Что если на сервере есть сервис Nginx и Вам понадобился доступ к нему и для удобной закачки файлов, можно обойтись и одним SSH, то если как у меня сервером пользуется еще и руководитель отдела IT, то ему привычнее использовать не консоль командной строки, а все что GUI'шное, к примеру Filezilla соединяясь через FTP over SSL. Просто по-другому я лично не приемлю, пока сервер остается в моей зоне ответственности.

Где Nginx? Как показывает практика есть сервис MySQL, так почему бы не хранить связку логина и пароля в текстовом файле /etc/proftpd/ftpd.passwd, а организовать ее местонахождение в базе. Удобно использовать, практично бекапировать и переносить если вдруг возникнет такая необходимость. А пароль можно хранить как в чистом виде, так и зашифрованном — кому как удобно. Думаю это стоит разобрать и оформить как пошаговая заметка и конечно же использовать.

Шаг №1: Первым делом устанавливаем ProFTPD опираясь на заметку «Как применять ProFTPD на Ubuntu 18.04«. Дальше по своему усмотрению накладываем:

Шаг №2: Для хранения учетных данных в базе необходимо установить пакет связки сервиса ProFTPD:

ekzorchik@srv-bionic:~$ sudo apt-get install -y proftpd-mod-mysql mariadb-server mariadb-client

ekzorchik@srv-bionic:~$ sudo mysqladmin -u root password 712mbddr@

Шаг №3: Создаю базу, пользователя и пароль для пользователя в которой будут хранится учетные данные на доступ к FTP сервису ProFTPD:

ekzorchik@srv-bionic:~$ sudo mysql -u root -p712mbddr@ -e "create database db_proftpd character set utf8"

ekzorchik@srv-bionic:~$ sudo mysql -u root -p712mbddr@ -e "create user 'us_proftpd'@'localhost' identified by '612mbddr@'"

ekzorchik@srv-bionic:~$ sudo mysql -u root -p712mbddr@ -e "grant all on db_proftpd.* to 'us_proftpd'@'localhost';"

Шаг №4: Теперь в базе db_proftpd нужно создать таблицу «users» с полями:

