Задача: установить FTP-сервер для оперативного выкладывания для клиентов больших файлов, которые сложно переслать по почте. Будем использовать ProFTPD.
Содержание
Введение
ProFTPD появился как безопасный и удобно настраиваемый FTP-сервер, используя Apache-подобный синтаксис файла конфигурации.
В то время когда начали создавать ProFTPD, наиболее часто используемым сервером был wu-ftpd. wu-ftpd обеспечивает отличную производительность, но испытывает недостаток в многочисленных функциях новых серверов Win32 FTP, а также имеет плохую историю безопасности. Многие люди, в том числе разработчиков, которые работают на ProFTPD, потратил много времени на исправление ошибок и дыр безопасности wu-ftpd. Но к сожалению, стало ясно, что необходим начать с нуля для реализации легкой конфигурируемости и обеспечения безопасности.
Есть и другие серверы FTP, который значительно более безопасные и менее ресурсоемкие, чем wu-ftpd. Но к сожалению, не предлагают набор расширенных функций, необходимых для более сложных FTP сайтов.
ProFTPD это безопасный FTP сервер разработанный с нуля, удобный и легко конфигурируемый. Очень много хорошо известных и высоконагруженных серверов используют ProFTPD.
Установка ProFTPD
Найдем нужный порт и установим его через portmaster.
# whereis proftpd proftpd: /usr/ports/ftp/proftpd # portmaster /usr/ports/ftp/proftpd
Либо через порты:
#cd /usr/ports/ftp/proftpd && make install clean
===> SECURITY REPORT:
This port has installed the following files which may act as network
servers and may therefore pose a remote security risk to the system.
/usr/local/libexec/proftpd/mod_snmp.so
/usr/local/sbin/proftpd
/usr/local/libexec/proftpd/mod_radius.so
/usr/local/bin/ftpdctl
This port has installed the following startup scripts which may cause
these network services to be started at boot time.
/usr/local/etc/rc.d/proftpd
If there are vulnerabilities in these programs there may be a security
risk to the system. FreeBSD makes no guarantee about the security of
ports included in the Ports Collection. Please type ‘make deinstall’
to deinstall the port if this is a concern.
For more information, and contact details about the security
status of this software, see the following webpage:
http://www.proftpd.org/
===>>> Installation of ftp/proftpd (proftpd-1.3.5b) complete
Установка завершена, перейдем к настройке.
Настройка ProFTPD
Посмотрим файл конфигурации, который создал установщик /usr/local/etc/proftpd.conf
# # For more information about Proftpd configuration # see http://www.proftpd.org/ # # This is a basic ProFTPD configuration file (rename it to # 'proftpd.conf' for actual use. It establishes a single server # and a single anonymous login. It assumes that you have a user/group # "nobody" and "ftp" for normal operation and anon. ServerName "ProFTPD Default Installation" ServerType standalone DefaultServer on ScoreboardFile /var/run/proftpd/proftpd.scoreboard # Port 21 is the standard FTP port. Port 21 # Use IPv6 support by default. UseIPv6 on # Umask 022 is a good standard umask to prevent new dirs and files # from being group and world writable. Umask 022 # To prevent DoS attacks, set the maximum number of child processes # to 30. If you need to allow more than 30 concurrent connections # at once, simply increase this value. Note that this ONLY works # in standalone mode, in inetd mode you should use an inetd server # that allows you to limit maximum number of processes per service # (such as xinetd). MaxInstances 30 CommandBufferSize 512 # Set the user and group under which the server will run. User nobody Group nogroup # To cause every FTP user to be "jailed" (chrooted) into their home # directory, uncomment this line. #DefaultRoot ~ # Normally, we want files to be overwriteable. AllowOverwrite on # Bar use of SITE CHMOD by default <Limit SITE_CHMOD> DenyAll </Limit> # A basic anonymous configuration, no upload directories. If you do not # want anonymous users, simply delete this entire <Anonymous> section. ######################################################################### # # # Uncomment lines with only one # to allow basic anonymous access # # # ######################################################################### #<Anonymous ~ftp> # User ftp # Group ftp ### We want clients to be able to login with "anonymous" as well as "ftp" # UserAlias anonymous ftp ### Limit the maximum number of anonymous logins # MaxClients 10 ### We want 'welcome.msg' displayed at login, and '.message' displayed ### in each newly chdired directory. # DisplayLogin welcome.msg # DisplayFirstChdir .message Limit WRITE everywhere in the anonymous chroot # <Limit WRITE> # DenyAll # </Limit> #</Anonymous>
По сути все должно уже работать с этим конфигом.
Запуск ProFTPD
В файл /etc/rc.conf добавляем строку
proftpd_enable="YES"
Запускаем без перезагрузки сервера сервис ProFTPD:
# service proftpd start
Вышла ошибка:
# service proftpd start Starting proftpd. 2016-12-19 11:26:14,483 srv01 proftpd[14406]: fatal: UseIPv6: Use of the UseIPv6 directive requires IPv6 support (--enable-ipv6) on line 19 of '/usr/local/etc/proftpd.conf' /usr/local/etc/rc.d/proftpd: WARNING: failed to start proftpd
Закомментировал строку:
# Use IPv6 support by default. # UseIPv6 on
Запустил заново, вышла ошибка:
# service proftpd start Starting proftpd. 2016-12-19 11:31:07,047 srv01 proftpd[14439]: warning: unable to determine IP address of 'srv01' 2016-12-19 11:31:07,047 srv01 proftpd[14439]: error: no valid servers configured 2016-12-19 11:31:07,047 srv01 proftpd[14439]: fatal: error processing configuration file '/usr/local/etc/proftpd.conf' /usr/local/etc/rc.d/proftpd: WARNING: failed to start proftpd
Имя сервера у меня srv01, добавляю в hosts
192.168.146.252 srv01
Теперь все успешно запустилось:
# service proftpd start Starting proftpd.
Перезапустить можно командой:
# service proftpd restart
Теперь можно на любом клиенте проверить доступ к серверу по следующему адресу (в адресной строке любого браузера набираете):
ftp://192.168.146.252/
Появляется запрос на вводи имени и пароля, вводите необходимые данные и попадаете в домашнюю папку пользователя.
Естественно вводите существующего пользователя системы FreeBSD 11.0
По сути вот мы и произвели простейшую настройку ФТП-сервера для использования в локальной сети.
Думаю надо остановиться на вопросах прописывания правил для файерволла ipfw, для того, чтобы открыть доступ снаружи к установленному фтп-серверу.
Русские символы в название файла
Проблема: на FreeBSD 11.0 установлена локаль UTF-8, при доступе к файлу, которые именован русскими буквами произошла ошибка.
Решение: добавил в конфигурационный файл следующие строки
<IfModule mod_lang.c> UseEncoding utf8 cp1251 </IfModule>
Полезные команды ProFTPD
Проверка правильности синтаксиса конфигурационного файла
# proftpd -t
Checking syntax of configuration file
Syntax check complete.
Проверка поддерживаемых модулей
# proftpd -l
Compiled-in modules:
mod_core.c
mod_xfer.c
mod_rlimit.c
mod_auth_unix.c
mod_auth_file.c
mod_auth.c
mod_ls.c
mod_log.c
mod_site.c
mod_delay.c
mod_facts.c
mod_dso.c
mod_ident.c
mod_auth_pam.c
mod_ctrls.c
mod_lang.c
Описание настроек ProFTPD
Все что написано выше, это простейшая конфигурация ProFTPD сервера. В реальной жизни может использоваться только в локальной сети.
К сожалению в жизни все не просто так. Начнем с того, что сам протокол FTP не является безопасным, поэтому используют различные ухищрения, чтобы его использование не дискредитировало вас и ваш сервер.
Начнем, будем создавать виртуальных ftp-пользователей. То есть они не имеют системной учетной записи в самой системе FreeBSD. Есть несколько вариантов хранения учетных записей виртуальных пользователей.
Предлагаю начать с использования альтернативного файла имен и паролей пользователей, также можно использовать базу данных MySQL.
Выполним начальные настройки, которые нам советуют сделать в дефолтном конфигурационном файле.
# To cause every FTP user to be "jailed" (chrooted) into their home # directory, uncomment this line. DefaultRoot ~ ServerIdent on "FTP Server ready."
Подготовительный этап
Создаем место для хранения файлов, я использую zfs поэтому производим следующие манипуляции:
# zfs list NAME USED AVAIL REFER MOUNTPOINT bootpool 121M 1,80G 121M /bootpool zroot 3,59G 888G 96K /zroot zroot/ROOT 1,58G 888G 96K none zroot/ROOT/default 1,58G 888G 1,58G / zroot/tmp 144K 888G 144K /tmp zroot/usr 2,01G 888G 96K /usr zroot/usr/home 136K 888G 136K /usr/home zroot/usr/ports 1,41G 888G 1,41G /usr/ports zroot/usr/src 608M 888G 608M /usr/src zroot/var 736K 888G 96K /var zroot/var/audit 96K 888G 96K /var/audit zroot/var/crash 96K 888G 96K /var/crash zroot/var/log 232K 888G 232K /var/log zroot/var/mail 120K 888G 120K /var/mail zroot/var/tmp 96K 888G 96K /var/tmp
Смотрим как сейчас, затем создаем файловую систему:
# zfs create zroot/data
Смотрим что получилось
# zfs list NAME USED AVAIL REFER MOUNTPOINT bootpool 121M 1,80G 121M /bootpool zroot 3,59G 888G 96K /zroot zroot/ROOT 1,58G 888G 96K none zroot/ROOT/default 1,58G 888G 1,58G / zroot/data 96K 888G 96K /zroot/data zroot/tmp 144K 888G 144K /tmp zroot/usr 2,01G 888G 96K /usr zroot/usr/home 136K 888G 136K /usr/home zroot/usr/ports 1,41G 888G 1,41G /usr/ports zroot/usr/src 608M 888G 608M /usr/src zroot/var 736K 888G 96K /var zroot/var/audit 96K 888G 96K /var/audit zroot/var/crash 96K 888G 96K /var/crash zroot/var/log 232K 888G 232K /var/log zroot/var/mail 120K 888G 120K /var/mail zroot/var/tmp 96K 888G 96K /var/tmp
Выделенным место для хранения файлов сервера фтп.
Можно назначить квоту, зарезервировать необходимое место и включить автоматическое сжатие хранимых данных. Команды ниже не обязательны, это опции. Если не понимаете, что они значат не выполняйте их, значит оно вам не нужно.
#Резервируем место под свою файловую систему
zfs set reservation=800m zroot/data
#Устанавливаем квоту для вашей файловой системы, которую вы не сможете превысить
zfs set quota=800m zroot/data
#Включаем компрессию.
zfs set compression=on zroot/data
Настройка доступа ftp-пользователей к директориям
Изменяем владельца директории /zroot/data (необходимо указать нужную группу и пользователя ниже)
Создаем сначала реального пользователя через adduser
# adduser Username: proftp Full name: Uid (Leave empty for default): Login group [proftp]: Login group is proftp. Invite proftp into other groups? []: Login class [default]: Shell (sh csh tcsh bash rbash nologin) [sh]: nologin Home directory [/home/proftp]: /zroot/data Home directory permissions (Leave empty for default): Use password-based authentication? [yes]: Use an empty password? (yes/no) [no]: Use a random password? (yes/no) [no]: Enter password: Enter password again: Lock out the account after creation? [no]: Username : proftp Password : ***** Full Name : Uid : 1002 Class : Groups : proftp Home : /zroot/data Home Mode : Shell : /usr/sbin/nologin Locked : no
Затем права папке присваиваем
# chown proftp:proftp /zroot/data
Выставляем права доступа к директории, иначе увидим permission denied
# chmod 775 /zroot/data
Теперь виртуальные пользователи могут создавать, редактировать и удалять файлы и папки.
Смотрим в файле /etc/passwd uid и gid созданного юзера, у меня вышло 1002
Сохраняем учетные записи виртуальных пользователей в текстовом файле
Необходимо, чтобы ftp-пользователь имел возможность редактировать и удалять файлы.
Создаем нового виртуального ftp-пользователя с логином ftpuser, идентификатором 1002, группой 1002 и домашним каталогом /data.
ftpasswd --passwd --file=/usr/local/etc/proftpd/ftpd.passwd --name=ftpuser --uid=1002 --gid=1002 --home=/zroot/data --shell=/usr/sbin/nologin
После выполнения команды система попросит ввести дважды пароль пользователя.
В итоге, у нас появится файл /usr/local/etc/proftpd/ftp.passwd с записью о пользователе.
Изменить пароль пользователя можно следующей командой:
ftpasswd --passwd --name=ftpuser --change-password
Изменяем /usr/local/etc/proftpd.conf, для подключения виртуального пользователя:
RequireValidShell off
AuthUserFile /usr/local/etc/proftpd/ftpd.passwd
Перезапускаем ftp-сервер:
service proftpd restart
Мониторинг работы ProFTPD
ftpcount — показывает число соединений в настоящий момент (с разбивкой по виртуальным хостам).
ftpwho — показывает информацию о каждом текущем соединении (—verbose показывает также текущую рабочую директорию).
ftptop — аналог программы top для процессов ProFTPD.
Настройка логов
Добавляем в /usr/local/etc/proftpd.conf
ExtendedLog /var/log/ftp.log TransferLog /var/log/proftpd SystemLog /var/log/proftpd/proftpd.log
Создаем необходимые файлы.
touch /var/log/ftp.log mkdir /var/log/proftpd touch /var/log/proftpd/xferlog touch /var/log/proftpd/proftpd.log
Выпускаем наружу FTP-сервер через шлюз с помощью NAT (ProFTPD)
Читаем документацию и пробуем.
Сначала добавляем строку в ваш конфигурационный файл proftpd.conf. Прописываем днс-имя или ip-адрес, в зависимости от того, как вы будете обращаться к серверу снаружи.
Добавляем директиву MasqueradeAddress
MasqueradeAddress ftp.mydomain.com # если используете DNS-имя MasqueradeAddress 123.45.67.89 # если используете IP-адрес
Естественно используете публичный адрес, а не локальный.
Существует одна большая проблема, дело в том что при пассивном режиме фтп используются порты от 1024 и выше, что означает , что вы должны направить все порты 1024-65535 от NAT к FTP-серверу. Скажем так, это не очень безопасно.
Для решения этой проблемы, используйте директиву PassivePorts
в вашем конфигурационном файле proftpd.conf, чтобы
контролировать , какие порты proftpd
будут использоваться для передачи данных в пассивном режиме:
PassivePorts 50000 50200 # Эти порты должны быть безопасными
Обратите внимание, что если сконфигурированный диапазон портов слишком мал, то соединенные клиенты могут испытывать задержки или даже не подключаться, когда они запрашивают подключение через пассивный режим передачи данных.
Перезапускаете proftpd сервер.
# service proftpd restart Stopping proftpd. Waiting for PIDS: 18273. Starting proftpd. 2016-12-22 11:20:09,680 srv01 proftpd[23575] srv01: 192.168.146.252:21 masquerading as 123.45.67.89
Увидите примерно такую же запись, которая приведена выше. С первой частью задания вы справились.
Настройка директории для хранения файлов proftpd.conf
<Directory ~> AllowOverwrite on AllowStoreRestart on <Limit Write> AllowAll </Limit> <Limit READ> AllowAll </Limit> </Directory>
Немного теории: принцип работы протокола FTP
Существует два режима работы протокола FTP:
- активный режим работы протокола FTP;
Это когда клиент соединяется на 21 порт сервера, затем сервер при необходимости создает DATA соединение с 20 порта на указанный порт клиента (от 1024 и выше). - пассивный режим работы;
Клиент соединяется на 21 порт сервера, затем клиент при необходимости создает DATA соединение на указанный порт сервера. Диапазон портов сервера для данного режима как раз прописывается в конфигурационном файле ProFTPD, параметр PassivePorts.
Клиенту удобнее использовать пассивный режим, а серверу удобнее использовать активный режим, так как проще настройка ipfw.
Правила IPFW для проброса FTP на внутренний сервер локальной сети
Для активного режима:
#NAT $ipfw nat 1 config log if $internet_interface reset same_ports deny_in \ redirect_port tcp 192.168.146.252:21 21 $ipfw add 00500 nat 1 ip from any to any via $internet_interface $ipfw add 00605 allow tcp from any to 192.168.146.252 21 setup $ipfw add 00606 allow tcp from me 20 to any setup (надо еще проверить, не забыть про параметр в /etc/sysctl.conf net.inet.ip.fw.one_pass=0 )
Для пассивного режима:
#NAT $ipfw nat 1 config log if $internet_interface reset same_ports deny_in \ redirect_port tcp 192.168.146.252:21 21 \ redirect_port tcp 192.168.146.252:50000-50200 50000-50200 $ipfw add 00500 nat 1 ip from any to any via $internet_interface
(проверено работает,net.inet.ip.fw.one_pass=0)
Полезные ссылки:
Bog BOS: FTP-сервер ProFTPD: установка, настройка и использование
Документация по ProFTPD (английский язык)
ProFTPD: Configuring FTP over SSH (англ.яз)
ProFTPD: Firewalls, Routers, and NAT (англ.яз)
Маленькие нюансы при установке и настройке ProFTPD (на базе FreeBSD)
SFTP, FTPS и тонкая настройка ProFTPD
https://kamaok.org.ua/?p=136