Настройка pure-ftpd + MySQL во FreeBSD

Автор: Dark

Появилась задача, предоставить доступ на FTP админу и клиентам. Чтобы админ мог добавлять/удалять файлы, а простые пользователи только скачивать файлы по логину, который получат от админа. Anonymous FTP не подходил, из соображений экономии трафика и, да и не надо лишним людям видеть не касающуюся их информацию.

Для предоставления и разграничения доступа по FTP будем использовать демон pure-ftpd. Итак ставим:

root@localhost# cd /usr/ports/ftp/pure-ftpd

root@localhost# make config

root@localhost# make install

В "make config" выбираем нужные нам опции. Рекомендую собрать с поддержкой mysql, ибо именно такую конфигурацию мы будем использовать. Предполагается, что MySQL у нас уже есть, если нет - ставим, не умем ставить mysql - читаем handbook, не хотим Mysql - выбираем другой способ хранения информации о юзерах. MySQL был выбран исключительно из-за того, что на большинстве FTP-серверов используется и Apache вместе с MySQL, а раз он уже присутсвует, то не нужны нам другие способы хранения. Крайне не рекомендую использовать unix-юзеров т.к. их логины и пароли передаются в открытом виде и поддаются перехвату. Не дай бог, у них будет по недосмотру еще и доступ к ssh и тогда, за безопасность сервера не стоит ручаться. Итак:

Не забываем в /etc/rc.conf вписать:

pureftpd_enable="YES"

Создаем файл конфига:

root@localhost# cd /usr/local/etc

root@localhost# cp pureftpd-mysql.conf.sample pure-mysql.conf

root@localhost# cp pure-ftpd.conf.sample pure-ftpd.conf

Редактируем pure-ftpd.conf:

#Запираем пользователя в домашней директории

ChrootEveryone yes

# Минимальный UID, которому разрешено авторизироваться по FTP

TrustedGID 1000

# Для безопасности... что означает точно - не помню

BrokenClientsCompatibility no

# Максимальное количество подключений к серверу

MaxClientsNumber 50

# Demonize - сервер работает как демон, а не через inetd

Daemonize yes

# Максимальное количество соединений с одного ip

MaxClientsPerIP 3

# Вести расширенные логи, по умолчанию стоит no.

VerboseLog yes

# Показывать "скрытые" файлы, начинающиеся на точку

DisplayDotFiles no

# Только анонимный вход, авторизованных пользователей нет - запрещаем

AnonymousOnly no

# Запрещаем пользователя anonymous

NoAnonymous yes

# Настройка для syslog-a (может быть auth, authpriv, daemon, ftp, security, user, local*)

SyslogFacility daemon

# Не запрашивать обратную зону полученного ip-адреса клиента.

DontResolve yes

# Максимальное время бездействия клиента в минутах

MaxIdleTime 15

#Пожалуй самая главная строка - указываем путь к настройкам для mysql

MySQLConfigFile /usr/local/etc/pure-mysql.conf

#Дополнительные настройки для подключившихся пользователей

# Ограничение при выполнение команды "ls"

# Максимальное количество показываемых файлов 2000

# Максимальная глубина поддиректорий 8

LimitRecursion 2000 8

#Диапазон портов при пассивном подключении, как показала практика приведенного диапазона достаточно

PassivePortRange 49151 49999

# Запрет на скачивание файлов, которыми владеет юзер ftp.

# То есть файлы закаченные, но не одобренные админом.

# По умолчанию "yes"

AntiWarez no

# Позволить FXP для пользователей, по умолчанию no

AllowUserFXP yes

# Дополнительный лог. clf - в стиле Apache

# stats - в формате оптимизированном для статистических отчетов

# w3c - в формате стандарта W3C

AltLog clf:/var/log/pureftpd_clf.log

# Запретить выполнение команды CHMOD для всех пользователей

NoChmod yes

# Не заполнять более чем на 95% жесткий диск, чтобы оставить место

# для нормальной работы операционной системы.

MaxDiskUsage 95

И редактируем pure-mysql.conf:

#Указываем путь к сокету mysql

