Поиск по сайту:

FTP-сервер с PureFTPd, MariaDB и виртуальными пользователями (включая управление квотами и пропускной способностью) на CentOS 7.2


Это руководство существует для этих версий ОС

  • CentOS 7.2
  • CentOS 5.3

На этой странице

  1. 1 Предварительное примечание
  2. 2. Установите MySQL и phpMyAdmin.
  3. 3 Установите PureFTPd с поддержкой MySQL/MariaDB
  4. 4 Создайте базу данных для PureFTPd
  5. 5 Настройка PureFTPd
  6. 6 Заполните базу данных и протестируйте сервер
  7. 7 Администрирование базы данных
  8. 8 Анонимный FTP
  9. 9 Загрузите этот сервер CentOS 7.2 в качестве виртуальной машины.
  10. 10 ссылок

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

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

Это руководство основано на CentOS 7.2. Вы уже должны были настроить базовую минимальную систему CentOS 7.2.

Это руководство задумано как практическое руководство; он не охватывает теоретических основ. Они рассматриваются во многих других документах в Интернете.

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

1 Предварительное примечание

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

2 Установите MySQL и phpMyAdmin

Во-первых, мы включаем репозиторий EPEL в нашей системе CentOS, поскольку некоторые пакеты, которые мы собираемся установить в ходе этого руководства, недоступны в официальных репозиториях CentOS 7.2:

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*

Затем мы включаем репозиторий EPEL в нашей системе CentOS, поскольку многие пакеты, которые мы собираемся установить в ходе этого руководства, недоступны в официальном репозитории CentOS 7:

yum -y install epel-release
yum -y install yum-priorities

Отредактируйте /etc/yum.repos.d/epel.repo...

nano /etc/yum.repos.d/epel.repo

... и добавьте строку priority=10 в секцию [epel]:

[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[...]

Затем мы обновляем наши существующие пакеты в системе:

yum update

Теперь мы можем установить веб-сервер Apache, PHP, MariaDB и phpMyAdmin следующим образом:

yum -y install mariadb mariadb-server phpmyadmin httpd php

Теперь настраиваем phpMyAdmin. Изменяем конфигурацию Apache, чтобы phpMyAdmin разрешал подключения не только с локального хоста (закомментировав все в разделе и добавив строку Require all grant):

nano /etc/httpd/conf.d/phpMyAdmin.conf

чтобы файл выглядел так:

# phpMyAdmin - Web based MySQL browser written in php
#
# Allows only localhost by default
#
# But allowing phpMyAdmin to anyone other than localhost should be considered
# dangerous unless properly secured by SSL

Alias /phpMyAdmin /usr/share/phpMyAdmin
Alias /phpmyadmin /usr/share/phpMyAdmin

<Directory /usr/share/phpMyAdmin/>
AddDefaultCharset UTF-8 # <IfModule mod_authz_core.c> # # Apache 2.4 # <RequireAny> # Require ip 127.0.0.1 # Require ip ::1 # </RequireAny> # </IfModule> # <IfModule !mod_authz_core.c> # # Apache 2.2 # Order Deny,Allow # # Deny from All # Allow from 127.0.0.1 Options Indexes AllowOverride None Require all granted # Allow from ::1 # </IfModule> </Directory> <Directory /usr/share/phpMyAdmin/setup/> <IfModule mod_authz_core.c> # Apache 2.4 <RequireAny> Require ip 127.0.0.1 Require ip ::1 </RequireAny> </IfModule> <IfModule !mod_authz_core.c> # Apache 2.2 Order Deny,Allow Deny from All Allow from 127.0.0.1 Allow from ::1 </IfModule> </Directory> # These directories do not require access over HTTP - taken from the original # phpMyAdmin upstream tarball # <Directory /usr/share/phpMyAdmin/libraries/> Order Deny,Allow Deny from All Allow from None </Directory> <Directory /usr/share/phpMyAdmin/setup/lib/> Order Deny,Allow Deny from All Allow from None </Directory> <Directory /usr/share/phpMyAdmin/setup/frames/> Order Deny,Allow Deny from All Allow from None </Directory> # This configuration prevents mod_security at phpMyAdmin directories from # filtering SQL etc. This may break your mod_security implementation. # #<IfModule mod_security.c> # <Directory /usr/share/phpMyAdmin/> # SecRuleInheritance Off # </Directory> #</IfModule>

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

Откройте порты http и https, когда брандмауэр CentOS firewalld установлен на вашем сервере.

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

Затем запустите MariaDB и Aapche.

systemctl enable mariadb.service
systemctl start mariadb.service
systemctl enable httpd.service
systemctl start httpd.service

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

mysql_secure_installation

[[электронная почта защищена] ~]#

3 Установите PureFTPd с поддержкой MySQL/MariaDB

Пакет CentOS PureFTPd поддерживает различные серверные части, такие как MySQL, PostgreSQL, LDAP и т. д. Поэтому все, что нам нужно сделать, это установить обычный пакет PureFTPd:

yum -y install pure-ftpd

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

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

Служба ftp должна быть разрешена брандмауэром-cmd следующим образом:

firewall-cmd --permanent --zone=public --add-service=ftp
firewall-cmd --reload

4 Создайте базу данных для PureFTPd

Теперь мы создаем базу данных с именем pureftpd и пользователя MariaDB с именем 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 MySQL. Еще на оболочке 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 '',
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)
) ENGINE=MyISAM;
quit;