ekzorchik@srv-bionic:~$ nano table_proftpd.sql
CREATE TABLE `db_proftpd`.`users` (
`username` VARCHAR( 32 ) NOT NULL ,
`password` VARCHAR( 32 ) NOT NULL ,
`uid` INT NOT NULL ,
`gid` INT NOT NULL ,
`homedir` VARCHAR( 255 ) NOT NULL ,
`shell` VARCHAR( 255 ) NOT NULL ,
UNIQUE (`username`)
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;

Импортирую в базу db_proftpd структуру таблицы users:

ekzorchik@srv-bionic:~$ sudo mysql -u root -p712mbddr@ < table_proftpd.sql 
ekzorchik@srv-bionic:~$ sudo mysql -u root -p712mbddr@ db_proftpd -e "show tables"
+----------------------+
| Tables_in_db_proftpd |
+----------------------+
| users                |
+----------------------+
ekzorchik@srv-bionic:~$ sudo mysql -u root -p712mbddr@ db_proftpd -e "describe users"
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| username | varchar(32)  | NO   | PRI | NULL    |       |
| password | varchar(32)  | NO   |     | NULL    |       |
| uid      | int(11)      | NO   |     | NULL    |       |
| gid      | int(11)      | NO   |     | NULL    |       |
| homedir  | varchar(255) | NO   |     | NULL    |       |
| shell    | varchar(255) | NO   |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+
ekzorchik@srv-bionic:~$

После вносим в базу значения на доступ к FTP для виртуального пользователя:

ekzorchik@srv-bionic:~$ nano insert_data.sql
insert into `db_proftpd`.`users`(`username`,`password`,`uid`,`gid`,`homedir`,`shell`) VALUES ('alektest','Aa1234567','5010','33','/var/www/html','/bin/false');
ekzorchik@srv-bionic:~$ sudo mysql -u root -p712mbddr@ db_proftpd -e "source insert_data.sql"
ekzorchik@srv-bionic:~$ sudo mysql -u root -p712mbddr@ db_proftpd -e "select * from users"
+----------+-----------+------+-----+---------------+------------+
| username | password  | uid  | gid | homedir       | shell      |
+----------+-----------+------+-----+---------------+------------+
| alektest | Aa1234567 | 5010 |  33 | /var/www/html | /bin/false |
+----------+-----------+------+-----+---------------+------------+
ekzorchik@srv-bionic:~$

Шаг №5: Подгружаем модули mod_sql.c & mod_sql_mysql.c, ниже полный конфигурационный файл с уже подгруженными модулями, их не трогаю, оставляю все как есть:

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

ModulePath /usr/lib/proftpd

ModuleControlsACLs insmod,rmmod allow user root

ModuleControlsACLs lsmod allow user *

LoadModule mod_ctrls_admin.c

LoadModule mod_tls.c

LoadModule mod_sql.c

LoadModule mod_sql_mysql.c

LoadModule mod_radius.c

LoadModule mod_quotatab.c

LoadModule mod_quotatab_file.c

LoadModule mod_quotatab_radius.c

LoadModule mod_wrap.c

LoadModule mod_rewrite.c

LoadModule mod_load.c

LoadModule mod_ban.c

LoadModule mod_wrap2.c

LoadModule mod_wrap2_file.c

LoadModule mod_dynmasq.c

LoadModule mod_exec.c

LoadModule mod_shaper.c

LoadModule mod_ratio.c

LoadModule mod_site_misc.c

LoadModule mod_sftp.c

LoadModule mod_sftp_pam.c

LoadModule mod_facl.c

LoadModule mod_unique_id.c

LoadModule mod_copy.c

LoadModule mod_deflate.c

LoadModule mod_ifversion.c

LoadModule mod_tls_memcache.c

LoadModule mod_ifsession.c

Шаг №6: Привожу конфигурационный файл /etc/proftpd/proftpd.conf к следующему виду:

Include /etc/proftpd/modules.conf

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

UseIPv6 off

IdentLookups off

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

ServerName "PENTAGON"

# Режим запуска FTP-сервера

ServerType standalone

DeferWelcome off

MultilineRFC2228 on

DefaultServer on

ServerIdent off

ShowSymlinks on

# Таймаут на передачу: вошел и не начал передачу выраженное в мили секундах

TimeoutNoTransfer 600

# Подвисание во время передачи файлов выраженное в мили секундах

TimeoutStalled 600

# Таймаут бездействия после входа выраженное в мили секундах

TimeoutIdle 1200

DisplayLogin welcome.msg

DisplayChdir .message true

#ListOptions "-l"

ListOptions "-a"

# Запретить закачивать файлы, начинающиеся на точку

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>

#Диапозон пассивных портов

PassivePorts 49152 65535

Include /etc/proftpd/tls.conf

Include /etc/proftpd/conf.d/

#Для работы с базой данных

Include /etc/proftpd/sql.conf

AuthOrder mod_sql.c

Шаг №7: Теперь в sql.conf указываю параметры базы, пользователя и пароля:

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

<IfModule mod_sql.c>

SQLBackend mysql

SQLEngine on

SQLAuthTypes Plaintext

SQLConnectInfo db_proftpd@localhost us_proftpd 612mbddr@

SQLUserInfo users username password uid gid homedir shell

SQLAuthenticate users*

SQLMinUserUID 5010

SQLMinUserGID 33

SQLLogFile /var/log/proftpd/sql.log

</IfModule>

ekzorchik@srv-bionic:~$ sudo systemctl restart proftpd && sudo systemctl status proftpd | head -n5

● proftpd.service - LSB: Starts ProFTPD daemon

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

Active: active (running) since Thu 2020-04-09 21:11:41 MSK; 11ms ago

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

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

Шаг №8: Даю права на /var/www/html

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

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

Шаг №9: Проверяю, а смогу ли я через клиент ftp подключиться к сервису с другой системы:

ekzorchik@navy:~$ ftp 172.33.33.21 21

Connected to 172.33.33.21.

220 172.33.33.21 FTP server ready

Name (172.33.33.21:ekzorchik): alektest

234 AUTH TLS successful

[SSL Cipher ECDHE-RSA-AES128-GCM-SHA256]

200 PBSZ 0 successful

200 Protection set to Private

[Encrypted data transfer.]

331 Password required for alektest

Password:

230 User alektest 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

drwxrwxr-x 2 33 33 4096 Apr 8 17:53 .

drwxrwxr-x 2 33 33 4096 Apr 8 17:53 ..

-rw-r--r-- 1 33 33 2640 Apr 8 17:52 dproject

-rw-r--r-- 1 33 33 286104 Apr 8 10:32 out.txt

-rw-r--r-- 1 33 33 1724673 Apr 8 17:52 winbox

226 Transfer complete

ftp> quit

221 Goodbye.

ekzorchik@navy:~$

На заметку: Если что-то было в файле /etc/proftpd/ftpd.passwd оно перестанет действовать, т.к. в данный момент работает авторизация через базу.

Ответ да! Я успешно подключился к сервису ProFTPD где аутентификационные данные берутся из базы данных. Круто! Конечно все это выше не я сам сделал, а доработал и разобрался для себя со всеми нюансами. В этом и принцип open source программ, скриптов и т.д., что Вы можете вносить и дополнять и использовать. Заметка работоспособна. На этом я прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.