Дата написания: май 2018 г.
Автор: Graf

FTP Сервер на базе PureFTPd


В статье рассказывается об установке и настройке автономного (STANDALONE), т.е. без использования сетевых демонов (супер-серверов), FTP-сервера с поддержкой шифрования. Если есть необходимость установки с использованием таких демонов как Inetd, TCPserver, Xinetd, то можно обратиться к специальному разделу (SUPER-SERVER INSTALLATION) в официальном README. Процесс такой установки, по сути, происходит в 1-2 действия.

Установка и настройка сервера

Перед установкой и настройкой сервера, открываем файл /etc/shells и проверяем в нем наличие строки /bin/false, если ее нет — дописываем. Устанавливаем pure-ftpd через sbopkg предварительно изменив SlackBuild добавив в блок configure:

--with-language=russian \
--with-tls \
--with-rfc2640

Или изменив соответствующие переменные выше блока configure.
Далее, во всех статьях советуют создать отдельную группу и пользователя от имени которого будут работать виртуальные пользователи.

# groupadd ftpgroup
# useradd -g ftpgroup -d /dev/null -s /bin/false ftpuser

Но, у меня стоит задача дать доступ лишь веб-программистам которые могли бы заливать файлы по ftp.
И тут возникает одна оказия. После заливки файлов на веб-ресурс , владельцем их становится ftpuser:ftpgroup, а надо apache:apache. Поэтому ничего создавать я не буду, так-как apache у нас, в основном, бесправный вот пусть он и будет для виртуальных пользователей ftp «папой и мамой». :)
Если ftp-сервер создается для других целей, то целесообразно создать отдельную группу и пользователя (команда выше), а в моих примерах поменять их соответственно.
Так как сам ftp не безопасен, надо его хоть как-то защитить. Для этого создадим сертификат:

# mkdir -p /etc/ssl/private/
# openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem
...
-----
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:MO
Locality Name (eg, city) []:Moscow
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyOrg
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:mydom-ftp.ru  <- DNS имя на которое будем заходить по ftp
Email Address []:admin@mydom.ru

# chmod 600 /etc/ssl/private/pure-ftpd.pem

Создали.
Теперь настроим сам сервер. Для этого переименуем существующий файл /etc/pure-ftpd/pure-ftpd.conf и создадим новый со следующими параметрами:

ChrootEveryone              yes
BrokenClientsCompatibility  no
MaxClientsNumber            5
Daemonize                   yes
MaxClientsPerIP             3
VerboseLog                  no
DisplayDotFiles             no
AnonymousOnly               no
NoAnonymous                 yes
SyslogFacility              ftp
DontResolve                 yes
MaxIdleTime                 10
PureDB                      /etc/pure-ftpd/pureftpd.pdb
LimitRecursion              10000 8
AnonymousCanCreateDirs      no
MaxLoad                     4
TLS                         2
CertFile                    /etc/ssl/private/pure-ftpd.pem
FileSystemCharset           UTF-8
AltLog                      w3c:/var/log/pureftpd.log
PassivePortRange            50000 50100

Пояснения к параметрам и возможные значения указаны в специальном разделе статьи.

Если сервер (допустим -192.168.15.15) за NAT'ом, то необходимо пробросить TCP порты 20, 21 - для активного режима и диапазон TCP портов, например 50000:50100 - для пассивного:

$IPTABLES -t nat -A PREROUTING -d $INET_IP -p tcp -m multiport --port 20,21,50000:50100 -j DNAT --to-destination 192.168.15.15
$IPTABLES -I FORWARD 1 -i $INET_IFACE -o $LAN_IFACE -d 192.168.15.15 -p tcp -m multiport --port 20,21,50000:50100  -j ACCEPT

Если не за NAT'ом, то просто открыть их:

$IPTABLES -A INPUT -p tcp -m multiport --destination-port 20,21,50000:50100 -j ACCEPT

Если выбран неявный (Implicit) метод шифрования, то необходимо ещё открыть (пробросить) TCP порты 989 и 990.

Добавляем виртуального пользователя webadmin1 с домашней директорией /var/www/htdocs/site1, который буде работать от имени реального пользователя и группы apache:apache (ftpuser:ftpgroup)

# pure-pw useradd webadmin1 -u apache -g apache -d /var/www/htdocs/site1

Если параметр CreateHomeDir в конфигурационном файле сервера не закомментирован и установлен в yes, то директория будет создана автоматически при первом входе данного пользователя через FTP-клиент. После выполнения команды будет предложено ввести пароль для виртуального пользователя.
После каждых изменений обновляем /etc/pure-ftpd/pureftpd.pdb (или используем ключ -m):

