Полтора года назад мы рассматривали настройку взаимодействия ftp-сервера pure-ftpd с CMS Joomla. Сейчас же попробуем рассмотреть другой случай: хранение ftp-аккаунтов в MySQL-базе, но без привязки к чему либо.
Для начала пару слов о том, зачем же собственно это нужно: ну хотя бы для того, чтобы разные пользователи имели возможность заливать файлы в разные директории, но при этом на самом сервере файлы должны иметь одни и те же uid/gid.
Разворачивать решение мы будем на сервере под управлением Ubuntu Server 9.04. Сначала нужно установить необходимые пакеты:
apt-get install pure-ftpd-mysql mysql-server
В процессе установки вам будет предложено задать пароль для вашего mysql-сервера. Задайте по своему усмотрению, но главное - не забудьт его потом:)
Теперь подключимся к нашему MySQL-серверу с помощью mysql-клиента:
mysql -u root -p
И создадим базу данных для для pure-ftpd:
mysql> CREATE DATABASE `pureftpd`;
Создадим пользователя pureftpd с правом выполнять запрос SELECT на эту базу и паролем "p4ssw0rd" (Для примера. В реальной конфигурации рекоммендуется придумать свой пароль):
mysql> GRANT SELECT ON `pureftpd`.* to `pureftpd`@`localhost` identified by 'p4ssw0rd';
Почему только SELECT? Потому что этого более чем достаточно для проверки пароля, но в случае обнаружения уязвимостей в pure-ftpd с последующим его взломом не даст возможности создать новых (потенциально опасных) пользователей.
Используем новую базу данных:
mysql> USE pureftpd;
Создаём таблицу, в которой будут храниться пользовательские аккаунты:
mysql> CREATE TABLE `users` ( -> `id` int(11) NOT NULL auto_increment, -> `login` varchar(32) NOT NULL default '', -> `password` varchar(32) NOT NULL default '', -> `homedir` varchar(255) NOT NULL default '', -> `uid` int(11) NOT NULL default '-1', -> `gid` int(11) NOT NULL default '-1', -> PRIMARY KEY (`id`), -> UNIQUE KEY `id` (`id`) -> ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
Сразу создадим пользователя. Допустим что у нас есть пользователь moose с uid:gid 1000:1000 и домашним каталогом /home/moose. Нужно дать пользователю с логином friend и паролем secret доступ к директории /home/moose/Films. Для этого выполним следующий запрос:
mysql> INSERT INTO `users` (`login`, `password`, `uid`, `gid`, `homedir`) VALUES ('friend', md5('secret'), 1000, 1000, '/home/moose/Films');
Теперь завершим работу с MySQL:
mysql> quit
И перейдём к настройке pure-ftpd.
Теперь открываем в редакторе файл /etc/pure-ftpd/db/mysql.conf и приводим его к следующему виду:
# Адрес MySQL-сервера MYSQLServer 127.0.0.1 # Порт MySQL-сервера MYSQLPort 3306 # Пользователь на MySQL-сервере MYSQLUser pureftpd # Пароль MYSQLPassword p4ssw0rd # Имя базы данных MYSQLDatabase pureftpd # Способ хэширования пароля. Мы будем использовать md5 MYSQLCrypt md5 # Этот запрос используется для получения хэша пароля из базы. # Здесь и далее вместо "\L" будет подставлен логин. MYSQLGetPW SELECT password FROM users WHERE login="\L" # Запрос для получения uid пользователя MYSQLGetUID SELECT uid FROM users WHERE login="\L" # Запрос для получения gid пользователя MYSQLGetGID SELECT gid FROM users WHERE login="\L" # Запрос для получения домашнего каталога пользователя MYSQLGetDir SELECT homedir FROM users WHERE login="\L"
Дальше нам нужно запереть пользователей в их домашний директориях:
echo yes >> /etc/pure-ftpd/conf/ChrootEveryone
Перезапускаем ftp-сервер:
invoke-rc.d pure-ftpd-mysql restart
После чего остаётся только попробовать подключиться к ftp-серверу. Следует отметить что по умолчанию разрешено так же использование системных аккаунтов. Если это не нужно (потенциальная дыра в безопасности), то эту возможность можно отключить следующимей командой:
echo no > /etc/pure-ftpd/conf/PAMAuthentication && invoke-rc.d pure-ftpd-mysql restart
На этом всё. Приятной работы!
kobel 2009-07-07 18:53:25 (#)
Установил пакет pure-ftpd-mysql mysql-server
Все сделано по выше описанной инструкции,
за исключением запрета системных акаунтов.
с системныйм акаунтом подключается а с акаунтом из базы НЕТ!
----------
Connect to: (07.07.2009 20:11:07)
hostname=192.168.0.111
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 1 of 50 allowed.
220-Local time is now 20:11. Server port: 21.
220-This is a private system - No anonymous login
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
USER bobik
331 User bobik OK. Password required
PASS ***********
530 Login authentication failed
QUIT
пароль пробывал в базу и текстом и md5 (в конфиге параметр при этом менял).
Помогите понять в чем дело ?