notby.NET Logo

Установка и настройка Pure-FTPd в FreeBSD 14

FTP сервер можно использовать когда необходимо кому-то выдать место куда он сможет загрузить файлы большого объема, использовать возможности загрузки файлов без авторизации из любого места интернета, загрузки файлов веб-сервера. Хотя для загрузки файлов веб-сервер рекомендую использовать SFTP. Использование в качестве FTP-сервера Pure-FTPd в FreeBSD удобно тем что можно создавать FTP пользователей во внутренней базе данный Pure-FTPd или использовать для этого SQL базы данных.

1. Установка Pure-FTPd

Устанавливаем через пакеты

pkg install pure-ftpd

Или устанавливаем из портов, с нужными опциями

cd /usr/ports/ftp/pure-ftpd/ && make install clean
Порт Pure-FTPd в FreeBSD, выбор параметров сборки.

Дожидаемся окончания сборки.

2. Конфигурация Pure-FTPd

Файл конфигурации FTP-сервера Pure-FTPd находится по адресу /usr/local/etc/pure-ftpd.conf (изначально он не создан)

Скопируем образец файла конфигурации pure-ftpd.conf.sample в pure-ftpd.conf

cp /usr/local/etc/pure-ftpd.conf.sample /usr/local/etc/pure-ftpd.conf

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

nano /usr/local/etc/pure-ftpd.conf

Описание, перевод и пояснение основных параметров файла конфигурации pure-ftpd.conf


############################################################
#                                                          #
#          Конфигурационный файл для pure-ftpd             #
#                                                          #
############################################################

# Ограничить пользователей их домашним каталогом.
ChrootEveryone               yes

# Если для предыдущего параметра установлено значение "нет", то члены
# следующей группы не будут ограничены. Остальные будут.
# TrustedGID                  100

# Включить хаки для совместимости с кривыми клиентами.
BrokenClientsCompatibility   no

# Максимальное количество одновременно подключенных пользователей.
MaxClientsNumber             50

# Запускать в фоновом процессе.
Daemonize                    yes

# Максимальное количество пользователей с одно IP-адреса.
MaxClientsPerIP              8

# Логирование команд клиентов. Для логирования ответов сервера дублировать строку. 
VerboseLog                   no

# Показывать файлы начинающиеся с точки.
DisplayDotFiles              no

# Только анонимный пользователи, запретить авторизацию.
AnonymousOnly                no

# Запретить анонимный доступ, только авторизованные пользователи (yes = запретить анонимный доступ).
NoAnonymous                  no

# Syslog facility (auth, authpriv, daemon, ftp, security, user, local*)
# По умолчанию "ftp". "none" выключает логирование.
SyslogFacility               none

# Display fortune cookies
# FortunesFile                 /usr/share/fortune/zippy

# Не переводить IP адреса в имена хостов.
DontResolve                  yes

# Время простоя в минутах после которого разрывается соединение.
MaxIdleTime                  15

# LDAP configuration file (see README.LDAP)
# LDAPConfigFile               /etc/pureftpd-ldap.conf

# MySQL configuration file (see README.MySQL)
# MySQLConfigFile              /etc/pureftpd-mysql.conf

# PostgreSQL configuration file (see README.PGSQL)
# PGSQLConfigFile              /etc/pureftpd-pgsql.conf

# PureDB user database (Аутентификация через внутреннюю базу данных пользователей)
# Далее в статье будет показано как создавать пользователей
# По умолчанию команда 'pure-pw mkdb' создает файл базы данных по следующему пути:
PureDB                       /usr/local/etc/pureftpd.pdb

# Path to pure-authd socket (see README.Authentication-Modules)
# ExtAuth                      /var/run/ftpd.sock

# Включить PAM аутентификация.
# PAMAuthentication            yes

# Использовать Unix (/etc/passwd) аутентификация.
# UnixAuthentication           yes

# Если используется несколько методов аутентификации, то они выполняются
# в последовательности как указаны в файле конфигурации.

# Предел рекурсии ls команды.  Первое — количество файлов, второе — количество подкаталогов.
LimitRecursion               10000 8

# Разрешить анонимным пользователям создавать каталоги.
AnonymousCanCreateDirs       no

