Что если на сервере есть сервис Nginx
и Вам понадобился доступ к нему и для удобной закачки файлов, можно обойтись и одним SSH
, то если как у меня сервером пользуется еще и руководитель отдела IT
, то ему привычнее использовать не консоль командной строки, а все что GUI'шное
, к примеру Filezilla
соединяясь через FTP over SSL
. Просто по-другому я лично не приемлю, пока сервер остается в моей зоне ответственности.
Где Nginx
? Как показывает практика есть сервис MySQL
, так почему бы не хранить связку логина и пароля в текстовом файле /etc/proftpd/ftpd.passwd
, а организовать ее местонахождение в базе. Удобно использовать, практично бекапировать и переносить если вдруг возникнет такая необходимость. А пароль можно хранить как в чистом виде, так и зашифрованном — кому как удобно. Думаю это стоит разобрать и оформить как пошаговая заметка и конечно же использовать.
Шаг №1:
Первым делом устанавливаем ProFTPD
опираясь на заметку «Как применять ProFTPD на Ubuntu 18.04«. Дальше по своему усмотрению накладываем:
- Доступ к ProFTPD только FTP через TLS
- Настраиваем Firewall-cmd на доступ к ProFTPd
- Убираем болтливость Сервисов SSH & ProFTPD
Шаг №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.