Вве­де­ние

Довольно часто воз­ни­кает необ­хо­ди­мость под­нять 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-интерфейс.