# Если система загружена больше чем указано, анонимные пользователи не могут скачивать.
MaxLoad                      4

# Диапазон портов для пассивного соединения.
# PassivePortRange             30000 50000

# Принудительно указывать IP-адрес в ответах PASV/EPSV для NAT. 
# ForcePassiveIP               192.168.0.1

# Коэффициент загруженного к скаченному для анонимных пользователей.
# AnonymousRatio               1 10

# Коэффициент загруженного к скаченному для всех пользователей включая анонимных.
# UserRatio                    1 10

# Запретить скачку файлов, принадлежащих системному пользователю "ftp".
# Файлы, которые были загружены, но не была еще изменены права доступа.
AntiWarez                    yes

# IP адрес/порт который слушает сервер (по умолчанию все адреса и 21 порт).
# Bind                         127.0.0.1,21

# Максимальная скорость для анонимных пользователей (KB/s).
# AnonymousBandwidth           8
# Максимальная скорость для всех пользователей включая анонимных (KB/s).
# UserBandwidth                8
# Использовать AnonymousBandwidth или UserBandwidth, не сразу оба.

# Маска создания файла: <маска для файлов>:<маска для каталогов>.
# Что бы получить umask, нужно из 777 вычесть права доступа которые хотим установить.
# Umask 137:027 соответствует правам 640 для файлов и 750 для каталога.
# Umask 177:077 соответствует правам 600 для файлов и 700 для каталога.
Umask                        137:027

# Минимальный UID с которого пользователь будет пущен. Для доступа root использовать значение 0.
MinUID                       100

# Разрешить FXP для авторизованных пользователей. Передача напрямую с FTP-сервера на FTP-сервера.
AllowUserFXP                 no

# Разрешить FXP для анонимных пользований и авторизованных пользователей.
AllowAnonymousFXP            no

# Пользователи не могут удалять/изменять файлы начинающиеся с точки, даже если они являются владельцами.
# Но если TrustedGID включен, то эта группа будет иметь доступ к этим файлам в исключительных случаях.
ProhibitDotFilesWrite        no

# Запретить чтение файлов начинающихся с точки (.history, .ssh, ...).
ProhibitDotFilesRead         no

# Не перезаписывать файл. Когда загружается файл с таким же именем,
# оригинальный файл будет переименован: file.1, file.2, file.3 и так далее.
AutoRename                   no

# Запретить загрузку файлов анонимными пользователями.
# Мне нужна загрузка, поэтому no (no = разрешить загрузку).
AnonymousCantUpload          no

# Только подключенные к этому IP адресу могут быть не анонимными пользователя.
# TrustedIP                    10.1.1.1

# Добавлять PID в каждую строку лога.
# LogPID                       yes

# Создавать дополнительные файлы журнала, в различных форматах.
# Create an additional log file with transfers logged in a Apache-like format :
# fw.c9x.org - jedi [13/Apr/2017:19:36:39] "GET /ftp/linux.tar.bz2" 200 21809338
# This log file can then be processed by common HTTP traffic analyzers.
# AltLog                       clf:/var/log/pureftpd.log

# Create an additional log file with transfers logged in a format optimized
# for statistic reports.
# AltLog                       stats:/var/log/pureftpd.log

# Create an additional log file with transfers logged in the standard W3C
# format (compatible with many HTTP log analyzers)
# AltLog                       w3c:/var/log/pureftpd.log

# Запретить CHMOD команду. Пользователи не смогут изменять права доступа.
# NoChmod                      yes

# Разрешать пользователям возобновлять/загружать файлы, но не удалять их.
# KeepAllFiles                 yes

# Автоматически создавать домашние каталоги пользователя, если они отсутствуют.
# CreateHomeDir                yes

# Квота для каждого пользователя.
# 1000:10 ограничение для пользователя в 1000 файлами и 10 МБ.
# Quota                        1000:10

# Путь к PID файлу (по умолчанию /var/run/pure-ftpd.pid)
# PIDFile                      /var/run/pure-ftpd.pid

# Если pure-ftpd скомпилирован с поддержкой pure-uploadscript, то эта опция будет
# записывать информацию о новых загузка в /var/run/pure-ftpd.upload.pipe файл
# и запускает скрипт pure-uploadscript для обработки.
# Не включать эту опцию, если не используется pure-uploadscript.
# CallUploadScript             yes

