виртуальный хостинг с PureFTPd и MySQL

Это документ описывает, как установить сервер PureFTPd, который использует виртуальных пользователей из базы данных MySQL вместо реальных пользователей системы. Это позволит иметь тысячи пользователей FTP на одной машине. Кроме того, я покажу, как использовать квотирование и ограничить входящую/исходящую пропускную способность. Пароли будут записаны в виде зашифрованных MD5-строк в базе данных.

Для администрирования базы данных MySQL вы можете использовать веб-интерфейс, такой как phpMyAdmin, установка которого тоже будет описана в этой статье. phpMyAdmin - это удобный графический интерфейс, благодаря которому не надо будет ничего делать из командной строки.

В статье используется Debian Etch (Debian 4.0). Естественно, у вас уже должна быть установлена базовая система Debian Etch. Эта статья является сугубо практической и не содержит теоретических отступлений.

Статья не дает каких-либо гарантий! Я не утверждаю что это единчтвенный способ настройки. Есть много способов, добиться той же цели. И я не гарантирую, что приведенный способ будет работать у вас.

В этой статье я использую имя хоста server1.example.com и IP адресом 192.168.0.100. Эти настройки у вас могут быть другими, поэтому вам надо будет заменить их на соответствующие.

установка MySQL и phpMyAdmin

Все можно установить одной командой:

apt-get install mysql-server mysql-client libmysqlclient15-dev phpmyadmin apache2

Создайте пароль для MySQL пользователя root (замените yourrootsqlpassword на пароль, который хотите использовать):

mysqladmin -u root password yourrootsqlpassword

Затем с помощью следующей команды проверьте, какой адрес слушает MySQL

netstat -tap | grep mysql

Если вывод выглядит примерно так:

tcp 0 0 localhost.localdo:mysql *:* LISTEN 2713/mysqld

то это означает, что MySQL слушает только localhost.localdomain, и вы можете безопасно использовать пароль, установленный ранее. Но если вывод выглядит так:

tcp 0 0 *:mysql *:* LISTEN 2713/mysqld

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

mysqladmin -h server1.example.com -u root password yourrootsqlpassword

установка PureFTPd с поддержкой MySQL

Для Debian доступен сконфигурированный пакет pure-ftpd-mysql. Установить его можно так:

apt-get install pure-ftpd-mysql

Затем создаем ftp группу (ftpgroup) и пользователя (ftpuser), на которых будут ссылаться все наши виртуальные пользователи. Замените group- и userid 2001 на номер, который свободен в вашей системе:

groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "pureftpd user" -g ftpgroup ftpuser


создание базы данных MySQL для PureFTPd

Сейчас мы создадим базу данных, которую назовем pureftpd и MySQL пользователя pureftpd, которого демон PureFTPd будет использовать для подключения к базе данных pureftpd.

mysql -u root -p
CREATE DATABASE pureftpd;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost' IDENTIFIED BY 'ftpdpass';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost.localdomain' IDENTIFIED BY 'ftpdpass';
FLUSH PRIVILEGES;


Замените строку ftpdpass на пароль, который вы хотите использовать для пользователя pureftpd. Затем создадим таблицу, которая будет нам нужна:

USE pureftpd;
CREATE TABLE ftpd (
User varchar(16) NOT NULL default '',
status enum('0','1') NOT NULL default '0',
Password varchar(64) NOT NULL default '',
Uid varchar(11) NOT NULL default '-1',
Gid varchar(11) NOT NULL default '-1',
Dir varchar(128) NOT NULL default '',
ULBandwidth smallint(5) NOT NULL default '0',
DLBandwidth smallint(5) NOT NULL default '0',
comment tinytext NOT NULL,
ipaccess varchar(15) NOT NULL default '*',
QuotaSize smallint(5) NOT NULL default '0',
QuotaFiles int(11) NOT NULL default 0,

PRIMARY KEY (User),

UNIQUE KEY User (User)
) TYPE=MyISAM;
quit;


Как вы, возможно, заметили, командой quit мы завершаем работу с MySQL.

Кстати, (я предполагаю, что имя вашего ftp сервера server1.example.com) вы можете получить доступ используя phpMyAdmin по адресу http://server1.example.com/phpmyadmin/ (вы также можете использовать IP-адрес вместо server1.example.com) и войти как пользователь pureftpd. После этого вы можете посмотреть на базу данных. Позже вы сможете использовать phpMyAdmin для администрирования вашего PureFTPd-сервера.

конфигурация PureFTPd

Отредактируйте /etc/pure-ftpd/db/mysql.conf:

MYSQLSocket /var/run/mysqld/mysqld.sock
#MYSQLServer localhost
#MYSQLPort 3306
MYSQLUser pureftpd
MYSQLPassword ftpdpass
MYSQLDatabase pureftpd
MYSQLCrypt md5
MYSQLGetPW SELECT Password FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetUID SELECT Uid FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetGID SELECT Gid FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetDir SELECT Dir FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetBandwidthUL SELECT ULBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetBandwidthDL SELECT DLBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetQTASZ SELECT QuotaSize FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetQTAFS SELECT QuotaFiles FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")


Убедитесь, что заменили ftpdpass настоящим паролем пользователя pureftpd в строке MYSQLPassword! Убедитесь, что используете MD5 как MYSQLCrypt- метод, что означает, что мы запоминаем пароли пользователей как MD5-строки, что гораздо безопаснее использования обычного текста!

Затем создайте файл /etc/pure-ftpd/conf/ChrootEveryone, содержащий строчку yes:

