Передача файлов


Никому не нужен веб-сервер без веб-страниц. Мои веб-сайты, созданные на базе FreeBSD, выглядят отвратительно.* Профессиональные веб-дизайнеры обычно проектируют сайты на своих рабочих станциях, а затем выгружают их на сервер. Стандартным способом передачи файлов являются FTP и sftp/scp.

FTP, File Transfer Protocol (протокол передачи данных) — это классический протокол для переноса файлов с одного компьютера на другой по Интернету. Большинство пользователей предпочтут использовать FTP. Как и многие другие протоколы, FTP со временем не стал лучше. Он с трудом работает в современных средах. За долгие годы в спецификации накопилось столько исправлений, что протокол стал похож на ужасное творение Франкенштейна, которое падает, как только администратор сети отвернется хотя бы на секунду. Хотя система FreeBSD обеспечивает максимально легкое обслуживание FTP, требуется немного поработать, чтобы этот протокол продолжал с пыхтением двигаться вперед.

Безопасность FTP

Пароли и имена пользователей передаются по FTP открытым текстом, поэтому обладатель анализатора пакетов может перехватить эту информацию. Никто в локальной сети, за исключением сетевого администратора, не должен обладать анализатором пакетов, но если ваши пользователи находятся в удаленных сетях или за кабельными модемами, их пароли под угрозой.

Будучи системным администратором, никогда, никогда, никогда не передавайте по сети свой пароль открытым текстом! Вместо этого для переноса файлов между машинами используйте scp(1) или sftp(1).

Клиент FTP

FTP — достаточно сложный протокол. В отличие от РОРЗ и SMTP, его трудно протестировать с помощью команды telnet(1). Для работы с FTP нужен FTP-клиент. Для подключения к хосту достаточно набрать команду ftp и указать имя хоста.

# ftp sardines
Connected to sardines.blackhelicopters.org.
220 sardines.blackhelicopters.org FTP server (Version 6.00LS) ready.
Name (sardines:mwlucas):

По умолчанию клиент посылает локальное имя пользователя, однако при необходимости можно ввести другое имя. Далее будет запрошен пароль:

331 Password required for mwlucas.
Password:
230 User mwlucas logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

Если все идет, как задумано, то в результате вы зарегистрируетесь на удаленном сервере с оболочкой, подобной командному интерпретатору. Выполнять команды вы не сможете, но сможете перемещаться и просматривать файлы с помощью стандартных команд UNIX, таких как ls и cd.

Для загрузки файла по FTP служит команда get с именем файла:

ftp> get .cshrc
local: .cshrc remote: .cshrc
229 Entering Extended Passive Mode (|||50451|)
150 Opening BINARY mode data connection for '.cshrc' (614 bytes).
100% |*************************************|  614   272.17 KB/s    00:00 ETA
226 Transfer complete.
614 bytes received in 00:00 (193.48 KB/s)
ftp>

Как видите, клиент FTP открывает соединение для передачи файла. По мере загрузки файла по экрану движется строка из звездочек (*). Значение в поле ЕТА обновляется в соответствии с временем, оставшимся до окончания загрузки. По завершении передачи файла вы увидите извещение, размер загруженного файла и приглашение FTP на ввод команды.

Для выгрузки файла из локальной системы на сервер FTP служит команда put. Вывод этой команды практически такой же, как у команды get, поэтому я не буду повторять его здесь.

Для перемещения сразу нескольких файлов предназначены команды mget и mput. Например, если требуется загрузить все файлы с расширением .html, введите команду mget *.html. Единственная неприятность состоит в том, что сервер будет запрашивать подтверждение перед передачей каждого файла. Включить или выключить запрос подтверждения можно с помощью команды prompt.

Наконец, по FTP можно просматривать содержимое текстовых файлов. Команда less отображает содержимое удаленного файла по одной странице, как и обычная команда less(1). Просматривать файлы и затем загружать их — нелепо, но зато с помощью less удобно просматривать содержимое README и индексных файлов.

Передача двоичных и ASCII-файлов

Различие между передачей двоичных и ASCII-файлов — постоянный источник путаницы из-за того, что по-разному обрабатываются символ возврата и символ разделителя строк. С давних пор в системах DOS и UNIX конец строки обозначался по-разному, что можно увидеть при передаче файлов между двумя системами. В Интернете можно найти много документов, детально описывающих это различие. Есть много статей, в которых сторонники двух систем жестко критикуют противоположные подходы. Вам же надо лишь знать, как действовать в сложившейся обстановке.

