FTP сервер на CentOS 7 под ProFTPd с бекендом в MySQL

Для меня уже стало признаком хорошего тона хранить учетки и иногда конфиги в базах данных.
Во первых это структурированные данные. Во вторых легкость в администрировании и управлении(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, как мы и хотели.
Удачных эксперементов

Добавить комментарий