FTP сервер · 13 min read · Dec 24, 2025

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

Этот документ описывает, как установить сервер 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 разрешал подключения не только с localhost (закомментировав все в разделе и добавив строку Require all granted):

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

так, чтобы файл выглядел следующим образом:

# phpMyAdmin - Веб-интерфейс для браузера MySQL, написанный на php
#
# Разрешает только localhost по умолчанию
#
# Но разрешение phpMyAdmin для всех, кроме localhost, следует считать
# опасным, если не защищено должным образом SSL

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


    AddDefaultCharset UTF-8
#  
#     # Apache 2.4
#     
#       Require ip 127.0.0.1
#       Require ip ::1
#     
#   
#   
#     # 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
#   




   
     # Apache 2.4
     
       Require ip 127.0.0.1
       Require ip ::1
     
   
   
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from ::1
   


# Эти директории не требуют доступа через HTTP - взято из оригинального
# phpMyAdmin upstream tarball
#

    Order Deny,Allow
    Deny from All
    Allow from None



    Order Deny,Allow
    Deny from All
    Allow from None



    Order Deny,Allow
    Deny from All
    Allow from None


# Эта конфигурация предотвращает фильтрацию SQL и т.д. в директориях phpMyAdmin.
# Это может сломать вашу реализацию mod_security.
#
#
#    
#        SecRuleInheritance Off
#    
#

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

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

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

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

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

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

mysql_secure_installation

[root@server1 ~]# mysql_secure_installation
/usr/bin/mysql_secure_installation: line 379: find_mysql_client: command not found

NOTE: РЕКОМЕНДУЕТСЯ ЗАПУСКАТЬ ВСЕ ЧАСТИ ЭТОГО СКРИПТА ДЛЯ ВСЕХ СЕРВЕРОВ MariaDB В ПРОИЗВОДСТВЕ! Пожалуйста, внимательно прочитайте каждый шаг!

Чтобы войти в MariaDB и обеспечить ее безопасность, нам нужен текущий
пароль для пользователя root. Если вы только что установили MariaDB и
еще не установили пароль root, пароль будет пустым,
поэтому вам просто нужно нажать Enter здесь. <–ENTER
Введите текущий пароль для root (нажмите Enter для отсутствия): <–ENTER
OK, успешно использован пароль, продолжаем…

Установка пароля root гарантирует, что никто не сможет войти в пользователя root MariaDB без надлежащей авторизации.

Установить пароль root? [Y/n] <–ENTER
Новый пароль: <–yourmariadbpassword
Повторите новый пароль: <–yourmariadbpassword
Пароль успешно обновлен!
Перезагрузка таблиц привилегий..
… Успех!

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

Удалить анонимных пользователей? [Y/n] <–ENTER
… Успех!

Обычно root должен иметь возможность подключаться только с ‘localhost’. Это
гарантирует, что кто-то не сможет угадать пароль root из сети.

Запретить удаленный вход root? [Y/n] <–ENTER
… Успех!

По умолчанию MariaDB поставляется с базой данных с именем ‘test’, к которой может
доступ иметь любой. Это также предназначено только для тестирования и должно быть удалено
перед переходом в производственную среду.

Удалить тестовую базу данных и доступ к ней? [Y/n] <–ENTER

  • Удаление тестовой базы данных…
    … Успех!
  • Удаление привилегий на тестовую базу данных…
    … Успех!

Перезагрузка таблиц привилегий гарантирует, что все изменения, сделанные до сих пор,
вступят в силу немедленно.

Перезагрузить таблицы привилегий сейчас? [Y/n] <–ENTER
… Успех!

Очистка…

Все готово! Если вы выполнили все вышеперечисленные шаги, ваша установка MariaDB
должна быть теперь безопасной.

Спасибо за использование MariaDB!
[root@server1 ~]#

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

Пакет PureFTPd для CentOS поддерживает различные бэкенды, такие как 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 должна быть разрешена брандмауэром следующим образом:

firebase-cmd --permanent --zone=public --add-service=ftp  
firebase-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 на любой пароль, который вы хотите использовать для пользователя MySQL 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 '',  
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 помещать каждого виртуального пользователя в его домашний каталог, чтобы он не мог просматривать каталоги и файлы вне своего домашнего каталога. Строка 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-учетная запись активна), паролем secret (который будет храниться в зашифрованном виде с использованием функции MD5 MySQL), 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.

Подключение к FTP-серверу с помощью FileZilla.

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

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

ls -l /home

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

[root@server1 ~]# ls -l /home  
total 0  
drwx------. 2 administrator administrator 59 Jun 21 16:13 administrator  
drwxr-xr-x. 2 ftpuser ftpgroup 22 Jul 4 18:30 www.example.com  
[root@server1 ~]#

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

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

Панель управления PHPMyAdmin

База данных MySQL pure-ftpd

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

Таблица FTPD:

  • User: Имя виртуального пользователя PureFTPd (например, exampleuser).
  • status: 0 или 1. 0 означает, что учетная запись отключена, пользователь не может войти в систему.
  • Password: Пароль виртуального пользователя. Убедитесь, что вы используете функцию MD5 MySQL, чтобы сохранить пароль в зашифрованном виде в виде строки MD5:
    Добавить FTP пользователя.
  • UID: Идентификатор пользователя FTP, который вы создали в конце второго шага (например, 2001).
  • GID: Идентификатор группы FTP, который вы создали в конце второго шага (например, 2001).
  • Dir: Домашний каталог виртуального пользователя PureFTPd (например, /home/www.example.com). Если он не существует, он будет создан, когда новый пользователь войдет в систему в первый раз через FTP. Виртуальный пользователь будет помещен в этот домашний каталог, т.е. он не сможет получить доступ к другим каталогам вне своего домашнего каталога.
  • ULBandwidth: Пропускная способность загрузки виртуального пользователя в КБ/с (килобайтах в секунду). 0 означает неограниченно.
  • DLBandwidth: Пропускная способность выгрузки виртуального пользователя в КБ/с (килобайтах в секунду). 0 означает неограниченно.
  • comment: Вы можете ввести любой комментарий здесь (например, для вашего внутреннего администрирования). Обычно это поле оставляют пустым.
  • ipaccess: Введите IP-адреса, которым разрешено подключаться к этой FTP-учетной записи. * означает, что любой IP-адрес может подключиться.
  • QuotaSize: Объем хранилища в МБ (не КБ, как в ULBandwidth и DLBandwidth!), который виртуальный пользователь может использовать на FTP-сервере. 0 означает неограниченно.
  • QuotaFiles: количество файлов, которые виртуальный пользователь может сохранить на FTP-сервере. 0 означает неограниченно.

8 Анонимный FTP

Если вы хотите создать анонимную FTP-учетную запись (FTP-учетную запись, в которую каждый может войти без пароля), вам нужен пользователь и группа с именем ftp. Оба были созданы автоматически, когда вы установили пакет pure-ftpd, поэтому вам не нужно создавать их вручную. Однако домашний каталог ftp по умолчанию — /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/

(Если вы хотите использовать /var/ftp вместо этого, замените /home/ftp на /var/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.

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

  • Пароль root: howtoforge
  • Пароль пользователя “administrator”: howtoforge

Пожалуйста, измените оба пароля при первом входе.

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

10 Ссылки

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.