Можно передавать и двоичные, и текстовые файлы в двоичном режиме, но нельзя передавать двоичные файлы в режиме ASCII. В UNIX-подобных системах по умолчанию используется двоичный режим, а в операционной системе Windows-режим ASCII. Команда bin предписывает серверу FTP выполнять двоичную передачу, а команда a — передачу в режиме ASCII. Двоичный режим подходит для обоих случаев, поэтому применяйте именно его, и у вас не будет проблем.

Сервер FTP

Теперь, когда вы узнали, как пользоваться клиентом FTP в системе FreeBSD, давайте посмотрим, как можно реализовать сервис FTP. Первая ваша задача — определиться с тем, как запускать демон ftpd(8), из inetd(8) или в автономном режиме.

По умолчанию FreeBSD запускает демон FTP из inetd(8). Большинство систем получают не так много запросов FTP, поэтому inetd легко справляется с поступающими запросами. Если не требуется поддерживать много сессий FTP одновременно, можно использовать inetd(8). Достаточно раскомментировать строку с описанием службы FTP в файле /etc/inetd.conf (глава 15) и перезапустить inetd. Любое изменение командной строки запуска ftpd(8) можно внести в файле /etc/inetd.conf.

Однако если предполагается, что ваш сервер FTP будет обслуживать сотни и тысячи одновременных соединений, то запуск FTP из inetd приведет к дополнительной нагрузке на систему. Чтобы этого не было, настройте использование FTP в автономном (standalone) режиме, подразумевающем постоянное прослушивание сети и самостоятельное обслуживание запросов. Не забудьте убрать запуск ftpd(8) из inetd, а затем добавьте строку ftpd_enable="YES" в файл /etc/rc.conf. После этого можно будет запустить ftpd(8) с помощью сценария /etc/rc.d/ftpd или перезагрузки.

Вы можете выполнить некоторые подстройки ftpd(8) с помощью ключей командной строки. Добавьте эти ключи в строку запуска ftpd(8) в файле /etc/inetd.conf или в параметр ftpd_flags в файле /etc/rc.conf. Теперь посмотрим, какие возможности предлагает демон ftpd(8), входящий в состав FreeBSD.

Протоколирование обращений к ftpd(8)

Демон ftpd(8) имеет два уровня протоколирования. Если задать ключ -l один раз (значение по умолчанию в /etc/inetd.conf), ftpd(8) будет протоколировать все успешные и неуспешные попытки регистрации. Если данный ключ указать дважды, ftpd(8) будет протоколировать все операции FTP: загрузку и выгрузку файлов, создание и удаление каталогов и т. д.

Режим «только для чтения»

Иногда требуется запретить выгрузку файлов на сервер, замещение файлов или любые другие операции, приводящие к изменениям в файловой системе сервера. Этот режим прекрасно подходит для организации серверов, разрешающих выполнять только загрузку файлов, таких как сайты-зеркала. Для этого применяется ключ -r.

Режим «только для записи»

Возможно, вам потребуется организовать сервер, куда пользователи смогут выгружать файлы, но не смогут загружать их. Для этого применяется флаг -o.

Тайм-аут

По умолчанию, если сеанс связи с пользователем простаивает 15 минут (900 секунд), соединение разрывается. Определить новое значение тайм-аута можно с помощью ключа -t, которому следует передать значение в секундах.

Управление пользователями FTP

С работающим сервером FTP связаны две типичные проблемы: 1) он позволяет пользователям загружать произвольные системные файлы и 2) пароли FTP могут быть похищены. Стоит ли подвергать свою систему риску из-за того, что какой-то пользователь-разиня, подключившись к серверу из местного интернет-кафе, не уберег свой пароль, и злоумышленник смог загрузить ключевые системные файлы! Лучший способ управлять пользователями заключается в том, чтобы выбрать, кто может входить на сервер и какие каталоги будут доступны этим выбранным пользователям.

chroot для пользователей

Вы можете заблокировать пользователей FTP в своих домашних каталогах с помощью chroot(8). Для пользователя его домашний каталог будет выглядеть как корень файловой системы. Пользователи не смогут покинуть свои домашние каталоги или получить доступ к произвольным системным файлам. Это очень напоминает маленькую клетку. Вариант с chroot полезен для веб-серверов с большим количеством клиентов на одной машине, то есть для веб-серверов с большим числом виртуальных хостов. В конце концов, только пользователь должен видеть свой каталог и больше никто.

Чтобы посадить пользователя в клетку, добавьте его имя в файл /etc/ftpchroot. Каждый пользователь должен указываться в отдельной строке. Всякий раз, когда пользователь подключается к системе по FTP, его учетная запись сравнивается с содержимым /etc/ftpchroot. Если имя есть в этом файле, пользователь блокируется в своем домашнем каталоге с возможностью полностью контролировать его (если это позволяют установленные вами права доступа), создавать столько подкаталогов и хранить столько файлов, сколько позволяет отведенное ему дисковое пространство. Но пользователь не может покидать свой домашний каталог и исследовать систему.

