Библиотека сайта rus-linux.net
FTP, второй по популярности в интернет протокол после HTTP, предназначен для обмена файлами. Он предназначен только для передачи файлов, зато делает это хорошо. К сожалению, изначально протокол спроектирован так, что пароли, данные и все прочее передаются открытым текстом и их можно легко перехватить – однако большинство серверов предоставляют только анонимный доступ, так что это не проблема.
В этом документе изложены рекомендации, которые помогут вам правильно настроить FTP-сервер и свести к минимуму угрозу проникновения в систему злоумышленников через этот вид сервиса.
Для начала вам необходимо создать бюджет пользователя ftp. Для
этого следует добавить данные пользователя в системный файл паролей,
если это не сделано пакетом ftp-сервера при установке. Бюджет ftp не
должен использоваться кем-либо для входа в систему, поэтому задавать
реальный пароль для него не следует; группа пользователя также может
быть любой, не имеющей каких-либо прав на файловой системе –
например, собственно ftp
(если группа ещё не существует, то создайте её), укажите рабочий
каталог для него, например /var/ftp
, а вместо интерпретатора
командной строки укажите /bin/false
. Таким образом, запись в файле
/etc/passwd
для пользователя ftp будет иметь примерно следующий
вид:
ftp:x:14:50:FTP User:/var/ftp:/bin/false
Итак, после того, как “официальный” пользователь
будущего FTP-сервера создан, можно обратить внимание и на его домашний
каталог. Домашним каталогом пользователя ftp является ~ftp
– это
полный путь к каталогу, который будет “корневым” для всех
анонимных пользователей. В нашем случае это /var/ftp
. Владельцем этого
каталога будет являться пользователь root. Да-да, именно он, а не
ftp. Это должно быть сделано в целях вашей же (FTP-сервера и системы в
целом) безопасности – иначе однажды вы можете узнать неприятную
новость, что больше не являетесь хозяином в своей системе.
Для нормального функционирования будущего сервера неплохо было
бы создать дерево подкаталогов, в которых будут размещаться некоторые
необходимые в работе файлы. Это ~ftp/bin
,
~ftp/etc
, ~ftp/lib
и ~ftp/pub
. На все
перечисленные выше каталоги необходимо разграничить права доступа. Для
~ftp/bin
, ~ftp/etc
и ~ftp/lib
это
должны быть 711, а для ~ftp/pub
– 775. Владельцем для
всех каталогов будет являться root – это делается для того,
чтобы содержимое первых трёх каталогов было доступно только для
выполнения, во избежание копирования выполняемых файлов находящихся в
них с целью изучения их на предмет уязвимости – в отличие от
~ftp/pub
, который должен быть доступен для всех
пользователей FTP-сервера, чтобы они могли беспрепятственно
(разумеется, в рамках дозволенного) использовать те файлы, которые вы
хотите сделать доступными публично.
Группу, которой принадлежит ~ftp/pub
, лучше
сменить с root на специальную, в которую включены пользователи,
имеющие право изменения содержимого этого каталога – этим не
стоит заниматься от имени root.
Для чего нужны эти каталоги и что в них должно находиться
– спросите вы. Поскольку сеанс работы с анонимным FTP-сервером
выполняется в изолированной среде выполнения (chrooted environment),
то каталог ~ftp становится корневым каталогом, а каталоги ~ftp/bin
,
~ftp/etc
, ~ftp/lib
и
~ftp/pub
маскируются соответственно под
/bin
,
/etc
, /lib
и
/pub
. Таким образом, ваш сервис оказывается
отрезанным от
системных библиотек и прочих “опасных” программ, которые,
тем не менее, ему нужны в работе и их требуется предоставить, не
нарушая при этом безопасности системы. Какие именно программы и
библиотеки необходимы – зависит от того, какой FTP-сервер вы
будете использовать, так как у большинства из них свои специфические
особенности. Некоторым, например, требуется наличие ~ftp/etc/passwd
для получения имен владельцев и групп файлов. Поэтому вы должны будете
положить копию вашего системного файла /etc/passwd
, предварительно
удалив оттуда все лишние записи.
Для того, чтобы разрешить пользователям вашего сервера доступ на
запись, создайте каталог ~ftp/pub/incoming
с
правами доступа 733 (владелец – root), тем самым предоставив
право записи в этот каталог, но лишив возможности просмотра его
содержимого.
Замечание
Совет: для предотвращения атаки на ваш сервер через ftp путём переполнения диска информацией с целью заблокировать работу всей системы создавайте каталог ~ftp/pub/incoming
на отдельном разделе.
В комплект поставки нашего дистрибутива входят следующие FTP-серверы:
libra-ftpd
(Libra FTP daemon) - для организации FTP-сервера с анонимным доступом к предоставляемым ресурсам, подобного описанному в предыдущей главе;vsftpd
(Very Secure FTP Daemon) – полнофункциональный FTP-сервер.
Разумеется, “Very Secure” в его названии не является гарантией, однако свидетельствует о том, что при написании кода целью стояло создание максимально безопасной и аккуратно выполненной программы, минимально чувствительной к атакам со стороны.
Если вам достаточно анонимного FTP-сервера, то вам подойдет
libra-ftpd
в сочетании с
anonftp
. Этот пакет содержит дерево каталогов и
набор файлов необходимых для организации сервера с анонимным доступом,
который не требует дополнительной настройки – если только вы не
захотите, например, предоставить пользователям доступ на запись. Всю
передачу данных этот сервер осуществляет в пассивном режиме, что в
высшей степени безопасно, однако не всегда удобно. Хорошим решением
будет применение libra-ftpd
в качестве локального сервера в
организации. Его использование в качестве публичного сервера не совсем
оправдано, так как его система безопасности настроена слишком
параноидально для этой задачи.
Если же вам необходим надёжный, защищённый и одновременно
чрезвычайно быстрый и масштабируемый FTP-сервер, предоставляющий не
только анонимный доступ к ресурсам вашего сервера, но и доступ
локально зарегистрированным пользователям, то вам безусловно
понадобится более серьёзное средство, такое как vsftpd
. Примером
такого использования может послужить серверный пул ftp.redhat.com,
обрабатывающий по 15000 соединений одновременно.
Что же придаёт ему такую популярность? Во-первых, конечно же
безопасность работы. Каждая строка его кода неоднократно подвергалась
самым жестким проверкам со стороны специалистов в вопросах
безопасности. Другой стороной его привлекательности безусловно
является простота и гибкость настройки. Все необходимые настройки
осуществляются путем редактирования единственного конфигурационного
файла /etc/vsftpd.conf
.
В целях безопасности сервер по умолчанию сконфигурирован для
предоставления только анонимного доступа. Запрещены любые команды
записи. От администратора требуется только указать при помощи
директивы nopriv_user
имя пользователя, которое vsftpd
будет
использовать для организации безопасных соединений. Это должен быть
абсолютно изолированный и лишённый каких-либо привилегий
пользователь.
Для предоставления доступа к FTP-серверу локально зарегистрированным пользователям необходимо удалить знак комментария перед директивой local_enable=YES
– тем самым вы предоставите доступ пользователям к их домашним и системным каталогам. Для ограничения возможности пользователя перемещаться по дереву каталогов в пределах только его домашнего каталога достаточно убрать знак комментария из строки, содержащей директиву chroot_list_file
, чтобы сообщить vsftpd
о необходимости использования изолированной среды выполнения, а также указать имя этого пользователя в файле /etc/vsftpd/chroot_list
.
Еще большей безопасности в работе FTP-сервера можно добиться при
помощи xinetd
. Этот сервер позволяет ограничить
количество одновременно выполняемых процессов как по системе в целом,
так и для каждого отдельного пользователя, указать пользователя, от
имени которого будет выполняться сервис, задать приоритет процесса
(nice), указать адреса, с которых разрешено подключение к данной
службе, а также время доступа и множество других параметров. Вот
наглядный пример файла конфигурации xinetd
для
vsftpd
:
# default: off # description: The vsftpd FTP server. service ftp { disable = no # включает службу socket_type = stream protocol = tcp wait = no user = root nice = 10 rlimit_as = 16M # устанавливает лимит адресного пространства server = /usr/sbin/vsftpd # путь к исполняемому файлу only_from = 192.168.0.0 # предоставляем доступ из всей подсети 192.168.0 only_from = 207.46.197.100, 207.46.197.101 # доступ с указанных адресов # only_from = 0.0.0.0 # неограниченный по адресам доступ access_times = 2:00-9:00 12:00-24:00 # время, когда возможен доступ }
Для получения дополнительной информации по использованию
xinetd
смотрите страницы руководства xinetd
и xinetd.conf
.