# Если диск заполнен больше чем указанное знамение, загрузки файлов будут запрещены.
MaxDiskUsage                   99

# Запретить возможность переименовывания файлов пользователям.
# NoRename                     yes

# Запрещать распространенные ошибки клиентов, такие как "chmod 0 public_html",
# которые являются допустимыми, но могут привести к тому,
# что клиенты непреднамеренно выстрелят себе в ногу.
CustomerProof                yes

# Ограничение параллелизма на одного пользователя. Будет работает если pure-ftpd
# скомпилирован с --with-peruserlimits параметром.
# Первой значение — максимальное количество сессий  авторизованного пользователя
# Второе значение — количество сессий анонимных пользователей.
# PerUserLimits                3:20

# Если при загрузке файла, файл существует с таким же именем, старый файл не будет ни удален, ни презаписан.
# Файл будет храниться под временным именем, и после завершения загрузки он будет атомарно переименован.
# Например, при загрузке большого PHP-скрипта веб-сервер будет продолжать обслуживать старую версию,
# а затем переключится на новую, как только будет передан весь файл.
# Эта опция несовместима с виртуальными квотами.
# NoTruncate                   yes

# Эта опция принимает три значения:
# 0 - отключить шифрования SSL/TLS (по умолчанию),
# 1 - принимать шифрованные и обычные подключения,
# 2 - принимать только шифрованные SSL/TLS подключения.
# Более подробно будет рассмотрено ниже в данной статье.
# TLS                          1

# Набор шифров для сессий TLS.
# Набор по умолчанию является безопасным, и установка этого свойства обычно
# требуется только для снижения  уровня безопасности, чтобы справится с устаревшими клиентами.
# TLSCipherSuite               HIGH

# Файл сертификата для TLS.
# CertFile                     /etc/ssl/private/pure-ftpd.pem
# CertFileAndKey               "/etc/pure-ftpd.pem" "/etc/pure-ftpd.key"

# Unix-сокет внешнего обработчика сертификатов, для TLS
# ExtCert                      /var/run/ftpd-certs.sock

# Использовать только IPv4, отключить IPv6.
IPV4Only                     yes
# Использовать только IPv6, отключить IPv4.
# IPV6Only                     yes
# По умолчанию используется IPv4 и IPv6.

# Добавить содержимое другого файла. Если файл не существует, директива игнорируется.
# Include                      additional_configuration.conf

Вносим необходимые изменения и сохраняем файл.

3. Автозагрузка и запуск Pure-FTPd

Добавляем в автозагрузку

sysrc pureftpd_enable="YES"

Или вручную открываем файл /etc/rc.conf и добавляем строку pureftpd_enable="YES"

Запускаем Pure-FTPd сервер

service pure-ftpd start

4. Создание пользователя ftp / ftpuser для Pure-FTPd

Пользователь ftp в системе c его домашним каталогом используется Pure-FTPd в качестве каталога для анонимных FTP-пользователей.

Создаем группу ftp, если она не существует

pw groupadd ftp

Создаем пользователя ftp с домашним каталогом /home/ftp/ и добавим его в группу ftp

pw useradd ftp -g ftp -d /home/ftp/ -s /usr/sbin/nologin

Создаем домашний каталог для ftp пользователя

mkdir /home/ftp/

Изменяем владельца каталога /home/ftp/ на ftp:ftp

chown ftp:ftp /home/ftp/

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

ftp anonymous@localhost
Успешное подключение анонимным пользователем к FTP серверу Pure-FTPd командой "ftp anonymous@localhost" в FreeBSD.

Успешное подключение анонимного пользователя.


Если анонимный доступ не нужен и он выключен, вместо пользователя ftp рекомендовано в руководстве Pure-FTPd создать пользователя ftpuser и группу ftpgroup без домашнего каталога.

Создаем группу ftpgroup

pw groupadd ftpgroup

Создаем пользователя ftpuser

pw useradd ftpuser -g ftpgroup -d /nonexistent -s /usr/sbin/nologin

Теперь можно создавать FTP-пользователей с правами ftpuser.

5. Создание пользователя Pure-FTPd

Так как в файле конфигурации была выбрана авторизацию через внутреннюю базу пользователей PureDB, то управление пользователями происходит через pure-pw утилиту.