# pure-pw mkdb

Немного о параметрах и ключах команды pure-pw в специальном разделе статьи.
Теперь запустим сервер и проверим работу нашего FTP-сервера:

# /etc/rc.d/rc.pure-ftpd start

Для автоматического запуска, пропишем эту строчку в /etc/rc.d/rc.local
Проверим запустился ли наш сервер.

# ps aux | grep pure
root      5876  0.0  0.0  17460  4740 ?        Ss   09:29   0:00 /usr/sbin/pure-ftpd /etc/pure-ftpd/pure-ftpd.conf

Запустился. Идём настраивать клиентов и проверять работу нашего FTP-сервера.

Установка и настройка клиентов

В Slackware воспользуемся одной из утилит - curlftpfs, которая позволяет монтировать FTP-ресурс как обычный каталог. Установим её при помощи sboopkg.

# sbopkg -Bi curlftpfs

Пробуем подключиться к mydom-ftp.ru пользователем webadmin1 с паролем ppp111222 и примонтировать его домашний каталог в /mnt/ftp. При этом указываем, что соединение будет по ftps (ключ - ssl) и не нужно проверять сертификат (ключ - no_verify_peer), так как он у нас самоподписанный.

# mkdir -p /mnt/ftp
# curlftpfs mydom-ftp.ru /mnt/ftp/ -o ssl,no_verify_peer,user=webadmin1:ppp111222
# ls -al /mnt/ftp
...
...
index.html

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

# ps aux | grep curlftp

root   17164  0.0  0.0  25704  4080 ? Ssl  17:54   0:00 curlftpfs mydom-ftp.ru /mnt/ftp -o ssl,no_verify_peer,user=webadmin1:ppp111222

Поэтому, сделаем следующее (пример для обычного пользователя):

  • создадим файл ~/.netrc с содержимым
machine mydom-ftp.ru
login webadmin1
password ppp111222
  • ограничим его правами
$ chmod 600 ~/.netrc
  • создадим каталог монтирования и попробуем соединиться.
$ mkdir -p ~/ftp/site1
$ curlftpfs -o ssl,utf8,no_verify_peer ftp://mydom-ftp.ru/ ~/ftp/site1
$ ls -al ~/ftp/site1
...
...
index.html

Всё получилось и работает.
Чтобы отмонтировать ресурс введём в консоли:

$ fusermount -u ~/ftp/site1

Думаю, нет особой нужды расписывать настройку ftp-клиетнов, таких как FileZilla или WinSCP, для семейства OC Windows. Так как она и так интуитивно понятна.

Параметры и ключи pure-pw

Список некоторых параметров и ключей команды pure-pw

Просмотреть детальную информацию ПОЛЬЗОВАТЕЛЯ

# pure-pw show ПОЛЬЗОВАТЕЛЬ

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

# pure-pw list

Следующие команды с ключом -m в конце, вносят изменения сразу в /etc/pure-ftpd/pureftpd.pdb без необходимости запуска pure-pw mkdb:

Добавить ПОЛЬЗОВАТЕЛЯ

# pure-pw useradd ПОЛЬЗОВАТЕЛЬ

Изменить пароль ПОЛЬЗОВАТЕЛЯ

# pure-pw passwd ПОЛЬЗОВАТЕЛЬ

Удалить ПОЛЬЗОВАТЕЛЯ

# pure-pw userdel ПОЛЬЗОВАТЕЛЬ

Изменить значения у ПОЛЬЗОВАТЕЛЯ

# pure-pw usermod ПОЛЬЗОВАТЕЛЬ

Ключ -z в useradd и usermod даёт возможность ограничить доступ в период времени, например разрешить доступ с 09:00 до 18:00:

-z 0900-1800

Подробнее о командах в pure-pw -h

Таблица параметров pure-ftpd.conf

Таблица взята ЗДЕСЬ.

