Установка и настройка FTP-сервера ProFTPd на Linux Ubuntu

Обновлено Обновлено: Опубликовано Опубликовано:

Используемые термины: FTP, Linux, Ubuntu.

Среди возможностей ProFTPd есть использование виртуальных пользователей с uid системных учетных записей, работа по FTP через TLS, использование виртуальных пользователей с хранением их в отдельном файле или базе данных. Мы рассмотрим настройку всех этих возможностей сервера FTP на примере Linux Ubuntu 18.04. Инструкция также, во многом, подойдет для настройки на Debian.

Настройка системы

Подготовим нашу операционную систему для корректной работы сервера FTP. Для этого настроим синхронизацию времени и правила в Firewall.

1. Время

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

cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime

Устанавливаем chrony:

apt-get install chrony

… и разрешаем его запуск при загрузке системы:

systemctl enable chrony

2. Брандмауэр

Если в нашем сервере используется фаервол (по умолчанию, он работает с разрешающими правилами), разрешаем порты:

  • 20 — для передачи данных.
  • 21 — для передачи команд.
  • с 60000 по 65535 — набор для пассивного обмена FTP. Данный диапазон может быть любым из свободных, но практика показывает, что данные значения работают стабильнее.

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

а) Iptables

Если для управления netfilter мы используем утилиту Iptables, то вводим команду:

iptables -A INPUT -p tcp –match multiport –dports 20,21,60000:65535 -j ACCEPT

Для сохранения правил можно использовать утилиту:

apt-get install iptables-persistent

netfilter-persistent save

б) UFW

В ufw команда будет следующей:

ufw allow 20,21,60000:65535/tcp

Установка и запуск с базовыми параметрами

Установка ProFTPd на Ubuntu выполняется следующей командой:

apt-get install proftpd

Открываем основной конфигурационный файл:

vi /etc/proftpd/proftpd.conf

Редактируем значения для параметров:

UseIPv6 off

* где UseIPv6 — разрешаем или запрещает использование IPv6. Если в нашей среде будет использоваться IP версии 6, то значение данной опции должно быть on. 

Снимаем комментарий для опции PassivePorts и задаем ей следующее значение:

PassivePorts 60000:65535

* где 60000 – 65535 — диапазон динамических портов для пассивного режима.

Разрешаем автозапуск FTP-серверу и перезапускаем его:

systemctl enable proftpd

systemctl restart proftpd

Готово — пробуем подключиться к серверу, использую любые FTP-клиенты, например, FileZilla, Total Commander или браузер. В качестве логина и пароля используем учетную запись пользователя Ubuntu.

Если мы хотим использовать выделенную учетную запись для FTP, то создаем ее командой:

useradd ftpuser -m

Задаем ей пароль:

passwd ftpuser

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

vi /etc/proftpd/proftpd.conf

DefaultRoot                     ~

И перезапускаем сервис:

systemctl restart proftpd

Шифрование при передаче данных

Следующим этапом настроим передачу данных через TLS.

В конфигурационном файле сервера ftp снимаем комментарий для строки:

vi /etc/proftpd/proftpd.conf

Include /etc/proftpd/tls.conf

Открываем конфигурационный файл tls.conf:

vi /etc/proftpd/tls.conf

Снимаем комментарии для следующих настроек:

TLSEngine                               on
TLSLog                                  /var/log/proftpd/tls.log
TLSProtocol                             SSLv23

TLSRSACertificateFile                   /etc/ssl/certs/proftpd.crt
TLSRSACertificateKeyFile                /etc/ssl/private/proftpd.key

TLSOptions                              NoCertRequest EnableDiags NoSessionReuseRequired

TLSVerifyClient                         off

TLSRequired                             on

* параметр TLSRequired можно задать в значение off, если мы не хотим требовать от клиента соединения по TLS.

Генерируем сертификат:

openssl req -x509 -nodes -newkey rsa:1024 -keyout /etc/ssl/private/proftpd.key -out /etc/ssl/certs/proftpd.crt -subj “/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=ftp.admins24.local/CN=ftp”

* где ftp.admins24.local — имя сервера в формате FQDN (не принципиально).

Перезапускаем ProFTPd:

systemctl restart proftpd

Использование виртуальных пользователей

Для безопасности рекомендуется использовать не реальных пользователей системы, а виртуальных. Мы рассмотрим процесс их хранения в файле или базе данных.

Хранение в файле

Создаем виртуального пользователя командой:

ftpasswd –passwd –file=/etc/proftpd/ftpd.passwd –name=ftpvirt –uid=33 –gid=33 –home=/var/tmp –shell=/usr/sbin/nologin

* где: 

  • /etc/proftpd/ftpd.passwd — путь до файла, в котором хранятся пользователи; 
  • ftpvirt — имя пользователя (логин); 
  • uid и gid — идентификаторы пользователя и группы системной учетной записи (например, www-data); 
  • /var/tmp — домашний каталог пользователя; 
  • /usr/sbin/nologin — оболочка, запрещающая локальный вход пользователя в систему.

Открываем конфигурационный файл proftpd:

vi /etc/proftpd/proftpd.conf

Снимаем комментарий или редактируем опцию (если не сделали это раньше):

DefaultRoot                     ~

* данная опция говорит о том, что корневой директорией для пользователя будет домашняя директория. Это нужно, чтобы FTP-пользователи не могли выйти за пределы дозволенного и видеть на сервере сайты друг друга.

Создаем дополнительный конфигурационный файл для proftpd:

vi /etc/proftpd/conf.d/virtual_file.conf

RequireValidShell off
AuthUserFile /etc/proftpd/ftpd.passwd
AuthPAM off
LoadModule mod_auth_file.c
AuthOrder mod_auth_file.c

