В этом выпуске заметок я покажу на практическом применении, как поднять 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

Настройки FileZilla для подключения через TLS

И нажимаю: OK, после снова открываю «Менеджер Сайтов», выбираю настроенное подключение и нажимаю «Соединиться», если подключение происходит первый раз, то появляется окно в котором выводится информация что для подключения нужно принять сертификат, отмечаю галочкой пункт «Всегда принимать сертификат в будущих сессиях» и нажимаю «ОК» – я успешно подключился вижу свой домашний каталог с именем user1

Подключение через TLS к FTP успешно.

Чтобы отключиться от 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.

От ekzorchik

Всем хорошего дня, меня зовут Александр. Я под ником - ekzorchik, являюсь автором всех написанных, разобранных заметок. Большинство вещей с которыми мне приходиться разбираться, как на работе, так и дома выложены на моем блоге в виде пошаговых инструкции. По сути блог - это шпаргалка онлайн. Каждая новая работа где мне случалось работать вносила новые знания и нюансы работы и соответственно я расписываю как сделать/решить ту или иную задачу. Это очень помогает. Когда сам разбираешь задачу, стараешься ее приподнести в виде структурированной заметки чтобы было все наглядно и просто, то процесс усвоения идет в гору. Также прошу на https://win.ekzorchik.ru https://lin.ekzorchik.ru https://net.ekzorchik.ru https://voip.ekzorchik.ru https;//home.ekzorchik.ru