С чего такой интерес к ProFTPD? Дело в том, что раз я пока на удаленке, то мне дают не просто задачи от пользователей, а либо проработать бесшовную работу различных сервисов, как организовать бекап и восстановление + уведомления, но и разобраться с порталами компании. И вот один из порталов и проработал как уйти со связки CentOS 7 Docker (Traefik + Portainer + Site) в пользу того, в чем я профи — это Ubuntu 18.04 Server. Я сделал это, я выложу на блог данную заметку может кто подчерпнет нюансы с которыми столкнулся. От предыдущего системного Администратора Кочеткова Александра я получал лишь одно «я не помню, давно было, надо смотреть». Но я не такой, я разберусь и разобрался. После от моего руководителя последовала задача развернуть сервис FTP на доступ к порталу с возможностью записи и быть ограниченным лишь каталогом сайта, по-сути как было в Docker. И вот родилась данная заметка.

Большая часть шагов и действия опирается на ранее разобранные заметки:

Схема которую я хочу реализовать

FTP

    • (nginx:sites-enabled)
      • доступ к этому сайту должны иметь виртуальные FTP пользователи со своими логинами и паролями
      • доступ ограничен только каталогом сайта
      • доступ к каталогу сайта с правами чтения и записи

Шаг №1: Подготавливаю систему Ubuntu 18.04 Server к последующему использованию в рамках текущей заметки:

ekzorchik@srv-bionic:~$ hg clone --insecure https://ekzorchik@172.35.35.8/hg/dproject

ekzorchik@srv-bionic:~$ sudo ./dproject/default

Шаг №2: Устанавливаю Webсервис nginx:

ekzorchik@srv-bionic:~$ sudo apt-get install -y nginx

Шаг №3: Устанавливаю приложение Proftpd on Ubuntu 18.04 Server

ekzorchik@srv-bionic:~$ apt-cache show proftpd-basic | grep Version

Version: 1.3.5e-1build1

ekzorchik@srv-bionic:~$ sudo apt-get install -y proftpd-basic

Шаг №4: Создаю свой конфигурационный файл на основе дефолтных настроек с учетом моих требований.

ekzorchik@srv-bionic:~$ sudo rm /etc/proftpd/proftpd.conf

ekzorchik@srv-bionic:~$ sudo nano /etc/proftpd/proftpd.conf

Include /etc/proftpd/modules.conf

# Отключаем использование протокола IPv6

UseIPv6 off

IdentLookups off

# Имя FTP-сервера

ServerName "srv-bionic"

# Режим запуска 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/

Шаг №5: Создаю файл в котором будут указаны виртуальные учетные записи ftp и их пароли в зашифрованном виде:

ekzorchik@srv-bionic:~$ sudo touch /etc/proftpd/ftpd.passwd

ekzorchik@srv-bionic:~$ sudo chmod 440 /etc/proftpd/ftpd.passwd

ekzorchik@srv-bionic:~$ sudo chown proftpd.root /etc/proftpd/ftpd.passwd

Шаг №6: Чтобы нельзя было подключаться к данному FTP сервису под указанными пользователями перечисляем их:

ekzorchik@srv-bionic:~$ sudo bash -c "cat /etc/ftpusers | head -n 5"

# /etc/ftpusers: list of users disallowed FTP access. See ftpusers(5).

root

daemon

bin

Шаг №7: Перезапускаю ProFTPD сервис:

ekzorchik@srv-bionic:~$ sudo systemctl restart proftpd && sudo systemctl status proftpd && sudo netstat -tulpn | grep proftpd

● proftpd.service - LSB: Starts ProFTPD daemon

Loaded: loaded (/etc/init.d/proftpd; generated)

Active: active (running) since Wed 2020-04-08 12:48:51 MSK; 12ms ago

Docs: man:systemd-sysv-generator(8)

Process: 3699 ExecStop=/etc/init.d/proftpd stop (code=exited, status=0/SUCCESS)

Process: 3754 ExecStart=/etc/init.d/proftpd start (code=exited, status=0/SUCCESS)

Tasks: 1 (limit: 2336)

CGroup: /system.slice/proftpd.service

└─3763 proftpd: (accepting connections)

Apr 08 12:48:51 srv-bionic systemd[1]: Starting LSB: Starts ProFTPD daemon...

Apr 08 12:48:51 srv-bionic proftpd[3754]: * Starting ftp server proftpd

Apr 08 12:48:51 srv-bionic proftpd[3754]: ...done.

Apr 08 12:48:51 srv-bionic systemd[1]: Started LSB: Starts ProFTPD daemon.

tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 3763/proftpd: (acce

ekzorchik@srv-bionic:~$

Шаг №8: Добавляю в файле где перечислены оболочки консоли которые можно назначать пользователям, что есть еще пустая (/bin/false), т.е. без доступа к интерпретатору команд:

ekzorchik@srv-bionic:~$ sudo nano /etc/shells

# /etc/shells: valid login shells

/bin/sh

/bin/bash

/bin/rbash

/bin/dash

/usr/bin/tmux

/bin/false

Шаг №9: Получаю идентификатор учетной записи Webсервиса:

ekzorchik@srv-bionic:~$ id www-data

uid=33(www-data) gid=33(www-data) groups=33(www-data)

Шаг №10: Определяю, какой ID пользователя самый последний в системе:

ekzorchik@srv-bionic:~$ cat /etc/passwd | tail -n1 | awk -F ":" '{print $3}'

108

значит виртуальных пользователей могу создавать начиная с этого ID, либо выделить для этих целей, к примеру с 5000'сячного.

Шаг №11: Создаю двух виртуальных пользователей:

ekzorchik@srv-bionic:~$ sudo ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=ftp1 --shell=/bin/false --home=/var/www/html --uid=5000 --gid=33

ftpasswd: using alternate file: /etc/proftpd/ftpd.passwd

ftpasswd: creating passwd entry for user ftp1

Password: Aa1234567

Re-type password: Aa1234567

ftpasswd: entry created

ekzorchik@srv-bionic:~$

и по аналогии для еще одного виртуального пользователя ftp2:

ekzorchik@srv-bionic:~$ sudo ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=ftp2 --shell=/bin/false --home=/var/www/html --uid=5001 --gid=33

Шаг №12: Проверяю, каково содержимое файла /etc/proftpd/ftpd.passwd:

ekzorchik@srv-bionic:~$ cat /etc/proftpd/ftpd.passwd

cat: /etc/proftpd/ftpd.passwd: Permission denied

ekzorchik@srv-bionic:~$ sudo bash -c "cat /etc/proftpd/ftpd.passwd"

ftp1:$1$QcbUEzvQ$xT6uWRS1hlOVC5U9PHV.W/:5000:33::/var/www/html:/bin/false

ftp2:$1$Wlv2O3zH$w2Hs89GU8mp6ifWEvaKSJ.:5001:33::/var/www/html:/bin/false

ekzorchik@srv-bionic:~$

Шаг №13: Теперь с учетом задания которое я поставил себе оформляя ее как заметку нужно дать виртуальным пользователем доступ на запись в указанный домашним каталогом:

ekzorchik@srv-bionic:~$ sudo chown -R www-data:www-data /var/www/html/

ekzorchik@srv-bionic:~$ sudo chmod -R 770 /var/www/html/

Шаг №14: Проверяю, что могу подключить к FTP с другой машины и в качестве авторизации указываю один из созданных виртуальных логинов со своим паролем (Login: ftp1 Pass: Aa1234567)

ekzorchik@navy:~$ ftp 172.33.33.21 21

Connected to 172.33.33.21.

220 ProFTPD 1.3.5e Server (srv-bionic) [172.33.33.21]

Name (172.33.33.21:ekzorchik): ftp1

500 AUTH not understood

500 AUTH not understood

SSL not available

331 Password required for ftp1

Password:

230 User ftp1 logged in

Remote system type is UNIX.

Using binary mode to transfer files.

ftp> pwd

257 "/" is the current directory

ftp> ls <= отобразить листинг домашнего каталога

200 PORT command successful

150 Opening ASCII mode data connection for file list

-rwxrwx--- 1 33 www-data 612 Apr 8 09:37 index.nginx-debian.html

226 Transfer complete

ftp> mkdir example <= создаю каталог

257 "/example" - Directory successfully created

ftp> ls <= отобразить листинг домашнего каталога

200 PORT command successful

150 Opening ASCII mode data connection for file list

drwxr-xr-x 2 ftp1 www-data 4096 Apr 8 10:05 example

-rwxrwx--- 1 33 www-data 612 Apr 8 09:37 index.nginx-debian.html

226 Transfer complete

ftp> rm example <= удаляю каталог

250 RMD command successful

ftp> ls <= отобразить листинг домашнего каталога

200 PORT command successful

150 Opening ASCII mode data connection for file list

-rwxrwx--- 1 33 www-data 612 Apr 8 09:37 index.nginx-debian.html

226 Transfer complete

ftp> quit

221 Goodbye.

ekzorchik@navy:~$

Шаг №15: Если нужно через консоль передать с локальной системы на удаленную:

ftp> put out.txt

Шаг №16: Если нужно через консоль с текущей передать на удаленную:

ftp> get out.txt out1.txt

т.е. на локальной системе с которой я инициализировал подключение через FTP в каталоге откуда делал ftp IP-Address 21 будет файл out1.txt

ekzorchik@navy:~$ ls -l out1.txt

-rw-r--r-- 1 ekzorchik ekzorchik 286104 апр 8 13:32 out1.txt

итого доступ в назначенный /var/www/html/ каталог для виртуального пользователя сервиса ftp1 работает. Права на чтение, запись, выполнение есть, т.е. я могу обновлять файлы сайта.

Итого заметка работоспособна. В дальнейшем я покажу как настроить защиту данного сервиса

Если что не так будет, то заметка будет дописываться.

На этом у меня всё, с уважением автор блога Олло Александр aka ekzorchik.