Как вы могли заметить, с quit; мы покинули оболочку MySQL и вернулись в оболочку Linux.

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

5 Настройте PureFTPd

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

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

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

Затем редактируем /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
nano /etc/pure-ftpd/pureftpd-mysql.conf
MYSQLSocket      /var/lib/mysql/mysql.sock
#MYSQLServer     localhost
#MYSQLPort       3306
MYSQLUser       pureftpd
MYSQLPassword   ftpdpass
MYSQLDatabase   pureftpd
#MYSQLCrypt md5, cleartext, crypt() or password() - md5 is VERY RECOMMENDABLE uppon cleartext
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 в качестве метода MYSQLCrypt, что означает, что мы будем хранить пароли пользователей в виде строки MD5 в базе данных, что намного безопаснее, чем использование простых текстовых паролей!

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

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

6 Заполните базу данных и протестируйте сервер

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

mysql -u root -p
USE pureftpd;

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

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 на своей рабочей станции (что-то вроде FileZilla, если вы работаете в системе Windows, или gFTP на рабочем столе Linux) и попробуйте подключиться. В качестве имени хоста вы используете server1.example.com (или IP-адрес системы), имя пользователя — exampleuser, а пароль — secret.

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

Теперь, если вы запустите

ls -l /home

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

[ ~]#

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

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

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

Таблица FTPD:

8 Анонимный FTP

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

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

nano /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 (не делайте этого, если хотите использовать /var/ftp):

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/

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

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

nano /etc/pure-ftpd/pure-ftpd.conf
[...]
NoAnonymous                 no
[...]
AntiWarez                   no
[...]
AnonymousBandwidth            8
[...]
AnonymousCantUpload         no
[...]

(Настройка AnonymousBandwidth не является обязательной — она позволяет ограничить пропускную способность загрузки и выгрузки для анонимных пользователей. 8 означает 8 КБ/с. Используйте любое значение по своему усмотрению или закомментируйте строку, если не хотите ограничивать пропускную способность.)

Наконец, перезапускаем PureFTPd:

systemctl restart pure-ftpd.service

9 Загрузите этот сервер CentOS 7.2 как виртуальную машину

Эта установка доступна для загрузки виртуальной машины в формате ova/ovf (совместима с VMWare и Virtualbox) для подписчиков howtoforge.

Данные для входа в виртуальную машину

  • Корневой пароль: howtoforge
  • Пароль пользователя \администратора\: howtoforge

Измените оба пароля при первом входе.

  • IP-адрес виртуальной машины: 192.168.1.100.

10 ссылок

  • PureFTPd: http://www.pureftpd.org/
  • MySQL: http://www.mysql.com/
  • phpMyAdmin: http://www.phpmyadmin.net/
  • CentOS: http://centos.org/