Почему обычный FTP больше не нужен

Когда проект растёт, безопасное хранение файлов становится критичной задачей. Медиа — аудио, видео, изображения — нельзя оставлять без защиты. FTP давно устарел: данные идут в открытом виде и легко перехватываются.

SFTP с chroot — решение, которое позволяет изолировать пользователя в одной директории. В этой статье я покажу пошаговую практическую настройку, проверенную на реальном сервере.

Преимущества SFTP перед FTP

SFTP работает через SSH и шифрует весь трафик, поэтому безопаснее.

Что получает сервер

  • Нет необходимости открывать отдельный порт
  • Пользователь ограничен одной папкой
  • Можно безопасно интегрировать с CDN

FTP же уязвим к перехвату и не шифрует данные.

Постановка задачи

Мы хотим получить:

  • Пользователь  sftpuser
  • Доступ только к  /upload
  • Возможность загружать файлы в  /upload/files
  • Полная изоляция от остальных директорий

Это позволит контролировать все действия и защитить сервер.

Шаг 1. Создание пользователя SFTP

adduser sftpuser
id sftpuser

Пропускаем лишние поля и задаём пароль. Проверка ID гарантирует, что пользователь создан.

Шаг 2. Подготовка директорий и прав

Создаём структуру:

mkdir -p /upload/files

Настройка прав:

chown root:root /upload
chmod 755 /upload

chown sftpuser:sftpuser /upload/files
chmod 755 /upload/files

Почему это важно

  • Корневая директория должна принадлежать root
  • Пользователь пишет только во вложенные папки
  • Нарушение этих правил приведёт к сбою SFTP

Шаг 3. Настройка SSH для изоляции

Открываем конфигурацию:

nano /etc/ssh/sshd_config

Добавляем:

Match User sftpuser
    ChrootDirectory /upload
    ForceCommand internal-sftp
    X11Forwarding no
    AllowTcpForwarding no

Убедитесь, что есть:

Subsystem sftp internal-sftp

Шаг 4. Перезапуск и проверка SSH

Проверяем конфиг:

sshd -t

Перезапуск:

systemctl restart ssh

Шаг 5. Тестирование подключения

Подключаемся по sftp используя терминал  sftp sftpuser@YOUR_SERVER_IP  или клиент например FileZile или любой другой вводим ip, пароль

Пользователь увидит только папку  files  и сможет загружать файлы.

Интеграция с приложением (пример Django)

from storages.backends.sftpstorage import SFTPStorage

class MediaSFTPStorage(SFTPStorage):
    def __init__(self, *args, **kwargs):
        kwargs['host'] = 'SERVER_IP'
        kwargs['root_path'] = '/upload/files'
        kwargs['params'] = {
            'username': 'sftpuser',
            'password': 'your_password',
            'port': 22,
        }
        kwargs['base_url'] = 'https://cdn.example.com/upload/'
        super().__init__(*args, **kwargs)

Теперь все файлы загружаются через SFTP и сразу доступны через CDN.

Типичные ошибки и как их избежать

ОшибкаПричина
SFTP не подключается/upload не принадлежит root
Permission deniedПопытка записи в /upload вместо /upload/files
Connection closedНеправильные права на папки

Практические советы из опыта

  • Делите файлы по датам:  /upload/files/2026/03/
  • Не храните все файлы в одной папке
  • В будущем: SSH-ключи, логирование подключений, ограничение числа сессий

Заключение: SFTP с chroot — надёжная защита
Использование SFTP с изоляцией пользователя:

  • Позволяет безопасно принимать файлы
  • Изолирует пользователей
  • Подготавливает инфраструктуру под CDN

Настройка занимает 10–15 минут, экономя часы и нервы. Попробуйте прямо сейчас, и ваши медиа-файлы будут под полной защитой.