FTP-сервер с аутентификацией по MySQL

7 Ноября 2018

FTP_Server.png

Ранее было показано, как быстро развернуть FTP-сервер. Сделать это очень просто и, если FTP-сервер предназначен для личного использования, даже не нужно выполнять какую-либо конфигурацию – настройки по умолчанию вполне приемлемы. Но в промышленном применении, когда пользователей будет не несколько десятков, а несколько тысяч, конфигурация по умолчанию становится неудобно. В первую очередь потому, что она предполагает аутентификацию посредством самой операционной системы, следовательно, в системе должны существовать все эти несколько тысяч пользователей. Как мы знаем, информация об учетных записях хранится в файле /etc/passwd: он разрастется до неприличных размеров, а в каталоге /home будет создано несколько тысяч подкаталогов – домашние каталоги будут созданы для каждого пользователя из /etc/passwd. Управлять всем этим добром с помощью системных средств тоже будет неудобно. Все гораздо проще, если информацию о пользователях хранить в базе данных MySQL: тогда записи о FTP-пользователях не будут храниться в /etc/passwd, а управлять "учетками" можно будет посредством того же phpMyAdmin, что гораздо удобнее обычных средств управления пользователям. Вы сможете просматривать таблицы с учетными данными, легко редактировать любую учетную запись, применять SQL-запросы, затрагивающие сразу сотни учетных записей.

Подготовительные мероприятия 

Мы считаем, что сервер MySQL уже установлен и выполнена его базовая настройка. Если вы хотите использовать phpMyAdmin для управления учетными записями, тогда нужно установить еще Web-сервер Apache. Если вы не знаете, как это сделать: следите за нашим блогом – скоро мы опишем подробно процесс установки phpMyAdmin.

Кроме серверов MySQL и Apache вам понадобится еще и пакет proftpd-mod-mysql, обеспечивающий поддержку хранения учетных данных в базе данных MySQL. Установить его можно командой:

sudo apt-get install proftpd-mod-mysql 

Настройка FTP-севера 

Когда все готово, можно приступить к настройке FTP-сервера. Откроем его файл конфигурации: 

sudo mcedit /etc/proftpd/proftpd.conf 

Здесь mcedit – это текстовый редактор, входящий в состав файлового менеджера Midnight Commander (пакет mc). Вы можете использовать любой другой редактор. О выборе редактора мы уже говорили в статье Выбор текстового редактора в консоли Linux

Проверьте, чтобы в файле конфигурации proftpd.conf были следующие строки (их нужно раскомментировать или добавить):

Include /etc/proftpd/sql.conf
DefaultRoot ~
RequireValidShell off 

Если облака для вас
не просто теория
Широкий спектр услуг
по выделенным северам
и мультиклауд-решениям
Конфигурация VPS и бесплатный тест уже через 2 минуты
Организация вашей IT-инфраструктуры на основе мультиклауд-решения

Теперь нужно создать системного пользователя и группу, к которым будут привязаны все виртуальные пользователи из базы данных MySQL:

sudo groupadd -g 2002 ftpgroup
sudo useradd -u 2002 -s /bin/false -d /bin/null -c «proftpd user» -g ftpgroup ftpuser 

Эти команды создали пользователя ftpuser и группу ftpgroup.

Теперь нужно ввести несколько SQL-запросов. Для этого можно подключиться к MySQL-серверу или посредством клиента mysql или phpMyAdmin. Поскольку последнее приложение мы пока не установили, то будем использовать клиент mysql:

mysql -u root -p 

Далее, находясь в клиенте mysql, введите следующие запросы: 

CREATE DATABASE proftpd;
GRANT SELECT, INSERT, UPDATE, DELETE ON proftpd.* TO 'proftpd'@'localhost'
IDENTIFIED BY 'password';
FLUSH PRIVILEGES; 

Первый запрос создает базу данных proftpd, второй — предоставляет все необходимые привилегии по работе с этой базой данных пользователю proftpd. Третья команда обновляет привилегии.

После этого нужно ввести следующее: 

USE proftpd;
CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL default ' ',
gid smallint(6) NOT NULL default '2001',
members varchar(16) NOT NULL default ' ',
KEY groupname (groupname)
) ENGINE=MyISAM COMMENT='ProFTP group table'; 

CREATE TABLE ftpuser (
id int(10) unsigned NOT NULL auto_increment,
userid varchar(32) NOT NULL default ' ',
passwd varchar(32) NOT NULL default ' ',
uid smallint(6) NOT NULL default '2001',
gid smallint(6) NOT NULL default '2001',
homedir varchar(255) NOT NULL default ' ',
shell varchar(16) NOT NULL default '/sbin/nologin',
count int(11) NOT NULL default '0',
accessed datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00', 

PRIMARY KEY (id),
UNIQUE KEY userid (userid)
) ENGINE=MyISAM COMMENT='ProFTP user table'; 

INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 2002, 'ftpuser');
INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (NULL, 'test', 'password')', '2002', '2002', '/srv/ftp/test', '/sbin/nologin', '0', '0000-00-00 00:00:00.000000', '0000-00-00 00:00:00.000000'); 

exit; 

Первый запрос (USE) выбирает только что созданную базу данных. После этого мы создаем две таблицы (запрос CREATE TABLE) – ftpgroup и ftpuser. В первой будут описаны FTP-группы, во второй – FTP-пользователи. Запросы INSERT создают одну группу и одного пользователя. Обратите внимание: для пользователя мы используем оболочку /sbin/nologin и домашний каталог /srv/ftp/test – он должен существовать.

Последняя команда exit обеспечивает выход из клиента mysql – он больше нам не нужен.

Далее в текстовом редакторе нужно открыть файл /etc/proftpd/modules.conf:

sudo mcedit /etc/proftpd/modules.conf 

В нем нужно раскомментировать (или добавить) две строки: 

LoadModule mod_sql.c 
LoadModule mod_sql_mysql.c 

Как вы уже догадались, это загрузка модуля для работы с MySQL. Теперь осталось указать в настройках самого FTP-сервера, что нужно использовать MySQL для аутентификации. Откройте файл sql.conf:

sudo mcedit /etc/proftpd/sql.conf 

В нем нужно указать логин и пароль пользователя, использующегося для подключения к БД, а также названия таблиц, в которых будут содержаться сведения о пользователях:

<IfModule mod_sql.c>
SQLBackend mysql
SQLAuthTypes Crypt
SQLConnectInfo proftpd@localhost proftpd password
SQLUserInfo ftpuser userid passwd uid gid homedir shell
SQLGroupInfo ftpgroup groupname gid members
# Update count every time user logs in
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser
SQLLog STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser
</IfModule>

Осталось только перезапустить сервис proftpd: 

sudo service proftpd restart 

На этом настройка завершена. Можно попытаться подключиться к FTP-серверу, используя логин test и пароль password – именно эти учетные записи добавлены в таблицу ftpuser.

Получить консультацию специалиста