Перезапускаем сервис FTP-сервера:

systemctl restart proftpd

Хранение в MariaDB (MySQL)

Настройку разделим на два этапа:

  1. Установку и настройку СУБД.
  2. конфигурирование FTP-сервера.

В качестве СУБД будем использовать MariaDB / MySQL.

СУБД

Устанавливаем на Ubuntu СУБД и модуль mysql для ProFTPd:

apt-get install mariadb-server proftpd-mod-mysql

Разрешаем автозапуск сервиса mariadb:

systemctl enable mariadb

Задаем пароль для пользователя root в mysql:

mysqladmin -u root password

Подключаемся к базе данных:

mysql -uroot -p

Создаем базу данных для хранения пользователей:

> CREATE DATABASE proftpd DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

* в данном примере мы создали базу данных proftpd.

Создаем таблицу в созданной базе:

> CREATE TABLE `proftpd`.`users` (
`userid` VARCHAR( 32 ) NOT NULL ,
`passwd` CHAR( 41 ) NOT NULL ,
`uid` INT NOT NULL ,
`gid` INT NOT NULL ,
`homedir` VARCHAR( 255 ) NOT NULL ,
`shell` VARCHAR( 255 ) NOT NULL DEFAULT ‘/usr/sbin/nologin’,
UNIQUE (`userid`)           
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;

* данной командой мы создаем таблицу users в базе данных proftpd.

Создаем пользователя mariadb для доступа к таблицам базы proftpd:

> GRANT SELECT ON proftpd.* TO [email protected] IDENTIFIED BY ‘proftpd_password’;

* мы создали пользователя proftpd_user с паролем proftpd_password, которому дали право подключаться только с локального сервера.

Добавляем FTP-пользователя в таблицу:

> INSERT INTO `proftpd`.`users` VALUES (‘sqluser’, ENCRYPT(‘sqlpassword’), ’33’, ’33’, ‘/var/tmp’, ‘/usr/sbin/nologin’);

* в данном примере мы создаем пользователя sqluser с паролем sqlpassword.

… и отключаемся от базы:

Настройка FTP-сервера

Открываем конфигурационный файл для proftpd:

vi /etc/proftpd/proftpd.conf

Снимаем комментарий для подключения файла sql.conf:

Include /etc/proftpd/sql.conf

Открываем на редактирование файл sql.conf:

vi /etc/proftpd/sql.conf

Приводим его к виду:

<IfModule mod_sql.c>

SQLBackend      mysql

SQLEngine on
SQLAuthenticate users

SQLAuthTypes Crypt

SQLConnectInfo [email protected] proftpd_user proftpd_password

SQLUserInfo users userid passwd uid gid homedir shell

SqlLogFile /var/log/proftpd/sql.log

</IfModule>

* где нужно обратить внимание на следующие параметры:

  • SQLAuthenticate — указываем, что модуль должен выполнять аутентификацию по пользователю.
  • SQLAuthTypes — способ хранения пароля в базе. Можно перечислить несколько вариантов. Для наибольшей безопасности мы разрешили хранить пароли только в зашифрованном виде.
  • SQLConnectInfo — параметры для подключения к базе. Здесь мы задаем имя и сервер базы данных, а также данные пользователя для подключения.
  • SQLUserInfo — информация о таблице, где хранится пользователь. Мы указываем на название таблицы и перечисляем название полей, в которых хранятся нужные сведения.

Создаем дополнительный конфигурационный файл для proftpd:

vi /etc/proftpd/conf.d/virtual_mysql.conf

RequireValidShell               off
AuthOrder                       mod_sql.c

Открываем файл modules.conf:

vi /etc/proftpd/modules.conf

Снимаем комментарии для следующих строк:

LoadModule mod_sql.c

LoadModule mod_sql_mysql.c

Перезапускаем сервис FTP-сервера:

systemctl restart proftpd

Можно пробовать подключаться к базе под пользователем sqluser с паролем sqlpassword

Настройка прав доступа

Разберем пример, когда нам нужно будет к одной и той же папке дать разные права — одному пользователю только на чтение, другому на чтение и запись.

vi /etc/proftpd/conf.d/rights.conf

Добавляем:

<Directory /var/tmp>
        <Limit WRITE>
                Order deny,allow
                AllowUser ftpvirt
        </Limit>
        <Limit ALL>
                AllowAll
        </Limit>
</Directory>

* в данном примере мы задаем права для директории /var/tmp. Мы разрешаем запись в директорию только для пользователя ftpvirt, остальные права разрешены для всех.

Устранение проблем

Для решения проблем в работе FTP-сервера можно просмотреть файл журнала. Файлов может быть несколько и они находятся в каталоге /var/log/proftpd. Основной — proftpd.log.

Для просмотра вводим команду:

tail -f /var/log/proftpd/proftpd.log

По умолчанию, настройка лога в конфигурационном файле proftpd выглядит так:

TransferLog /var/log/proftpd/xferlog
SystemLog   /var/log/proftpd/proftpd.log

При необходимости, можно настроить дополнительный файл журнала:

ExtendedLog                     /var/log/proftpd/access.log WRITE,READ write
ExtendedLog                     /var/log/proftpd/auth.log AUTH auth

* в данном примере в файле /var/log/proftpd/access.log будут храниться логи обращения к файлам; /var/log/proftpd/auth.log — аутентификации.

Не забываем перезагрузить сервис:

systemctl restart proftpd

Читайте также

Другие инструкции про FTP, которые могут быть полезны:

1. FTP-сервер ProFTPd на CentOS 7

2. Настройка FTP-сервера vsFTPd на CentOS 7

3. Установка и настройка vsFTPd на Ubuntu