Table of Contents
Настройка sftp сервера
О сабже
SFTP (англ. SSH File Transfer Protocol) – протокол прикладного уровня, предназначенный для копирования и выполнения других операций с файлами поверх надёжного и безопасного соединения. Протокол разработан группой IETF как расширение к SSH-2, однако SFTP допускает реализацию и с использованием иных протоколов сеансового уровня. Разработчики инженерного совета интернета(IETF) заявляют, что, хотя этот протокол описан в контексте протокола SSH-2, он может использоваться в ряде различных приложений, таких как безопасная передача файлов через Transport Layer Security (TLS) и передача информации в приложениях VPN.
SFTP не следует путать с FTPS и FTP через SSH, это скорее новый протокол, разработанный с нуля. Также SFTP иногда из-за совпадающей аббревиатуры путают с Simple File Transfer Protocol, сильно урезанной версией основной технологии FTP.
Этот протокол предполагает, что он работает по защищенному каналу, например SSH, что сервер уже аутентифицировал клиента и что протоколу доступна информация пользователя.
По сравнению с протоколом SCP, который разрешает только передачу файлов, протокол SFTP позволяет выполнять ряд операций с удаленными файлами, что делает его более похожим на протокол удаленной файловой системы. Дополнительные возможности клиента SFTP включают возобновление прерванной передачи, списки каталогов и удаленное удаление файлов.
Загруженные файлы могут быть связаны с их основными атрибутами, такими как отметки времени. Это преимущество перед обычным протоколом FTP.
Создание пользователя
Итак, создаем нового пользователя, основную группу и задаем пароль:
sudo groupadd sftp-group # создаем группу sftp-group useradd --no-create-home --gid sftp-group sftp-user # создаем пользователя passwd sftp-user # задаем пароль для пользователя sftp-user
Создание директории
Чтобы ограничить доступ пользователя к SFTP одной директорией, сначала нужно убедиться, что директория соответствует требованиям. Сама директория и все директории над ней в дереве файловой системы должны принадлежать root, а другие пользователи не должны иметь права на запись в них. Следовательно, невозможно просто предоставить ограниченный доступ к домашнему каталогу пользователя, поскольку домашние каталоги принадлежат пользователям, а не root.
В качестве целевой директории загрузки будем использовать /srv/sftp/sftp-user
. Директория /srv/sftp
будет принадлежать пользователю root и заблокирована для других пользователей. Субдиректории /srv/sftp/sftp-user
будет принадлежать пользователю sftp-user, так что он сможет загружать в них файлы.
mkdir /srv/sftp chown root. /srv/sftp chmod 755 /srv/sftp mkdir /srv/sftp/sftp-user chown sftp-user:sftp-group /srv/sftp/sftp-user
Конфигурация ssh-сервера
На этом этапе нужно изменить конфигурацию ssh-сервера и заблокировать пользователю sftp-user доступ к терминалу, но разрешить доступ к передаче файлов. Открываем на редактирование файл конфигурации ssh-сервера /etc/ssh/sshd_config
, и дописываем в конец
# Это только для пользователй группы sftp-group Match Group sftp-group # использовать встроенный sftp-сервер ForceCommand internal-sftp # разрешить аутентификацию по паролю PasswordAuthentication yes # разрешить доступ только к /srv/sftp ChrootDirectory /srv/sftp # запретить все, что не нужно для работы PermitTunnel no AllowAgentForwarding no AllowTcpForwarding no X11Forwarding no
Перезапускаем демон
systemctl restart sshd.service
Ну и традиционно, если что не так
tail -f /var/log/auth.log
Тестирование конфигурации
Пользователь sftp-user не может подключиться по ssh и получить доступ к терминалу:
ssh sftp-user@10.10.10.14 sftp-user@10.10.10.14's password: This service allows sftp connections only.
Но пользователь sftp-user может использовать SFTP для передачи файлов:
sftp sftp-user@110.10.10.14 sftp-user@10.10.10.14's password: Connected to 10.10.10.14. sftp>
Основные команды sftp
Оказавшись в командной строке sftp можно получить список доступных команд с помощью команды help
> help Available commands: bye Quit sftp cd path Change remote directory to 'path' chgrp grp path Change group of file 'path' to 'grp' chmod mode path Change permissions of file 'path' to 'mode' chown own path Change owner of file 'path' to 'own' df [-hi] [path] Display statistics for current directory or filesystem containing 'path' exit Quit sftp get [-afPpRr] remote [local] Download file reget [-fPpRr] remote [local] Resume download file reput [-fPpRr] [local] remote Resume upload file help Display this help text lcd path Change local directory to 'path' lls [ls-options [path]] Display local directory listing lmkdir path Create local directory ln [-s] oldpath newpath Link remote file (-s for symlink) lpwd Print local working directory ls [-1afhlnrSt] [path] Display remote directory listing lumask umask Set local umask to 'umask' mkdir path Create remote directory progress Toggle display of progress meter put [-afPpRr] local [remote] Upload file pwd Display remote working directory quit Quit sftp rename oldpath newpath Rename remote file rm path Delete remote file rmdir path Remove remote directory symlink oldpath newpath Symlink remote file version Show SFTP version !command Execute 'command' in local shell ! Escape to local shell ? Synonym for help
Example
Текущий рабочий каталог:
pwd # удаленная рабочая директория lpwd # локальная директория
Меняем директорию:
cd uploads # сменить директорию на удаленной системе lcd uploads # сменить директорию на локальной системе
Список файлов и директорий:
ls # список на удаленной системе lls # список на локальной системе
Загрузить на удаленную систему файл или директорию:
put image.jpg # загрузить файл put -r images/ # загрузить директорию
Скачать с удаленной системы файл или директорию:
get image.jpg # скачать файл get -r images/ # скачать директорию
Создать директорию:
mkdir images # создать директорию на удаленной системе lmkdir images # создать директорию на локальной системе
Удалить директорию:
rmdir images # удалить директорию на удаленной системе !rmdir images # удалить директорию на локальной системе
Выполнить произвольную команду на локальной системе:
!команда
Выполнить несколько команд на локальной системе:
! # временно выходим из командной строки sftp команда # выполняем команду в shell (bash) команда # выполняем команду в shell (bash) exit # возвращаемся к командной строке sftp, либо CTRL + d
Завершить сеанс:
exit # или quit или bye