Посмотрим доступные команды и параметры pure-pw

pure-pw
# Краткое описание команд pure-pw, <login> - имя пользователя.
# Добавить пользователя
pure-pw useradd <login> [- различные параметры]
# Редактировать пользователя
pure-pw usermod <login> [- различные параметры]
# Удалить пользователя
pure-pw userdel <login>
# Изменить пароль пользователя
pure-pw passwd  <login>
# Показать информацию о пользователе
pure-pw show    <login>
# Создать или обновить базу данных
pure-pw mkdb
# Список пользователей
pure-pw list

Добавляем пользователя

pure-pw useradd web -u ftpuser -d /usr/local/www/

web – имя FTP пользователя, параметр -u указывает что подключение будет с правами пользователя ftpuser (может быть любой пользователь в системе, кроме root), параметр -d указывает что /usr/local/www/ домашний каталог пользователя.

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

Создаем базу данных

pure-pw mkdb

По умолчанию база данных создается в /usr/local/etc/pureftpd.pdb файле. Этот же путь необходимо указывать в параметре PureDB конфигурационного файла.

Пробуем подключится к FTP серверу от созданного пользователя.

ftp web@localhost

Вводим пароль и попадаем в каталог для web пользователя.

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


В примере вышел, был создан пользователь web для каталога /usr/local/www/ веб-сервера.

Настроим права доступа для каталогов сайтов которые находятся в /usr/local/www/ каталоге следующим образом:

cd /usr/local/www/
chown ftpuser:www *
chmod 750 *
ls -lh
FreeBSD переход в каталог "cd /usr/local/www/", установка владельца каталогов "chown ftpuser:www *", установка прав каталогов "chmod 750 *", вывод содержимого каталога "ls -lh".

Результат такой настройки: через FTP можно будет загружать/удалять файлы из каталогов сайтов, но при этом через веб-сервер не получится загрузить или изменить файлы. Если произойдет попытка взлома сайта, не получится загрузить вредоносные файлы или изменить файлы сайта.

6. Защищенное соединение FTP

Протокол FTP по умолчанию не использует шифрование соединения и все данные передаются в открытом виде. Это не безопасно для авторизованных пользователь, так как можно завладеть паролем пользователя и всей передаваемой информацией. Pure-FTPd поддерживает работу в режиме защищенного шифрованного соединения (FTPS).

Создаем каталог для сертификатов, если он не создан

mkdir -p /etc/ssl/private/

Создаем самоподписанный сертификат с ключом для Pure-FTPd в одном файле сроком на 3650 дней (10 лет)

openssl req -x509 -days 3650 -nodes -newkey ed25519 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem

Вопросы можно не заполнять оставляя поля пустыми и просто Enter нажимать.

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

nano /usr/local/etc/pure-ftpd.conf

Вносим изменение в параметры относящиеся к защищенному соединению

# Эта опция принимает три значения:
# 0 - отключить шифрования SSL/TLS (по умолчанию),
# 1 - принимать шифрованные и обычные подключения,
# 2 - принимать только шифрованные SSL/TLS подключения.
# Вклюаем только шифрованные SSL/TLS подключения.
TLS                          2

# Набор шифров для сессий TLS.
# Набор по умолчанию является безопасным, и установка этого свойства обычно
# требуется только для снижения  уровня безопасности, чтобы справится с устаревшими клиентами.
# TLSCipherSuite               HIGH

# Файл сертификата для TLS.
# Сертификат и ключ можно объединить в один файл или использовать отдельные файлы.
CertFile                     /etc/ssl/private/pure-ftpd.pem
# CertFileAndKey               "/etc/ssl/private/pure-ftpd.pem" "/etc/ssl/private/pure-ftpd.key"

Сохраняем файл и перезапускаем FTP сервер

service pure-ftpd restart

Пробуем подключится к FTP серверу по зашифрованному соединению, например через FileZilla клиент.

FileZilla клиент. Показан сертификат FTP-сервера. Установлено TLS-соединение c FTP сервером от анонимного пользователя.

Во время соединения показывается сертификат FTP сервера. После соглашение на использование сертификата происходит успешное защищенное подключение к FTP серверу Pure-FTPd.