SFTP
Материал из Xgu.ru
- Автор: Игорь Чубин
Содержание |
[править] Протокол SFTP
SFTP расшифровывается как SSH File Transfer Protocol — SSH-протокол для передачи файлов.
Он предназначен для копирования и выполнения других операций с файлами поверх надёжного и безопасного соединения.
Как правило, в качестве базового протокола, обеспечивающего соединение, и используется протокол SSH2, но это не обязательно.
В сравнении с другим протоколом, тоже предназначенным для копирования файлов поверх SSH — протоколом SCP, который позволяет только копировать файлы, SFTP даёт возможность выполнять намного больше операций с ними: например, докачивать файл после разрыва соединения или удалять файл на сервере и многие другие операции. По этой причине существуют графические и псевдографические клиенты для SFTP, но нет таких, кто использовал бы только SCP в чистом виде.
Последнее утверждение может вызвать сомнения, ведь известно, что существуют WinSCP, модуль расширения для FAR и другие подобные менеджеры, содержащие SCP в названии, что может навести на мысль, что все их возможности реализуются через протокол SCP.
В действительности, эти программные средства опираются не только на SCP, но и на сам протокол SSH и на помощь со стороны сервера, например, для получения списка файлов и выполнения тому подобных операций. Что касается SCP, то это просто протокол для удалённого копирования файлов RCP, работающий поверх SSH, но не более[1].
SFTP призван быть более платформонезависимым чем SCP. В частности, как раскрывать файловые шаблоны, описывается в самом стандарте — и это не зависит от сервера. В то время как в SCP как будут раскрыты файловые шаблоны было полностью на совести сервера, точнее командного интерпретатора пользователя. SCP-серверы более распространены для Unix, а SFTP как для Unix, так и для Windows.
Существует заблуждение, что SFTP это просто обычный FTP, работающий поверх SSH. В действительности SFTP — это новый протокол, разработанный с нуля. Ещё его иногда путают с Simple File Transfer Protocol. SFTP расшифровывается как SSH File Transfer Protocol и ничего общего с Simple File Transfer Protocol не имеет.
Сам по себе протокол SFTP не обеспечивает безопасность работы; это делает нижележащий протокол. Как правило, SFTP используется в сочетании с протоколом SSH2 (он даже был разработан той же рабочей группой). Можно использовать SFTP и с другими протоколами, например SSH1, но это сопряжено с дополнительными трудностями.
При загрузке (upload) файлов наряду с данными на сервер могут копироваться и метаданные файла, в частности временные метки (timestamps), что при желании даёт возможность сохранить в загруженном на сервер файле время модификации неизменным.
В настоящий момент протокол SFTP не принят в качестве официального стандарта Интернет.Наиболее новая спецификация есть в черновике (draft), который описывает версию 6 протокола. Самой распространённой версией является 3-я, которая реализована в SSH-сервере OpenSSH. В большинстве Windows-клиентов реализована версия 4. SFTP, начиная с версии 4, становится более платформонезависимым и работает одинаково на Unix и Windows.
[править] Сервер SFTP
SFTP-сервер встроен в OpenSSH. Он реализуется с помощью программы sftp-server. Для того чтобы включить sftp-server в sshd, необходимо указать его в конфигурационном файле sshd_config в качестве подсистемы:
Subsystem sftp /usr/lib/openssh/sftp-server
Как правило, это строка уже указана в конфигурационном файле sshd по умолчанию, так что SFTP работает сразу и не требует никаких дополнительных действий для включения.
[править] Клиент SFTP
SFTP-клиент sftp встроен в пакет OpenSSH.
Форма вызова команды:
sftp [-1Cv] [-B buffer_size] [-b batchfile] [-F ssh_config] [-o ssh_option] [-P sftp_server_path] [-R num_requests] [-S program] [-s subsystem | sftp_server] хост sftp [[user@]host[:файл1 [файл2]]] sftp [[user@]host[:dir[/]]] sftp -b batchfile [user@]host
В первой форме sftp подключается к удалённому серверу SFTP хост и переходит в интерактивный режим работы.
Во втором случае sftp скачивает файл1 с сервера и записывает его в текущий каталог с под именем файл1 (или файл2, если это имя указано).
Третья форма, также как и первая, переводит sftp в интерактивный режим; с той только разницей, что работа на удалённом сервере начинается с определённого каталога.
В четвёртой форме после подключения к серверу выполняется batchfile, содержащий команды sftp. В качестве имени файла может быть указан символ -, в этом случае batchfile читается со стандартного потока ввода.
Подробнее о синтаксисе sftp можно прочитать в sftp(1).
Программа sftp использует в качестве транспорта ssh, и аутентификация на удалённом сервер выполняется средствами ssh. Если есть необходимость вместо ssh использовать другую программу, это можно сделать указав её имя в опции -S sftp.
В качестве SFTP-клиента для Windows может использоваться WinSCP, PSFTP из пакета PuTTY или кросс-платформенный ftp-клиент Filezilla.
[править] Дополнительные вопросы
[править] chroot для SFTP в FreeBSD
Источник: http://uafug.org.ua/projects/faq/chroot.sftp.openssh/
Потребуется патч:
Прикладываем его, пересобираем и устанавливаем пропатченый sftp-server:
# cd /usr/src/crypto/openssh # patch < /path/to/patch # cd /usr/src/secure/libexec/sftp-server # make clean && make obj && make && make install # chmod +s /usr/libexec/sftp-server
Последняя операция, chmod, очень важна, sftp-server должен быть suid root, иначе ничего работать не будет.
У пользователя в домашнем каталоге вообще не должно быть никаких бинарников и конфигурационных файлов, всё работает и без них. Единственное что нужно сделать чтобы работал только sftp и ничего больше. Реализуется это простеньким скриптом на perl:
#!/usr/bin/perl if ($ARGV[1] eq "/usr/libexec/sftp-server") { exec "/usr/libexec/sftp-server"; } else { fail "SFTP-only account"; };
который ставится в качестве shell для нужного пользователя. Также нужно, чтобы у данного пользователя работал chroot, у него в поле home в passwd написать не '/home/user', а '/home/user/./', что будет означать в принципе то же самое, что и '/home/user', но даст указание sftp-server, когда нужно выполнить chroot(2).
[править] Как установить umask для SFTP-сервера?
Использовать ключ -u:
Subsystem sftp /usr/lib/openssh/sftp-server -u 022
В крайнем случае, если sftp-server не поддерживает -u, можно использовать такую хитрость:
Subsystem sftp /bin/sh -c 'umask 0002; /usr/lib/openssh/sftp-server'
[править] Дополнительная информация
- SSH File Transfer Protocol draft-ietf-secsh-filexfer-02.txt (англ.)
- man sftp (англ.)
- WinSCP (англ.) — свободный SFTP и FTP клиент для Windows; есть plugin для FAR
- Сравнение scp и sftp (англ.)
[править] Примечания
- ↑ Подробнее о SCP можно почитать здесь: https://chuacw.ath.cx/blogs/chuacw/archive/2019/02/04/how-the-scp-protocol-works.aspx (англ.)
[править] Материалы по SSH на xgu.ru
- SSH — основная страница
- Host-based аутентификация в OpenSSH — беспарольная аутентификация пользователей одного хоста на другом
- SFTP — протокол и программы для копирования файлов поверх SSH
- Хранение открытых ключей SSH в DNS
- Управление ключами SSH с помощью агента
- ssh-copy-id — программа для инсталляции открытых ключей на другой хост