Параметр Возможные значения Пояснение
ChrootEveryone yes/no Ограничить пользователя его домашним каталогом.
TrustedGID 10 Доверенная группа с этим номером имеет доступ ко всей файловой системе.
BrokenClientsCompatibility yes/no Включить/Выключить совместимость с нестандартными клиентами.
MaxClientsNumber 10 Максимальное число одновременно подключенных клиентов.
Daemonize yes/no Запускать в виде службы (демона).
MaxClientsPerIP 3 Максимальное число подключений с одного IP-адреса.
VerboseLog yes/no Если вы хотите записывать все команды клиентов,
то в этом пункте должно быть yes.
Если необходимо записывать также ответы сервера,
то просто продублируйте этот пункт.
AllowDotFiles yes/no Разрешить читать скрытые файлы.
DisplayDotFiles yes/no Показывать скрытые файлы,
даже когда клиент явно указано не показывать их.
AnonymousOnly yes/no Разрешить только анонимный доступ.
NoAnonymous yes/no Разрешить доступ только зарегистрированным пользователям.
SyslogFacility ftp Средства syslog (auth, authpriv, daemon, ftp, security, user, local*).
Значение по умолчанию — ftp, none — отключает логирование.
FortunesFile /usr/share/fortune/zippy Показывать сообщения (необходимо создать файл и прочитать man).
Например приветствие сервера, правила работы или шутки.
DontResolve yes/no Записывать в лог IP, а не имя клиента. Это приведет
к ускорению работы Pure-FTPd так как не будет использоваться DNS.
MaxIdleTime 3600 Максимальное время простоя, после которого клиент будет отключен.
LDAPConfigFile /etc/pure-ftpd/db/ldap.conf Файл конфигурации LDAP.
MySQLConfigFile /etc/pure-ftpd/db/mysql.conf Файл конфигурации MySQL.
PGSQLConfigFile /etc/pureftpd-pgsql.conf Файл конфигурации PostgreSQL.
PureDB /etc/pure-ftpd/pureftpd.pdb База данных пользователей PureDB.
ExtAuth /var/run/ftpd.sock Путь к сокету pure-authd.
PAMAuthentication yes/no Разрешить/запретить PAM аутентификацию.
UnixAuthentication yes/no Разрешить/запретить Unix аутентификацию (/etc/passwd).
LimitRecursion 2000 8 Ограничения рекурсии команды ls. Первый аргумент -
максимально число файлов, которые будет показаны.
Второе - максимальное число подкаталогов.
AnonymousCanCreateDirs no Анонимные пользователи могут создавать каталоги.
MaxLoad 4 Если система загружена более, чем в указанном параметре,
то анонимным пользователям запрещается скачивать файлы.
PassivePortRange 40110 40210 Диапазон портов для пассивного ответа соединения. Для брандмауэра.
ForcePassiveIP 192.168.0.1 Принудительный IP адрес в PASV/EPSV/SPSV ответах. Для NAT.
Символические имена хостов также приняты для
шлюзов с динамическим IP адресом.
AnonymousRatio 1 10 Соотношение загрузки/скачивания для анонимных пользователей.
UserRatio 1 10 Соотношение загрузки/скачивания для всех пользователей.
Эта директива не перекрывает предыдущую.
AntiWarez yes/no Не разрешает анонимным пользователям скачивать (download) файлы,
владельцем которых является ftp 
(как правило, файлы, загруженные с другими анонимными пользователями).
Скачивание должно быть подтверждено системным администратором
(передача прав на файл другому пользователю),
прежде чем этот файл будет доступен для скачивания..
Bind 10.26.95.227,21000 IP адрес/порт для прослушивания (по умолчанию = all IP и порт 21).
AnonymousBandwidth 8 Максимальная пропускная способность для анонимных пользователей в Кб/с.
UserBandwidth 8 Максимальная пропускная способность для всех пользователей
(в том числе анонимные) в Кб/с. Используйте AnonymousBandwidth
или UserBandwidth, использовать оба, не имеет смысла.
Umask 177 077 Маска для создаваемых файлов и каталогов.
Значение Umask получаем вычитанием нужной маски
из максимального значения (777). Если маска для файлов:каталогов
будет - 644:755, то значение Umask будет 133:022.
Ставьте 177:077 - если вы чувствуете себя параноиком.
MinUID 1000 Минимальный UID с которым пользователь будет авторизован.
Рекомендуется от 1000.
AllowUserFXP yes/no Разрешить FXP протокол аутентифицированным пользователям.
AllowAnonymousFXP yes/no Разрешить FXP протокол анонимным пользователям.
ProhibitDotFilesWrite yes/no Пользователи не могут удалять и/или изменять скрытые файлы
даже если они их владельцы. Если TrustedGID включена,
пользователи группы указанной в файле TrustedGID 
будут иметь доступ к скрытым файлам.
ProhibitDotFilesRead yes/no Запретить читать скрытые файлы.
AutoRename yes/no Переименовывает файл загружаемый файл (.1, .2 и т.п.),
если файл с таким именем уже есть.
AnonymousCantUpload yes/no Запретить/разрешить анонимным пользователям загружать новые файлы.
TrustedIP 10.1.1.1 Только подключения к этому конкретному IP адресу могут
быть не анонимными. Вы можете использовать эту директиву чтобы открыть
несколько публичных IP адреса для анонимного FTP, и оставить
приватный, защищенный файрволом IP для удалённого администрирования.
Вы также можете разрешить не маршрутизируемые локальные IP
(например, 10.x.x.x) для аутентификации и оставить публичный для
анонимных пользователей FTP-сервер на другом IP.
LogPID yes Добавлять PID в каждую строку лога.
AltLog clf:/var/log/pure-ftpd/transfer.log Записывает передачи файлов в заданный файл определенного формата
(clf - Apache-подобный формат, stats - оптимизирован для стат.отчетов,
w3c - в формате W3C)
NoChmod yes/no Запрещает команду chmod. Т.е. пользователи не могут менять права на свои файлы.
KeepAllFiles yes Разрешить пользователям закачивать, но файлы удалять нельзя.
CreateHomeDir yes/no Автоматически создавать домашний каталог пользователям (если он отсутствует).
Quota 1000:10 Включить виртуальную квоту. Первое число - максимальное число файлов.
Второе число - максимальный размер, в мегабайтах.
Итак 1000:10 ограничивает каждого пользователя 1000 файлов и 10 Мб.
PIDFile /var/run/pure-ftpd.pid Если ваш PureFTPd скомпилирован с поддержкой standalone режима,
вы можете изменить местоположение pid-файла.
По умолчанию используется/var/run/pure-ftpd.pid.
CallUploadScript yes Если pure-ftpd скомпилирован с поддержкой pure-uploadscript,
то этот пункт позволяет писать информацию о новых загруженных файлах
в /var/run/pure-tpd.upload.pipe так, что pure-uploadscript может прочесть их и
обработать загруженный файл.
MaxDiskUsage 99 Указывает в процентах, до какой степени может быть заполнен диск.
Если параметр превышен, загрузка файл на сервер запрещается.
NoRename yes/no Запрет переименования файлов.
CustomerProof yes/no Включить customer proof. Как обход против распространенных ошибок клиентов
к примеру chmod 0 public_html. Чтобы исключить некоторые проблемы.
PerUserLimits 3:20 Число параллельных процессов. Будет работать только если FTP-сервер был собран
с опцией –with-peruserlimits. Формат:
<максимум сессий на пользователей>:<максимум сеансов анонимных пользователей>.
Например, 3:20 означает, что авторизованный пользователь может иметь
3 активных сессии. А для всех анонимных пользователей - максимум 20 сессий.
NoTruncate yes Если файл загружается на сервер, и есть предыдущая его версия
с тем же именем, то старый файл не будет ни удалён, ни усечён.
Загрузка будет произведена во временный файл и по окончании загрузки
будет произведено атомарное переключение к новой версии файла.
Например, при загрузке большого PHP сценария, апач будет работать
со старой версией до полной загрузки и немедленно переключится на новый как только,
он будет полностью передан. Эта опция несовместима с виртуальными квотами.
TLS 0 Этот параметр (TLS) может принимать три значения: 0 - отключить SSL/TLS
шифрование (по-умолчанию). 1 - принимать обычные и шифрованные подключения.
2 - отклонять подключения которые не используют SSL/TLS,
включая анонимные соединения. Не раскомментируйте это вслепую.
Проверьте, что: 1) Ваш сервер был собран с поддержкой SSL/TLS (–with-tls),
2) На месте есть действительный сертификат,
3) Только совместимые клиенты будут заходить.
IPV4Only yes/no Использовать только IPv4.
По умолчанию используется как IPv4, так и IPv6.
IPV6Only yes/no Использовать только IPv6.
По умолчанию используется как IPv4, так и IPv6.
FileSystemCharset big5 Определите кодировку для файловой системы сервера.
Работает только если pure-ftpd скомпилирован с параметром –with-rfc2640.
ClientCharset big5 Определите кодировку по умолчанию для клиентов,
которые не используют UTF-8. Опционально.
Работает только если pure-ftpd скомпилирован с параметром –with-rfc2640.

Ссылался на….


https://download.pureftpd.org/pub/pure-ftpd/doc/README
http://tolik-punkoff.com/2016/12/10/domashnij-ftp-server-na-slackware-i-pureftpd/


Обсуждаем на форуме

Печать/экспорт
QR Code
QR Code wiki:articles:pureftpd (generated for current page)