2010
Настройка Pure-FTPd + MySQL + User Manager
Введение
Довольно часто возникает необходимость поднять ftp-сервер с простым управлением через web-интерфейс. С подобной задачей легко справится ftp-сервер «Pure-FTPd» с хранением виртуальных пользователей в базе данных «MySQL» с управление через web-интерфейс «User Manager for Pure-FTPd». Выбор ftp-сервера «Pure-FTPd» не случаен. Он зарекомендовал себя как надежное и гибкое решение для организации ftp-сервера масштабов web-хостинга.
Установка «User Manager of Pure-FTPd»
Лучше всего начать установку сразу с «User Manager of Pure-FTPd», так как в процессе его установки будет создана база данных пользователей и будут известны параметры подключения к ней. Все это потом пригодится для настройки «Pure-FTPd».
Пакет с «User Manager of Pure-FTPd» можно получить из моего оверлея. После подключения оверлея, производим установку.
# emerge usermanager
Устанавливаем пакет «usermanager» в виртуальный хост на http-сервере. Устанавливать будем в отдельную директорию. Например, если настроен пакет «webapp-config» и существует виртуальных хост «admin», то установка будет выглядеть как показано ниже.
# webapp-config -I -h admin -d usermanager usermanager 2.1
Инсталлятор, идущий в комплекте с программой, мне не очень нравится. Поэтому все настройки сделаем сами.
В комплекте с программой в директории «extra» находится файл «script.mysql». Его можно немного подправить. Например, чтобы база данных называлась «pureftpd», MySQL-пользователь тоже «pureftpd» и пароль «mypassword». Так же пока можно убрать из скрипта создание администратора. Я приведу свой пример исправленного файла «script.mysql».
script.mysqlINSERT INTO mysql.user (Host, User, Password, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv) VALUES('localhost','pureftpd',PASSWORD('mypassword'),'N','N','N','N','N','N','N','N','N','N','N','N','N','N');
INSERT INTO mysql.db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Create_tmp_table_priv, Lock_tables_priv, Create_view_priv, Show_view_priv, Create_routine_priv, Alter_routine_priv, Execute_priv, Event_priv, Trigger_priv) VALUES ('localhost', 'pureftpd', 'pureftpd', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'N', 'N', 'Y', 'Y', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N');
FLUSH PRIVILEGES;
CREATE DATABASE pureftpd;
USE pureftpd;
CREATE TABLE admin (
Username varchar(35) NOT NULL default '',
Password char(32) binary NOT NULL default '',
PRIMARY KEY (Username)
) TYPE=MyISAM;
CREATE TABLE `users` (
`User` varchar(16) NOT NULL default '',
`Password` varchar(32) binary NOT NULL default '',
`Uid` int(11) NOT NULL default '14',
`Gid` int(11) NOT NULL default '5',
`Dir` varchar(128) NOT NULL default '',
`QuotaFiles` int(10) NOT NULL default '500',
`QuotaSize` int(10) NOT NULL default '30',
`ULBandwidth` int(10) NOT NULL default '80',
`DLBandwidth` int(10) NOT NULL default '80',
`Ipaddress` varchar(15) NOT NULL default '*',
`Comment` tinytext,
`Status` enum('0','1') NOT NULL default '1',
`ULRatio` smallint(5) NOT NULL default '1',
`DLRatio` smallint(5) NOT NULL default '1',
PRIMARY KEY (`User`)
) TYPE=MyISAM;
Скопируем скрипт во временную директорию, например «/tmp», изменим так, как необходимо, и выполним его.
# cat /tmp/script.mysql |mysql -u root -p
На предложение ввести пароль укажем пароль MySQL-пользователя «root».
Если база данных создана успешно, то добавим в нее администратора, например «admin» с паролем «pass».
# echo "insert into admin values('admin',md5('pass'))" |mysql -u pureftpd --password=mypassword -D pureftpd
Приведем файл «config.php» к следующему состоянию. Комментарии к параметрам можно прочитать в оригинальном файле «config.php» в директории установки программы.
config.php<?php
$LANG = "Russian";
$LocationImages = "images";
$DBHost = ":/var/run/mysqld/mysqld.sock";
$DBLogin = "pureftpd";
$DBPassword = "mypassword";
$DBDatabase = "pureftpd";
$FTPAddress = "server.cxm";
$DEFUserID = "1000";
$DEFGroupID = "1000";
$UsersFile = "/etc/passwd";
$GroupFile = "/etc/group";
$StyleSheet = "style/green.css.php";
$EnableQuota = 1;
$EnableRatio = 0;
$BlacklistUsers = array ('adm','bin','bind','daemon','gopher','halt','kmem','lp',
'mailnull','man','named','nfsnobody','nscd','operator',
'pop','root','rpc','rpcuser','rpm','shutdown','smmsp',
'sshd','sync','toor','tty','uucp','vcsa','xfs');
$BlacklistGroups = array ('adm','bin','bind','daemon','dialer','dip','disk','floppy','gopher','kmem',
'lock','lp','mailnull','man','named','mem','network','news',
'nscd','ntp','operator','pcap','root','rpc','rpcuser','rpm','slocate','smmsp',
'sshd','staff','sys','tty','utmp','uucp','vcsa','wheel','xfs');
?>
Особое внимание обратите на переменные «DEFUserID» и «DEFGroupID». Они задают пользователя и группу по умолчанию, с которыми будут создаваться файлы в системе при загрузке их на сервер. Эти значения можно будет в дальнейшем выставить индивидуально для каждого ftp-пользователя.
После всех манипуляций стало возможным войти в программу «User Manager of Pure-FTPd» из браузера, указав пользователя «admin» и пароль «pass». Сразу же можно добавить необходимых ftp-пользователей.
Установка «Pure-FTPd»
Перед началом установки «Pure-FTPd» проверим, включены ли необходимые USE-флаги.
# emerge pure-ftpd -p
Обязательно должны быть включены USE-флаги «mysql» и «vchroot». Так же желательно включить USE-флаг «charconv» - для возможности отдавать пользователям список файлов в кодировке, отличной от кодировки файловой системы, и USE-флаг «ssl» - для возможности организовать защищенный туннель для передачи данных. Если не планируется использование системных пользователей для работы с «Pure-FTPd», то можно отключить USE-флаг «pam».
Если какие-либо USE-флаги оказались не включены, то можно включить их, добавив соответствующую информацию в файл «/etc/make.conf» или «/etc/portage/package.use».
# echo "net-ftp/pure-ftpd charconv mysql ssl vchroot -pam" >>/etc/portage/package.use
Выполняем установку пакета «net-ftp/pure-ftpd».
# emerge pure-ftpd
Файл настройки ftp-сервера «Pure-FTPd» находится в «/ect/conf.d/pure-ftpd» и может выглядеть так, как показано ниже.
/ect/conf.d/pure-ftpdIS_CONFIGURED="yes"
SERVER="-S 21"
MAX_CONN="-c 30"
MAX_CONN_IP="-C 10"
DAEMON="-B"
DISK_FULL="-k 90%"
AUTH="-l mysql:/etc/pure-ftpd/pure-ftpd.conf"
TIMEOUT="-I 5"
LOG="-f ftp"
CHARCONV="--fscharset UTF-8 --clientcharset=CP1251"
MISC_OTHER="-A -E -i -R -Z -H -u10000 -L15000:5 -m70 -y15:5 -p40000:50400 -U137:027 -Y1"
Исходный файл «/ect/conf.d/pure-ftpd» хорошо документирован, так что с настройкой проблем возникнуть не должно. Обратите внимание на опцию «MISC_OTHER», так как большинство настроек ftp-сервера задается именно в ней. Чтобы узнать о всех возможных ключах запуска «Pure-FTPd», нужно обратиться к официальной документации.
В опции «AUTH» задается тип аутентификации. В нашем случае там содержится путь к файлу с дополнительными опциями для подключения к MySQL-базе с ftp-пользователями.
Создадим дополнительную директорию «/etc/pure-ftpd» и поместим туда файл «pure-ftpd.conf» следующего содержания.
/ect/pure-ftpd/pure-ftpd.conf#MYSQLServer 127.0.0.1
#MYSQLPort 3316
MYSQLSocket /var/run/mysqld/mysqld.sock
MYSQLUser pureftpd
MYSQLPassword mypassword
MYSQLDatabase pureftpd
MYSQLCrypt md5
MYSQLGetPW SELECT Password FROM users WHERE User="\L" AND Status="1" AND (Ipaddress = "*" OR Ipaddress LIKE "\R")
MYSQLGetUID SELECT Uid FROM users WHERE User="\L" AND Status="1" AND (Ipaddress = "*" OR Ipaddress LIKE "\R")
MYSQLGetGID SELECT Gid FROM users WHERE User="\L" AND Status="1" AND (Ipaddress = "*" OR Ipaddress LIKE "\R")
MYSQLGetDir SELECT CONCAT(Dir,'/./') UDir FROM users WHERE User="\L" AND Status="1" AND (Ipaddress = "*" OR Ipaddress LIKE "\R")
MySQLGetQTAFS SELECT QuotaFiles FROM users WHERE User="\L" AND Status="1" AND (Ipaddress = "*" OR Ipaddress LIKE "\R")
MySQLGetQTASZ SELECT QuotaSize FROM users WHERE User="\L" AND Status="1" AND (Ipaddress = "*" OR Ipaddress LIKE "\R")
MySQLGetRatioUL SELECT ULRatio FROM users WHERE User="\L" AND Status="1" AND (Ipaddress = "*" OR Ipaddress LIKE "\R")
MySQLGetRatioDL SELECT DLRatio FROM users WHERE User="\L" AND Status="1" AND (Ipaddress = "*" OR Ipaddress LIKE "\R")
MySQLGetBandwidthUL SELECT ULBandwidth FROM users WHERE User="\L" AND Status="1" AND (Ipaddress = "*" OR Ipaddress LIKE "\R")
MySQLGetBandwidthDL SELECT DLBandwidth FROM users WHERE User="\L" AND Status="1" AND (Ipaddress = "*" OR Ipaddress LIKE "\R")
Файл содержит все необходимые параметры для подключения к MySQL-базе и список SQL-запросов для получения необходимой информации.
Обратите внимание на опцию «MYSQLGetDir», в которой содержится путь к домашней директории ftp-пользователя. В базе данных хранится обычный путь, а при выборке его для «Pure-FTPd» мы добавим строку «/./». В этом случае ftp-пользователь будет ограничен только своей домашней директорией и не сможет выйти за ее пределы.
Если планируется использовать защищенные ftp-соединения, то необходимо чтобы файл сертификата находился в «/etc/ssl/private/pure-ftpd.pem». Подробнее об этом можно прочесть здесь.
Если все настройки сделаны, то можно запустить ftp-сервер «Pure-FTPd».
# /etc/init.d/pure-ftpd start
На этом настройку связки «Pure-FTPd» + «MySQL» + «User Manager of Pure-FTPd» можно считать завершенной. В результате мы имеем надежный ftp-сервер с удобным управлением пользователями через web-интерфейс.