Почему обычный 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 минут, экономя часы и нервы. Попробуйте прямо сейчас, и ваши медиа-файлы будут под полной защитой.

Комментарии