В файле /etc/ftpchroot можно также указывать группы, что будет приводить к блокированию в домашних каталогах всех пользователей, входящих в эту группу. Имена групп должны начинаться с символа @ (например, @customers).

Допустим, в системе есть два веб-дизайнера, Гордон и Крис. Требуется разрешить им выгрузку файлов только в свои домашние каталоги. Есть также группа клиентов, которые поддерживают свои веб-сайты. Клиенты входят в группу webclients. Чтобы «посадить» всех этих пользователей в клетку, настройте /etc/ftpchroot так:

gordon
chris
@webclients

Теперь все эти пользователи заперты в своих домашних каталогах.

Запрет доступа к FTP

Имя файла /etc/ftpusers обманчиво. Файл содержит не список разрешенных пользователей, а список тех, кому не позволено входить в систему по FTP. По умолчанию в /etc/ftpusers представлены разные системные учетные записи, такие как root и nobody. Ни один системный администратор не сможет зарегистрироваться как root!

В этот файл можно добавить группы, поместив перед их именами символ @. Обычно я запрещаю доступ к FTP членам группы wheel. Пользователи, применяющие пароль root, не должны передавать свои пароли открытым текстом! Все, кому я могу доверить доступ в систему с привилегиями пользователя root, знают, как пользоваться SSH, scp(1) и sftp(1)!

Сообщения сервера FTP

При подключении сервер FTP может выводить два разных сообщения, текст которых хранится в файлах /etc/ftpwelcome и /etc/ftpmotd.

Когда клиент устанавливает соединение FTP впервые, ftpd(8) отображает содержимое файла /etc/ftpwelcome. В него можно поместить правила пользования, предупреждения, сообщения о предоставляемых возможностях, непристойности, угрозы, то есть все что угодно. Пользователи увидят данную информацию еще до получения приглашения к регистрации. Это замечательное место для сообщения «Несанкционированное использование запрещено». Факт наличия этого сообщения, пусть и не такого забавного, как «Пользователи, совершившее незаконное вторжение, будут преследоваться по всей строгости моим злобным ротвейлером и 12-зарядным дробовиком», пригодится в суде, если кто-нибудь воспользуется вашими услугами в противозаконных целях.

Как только пользователь войдет в систему, отображается содержимое /etc/ftpmotd. Обычно в нем содержатся соглашения по пользованию услугой.

Настройка анонимного сервера FTP

Анонимные FTP-сайты — это популярный способ предоставления файлов и документов всему Интернету. Однако такие сайты зачастую взламываются. Хотя ftpd(8) системы FreeBSD достаточно устойчив и безопасен, необходимо предпринять меры предосторожности и настроить сервер должным образом. Вот несколько рекомендаций:

  • Не объединяйте службы анонимного и не анонимного FTP на одном сервере.
  • Если возможно, разрешите только считывание файлов с сервера, применив ключ -r.
  • Применяйте ключ -S для протоколирования в /var/log/ftpd всех операций анонимного сервера FTP. Файл следует создать до запуска ftpd(8), поэтому сначала запустите команду touch /var/log/ftpd.
  • Создайте непривилегированного пользователя с именем «ftp», с правами которого будет работать ftpd(8). Домашним каталогом этого пользователя будет корень дерева каталогов анонимного сервера FTP; все файлы, которые должны быть доступны всему миру, надо разместить в этом каталоге.
  • Создайте каталог /home/ftp/pub для папки pub, традиционно присутствующей на серверах FTP, и измените права доступа к домашнему каталогу пользователя ftp так, чтобы пользователи не могли ничего изменить в этом каталоге. При таких настройках пользователи смогут выгружать свои файлы только в каталог pub.

Предостережение по поводу анонимного FTP

Разрешение всем желающим загружать файлы на сервер кажется дружеским шагом. У вас есть достаточная полоса пропускания и вы хотите предоставлять общедоступный сервис. В идеальном мире (каким был Интернет 1980-х) это было бы замечательно.

Однако если разрешить всем желающим хранить данные в вашей системе, пользователи смогут использовать сервер FTP для хранения нелегальных программ, детской порнографии или переписки террористов. Чтобы все это было трудно обнаружить, злоумышленники могут создать скрытые каталоги или замаскировать данные. Даже если вы отслеживаете все барахло, загружаемое пользователями, вы можете не обратить внимание на файл CookieRecipies.txt, который фактически является учебным MPEG-фильмом Фронта освобождения хомяков, задача которого — засадить президента в гигантское колесо и заставить его бегать в нем всю оставшуюся жизнь. Вам будет очень нелегко объяснить наличие этого файла службе государственной безопасности.

Комментарии запрещены.