MYSQLSocket /tmp/mysql.sock

#Пользователь MYSQL

MYSQLUser ftp-user

# Его пароль

MYSQLPassword 123

#Название базы данных

MYSQLDatabase ftp

#Способ хранения паролей в БД. Можно указать "cleartext", "crypt", "md5", "password".

MYSQLCrypt cleartext

# Запрос к БД за паролем "L" - по логину

MYSQLGetPW SELECT Password FROM users WHERE User="L"

# А этим запросом мы выясняем UID (User ID) определенного пользователя

MYSQLGetUID SELECT Uid FROM users WHERE User="L"

# Ну и наконец - рабочую директорию пользователя

MYSQLGetDir SELECT Dir FROM users WHERE User="L"

Этого конфига уже достаточно для работы pure-ftpd c MySQL.

Теперь необходимо создать БД, и завести в нее пользователей с параметрами

root@localhost# mysql -u root -p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or g.

Your MySQL connection id is 743681 to server version: 4.0.27-log

Type 'help;' or 'h' for help. Type 'c' to clear the buffer.

mysql> CREATE DATABASE `ftp` ;

Query OK, 1 row affected (0.00 sec)

mysql> use ftp;

Database changed

mysql> CREATE TABLE `users` (

-> `id` SMALLINT DEFAULT '0' NOT NULL AUTO_INCREMENT ,

-> `User` VARCHAR( 50 ) NOT NULL ,

-> `Password` VARCHAR( 50 ) NOT NULL ,

-> `Uid` SMALLINT DEFAULT '10000' NOT NULL ,

-> `Gid` SMALLINT DEFAULT '10000' NOT NULL ,

-> `Dir` VARCHAR( 100 ) NOT NULL ,

-> `Comment` VARCHAR( 200 ) ,

-> PRIMARY KEY ( `id` )

-> );

Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO `users` ( `id` , `User` , `Password` , `Uid` , `Gid` , `Dir` , `Comment` )

-> VALUES ( '', 'adminko', 'parolko', '10000', '10000', '/usr/ftp', 'Admin user' );

Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `users` ( `id` , `User` , `Password` , `Uid` , `Gid` , `Dir` , `Comment` )

-> VALUES ( '', 'friend', 'drujok', '10001', '10001', '/usr/ftp', 'No write' );

Query OK, 1 row affected (0.00 sec)

mysql> GRANT SELECT ON `ftp-user` . * TO 'ftp'@'%';

Query OK, 0 rows affected (0.00 sec)

mysql> SET PASSWORD FOR 'ftp-user'@'%' = password ('123');

Query OK, 0 rows affected (0.00 sec)

mysql> q

Bye

root@localhost#

Разумеется логин и пароль каждый выставляет свой. Теперь пора создать дирректорию для FTP и раздать на неё права:

root@localhost# mkdir /usr/ftp

root@localhost# chown -R 10000:10000 /usr/ftp

root@localhost# chmod -R +rX /usr/ftp

Таким образом, adminko с UID:GID = 10000:10000 получает полный доступ к дирректории, а пользователь friend c UID:GID = 10001:10001 только на чтение. Пробуем запустить:

root@localhost# /usr/local/etc/rc.d/pure-ftpd start

Starting pureftpd.

Running: /usr/local/sbin/pure-ftpd -A -a1000 -c50 -B -C3 -E -fdaemon -H -I15 -lmysql:/usr/local/etc/pure-mysql.conf -L2000:8 -m4 -P192.168.0.3 -s -U133:022 -u100 -k99 -Z

root@localhost#

Если демон не запустился, то смотрим в логи ('/var/log/messages') и правим конфиг ('/usr/local/etc/pure-ftpd.conf')

Для корректного подключения в пассивном режиме, необходимо будет подправить еще и конфиг фаервола. Например, для pf можно прописать так:

pass in on $ext_if proto tcp from any to any port 21 keep state

pass in on $ext_if proto tcp from any to any port 49151:49999 keep state

http://www.ounix.ru/index.php?page=article&id=21

Обновлено: 12.03.2015