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
Окно WinSCP Commander в одном из режимов работы

В первой форме 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'

[править] Дополнительная информация

[править] Примечания

  1. Подробнее о SCP можно почитать здесь: https://chuacw.ath.cx/blogs/chuacw/archive/2019/02/04/how-the-scp-protocol-works.aspx (англ.)

[править] Материалы по SSH на xgu.ru

Источник — «http://xgu.ru/wiki/SFTP»
На других языках