Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Сетевые сервисы: FTP

Обзор

Серверы FTP

 

Обзор

FTP второй по использованию в Internet протокол (после HTTP), предназначен для обмена файлами. FTP умеет только передавать файлы, зато он умеет передавать их хорошо. Протокол непосредственно опасен, пароли, данные и все прочее передаются открытым текстом, и можно легко использовать сниффинг, однако большинство ftp используют анонимный доступ, так что это не проблема. Одна из основных проблем, с которыми обычно сталкиваются на ftp-сайтах, неподходящие разрешения каталогов, которые позволяют людям использовать место, чтобы размещать их собственные данные (обычно защищенный авторским правом материал, и т.д). Снова, как с telnet, Вы должны использовать отдельный логин для управления ftp, так как пароль будет передан в открытом виде.

Проблемы с ftp обычно включают:

╖ Передачу username и пароля открытым текстом.
╖ Передачу команд открытым текстом.
╖ Атаку на вычисление пароля.
╖ Неправильные настройки сервера.
╖ Несколько дырок для атаки Denial of Service все еще есть в некоторых серверах ftp.
╖ Старые версии WU-FTPD и его производных дают возможность захвата root-достуа.

Безопасность FTP низка, так что используя firewall и TCP_WRAPPERS Вы сможете ограничивать доступ, исходя из IP-адреса/имени хоста. Кроме того, большинство серверов ftp работает chroot'ed по умолчанию для любого анонимного доступа, или гостевого логина. Можно использовать chroot для всех пользователей ftp на их домашние каталоги, есть серверы, которые поддерживают протоколы шифрования данных (например, SSL), однако, при их использовании понадобится аналогичная поддержка со стороны клиентов, а это не всегда удобно. Проследите также, чтобы на Вашем сервере ftp не было публичных каталогов, доступных для чтения и записи одновременно, иначе пользователи рано или поздно начнут их активное использование для распространения своих данных (обычно warez или porn).

Пример firewall-правил:

ipfwadm -I -a accept -P tcp -S 10.0.0.0/8 -D 0.0.0.0/0 21
ipfwadm -I -a accept -P tcp -S some.trusted.host -D 0.0.0.0/0 21
ipfwadm -I -a deny -P tcp -S 0.0.0.0/0 -D 0.0.0.0/0 21

или

ipchains -A input -p tcp -j ACCEPT -s 10.0.0.0/8 -d 0.0.0.0/0 21
ipchains -A input -p tcp -j ACCEPT -s some.trusted.host -d 0.0.0.0/0 21
ipchains -A input -p tcp -j DENY -s 0.0.0.0/0 -d 0.0.0.0/0 21

Пример использования TCP_WRAPPERS в /etc/hosts.allow:

in.ftpd: 10.0.0.0/255.0.0.0, some.trusted.host

в /etc/hosts.deny:

in.ftpd: 0.0.0.0/0.0.0.0

Имеются несколько шифрованных вариантов ftp как упомянуто выше, SSLeay FTPD и утилиты третьих фирм. Так как большинство ftp-логинов не используется как логины администраторов (пароли в открытом виде, я Вас предупредил) и выполняется chroot, опасность минимальна.

Серверы FTP

Есть много серверов ftp для Linux. Популярные (Wu-FTPD и ProFTPD) имели серьезное число проблем, так что удостоверитесь, что ваша версия современна.

ProFTPD

ProFTPD доступный по GPL ftp-сервер, который может выполняться на многих UNIX-платформах. Он поддерживает новые свойства типа виртуальных ftp, индивидуальной настройки каталогов (в каждом каталоге используется файл .ftpaccess, аналог файла .htaccess в Apache), выдыхающиеся логины и многое другое. Он также поддерживает действительно полезные свойства типа ограничения загрузок и намного более жесткие средства управления защитой, чем WU-FTPD.

Основной файл конфигурации ПроФТПДа называется /etc/proftpd.conf, он имеет Apache-стиль, который я нахожу приятным. ProFTPD может быть выполнен из inetd (и использовать TCP_WRAPPERS) или выполнен как самостоятельный сервер. Он также поддерживает файлы конфигурации каталога, чтобы ограничить доступ и т.д. ProFTPD также поддерживает виртуальные ftp (хотя в отличие от виртуального www-сервера нужен лишний IP-адрес), причем каждый сайт может быть конфигурировано по-своему (различный анонимный доступ и другие параметры). Файл proftpd.conf обычно имеет раздел глобальных параметров настройки (inetd или автономный, максимальное число процессов, от какого имени работать и тому подобное), сопровождаемый заданной по умолчанию конфигурацией плюс настройка для конкретного сайта (или набора вирьуальных сайтов).

Пример настройки сервера ProFTPD для запуска из inetd без анонимного доступа:

