Рано или поздно на сервер нужно залить файлы сайта, забрать резервную копию или поправить конфиг в удобном редакторе на своём компьютере. Для этого есть SFTP, протокол передачи файлов, который работает поверх SSH. Если вы уже подключаетесь к серверу по SSH, то SFTP у вас уже есть, ничего дополнительно ставить не нужно. В этой статье разберём, как работает SFTP, научимся передавать файлы из терминала и через FileZilla, а затем создадим отдельного пользователя, который может работать только с файлами в одной папке и не может войти на сервер по SSH. Все примеры мы проверили на тестовом сервере с Debian 12.
Как устроен SFTP
Несмотря на похожее название, SFTP не имеет отношения к старому протоколу FTP. Это часть SSH. Когда вы подключаетесь по SFTP, клиент открывает обычное SSH-соединение на порт 22, проходит ту же проверку пароля или ключа, а затем вместо командной строки запускает на сервере специальную программу для работы с файлами. В конфигурации SSH на нашем сервере с Debian 12 она подключена по умолчанию строкой Subsystem sftp /usr/lib/openssh/sftp-server.
Отсюда следуют три удобных свойства. Во-первых, всё, что передаётся, шифруется так же, как SSH-сессия, поэтому пароль и файлы не уходят по сети открытым текстом. Во-вторых, не нужно открывать в брандмауэре новые порты и ставить отдельный FTP-сервер. В-третьих, для входа подходят те же пользователи и ключи, что и для SSH.
У этого есть и обратная сторона. Обычный пользователь, который может подключиться по SFTP, может войти и по SSH и увидеть все файлы, которые ему разрешено читать. Если доступ нужен человеку только для загрузки файлов, например разработчику сайта, лучше создать для него пользователя, у которого есть только SFTP и только одна папка. Это делается встроенными средствами SSH, и мы разберём это в шаге 3.
Что понадобится
- Сервер с Debian 12 или Ubuntu 24.04 и доступ к нему по SSH. Как подключиться, рассказано в статье про Termius.
- Программа
sftpна вашем компьютере. В macOS и Linux она уже есть. В Windows 10 и 11 она входит в компонент OpenSSH Client. Если команда не находится, добавьте этот компонент в разделе дополнительных компонентов Windows Optional Features.
Шаг 1. Подключитесь по SFTP из терминала
Откройте терминал на своём компьютере и подключитесь к серверу. Вместо IP-адрес-сервера укажите адрес вашего VPS.
sftp root@IP-адрес-сервераПрограмма спросит пароль, как при обычном SSH-подключении, а при первом подключении попросит подтвердить ключ сервера. Если сервер переустанавливали и появилось предупреждение о смене ключа, поможет статья про REMOTE HOST IDENTIFICATION HAS CHANGED. После входа появится приглашение sftp>.
Шаг 2. Передавайте файлы
В сеансе SFTP у вас два текущих каталога, на сервере и на вашем компьютере. Команды для сервера пишутся как обычно, а для своего компьютера с буквой l в начале, от слова local.
| Команда | Что делает |
|---|---|
pwd и lpwd | Показать текущую папку на сервере и на компьютере |
ls и lls | Список файлов на сервере и на компьютере |
cd и lcd | Перейти в папку на сервере и на компьютере |
put файл | Загрузить файл с компьютера на сервер |
get файл | Скачать файл с сервера на компьютер |
put -R папка и get -R папка | Загрузить или скачать папку целиком |
reput файл и reget файл | Продолжить прерванную загрузку или скачивание |
mkdir, rm, rename | Создать папку, удалить файл, переименовать |
bye | Завершить сеанс |
Ниже настоящий сеанс с нашего компьютера. Мы создали на сервере папку, загрузили в неё файл, проверили, что он на месте, и скачали его обратно под другим именем.
mkdir site-backup
cd site-backup
put report.txt
ls -l
get report.txt report-copy.txt
bye
Файл загружен на сервер и скачан обратно
Команда put берёт файл из текущей папки на компьютере, а get сохраняет файл в неё же. Поэтому перед работой удобно перейти командой lcd в нужную папку на своём компьютере.
Как подключиться через FileZilla
Если удобнее перетаскивать файлы мышкой, используйте FileZilla, бесплатную программу для Windows, macOS и Linux. По официальной инструкции FileZilla подключение к SFTP выглядит так.
- В строке быстрого подключения вверху окна в поле адреса введите адрес сервера с приставкой
sftp://, напримерsftp://203.0.113.10. - Укажите имя пользователя и пароль.
- Порт можно не указывать, для SFTP по умолчанию используется 22.
- Нажмите кнопку быстрого подключения Quickconnect или клавишу Enter.
После подключения слева будут файлы вашего компьютера, а справа файлы сервера. Файлы переносятся между ними перетаскиванием.
Не забудьте приставку sftp://
Без неё FileZilla будет подключаться по обычному FTP на порт 21. На VPS, где FTP-сервера нет, такое подключение не заработает.
Шаг 3. Создайте пользователя только для SFTP
Теперь создадим пользователя sftpuser, который сможет работать с файлами только в одной папке и не сможет войти по SSH. Для этого SSH умеет запирать пользователя в каталоге с помощью chroot. Для такого пользователя указанная папка становится корнем файловой системы, и выйти выше неё он не может.
У chroot есть строгое правило. Сама папка, в которой запирается пользователь, и все папки выше неё должны принадлежать root, и никто, кроме root, не должен иметь права записи в них. Поэтому файлы пользователь будет класть во вложенную папку files, которая уже принадлежит ему.
Создайте группу и пользователя без доступа к командной строке.
bashgroupadd sftponly useradd -m -d /home/sftpuser -s /usr/sbin/nologin -G sftponly sftpuser passwd sftpuserКоманда
passwdпопросит дважды ввести пароль для нового пользователя. С этим паролем он будет подключаться по SFTP.Создайте папку для chroot и папку для файлов с правильными владельцами.
bashmkdir -p /srv/sftp/sftpuser/files chown root:root /srv/sftp /srv/sftp/sftpuser chmod 755 /srv/sftp /srv/sftp/sftpuser chown sftpuser:sftpuser /srv/sftp/sftpuser/filesСделайте резервную копию настроек SSH и откройте их.
bashcp /etc/ssh/sshd_config /root/sshd_config.bak nano /etc/ssh/sshd_configДобавьте в самый конец файла блок ниже и сохраните файл.
%uSSH заменит на имя пользователя, поэтому один блок подойдёт для всех будущих пользователей группыsftponly.bashMatch Group sftponly ChrootDirectory /srv/sftp/%u ForceCommand internal-sftp -d /files AllowTcpForwarding no X11Forwarding noПроверьте настройки и примените их. Если
sshd -tвыведет ошибку, не перезагружайте SSH, а исправьте файл.bashsshd -t && systemctl reload ssh
Не закрывайте текущее подключение
Пока вы меняете настройки SSH, держите открытым окно, в котором работаете. Сначала проверьте в новом окне, что вход на сервер по-прежнему работает, и только потом закрывайте старое. Мы так и сделали, и вход для root после изменения продолжил работать.
Подключитесь новым пользователем командой sftp sftpuser@IP-адрес-сервера. Он сразу оказывается в папке /files, может загружать в неё файлы, а выше подняться не может. В корне ему видна только папка files, а папка /etc сервера для него просто не существует.

