В этом выпуске заметок я покажу на практическом применении, как поднять FTP ресурс задействовав лишь один конфигурационный файл — да есть и такое имя ему: ProFTPd. Вообще если честно без разница какое программное обеспечение использовать, а главное чтобы Вы с ним уже работали и имели разносторонние взгляды на решение Вашей поставленной задачи. И вот сейчас заметка для себя, но ведь она также может и пригодиться Вам. Все рассматриваемые действия ниже ориентированы на Ubuntu Trusty самой последней версии и с последними обновлениями на момент данной заметки.
Текущая система:
ekzorchik@srv-host:~$ uname -a && lsb_release -a
Linux srv-host 4.4.0-51-generic #72~14.04.1-Ubuntu SMP Thu Nov 24 19:22:30 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.5 LTS
Release: 14.04
Codename: trusty
Настраиваю правильный часовой пояс на системе в рамках моего текущего месторасположения:
ekzorchik@srv-host:~$ sudo rm -f /etc/localtime
ekzorchik@srv-host:~$ sudo ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime
Устанавливаю утилиту proftpd из дефолтных репозитариев Ubuntu Trusty:
ekzorchik@srv-host:~$ sudo apt-get install proftpd -y
Run proftpd: standalone
Всегда делаю бекап дефолтного конфигурационного файла и на его основе создаю свой:
ekzorchik@srv-host:~$ sudo mv /etc/proftpd/proftpd.conf{,.backup}
ekzorchik@srv-host:~$ sudo cp /etc/proftpd/proftpd.conf.backup /etc/proftpd/proftpd.conf
ekzorchik@srv-host:~$ sudo nano /etc/proftpd/proftpd.conf
Include /etc/proftpd/modules.conf
# Отключаем использование протокола IPv6
UseIPv6 off
IdentLookups off
# Имя FTP-сервера
ServerName "srv-host"
# Режим запуска FTP-сервера
ServerType standalone
DeferWelcome off
MultilineRFC2228 on
DefaultServer on
ShowSymlinks on
# Таймаут на передачу: вошел и не начал передачу выраженное в мили секундах
TimeoutNoTransfer 600
# Подвисание во время передачи файлов выраженное в мили секундах
TimeoutStalled 600
# Таймаут бездействия после входа выраженное в мили секундах
TimeoutIdle 1200
DisplayLogin welcome.msg
DisplayChdir .message true
ListOptions "-l"
# Запретить закачивать файлы, начинающиеся на точку
DenyFilter \*.*/
DefaultRoot ~
AuthUserFile /etc/proftpd/ftpd.passwd
Port 21
# запрещаем подключать от имени суперпользователя
RootLogin off
PassivePorts 49152 65534
<IfModule mod_dynmasq.c>
</IfModule>
# Максимальное количество дочерних процессов
MaxInstances 30
# Пользователь и группа, под которой работает демон
User proftpd
Group nogroup
# маска для ограничения создания директорий и файлов
Umask 022 022
# Разрешить перезаписывать существующие файлы
AllowOverwrite on
DebugLevel 10
TransferLog /var/log/proftpd/xfer.log
SystemLog /var/log/proftpd/proftpd.log
ExtendedLog /var/log/proftpd/auth.log AUTH auth
SetEnv TZ :/etc/localtime
<IfModule mod_quotatab.c>
QuotaEngine off
</IfModule>
<IfModule mod_ratio.c>
Ratios off
</IfModule>
<IfModule mod_delay.c>
DelayEngine on
</IfModule>
<IfModule mod_ctrls.c>
ControlsEngine off
ControlsMaxClients 2
ControlsLog /var/log/proftpd/controls.log
ControlsInterval 5
ControlsSocket /var/run/proftpd/proftpd.sock
</IfModule>
<IfModule mod_ctrls_admin.c>
AdminControlsEngine off
</IfModule>
Include /etc/proftpd/tls.conf
Include /etc/proftpd/conf.d/
(Если нужно вывести содержимое конфигурационного файла без символов комментария: ekzorchik@srv-host:~$ grep -v -E "^#" /etc/proftpd/proftpd.conf
)
Запретить тем учетным записям которые Вы бы не хотели чтобы имели возможность подключаться к текущего разворачиваемому FTP сервису можно путем внесения их логина в данный файл:
ekzorchik@srv-host:~$ sudo bash -c "cat /etc/ftpusers | head -n 5"
# /etc/ftpusers: list of users disallowed FTP access. See ftpusers(5).
root
daemon
bin
Запускаю сервис proftpd:
ekzorchik@srv-host:~$ sudo service proftpd start
* Starting ftp server proftpd [ OK ]
ekzorchik@srv-host:~$ sudo service proftpd status
ProFTPD is started in standalone mode, currently running.
ekzorchik@srv-host:~$ sudo netstat -tlpn | grep proftpd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 2094/proftpd:
Теперь проверяю, как работает данный FTP сервис, вот только по дефолту подключившись к нему под текущей учетной записью я попадаю в собственный каталог /home:
ekzorchik@srv-host:~$ ftp localhost 21
Connected to localhost.
220 ProFTPD 1.3.5rc3 Server (srv-host) [127.0.0.1]
Name (localhost:ekzorchik): ekzorchik
331 Password required for ekzorchik
Password: 712mbddr@
230 User ekzorchik logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful
150 Opening ASCII mode data connection for file list
-r-xr-xr-x 1 root root 8099276 Oct 4 19:08 VBoxLinuxAdditions.run
226 Transfer complete
ftp> quit
221 Goodbye.
Одно можно с уверенностью сказать, FTP сервис поднимается очень легко, но теперь нужно усложнить задачу, а именно создать пользователей данного ресурса и ограничить их только своими каталогами.
ekzorchik@srv-host:~$ sudo mkdir -p /var/www/ftp
(Добавить строку после всех имеющихся)
ekzorchik@srv-host:~$ sudo nano /etc/shells
/bin/false
ekzorchik@srv-host:~$ sudo service proftpd restart
ekzorchik@srv-host:~$ id ftp
uid=106(ftp) gid=65534(nogroup) groups=65534(nogroup)
ekzorchik@srv-host:~$ id www-data
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Теперь создаем виртуального пользователя развернутого FTP ресурса:
ekzorchik@srv-host:~$ sudo mkdir /var/www/ftp/user1
ekzorchik@srv-host:~$ sudo ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=wp --shell=/bin/false --home=/var/www/ftp/user1 --uid=107 --gid=33
ftpasswd: using alternate file: /etc/proftpd/ftpd.passwd
ftpasswd: creating passwd entry for user wp
# сервер должен попросить нас ввести пароль (дважды), который он зашифрует и сохранит в файле /etc/proftpd/ftpd.passwd
Password: Aa1234567
Re-type password: Aa1234567
ftpasswd: entry created
Теперь посмотрим содержимое файла где хранится пароль виртуального пользователя:
ekzorchik@srv-host:~$ sudo bash -c "cat /etc/proftpd/ftpd.passwd"
wp:$1$WPY5dl6H$cAwGEjHWXc.pJSsKHCcrX/:107:33::/var/www/ftp/user1:/bin/false
ekzorchik@srv-host:~$ sudo chown -R 107:33 /var/www/ftp/user1/
ekzorchik@srv-host:~$ ls -l /var/www/ftp/
total 4
drwxr-xr-x 2 107 www-data 4096 Dec 4 16:53 user1
ekzorchik@srv-host:~$ sudo service proftpd stop
ekzorchik@srv-host:~$ sudo service proftpd start
Проверяю, как я смогу зайти под созданным пользователем на FTP ресурс:
ekzorchik@srv-host:~$ ftp localhost 21
Connected to localhost.
220 ProFTPD 1.3.5rc3 Server (srv-host) [127.0.0.1]
Name (localhost:ekzorchik): wp
331 Password required for wp
Password:
530 Login incorrect.
Login failed.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> quit
221 Goodbye.
А в логах сервиса наблюдаю следующие ошибки, видно что у сервиса нет доступа в файле где обозначены логин и пароль виртуального пользователя:
ekzorchik@srv-host:~$ sudo tail -f /var/log/proftpd/proftpd.log
2016-12-04 16:59:00,717 srv-host proftpd[2330] srv-host (localhost[127.0.0.1]): error: unable to open passwd file '/etc/proftpd/ftpd.passwd': Permission denied
2016-12-04 16:59:00,717 srv-host proftpd[2330] srv-host (localhost[127.0.0.1]): USER wp: no such user found from localhost [127.0.0.1] to 127.0.0.1:21
ekzorchik@srv-host:~$ sudo chmod 440 /etc/proftpd/ftpd.passwd
ekzorchik@srv-host:~$ sudo chown proftpd.root /etc/proftpd/ftpd.passwd
ekzorchik@srv-host:~$ sudo service proftpd start
* Starting ftp server proftpd [ OK ]
ekzorchik@srv-host:~$ sudo netstat -tulpn | grep :21
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 2531/proftpd:
ekzorchik@srv-host:~$ ftp localhost 21
Connected to localhost.
220 ProFTPD 1.3.5rc3 Server (srv-host) [127.0.0.1]
Name (localhost:ekzorchik): wp
331 Password required for wp
Password:
230 User wp logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful
150 Opening ASCII mode data connection for file list
226 Transfer complete
ftp> pwd
257 "/user1" is the current directory
Вот теперь подключение под виртуальным пользователем прошло успешно и его каталог есть обозначенный user1, только вот что плохо, что пользователь может покинуть его и посмотреть какие каталоги есть еще:
ftp> cd /
250 CWD command successful
ftp> ls
200 PORT command successful
150 Opening ASCII mode data connection for file list
drwxr-xr-x 2 wp www-data 4096 Dec 4 13:53 user1
226 Transfer complete
ftp> pwd
257 “/” is the current directory
ftp> mkdir user2
550 user2: Permission denied
Ладно с этим я еще побадаюсь, я ведь пока изучаю как работает данный ftp сервис, а потому могу совершать непростительные ошибки настройки.
Решение: чтобы виртуальный пользователь FTP ресурса был ограничен только своим домашним каталогом нужно:
ekzorchik@srv-host:~$ sudo nano /var/www/ftp/user1/.ftpaccess
<Limit READ WRITE DIRS>
Order deny,allow
Allowuser wp
</Limit>
Так, а теперь еще усложним задачу, нужно чтобы только через безопасное (TLS/SSL) подключение был доступ на FTP ресурс:
ekzorchik@srv-host:~$ sudo mkdir /etc/ssl/proftpd
ekzorchik@srv-host:~$ sudo openssl req -x509 -days 3650 -nodes -newkey rsa:4096 -keyout /etc/ssl/proftpd/proftpd.key -out /etc/ssl/proftpd/proftpd.crt
Generating a 4096 bit RSA private key
Common Name (e.g. server FQDN or YOUR name) []:192.168.1.153
ekzorchik@srv-host:~$ sudo chmod 600 /etc/ssl/proftpd/proftpd.key
ekzorchik@srv-host:~$ sudo nano /etc/proftpd/proftpd.conf
# Диапазон пассивных портов
PassivePorts 49152 65534
Include /etc/proftpd/tls.conf
ekzorchik@srv-host:~$ sudo nano /etc/proftpd/tls.conf
<IfModule mod_tls.c>
TLSEngine on
TLSLog /var/log/proftpd/tls.log
TLSProtocol TLSv1.2
TLSCipherSuite ALL:!ADH:!DES
TLSOptions NoCertRequest AllowClientRenegotiations
TLSRSACertificateFile /etc/ssl/proftpd/proftpd.crt
TLSRSACertificateKeyFile /etc/ssl/proftpd/proftpd.key
TLSVerifyClient off
#Only TLS and non-TLS connection
#TLSRequired on
#Only non-TLS connection
TLSRequired off
RequireValidShell no
</IfModule>
ekzorchik@srv-host:~$ sudo nano /etc/default/proftpd
CONFIG_FILE=/etc/proftpd/proftpd.conf
RUN="yes"
OPTIONS="-DTLS"
ekzorchik@srv-host:~$ sudo service proftpd stop
* Stopping ftp server proftpd [ OK ]
ekzorchik@srv-host:~$ sudo service proftpd start
* Starting ftp server proftpd
ekzorchik@srv-host:~$ sudo netstat -tlpn | grep proftpd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 2726/proftpd:
Теперь если пытаться подключиться как обычно, просто на 21 порт сервис ответит ошибкой, что так нельзя и он работает только если задействовать TLS:
ekzorchik@srv-host:~$ ftp localhost 21
Connected to localhost.
220 ProFTPD 1.3.5rc3 Server (srv-host) [127.0.0.1]
Name (localhost:ekzorchik): wp
550 SSL/TLS required on the control channel
Login failed.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
Проверяю возможность подключения по зашифрованному соединению из своей рабочей станции под управлением Ubuntu 12.04.5 Precise Desktop Gnome Classic amd64 ноутбука Lenovo ThinkPad E555 посредством устанавливаемого клиента Filezilla:
ekzorchik@navy:~$ sudo apt-get install filezilla -y
Приложения — Интернет — FileZilla — Файл — Менеджер Сайтов — Новый сайт :
вкладка Общие:
- Хост: 192.168.1.153
- Protocol: FTP — File Transfer Protocol
- Encryption: Require explicit FTP over TLS
- Тип входа: Нормальный
- Пользователь: wp
- Пароль: Aa1234567
И нажимаю: OK, после снова открываю «Менеджер Сайтов», выбираю настроенное подключение и нажимаю «Соединиться», если подключение происходит первый раз, то появляется окно в котором выводится информация что для подключения нужно принять сертификат, отмечаю галочкой пункт «Всегда принимать сертификат в будущих сессиях» и нажимаю «ОК» – я успешно подключился вижу свой домашний каталог с именем user1
Чтобы отключиться от FTP сервера: FileZilla — Сервер — Разъединить.
Итак я разобрал для себя как поднять FTP сервис воспользовавшись приложением proftpd, а также как подключаться к нему через сертификат. Это дает мне защиту от перехвата пароля и производимых действий, что еще может быть нужно.
Проверил все выше указанное еще раз — работает, создал пользователя дал ему права подключился вообще все.
Теперь другая задача как настроить безопасность данного FTP ресурса.
- 1) Сменить дефолтный порт на выше 1024
- 2) Прекратить болтливость SSH сервиса на сервере:
ekzorchik@srv-host:~$ sudo nano /etc/ssh/sshd_config
DebianBanner no
а также все возможная защита SSH сервиса: опубликую чуть позже.
ekzorchik@srv-host:~$ sudo service ssh restart
ekzorchik@navy:~$ sudo nmap -T4 -A 192.168.1.153 -p 22
22/tcp open ssh OpenSSH 6.6.1p1 (protocol 2.0)
- 3) Включить доступ к FTP ресурсу только через TLS
- 4) Задействовать UFW только порт сервиса SSH & ProFTPD
- 5) Прекратить болтливость FTP ресурса о своей версии и по:
ekzorchik@srv-host:~$ ftp localhost 21
Connected to localhost.
220 ProFTPD 1.3.5rc3 Server (srv-host) [127.0.0.1]
Нужно в /etc/proftpd/proftpd/proftpd.conf добавить следующий параметр:
ServerIdent Off
ekzorchik@srv-host:~$ sudo service proftpd stop && sudo service proftpd start
ekzorchik@srv-host:~$ sudo netstat -tulpn | grep proftpd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 3496/proftpd:
ekzorchik@srv-host:~$ ftp 192.168.1.153 21
Connected to 192.168.1.153.
220 192.168.1.153 FTP server ready
Name (192.168.1.153:ekzorchik): wp1
331 Password required for wp1
Password:
230 User wp1 logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> quit
221 Goodbye.
Вот уже лучше, а если просканировать данный хост с другой станции сетевым сканером nmap:
ekzorchik@navy:~$ sudo nmap -T4 -A 192.168.1.153 -p 21
PORT STATE SERVICE VERSION
21/tcp open ftp ProFTPD
Отлично версия не передается. Заметка завершена и работоспособна. Вот так вот я обычно и поступаю, сперва по поставленной задаче формирую заметку, рассматривая в ней интересуемые мне задачи, а уже после применяю ее на боевом использовании. Окунаться в боевое использование без подготовки это не мое, как и решать проблемы наскоком, я люблю осторожность и полное владение вверенной инфраструктурой. А пока я прощаюсь с Вами читатели моего блога, до новых заметок, с уважением автор блога Олло Александр aka ekzorchik.