ServerName "ProFTPD Default Installation"
ServerType inetd
DefaultServer on
Port 21
Umask 022
MaxInstances 30
User nobody
Group nobody
<Directory /*>
AllowOverwrite on
</Directory>

Доустим, Вы хотите управлять доступом к серверу ftp исходя из IP-адресов, имен хостов и доменов (хотя лучше полагаться только на IP). Вы могли бы достичь этого через правила firewall, но это имеет тенденцию замедлять машину (особенно, если Вы добавляете большое количество правил как обычно и бывает). Вы могли бы использовать TCP_WRAPPERS, но Вы не будете способны выборочно ограничить доступ к виртуальным и анонимным сайтам. Но всего этого можно достичь в файле proftpd.conf директивой ⌠<Limit LOGIN>■.

Пример ниже разрешает доступ всем машинам 10.1.*.* и машине 1.2.3.4, всем остальным доступ запрещен.

<Limit LOGIN>
Order Allow,Deny
Allow from 10.1., 1.2.3.4
Deny from all
</Limit>

Если Вы помещаете это внутри директив ⌠<VirtualHost>■ или ⌠<Anonymous>■ это применяется только к соответствующему виртуальному или анонимному сайту, при помещении в директиву ⌠<Global>■ это будет применено ко всем секциям ⌠< VirtualHost>■ и ⌠<Anonymous>■, а при помещении в настройки сервера (с ⌠ServerName■ и связанными данными) это будет вести себя подобно TCP_WRAPPERS, любая машина не из диапазона 10.1.*.*, и не 1.2.3.4 получат отказ ри соединении с портом 21, в противоположность тому, что им просто было бы отказано в соединении, если бы эти ограничения были бы в секциях ⌠<Global>■, ⌠<VirtualHost>■ или ⌠<Anonymous>■.

Если нужен анонимный доступ, просто допишите:

<Anonymous ~ftp>
User ftp
Group ftp
RequireValidShell off
UserAlias anonymous ftp
MaxClients 10
DisplayLogin welcome.msg
DisplayFirstChdir .message
<Directory *>
<Limit WRITE>
DenyAll
</Limit>
</Directory>
</Anonymous>

Это назначит ⌠ftp■ домашний каталог, как и прочим пользователям, (при нормальной настройке ⌠~ftp■ скорее всего он будет /home/ftp) в качестве корневого каталога для анонимных пользователей, ProFTPD выполнится как пользователь ⌠ftp■ группы ⌠ftp■, когда пользователь заходит анонимно (в противоположность регистрации нормального пользователя), и число анонимных входов в систему будет ограничено 10. Также будет отображен файл /home/ftp/welcome, а при переходе в любой каталог, содержащий файл .message, его содержимое также будет отображаться. Директива ⌠< Directory *>■ охватывает /home/ftp/* и не дает заисывать что-либо в данную иерархию. Если нужен каталог incoming (для входящих файлов) просто допишите после директивы ⌠<Directory *>■:

<Directory incoming>
<Limit WRITE>
AllowAll
</Limit>
<Limit READ>
DenyAll
</Limit>
</Directory>

Это позволит записывать файлы в /home/ftp/incoming/, но не читать их. ProFTPD с его богатыми возможностями требует больше времени на настройку, чем WU-FTPD, но, видимо, того стоит. Загрузить ProFTPD с документацией на английском можно с http://www.protftpd.net.

proftpd-ldap

proftpd-ldap позволяет Вам управление паролем, используя LDAP. Доступен на http://horde.net/~jwm/software/proftpd-ldap.

WU-FTPD

Один основной механизм защиты в WU-FTPD: использование chroot (подмена корневого каталога). Например: по умолчанию для всех анонимных (anonymous) пользователей задается каталог /home/ftp в качестве ⌠корневого■ каталога. Они не могут выходить из и смотреть содержимое, скажем, /home или /etc. То же самое может применяться к группам пользователей, например Вы можете отправить всех пользователей, заходящих по ftp, в каталог /home или в домашний каталог пользователя. Такая подмена корневого каталога позволит избежать многих проблем. Это может быть выполнено с помощью /etc/ftpaccess и /etc/passwd (man ftpaccess выдаст все сведения). ftpd также проверяет файл /etc/ftpusers и, если пользователь в нем упомянут, ему будет отказано в доступе по ftp.

Подмена каталогов пользователей при входе по ftp проста, но описана плохо. Сервер ftp проверяет файл /etc/ftpaccess в поисках гостевой группы, которая пишется просто как "guestgroup какая-то-группа-в-системе" то есть "guestgroup users". Имя групы должно быть определено в /etc/group, в группу должны быть добавлены члены. Для них надо поправить строки в файле passwd, чтобы сервер ftp знал где искать их каталоги. Так как они теперь работают с подменой каталога (их каталог становится для них корневым), они не имеют доступа к /lib, так что Вы должны скопировать некоторые файлы в их каталог, чтобы программы вроде ⌠ls■ работали правильно.

Установим для пользователя (billybob) доступ по ftp в его домашний каталог. В дополнение к этому billybob может заходить по telnet и менять свой пароль, но не может больше ничего сделать. Система использует теневые пароли, так что в поле пароля будет стоять 'x' для пользователя billybob.

Сначала впишем логин для пользователя billybob в файл /etc/passwd:

billybob:x:500:500:Billy Bob:/home/billybob/./:/usr/bin/passwd

Это означает, что сервер ftp будет представлять /home/billybob как его корневой каталог и переходить туда, представляя его для billybob как / (/home/billybob для остальной части пользователей). Конечно, /usr/sbin/passwd должен быть перечислен в /etc/shells, иначе ftp работать не будет. Подробно все описано в man-описании файла ftpaccess.

Теперь надо сказать серверу ftp, что данного пользователя надо пускать с подменой каталога. Для этого он должен быть членом группы (badusers, ftppeople, ...) которая задана в /etc/group. Потом данная группа должна быть указана в файле /etc/ftpaccess.

Теперь Вы должны скопировать некоторые библиотеки и исполняемые модули в chroot ⌠заповедник■, иначе ⌠billybob■ работать не сможет. Нужные файлы доступны как пакеты (обычно называемые "anonftp"), как только они установлены, файлы будут скопированы в /home/ftp. Обратите внимание на то, что файл /etc/passwd используется просто для связи UID и usernames, если нужно чтобы billybob видел username, а не UID, добавьте строку для него (то есть, скопируйте его строку из реального /etc/passwd в этот). То же справедливо и для файла group.

Без "billybob:*:500:500:::" в /home/billybob/etc/passwd:

drwxr-xr-x 2 500 500 1024 Jul 14 20:46 billybob

и со строкой в /home/billybob/etc/passwd:

drwxr-xr-x 2 billybob 500 1024 Jul 14 20:46 billybob

и со строкой для группы billybob в /home/billybob/etc/group:

drwxr-xr-x 2 billybob billybob 1024 Jul 14 20:46 billybob

Billybob теперь может заходить по ftp, загружать и выгружать файлы из /home/billybob и менять свой пароль. Но больше ничего он делать не может.

FTP очень интересный протокол. Клиенты соединяются с сервером через порт 21 (обычно), а сервер отвечает им через порт 20, и через него он и передает данные. Из чего следует, что порт 20 должен принимать внешние соединения. Помните это при установке firewall. Также имеется 'пассивный' ftp и манера забивать гвозди микроскопом (просматривать ftp с помощью www-браузера), который создает входящие подключения с сервером ftp на высоких номерах порта (вместо того, чтобы использовать 20, они договариваются о других числах!). Если Вы создаете публичный сервер ftp, выделите под него отдельную машину, предпочтительно вне вашей внутренней LAN (см. Practical Unix and Internet Security на предмет дискуссии о концепции 'DMZ'). Вы можете скачать WU-FTPD с ftp://ftp.wu-ftpd.org.

NcFTPD

NcFTPD очень мощный ftp-сервер, но бесплатен только для личного или учебного пользования. Доступен на http://www.ncftpd.com/ncftpd.

BSD ftpd

BSD ftp server (ftpd) также был перенесен к Linux, так что если Вы хотите использовать именно его, Вы можете это сделать. Доступен на ftp://quatramaran.ens.fr/pub/madore/ftpd-BSD.

Muddleftpd

Muddleftpd маленький сервер ftp. Доступен на http://www.computing.edu.au/~kuiperba/muddleftpd.

Troll ftpd

Troll ftpd чрезвычайно маленький и относительно надежный сервер. Он не может выполнять внешние программы и очень прост в настройке. Доступен на http://www.troll.no/freebies/ftpd.html.

BetaFTPD

BetaFTPD однопоточный маленький сервер. Скачать можно с http://members.xoom.com/_XOOM/sneeze/betaftpd.html.

FTP4ALL

Еще один FTP-сервер, распространяемый по GPL, доступен на http://www.ftp4all.de/v3/noframes.

FTP - SSL

Замена Вашего любимого ftpd (возможно, WU-FTPD), также доступен как набор патчей для WU-FTPD. Вроде бы повышает защиту. Можно скачать tarball с ftp://ftp.uni-mainz.de/pub/internet/security/ssl, или пакет RPM с ftp://ftp.zedz.net/pub/replay/linux/redhat.

FTP - SRP

SRP также может использоваться для шифрования username/password Ваших ftp-сеансов. SRP доступен на http://srp.stanford.edu/srp

sftp

sftp работает поверх ssh, что позволяет использовать безопасные ftp-сеансы. Доступен на http://www.xbill.org/sftp.

Back

Written by Kurt Seifried