Пользователь заперт в своей папке
Если тот же пользователь попробует войти по SSH, сервер ответит This service allows sftp connections only. и закроет соединение.
Чтобы добавить ещё одного такого пользователя, повторите шаги 1 и 2 с его именем. Блок в sshd_config менять не нужно.
Частые вопросы
fatal: bad ownership or modes for chroot directory
Папка chroot или одна из папок выше неё принадлежит не root либо доступна для записи кому-то ещё. Клиент при этом видит только Connection closed, а саму причину можно найти в журнале командой journalctl -u ssh -n 20. Мы получили эту ошибку, когда сделали владельцем /srv/sftp/sftpuser самого пользователя. Верните владельца командами chown root:root /srv/sftp/sftpuser и chmod 755 /srv/sftp/sftpuser.
dest open "/report.txt": Permission denied
Пользователь пытается записать файл в корень своей папки chroot, а она принадлежит root. Так и должно быть. Файлы нужно класть во вложенную папку files, в неё пользователь попадает сразу после входа.
This service allows sftp connections only.
Это не ошибка. Пользователь из группы sftponly может работать только по SFTP, а вход в командную строку по SSH ему запрещён.
Permission denied (publickey,password)
Сервер не принял ни ключ, ни пароль. Мы получили эту ошибку, подключаясь пользователем sftpuser без ключа и без пароля. Проверьте имя пользователя и пароль, а если пароль ещё не задан, задайте его командой passwd sftpuser. Если вы входите по ключу, публичный ключ нужно положить в /home/sftpuser/.ssh/authorized_keys, именно в домашнюю папку, а не в папку chroot. Подробнее о ключах рассказано в статье про SSH-ключи.
Наши ресурсы
Telegram-канал: https://t.me/f3cloud_news
Официальный сайт: https://f3cloud.com