echo "yes" > /etc/pure-ftpd/conf/ChrootEveryone

Это заставит PureFTPd делать chroot для каждого пользователя в его домашний каталог и он не сможет простматривать файлы и папке вне домашнего каталога.

Также создайте файл /etc/pure-ftpd/conf/CreateHomeDir, также содержащий строку yes:

echo "yes" > /etc/pure-ftpd/conf/CreateHomeDir

Это заставит PureFTPd создавать домашний каталог пользователя, если его не существует.

Теперь нам надо сконфигурировать PureFTPd как самостоятельный демон (пока он конторолируется inetd). Чтобы это сделать, мы откроем
/etc/default/pure-ftpd-common и изменим значение параметра STANDALONE_OR_INETD на standalone:

STANDALONE_OR_INETD=standalone
VIRTUALCHROOT=false
UPLOADSCRIPT=
UPLOADUID=
UPLOADGID=


Затем изменим /etc/inetd.conf, закомментировав строку ftp:

#ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/pure-ftpd-wrapper

После этого перезапустим Inetd и PureFTPd:

/etc/init.d/openbsd-inetd restart
/etc/init.d/pure-ftpd-mysql restart


заполнение базы данных и тесты

Для заполнения базы данных вы можете использовать командный интерпритатор MySQL:

mysql -u root -p
USE pureftpd;


Теперь создадим пользователя exampleuser со статусом 1 (что означает, что его ftp-аккаунт - активный), пароль secret (который будет сохранен в заштфрованном виде, используя MySQL функцию MD5), UID и GID 2001 (используйте userid и groupid пользователя/группы, которых вы создали ранее), домашний каталог /home/www.example.com, лимит входяшей/исходящей пропускной способности 100 KБ/с (килобайт в секунду), и квоту в 50 MБ:

INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`) VALUES ('exampleuser', '1', MD5('secret'), '2001', '2001', '/home/www.example.com', '100', '100', '', '*', '50', '0');
quit;


Теперь откройте FTP-клиент на своей рабочей станции и попробуйте подключиться. В качестве имени используйте server1.example.com (или соответствующий IP-адрес), имя пользователя exampleuser и пароль secret.

Если вам удалось подключиться - поздравляю! Если нет, то что-то пошло не так.

Теперь, если вы выполните

ls -l /home

вы должны увидеть, что директория /home/www.example.com (домашний каталог пользователя exampleuser) была автоматически создана, и принадлежит ftpuser и ftpgroup (Пользователь/группа, которых мы создали в конце 2 части):

server1:/etc/default# ls -l /home

total 8
drwxr-xr-x 2 administrator administrator 4096 2007-04-23 14:25 administrator
drwxr-xr-x 2 ftpuser ftpgroup 4096 2007-04-23 17:26 www.example.com


администрирование базы данных

Для большинства людей легче всего использовать графическую оболочку для MySQL; однако также можете использовать phpMyAdmin (в этом примере по адресу http://server1.example.com/phpmyadmin/) для администрирования базы данных pureftpd.

Когда вы хотите создать нового пользователя, вам надо создать запись в таблице ftpd. Далее будут описаны все строки этой таблицы:

- User - имя виртуального пользователя PureFTPd;

- status - 0 или 1. 0 означает, что аккаунт отключен и пользователь не может подключится;

- Password - пароль виртуального пользователя;

- UID - userid пользователя;

- GID -gupid пользователя;

- Dir - домашний каталог виртуального пользователя PureFTPd;

- ULBandwidth - скорость закачки для вирткального пользователя в КБ/с. 0 - не ограничена;

- DLBandwidth - скорость скачки для вирткального пользователя в КБ/с. 0 - не ограничена;

- comment - комментарии. Поле можно оставить пустым;

- ipaccess - IP-адрес, с которого можно подключаться с данным аккаунтом;

- QuotaSize - квота в МБ;

- QuotaFiles - количество файлов, которое можно сохранять.0 - не ограничено.

анонимный FTP

Если вы хотите создать анонимный аккаунт (аккаунт, с которым любой может подключаться без пароля), вам надо сделать что-то вроде этого: Сначала надо создать пользователя ftp (с домашним каталогом /home/ftp) и группу ftp:

groupadd ftp
useradd -s /bin/false -d /home/ftp -m -c "anonymous ftp" -g ftp ftp


Затем создать файл /etc/pure-ftpd/conf/NoAnonymous, содержайщий строку no:

echo "no" > /etc/pure-ftpd/conf/NoAnonymous

После этого PureFTPd позволит использовать анонимный вход.
Перезапустите PureFTPd:

/etc/init.d/pure-ftpd-mysql restart

Теперь создадим директорию /home/ftp/incoming, в которую позволим анонимным пользователям закачивать файлы. Дадим директории /home/ftp/incoming права 311 и пользователи смогут закачивать файлы, но не смогут их видеть или скачивать. Директория /home/ftp будет иметь права 555, что позволит видеть и скачивать файлы:

cd /home/ftp
mkdir incoming
chown ftp:nogroup incoming/
chmod 311 incoming/
cd ../
chmod 555 ftp/


Теперь анонимные пользователи могут подключаться, скачивать файлы из /home/ftp и закачивать в /home/ftp/incoming.



Alex, впервые опубликовано на сайте «Жёлтый Лист» - ylsoftware.com


Сетевые решения. Статья была опубликована в номере 06 за 2007 год в рубрике sysadmin

©1999-2022 Сетевые решения