Виртуальный хостинг на Linux с доступом по FTP

Виртуальный хостинг с PureFTP и MySQL (включая управление квотой и шириной канала) на Linux.

Эта статья описывает процесс установки сервера PureFTP, который использует виртуальных пользователей из базы данных MySQL, а не реальных пользователей системы. Это гораздо более эффективно и позволяет без проблем иметь тысячи ftp-пользователей на одной системе. Будет рассмотрен вопрос, как пользоваться квотой и загрузкой/выгрузкой лимитов пропускной способности. Пароли будут зашифрованы в MD5 в базе данных.

pureftp

Примером построения системы на базе PureFTP является сервер сайта www.gkds.ru. Как видно из иллюстрации, выполняется попытка подключения по протоколу FTP, причем ответ получен от службы PureFTP.

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

Эта статья написана на базе дистрибутива Fedora версии 18, затем проверена на дистрибутиве Fedora версии 20 и 21. Для продолжения установки у вас должна быть установлена Fedora не ниже 16-й. Прекрасно подойдут дистрибутивы CentOS 7.0 или Red Hat Enterprise Linux 7.0.

В этой статье даны практические рекомендации, здесь мы не будем рассматривать теоретические основы, так как им уже посвящено большое количество статей в интернете.

1 Предварительные замечания

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

2 Установка MySQL

Установка подробно рассмотрена в основной статье. Как правило, достаточно воспользоваться командой:

install -y mysql mysql-server

Затем создадим ссылки для запуска системы с MySQL и Apache (обе программы будут запускаться автоматически при старте системы) и запустим обе службы:

systemctl enable mysqld.service
systemctl start mysqld.service

Если возникла подобная ошибка:

[root@server1 ~]# systemctl enable mysqld.service
Failed to issue method call: No such file or directory

введите следующее

[root@server1 ~]# ln -s '/usr/lib/systemd/system/mysqld.service'
'/etc/systemd/system/multi-user.target.wants/mysqld.service'
[root@server1 ~]# ln -s '/usr/lib/systemd/system/mariadb.service' '/etc/systemd/system/multi-
user.target.wants/mariadb.service'
systemctl start mysqld.service
systemctl start mariadb.service
systemctl enable httpd.service
systemctl start httpd.service

Создайте пароль администратора для MySQL (замените yourrootsqlpassword на любой пароль по вашему усмотрению):

mysql_secure_installation

Для того, чтобы залогиниться в MySQL необходимо нажать Enter и ввести ваш логин и пароль, на остальные вопросы просто соглашаемся, нажимая Enter.

3 Установка phpMyAdmin

Рассмотрена в отдельной статье.

4 Установка PureFTP с поддержкой MySQL

Служба PureFTPd на ОС Linux поддерживает большое количество систем управления базами данных, например: MySQL, PostgreSQL, LDAP, и т.д. Для начала установим PureFTPd, для этого запустим yum со следующими параметрами

install -y pure-ftpd

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

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

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

Создадим базу данных под названием pureftpd и пользователя MySQL под именем 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. В оболочке MySQL создадим таблицу с необходимыми базами данных:

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 '',
Uidvarchar(11) NOT NULL default '-1',
Gidvarchar(11) NOT NULL default '-1',
Dirvarchar(128) NOT NULL default '',
ULBandwidthsmallint(5) NOT NULL default '0',
DLBandwidthsmallint(5) NOT NULL default '0',
comment tinytext NOT NULL,
ipaccessvarchar(15) NOT NULL default '*',
QuotaSizesmallint(5) NOT NULL default '0',
QuotaFilesint(11) NOT NULL default 0,
PRIMARY KEY (User),
UNIQUE KEY User (User)
) ENGINE=MyISAM;
quit;

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

Теперь phpMyAdmin находится по адресу http://10.4.0.10/phpMyAdmin/ (также можно ввести localhost для локальной машины) и залогиниться, как пользователь pureftpd. Также вы можете просмотреть базы данных. Впоследствии вы можете использовать phpMyAdmin для администрирования PureFTPd-сервера.

5 Настройка PureFTPd

Отредактируем /etc/pure-ftpd/pure-ftpd.conf, нам необходимо проверить строки ChrootEveryone, MySQLConfigFileи CreateHomeDir, которые должны выглядеть следующим образом:

[...]
ChrootEveryone yes
[...]
MySQLConfigFile /etc/pure-ftpd/pureftpd-mysql.conf
[...]
CreateHomeDiryes
[...]

При включении ChrootEveryone каждый виртуальный пользователь сможет заходить только лишь в своюкорневуюдиректорию и не сможет просматривать файлы и директории вне своей. СтрокаCreateHomeDir сделает домашнюю директорию для пользователя, в том случае, когда пользователь вошёл в систему, а домашней директории ещё не существует.

Затем отредактируем файл/etc/pure-ftpd/pureftpd-mysql.conf следующим образом:

cp /etc/pure-ftpd/pureftpd-mysql.conf /etc/pure-ftpd/pureftpd-mysql.conf_orig
cat /dev/null> /etc/pure-ftpd/pureftpd-mysql.conf
vi /etc/pure-ftpd/pureftpd-mysql.conf
MYSQLSocket      /var/lib/mysql/mysql.sock
#MYSQLServer localhost
#MYSQLPort 3306
MYSQLUserpureftpd
MYSQLPasswordftpdpass
MYSQLDatabasepureftpd
#MYSQLCrypt md5, cleartext, crypt() or password() - md5 is VERY RECOMMENDABLEupponcleartext
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 на свой пароль для MySQL и пользователя pureftpdв строке MYSQLPassword! Обратите внимание, что мы будет использовать шифрование данных в виде md5, то есть мы будем хранить пароли пользователей,как строкуMD5 в базе данных, это гораздо более безопасно, чем простые текстовые пароли.

