нестандартная настройка proftpd
нестандартная настройка proftpd
нестандартная настройка proftpd
Введение
Навыки:
Опыт работы в компании с более 150 пользователей
Установка, настройка и администрирование Debian, Ubuntu
...
...
...
Администрирование ftp сервера: vsftpd
Не знаю как кто относится к подобным фразам, но у меня они вызывают лишь улыбку. Но в
случае с profptd, особенно зная его широкий функционал, я бы сказал, что его смело можно
указывать в резюме, если речь конечно не о типовой конфигурации - тривиальная настройка
ftp сервера.
Итак, что же такое proftpd? Как я уже говорил выше, пожалуй один из самых «мощных» и
продвинутых ftp серверов. Правда у этой медали есть и обратная сторона - в нем чаще, чем в
других ftp серверах находят уязвимости. Поэтому, если вы используете его на боевых
серверах, то необходимо следить за обновлениями.
wiki.sys-adm.org.ua - http://www.sys-adm.org.ua/
Last update: 2016/06/16 16:40 www:proftpd http://www.sys-adm.org.ua/www/proftpd
доступны следующие модули: MySQL/PQSQL, LDAP, SSL/TLS, SFTP, PAM, RADIUS, квоты и
многое другое.
Итак, почему я назвал статью нестандартная настройка? Потому что у нас ftp сервер по сути
будет выполнять 3 функции
1. ftp сервер на стандартном 21 порту, будет обслуживать программу для снимков экрана.
Так как программа была написана очень давно и понимает только ftp и только на
стандартному порту.
2. sftp сервер с поддержкой системных пользователей. Используется для разработчиков.
3. ftps сервер с аутентификацией в LDAP. Используется front-end разработчиками для
проверки html/ssi.
Установить сам proftpd вы можете любым удобным для вас способом, но в CentOS 6 к
сожалению в репозитариях идет старая версия 1.3.3g-4.el6, к тому же в ней нет поддержки
TLS. Но это не проблема, в составе тарбола самого proftpd идет spec файл, так что все, что нам
нужно - это собрать пакет с нужными нам опциями.
# wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.5a.tar.gz
# rpmbuild -ta --target=x86_64 --with ldap --with mysql --with pcre --with
ssl --with wrap proftpd-1.3.5.tar.gz
Building target platforms: x86_64
Building for target x86_64
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.HmqOvI
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd /root/rpmbuild/BUILD
+ rm -rf proftpd-1.3.4e
+ /bin/tar -xf -
...
...
...
Wrote: /root/rpmbuild/SRPMS/proftpd-1.3.5-0.1.a.el6.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/proftpd-1.3.5-0.1.a.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/proftpd-ldap-1.3.5-0.1.a.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/proftpd-mysql-1.3.5-0.1.a.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/proftpd-wrap-1.3.5-0.1.a.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/proftpd-devel-1.3.5-0.1.a.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/proftpd-utils-1.3.5-0.1.a.el6.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/proftpd-
debuginfo-1.3.5-0.1.a.el6.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.1ngMCo
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd proftpd-1.3.5a
+ rm -rf /root/rpmbuild/BUILDROOT/proftpd-1.3.5-0.1.a.el6.x86_64
+ rm -rf /root/rpmbuild/BUILD/proftpd-1.3.5
+ exit 0
# cd /root/rpmbuild/RPMS/x86_64/
# rpm -ivh proftpd-1.3.5-0.1.a.el6.x86_64.rpm proftpd-
utils-1.3.5-0.1.a.el6.x86_64.rpm proftpd-ldap-1.3.5-0.1.a.el6.x86_64.rpm
proftpd-devel-1.3.5-1.el6.x86_64.rpm
proftpd-mysql-1.3.5-1.el6.x86_64.rpm
proftpd-wrap-1.3.5-1.el6.x86_64.rpm
Несколько комментариев к данному файлу. Все, что касается описания виртуальных хостов и
их характеристик я специально вынес в отдельные файлы, которые располагаются в
/etc/proftpd/conf.d/. Это сделано специально, чтобы основной конфигурационный файл было
удобно читать и он не загромождался описанием виртуальных хостов. Примерно также
принято делать и в apache/nginx. Т.е. здесь мы описываем глобальные переменные и
поведение сервера в целом, а уже в конкретном виртуальном хосте - конкретизируем эти
требования.
ServerAdmin root@localhost
ServerType standalone
AccessGrantMsg "User %u logged in."
<IfModule mod_auth_pam.c>
AuthPAMConfig proftpd
</IfModule>
wiki.sys-adm.org.ua - http://www.sys-adm.org.ua/
Last update: 2016/06/16 16:40 www:proftpd http://www.sys-adm.org.ua/www/proftpd
# Указываем какие версии протокола можно использовать при шифровании канала в ftps
режиме
<IfModule mod_tls.c>
# TLSv1.1 TLSv1.2 будет работать только в 1.3.5+. В 1.3.4 можно указывать только
TLSv1
TLSProtocol TLSv1 TLSv1.1 TLSv1.2
</IfModule>
<IfDefine VHOST2_2121>
Include /etc/proftpd/conf.d/vhost2_2121.conf
</IfDefine>
<IfDefine VHOST3_3333>
Include /etc/proftpd/conf.d/vhost3_3333.conf
</IfDefine>
<IfDefine VHOST4_4444>
Include /etc/proftpd/conf.d/vhost4_4444.conf
</IfDefine>
# Глобальные переменные
<Global>
RequireValidShell off
AllowOverwrite yes
DenyFilter \*.*/
<Limit SITE_CHMOD>
DenyAll
</Limit>
</Global>
# Включаем логирование
LogFormat default "%h %l %u %t \"%r\" %s %b"
LogFormat auth "%v [%P] %h %t \"%r\" %s"
ExtendedLog /var/log/proftpd/access.log read,write
# cat /etc/sysconfig/proftpd
PROFTPD_OPTIONS="-DVHOST1_21 -DVHOST2_2121 -DVHOST3_3333 -DVHOST4_4444"
wiki.sys-adm.org.ua - http://www.sys-adm.org.ua/
Last update: 2016/06/16 16:40 www:proftpd http://www.sys-adm.org.ua/www/proftpd
VHOST1: protocol - FTP, port - 21, auth - plain file (virtual users)
А теперь опишем первый виртуальный хост. Так как это будет чистый ftp и использоваться он
будет только одной программой, то нет смысла заводить системного пользователя. Вместо
этого мы будем использовать виртуальных пользователей. Данные о самом пользователе
будут храниться в обычном текстовом файле.
Password:
Re-type password:
# cat /etc/proftpd/virtual_users.passwd
screen:$6$Vs7rWzTNHOp4JNCW$bvB7i5bd.t.lVEhXmn5J/0/LbtKcX6bMV352t4jULazNpZLhb
jqNjR/zxx8Fzjuse83lgplE7PFR9mjzVJHGw1:99:99::/vhosts/screen.example.net:/sbi
n/nologin
###
# /etc/proftpd/conf.d/vhost1_default_21.conf
###
<VirtualHost screen.example.net>
# Задаем общие настройки виртуального хоста
ServerName "FTP: Screenshots."
DefaultRoot ~
DefaultServer on
Umask 002
Port 21
доверие"
AuthOrder mod_auth_file.c*
# А здесь мы указываем путь к файлу, который мы создали перед этим. Именно на основании
его содержимого
# и будет производиться аутентификация. Так же задаем дополнительное ограничение,
домашний каталог
# пользователя должен быть /vhosts/screen.example.net/. Так же можно ограничить и
имя пользователя
AuthUserFile /etc/proftpd/virtual_users.passwd home
^/vhosts/screen.example.net$
Второй виртуальный хост используется разработчиками, для тестирования различных CMS. Тут
как бы все просто.
###
# /etc/proftpd/conf.d/vhost2_2121.conf
###
<VirtualHost sftp.example.net>
# Задаем общие настройки виртуального хоста
ServerName "SFTP: Staging."
DefaultRoot ~
Umask 002
Port 2121
wiki.sys-adm.org.ua - http://www.sys-adm.org.ua/
Last update: 2016/06/16 16:40 www:proftpd http://www.sys-adm.org.ua/www/proftpd
У FTPS есть два режима работы - explicit и implicit. Если производить аналогии с smtp, то в
первом случае мы будем использовать некий аналог starttls, чтобы указать серверу, что
необходимо шифрование. Во втором случае мы явно должны установить шифрованный тунель
и лишь потом производить любой обмен данными. Для включения implicit режима в TLSOptions
необходимо добавить UseImplicitSSL.
ftpes://user:[email protected]:port/
ftps://user:[email protected]:port/
Однозначно сложно сказать, какой из режимов лучше использовать. Тут придется пробовать,
многое будет зависеть от ftp клиентов, но implicit режим считается устаревшим.
###
# /etc/proftpd/conf.d/vhost3_3333.conf
###
<VirtualHost ftps.example.net>
# Задаем общие настройки виртуального хоста
ServerName "FTPES: SSI."
DefaultRoot ~
Umask 002
Port 3333
# Включаем шифрование
<IfModule mod_tls.c>
# Включаем поддержку TLS
TLSEngine on
TLSLog /var/log/proftpd/tls.log
wiki.sys-adm.org.ua - http://www.sys-adm.org.ua/
Last update: 2016/06/16 16:40 www:proftpd http://www.sys-adm.org.ua/www/proftpd
TLSRSACertificateKeyFile /etc/pki/proftpd/ftps.example.net.key
TLSCipherSuite
kEECDH+AES128:kEECDH:kEDH:-3DES:kRSA+AES128:kEDH+3DES:DES-CBC3-
SHA:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SS
Lv2
</IfModule>
# 99/99 - nobody/nobody
LDAPDefaultUID 99
LDAPDefaultGID 99
Так как пользователей в LDAP более 500, то функция автоматического создания home
директории при первом заходе - очень удобная и сильно облегчает жизнь администратору.
Даже казалось бы такой сложный и «странный» сервис можно настроить средствами ProFTPD.
За этого я его и люблю и мирюсь с относительно частыми проблемами безопасности. Это как
раз тот случай, когда за функционал приходится платить.
###
# /etc/proftpd/conf.d/vhost4_4444.conf
###
<VirtualHost backup.example.net>
ServerName "SFTP: Backup server. Public key auth only!"
DefaultRoot ~
Umask 002
Port 4444
RootRevoke on
SFTPHostKey /etc/ssh/ssh_host_rsa_key
SFTPHostKey /etc/ssh/ssh_host_dsa_key
# Путь к файлу с DH параметрами (Diffie-Hellman)
SFTPDHParamFile /etc/pki/proftpd/dhparam_2048.pem
# Здесь у нас будут храниться открытые ключи пользователей в формате RFC4716
SFTPAuthorizedUserKeys file:/etc/proftpd/sftp_authorized_keys
# Здесь мы описываем нашего единственного пользователя
AuthUserFile /etc/proftpd/sftp_users.passwd home ^/vhosts/backup/
SFTPCompression delayed
# Разрешаем проходить аутентификацию только по открытому ключу
SFTPAuthMethods publickey
wiki.sys-adm.org.ua - http://www.sys-adm.org.ua/
Last update: 2016/06/16 16:40 www:proftpd http://www.sys-adm.org.ua/www/proftpd
динамически
# задаем домашнюю директорию для пользователя. Таким образом нет необходимости
создавать
# запись в файле sftp_users.passwd для каждого пользователя. Достаточно лишь
добавить его
# открытый ключ в файл sftp_authorized_keys.
<IfModule mod_rewrite.c>
# Включаем возможность перезаписи домашней директории
RewriteHome on
# mkdir /etc/pki/proftpd/
# openssl dhparam -out /etc/pki/proftpd/dhparam_2048.pem 2048
Думаю очевидно, что такое 99. Но в принципе вам никто не запрещает создать специального
пользователя для этих целей.
# id nobody
uid=99(nobody) gid=99(nobody) groups=99(nobody)
# mkdir -p /vhosts/backup/
# chmod -R 700 /vhosts/backup/
# chown -R nobody:nobody /vhosts/backup/
Тестирование
# ftp 192.168.127.1 21
Connected to 192.168.127.1 (192.168.127.1).
220 ProFTPD 1.3.5 Server (FTP: Screenshots.) [::ffff:192.168.127.1]
Name (192.168.127.1:root): screen
331 Password required for screen
Password: *******
230 User screen logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,127,1,137,204).
150 Opening ASCII mode data connection for file list
226 Transfer complete
wiki.sys-adm.org.ua - http://www.sys-adm.org.ua/
Last update: 2016/06/16 16:40 www:proftpd http://www.sys-adm.org.ua/www/proftpd
ftp> ls
227 Entering Passive Mode (192,168,127,1,230,34).
150 Opening ASCII mode data connection for file list
-rw-rw-r-- 1 nobody nobody 588 Apr 7 11:38 smart.txt
226 Transfer complete
ftp> quit
221 Goodbye.
Как видно, все работает именно так, как мы и планировали. Если запустить proftpd в режиме
отладки, смотри ниже, то мы увидим следующие строки
При этом, если мы попробуем зайти под любым другим пользователем, даже который есть в
файле /etc/proftpd/virtual_users.passwd, то в логах мы увидим подобные строки
sftp> lpwd
Local working directory: /home/borodach
http://www.sys-adm.org.ua/ Printed on 2019/05/12 00:45
2019/05/12 00:45 15/20 Нестандартная настройка proftpd
sftp> pwd
Remote working directory: /
sftp> ls
smart.txt
sftp> rm smart.txt
Removing /smart.txt
sftp> quit
Думаю, тут все предельно просто и ясно. Для удобства быстрого доступа пользователей через
FileZilla, в описании проекта я генерирую ссылку быстрого доступа, которая имеет следующий
вид:
sftp://borodach:[email protected]:2121/
wiki.sys-adm.org.ua - http://www.sys-adm.org.ua/
Last update: 2016/06/16 16:40 www:proftpd http://www.sys-adm.org.ua/www/proftpd
И последний виртуальный хост - FTPS (explicit). Строка быстрого подключения для FileZilla
будет выглядеть
ftpes://borodach:[email protected]:3333/
BAC14CEF8249A16BF580
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
Start Time: 1428414903
Timeout : 7200 (sec)
Verify return code: 21 (unable to verify the first certificate)
---
220 ProFTPD 1.3.5 Server (FTPES: SSI.) [::ffff:192.168.127.1]
user borodach
331 Password required for borodach
pass 7654321
230 User borodach logged in
quit
221 Goodbye.
read:errno=0
Для тестирование нашего последнего виртуального хоста лучше использовать FileZilla или
любой другой клиент с поддержкой SFTP протокола. Итак, подключаемся с ключом первого
пользователя.
wiki.sys-adm.org.ua - http://www.sys-adm.org.ua/
Last update: 2016/06/16 16:40 www:proftpd http://www.sys-adm.org.ua/www/proftpd
Отладка Proftpd
В proftpd реализован удобный режим отладки, так что если у вас что либо не работает, или сам
демон не запускается, то советую запускать в режиме отладки, примерно таким образом
# proftpd -n -d 3 -DVHOST1_21
2015-04-07 06:27:25,490 ftp.example.net proftpd[8588]: using PCRE 7.8
2008-09-05
2015-04-07 06:27:25,494 ftp.example.net proftpd[8588]: mod_ldap/2.9.4:
compiled using LDAP vendor 'OpenLDAP', LDAP API version 3001
2015-04-07 06:27:25,494 ftp.example.net proftpd[8588]: mod_sftp/0.9.9: using
wiki.sys-adm.org.ua - http://www.sys-adm.org.ua/
Last update: 2016/06/16 16:40 www:proftpd http://www.sys-adm.org.ua/www/proftpd
Если вам не хватает 3го уровня информативности, т.е. не видно причину ошибки, то можно
увеличить уровень информативности вплоть до 10.
From:
http://www.sys-adm.org.ua/ - wiki.sys-adm.org.ua
Permanent link:
http://www.sys-adm.org.ua/www/proftpd