Для меня уже стало признаком хорошего тона хранить учетки и иногда конфиги в базах данных.
Во первых это структурированные данные. Во вторых легкость в администрировании и управлении(phpMyAdmin + mysqldump)
Аналогичная ситуация сложилась на веб-хостинге с FTP пользователями. Сайтов много, пользователей должно быть много, плодить системные учетки никакого желания нету. Вот и надумал хранить авторизационные данные (потом подумал и решил туда же складывать логи) в MySQL. Приступим. Для начала нужно установить сам proftpd с поддержкой mysql
# yum install proftpd-mysql
Следующим шагом будет создание и наполнение базы данных
# mysql -uroot -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. MariaDB [(none)]> create database proftpd; MariaDB [(none)]> grant all privileges on proftpd.* to proftpd@localhost identified by 'ProFTPd_PassWord'; MariaDB [(none)]> use proftpd; MariaDB [(none)]> CREATE TABLE users ( userid varchar(30) NOT NULL, passwd varchar(80) NOT NULL, uid int(11) DEFAULT NULL, gid int(11) DEFAULT NULL, homedir varchar(255) DEFAULT NULL, shell varchar(255) DEFAULT NULL, zz_comment varchar(255) DEFAULT NULL COMMENT 'Who is this?', PRIMARY KEY (`userid`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; MariaDB [(none)]> CREATE TABLE `ftplog` ( logid bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Record ID', loguser varchar(50) NOT NULL COMMENT 'Username', logdate datetime NOT NULL COMMENT 'Date of up- or download', logcmd char(10) NOT NULL COMMENT 'FTP command', logfile varchar(255) NOT NULL COMMENT 'Up- or downloaded file', logstatus_ftp smallint(5) unsigned NOT NULL COMMENT 'FTP Status', zz_proc char(1) NOT NULL COMMENT 'File processed status', PRIMARY KEY (`logid`), KEY `user_date` (`loguser`,`logdate`,`logcmd`,`logfile`), KEY `date_cmd` (`logdate`,`logcmd`,`loguser`), KEY `status_cmd` (`logstatus_ftp`,`logcmd`,`logdate`,`loguser`), KEY `user_proc_cmd` (`loguser`,`zz_proc`,`logcmd`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; MariaDB [(none)]> insert into users values ('username', 'password', 48, 48, '/var/www/html', '/sbin/nologin', 'Full Name'); MariaDB [(none)]> \q
Тут мы создал пользователя с логином username и паролем password, который при подключении будет работать от имени и группы apache (48 ID). Подключившись пользователь попадёт в каталог /var/www/html без возможности выхода на более высший уровень в структуре каталогов.
Далее правка основного конфигурационного файла /etc/proftpd.conf
1) заменим
AuthOrder mod_auth_pam.c* mod_auth_unix.c
на
AuthOrder mod_sql.c mod_auth_unix.c
2) Раскоментируем следующие модули
LoadModule mod_sql.c LoadModule mod_sql_passwd.c LoadModule mod_sql_mysql.c
3) Добавляем в конец файла следующий код
SQLEngine on
SQLConnectInfo proftpd:3306 proftpd ProFTPd_PassWord
SQLAuthTypes Plaintext
SQLAuthenticate users
SQLMinID 500
SQLDefaultGID 500
SQLDefaultHomedir /var/ftp
SQLLog RETR,STOR insertfileinfo
SQLNamedQuery insertfileinfo INSERT "0, '%u', now(), '%m', '%f', %s, ' '" ftplog
На этом наш сервер готов к работе. Осталось добавить его в автозагрузку и запустить
# systemctl enable proftpd # systemctl start proftpd
Ну и проверим
# ps aux | grep proftpd apache 21218 0.0 0.0 207460 2472 ? Ss 16:42 0:00 proftpd: (accepting connections)
как видно сервис запущен от имени пользователя apache, как мы и хотели.
Удачных эксперементов