Теперь создадим ссылки на автозагрузку PureFTPd и затем запустим саму программу:

systemctl enable pure-ftpd.service
systemctl start pure-ftpd.service

6 Заполнение базы данных и проверка

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

mysql -u root -p
USE pureftpd;

Теперь создадим пользователя exampleuser со статусом 1 (это означает, что его ftp-аккаунт активен) и пароль secret (который будет храниться в зашифрованном виде, используя MD5 в MySQL), UID и GID2001 (используйте команды userid и groupid для пользователя / группы, которого мы создали в конце второго пункта!), домашнюю директорию /home/example, и загрузку и выгрузку с шириной пропускания 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/example', '100', '100', '', '*', '50', '0');
quit;

Теперь откроем наш клиент FTP (по типу WS_FTP или SmartFTP, если вы используете Windows или gFTP если вы используете Linux) и попробуйте подключиться. В качестве имени хоста будем использовать IP-адрес вашей системы, имя пользователя –exampleuser и пароль secret.

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

Теперь, если вы введёте следующее:

ls -l /home

вы увидите директорию /home/example (стандартная директория exampleuser),созданную автоматически, и владельцем является ftpuse rи ftpgroup (пользователь/группа, которую мы создали в конце пункта два):

[root@server1 system]# ls -l /home/
total 4
drwxr-xr-x 2 ftpuserftpgroup 4096 May 2 02:35 example

7 Управление базами данных

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

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

Таблица ftpd:

User: Имя виртуального польовазтеля PureFTPd (на примерe xampleuser).
status: 0 or 1. 0 означает, что аккаунт пользователя неактивен и пользователь не сможет войти.
Password: Пароль виртуального пользователя. Убедитесь, что вы включили функцию шифрования пароля.
UID: идентификатор пользователя ftp, который мы создали в пункте 2 (например 2001).
GID: идентификатор группы, который мы создали в пункте 2 (например 2001).
Dir: Домашняя директория виртуального пользователя PureFTPd (например /home/example). Если такая директория не существует, она будет создана при первом входе пользователя в FTP. Виртуальный пользователь будет иметь доступ только к своей домашней директории.
ULBandwidth: Ширина канала отдачи виртуального пользователя, измеряется KБ/сек. (килобайты в секунду). 0снимаетлюбыеограничения.
DLBandwidth: Ширина канала загрузки виртуального пользователя, измеряется в KБ/сек. (килобайты в секунду). 0 снимает любые ограничения.
comment: Здесь можно оставить любой комментарий. (например для внутреннего управления)Обычно это поле оставляют пустым.
ipaccess: Введите IP адрес, с которого можно присоединиться к аккаунту FTP . * с любого IPадреса можно подключиться.
QuotaSize: Дисковое пространство в MБ (не в KБ, как в ULBandwidth и DLBandwidth!), которое виртуальный пользователь может использовать на сервере FTP. 0 снимает любые ограничения.
QuotaFiles: объем файлов виртуального пользователя, которые он может хранить на сервере FTP. 0 снимает любые ограничения.

8 Анонимный FTP

Если вы хотите создать анонимный ftpаккаунт (акаунт ftp, доступный любому, без пароля), вам потребуется пользователь или группа под именем ftp. Группа и пользователя созданы автоматически при установке pure-ftpd, поэтому в ручную их создавать не придётся.Тем не менее стандартной домашней директивой является /var/ftp, но мы создадим анонимную директорию ftp по адресу/home/ftp (домашние директории обычных пользователей находятся по адресу /home, например/home/example). Также вы можете оставить директорию в /var/ftp, если вам так удобно.

Если же вы хотите изменить домашнюю директорию, откройте /etc/passwdи измените домашнюю директорию пользователя ftp с /var/ftp на /home/ftp:

vi /etc/passwd
[...]
#ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
ftp:x:14:50:FTP User:/home/ftp:/sbin/nologin
[...]

Заменим /var/ftp на /home:

mv /var/ftp /home

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

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

(Если вы хотите использовать /var/ftpзамените /home/ftpна /var/ftp.)

Анонимные пользователи смогут войти в систему, и смогут загружать файлы из директории/home/ftp, но выгрузка файлов будет ограничена для директории /home/ftp/incoming (если файл загружен в /home/ftp/incoming, он не может быть прочитан или загружен из данной директории. Админ сервера должен переместить файлы в/home/ftpfirst,чтобы сделать их доступными.)

Теперь настроим PureFTPd для анонимногоftp. Откроем файл/etc/pure-ftpd/pure-ftpd.confи выставим там соответствующие настройки:

[...]
NoAnonymous no
[...]
AntiWarez no
[...]
AnonymousBandwidth 16
[...]
AnonymousCantUploadnо
[...]

(Настройка AnonymousBandwidth задаётся по вашему желанию – в ней можно настроить ширину канала загрузки и выгрузки для анонимных пользователей. Например, 16 означает 16 KБ/сек. Можно выставить любое значение или пропустить эту настройку, если вы не хотите задавать ширину полосы пропускания.)

В конце-концов перезапускаем PureFTPd:

systemctl restart pure-ftpd.service

Ура, наш хостинг готов принимать сайты на размещение!

1 Комментарий

Авторизуйтесь, чтобы получить возможность оставлять комментарии

Другие материалы в этой категории:

Go to top