Debian Jessie: Установка и настройка FTP сервера (proftpd + mod-geoip)

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

Установим необходимые пакеты:

deb$ sudo apt-get install proftpd-basic proftpd-mod-geoip geoip-database

Пакеты установили — вперед к настройке …

открываем текстовым редактором основной конфиг:

deb$ sudo vim /etc/proftpd/proftpd.conf

и приводим его к такому виду:

Include /etc/proftpd/modules.conf
Include /etc/proftpd/conf.d/

UseIPv6                         off
IdentLookups                    off
ServerName                      "FTP Server"
ServerType                      standalone
DeferWelcome                    off

MultilineRFC2228                on
DefaultServer                   on
ShowSymlinks                    on

TimeoutNoTransfer               600
TimeoutStalled                  600
TimeoutIdle                     1200

DisplayLogin                    welcome.msg
DisplayChdir                    .message true
ListOptions                     "-l"
DenyFilter                      \*.*/
DefaultRoot                     ~
RequireValidShell               off

Port                            21
PassivePorts                  57000 58000

MaxInstances                    30

User                            proftpd
Group                           nogroup

Umask                           022  022
AllowOverwrite                  on

TransferLog /var/log/proftpd/transfer.log
SystemLog   /var/log/proftpd/proftpd.log

<IfModule mod_quotatab.c>
QuotaEngine off
</IfModule>

<IfModule mod_ratio.c>
Ratios off
</IfModule>

<IfModule mod_delay.c>
DelayEngine on
</IfModule>

<IfModule mod_ctrls.c>
ControlsEngine        off
ControlsMaxClients    2
ControlsLog           /var/log/proftpd/controls.log
ControlsInterval      5
ControlsSocket        /var/run/proftpd/proftpd.sock
</IfModule>

<IfModule mod_ctrls_admin.c>
AdminControlsEngine off
</IfModule>

# http://www.proftpd.org/docs/contrib/mod_geoip.html
<IfModule mod_geoip.c>
GeoIPEngine             on
GeoIPPolicy             deny,allow
GeoIPLog                /var/log/proftpd/geoip.log
GeoIPTable              /usr/share/GeoIP/GeoIP.dat IndexCache
GeoIPAllowFilter        CountryCode UA
</IfModule>

также правим конфиг с модулями

deb$ sudo vim /etc/proftpd/modules.conf

и приводим его к такому виду:

ModulePath /usr/lib/proftpd
ModuleControlsACLs insmod,rmmod allow user root
ModuleControlsACLs lsmod allow user *
LoadModule mod_ctrls_admin.c
LoadModule mod_tls.c
LoadModule mod_wrap.c
LoadModule mod_rewrite.c
LoadModule mod_load.c
LoadModule mod_ban.c
LoadModule mod_wrap2.c
LoadModule mod_wrap2_file.c
LoadModule mod_dynmasq.c
LoadModule mod_exec.c
LoadModule mod_shaper.c
LoadModule mod_ratio.c
LoadModule mod_site_misc.c
LoadModule mod_sftp.c
LoadModule mod_sftp_pam.c
LoadModule mod_facl.c
LoadModule mod_unique_id.c
LoadModule mod_copy.c
LoadModule mod_deflate.c
LoadModule mod_ifversion.c
LoadModule mod_tls_memcache.c
LoadModule mod_geoip.c
LoadModule mod_ifsession.c

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

deb$ sudo systemctl restart proftpd.service

Добавлять в автозагрузку сервис proftpd не требуется, так как он добавляется автоматически при установке пакета proftpd-basic.

Поскольку ранее мы настроили фаервол iptables — нежно добавить в него правил для FTP. Для этого открываем основной конфиг /etc/iptables.rules и добавляем следующие правила:

# Allows FTP connections (Passive Mode)
-A INPUT -p tcp -m state --state NEW --dport 21 -j ACCEPT
-A INPUT -p tcp -m multiport --dports 57000:58000 -j ACCEPT

Применяем новые правила фаервола:

deb$ sudo iptables-restore /etc/iptables.rules

Проверка заключается в попытке авторизации на FTP сервере из GeoIP зоны UA и с IP за ее пределами. У меня был под рукой ssh сервера в DE — вот что получилось.
Сначала попытка авторизации с UA IP:

2015-05-19 07:33:17,003 deb proftpd[3367] deb.my.server.ua (91.220.151.166[91.220.151.166]): FTP session opened.
2015-05-19 07:33:17,048 deb proftpd[3367] deb.my.server.ua (91.220.151.166[91.220.151.166]): USER someuser: Login successful.

Как видите — FTP сервер дал мне доступ и я нормально залогинился.
Вторая попытка с DE IP:

2015-05-19 07:34:59,975 deb proftpd[3377] deb.my.server.ua (185.35.144.225[185.35.144.225]): mod_geoip/0.5: Connection denied to 185.35.144.225 due to GeoIP filter/policy
2015-05-19 07:34:59,975 deb proftpd[3377] deb.my.server.ua (185.35.144.225[185.35.144.225]): mod_geoip.c: error initializing session: Permission denied
2015-05-19 07:34:59,975 deb proftpd[3377] deb.my.server.ua (185.35.144.225[185.35.144.225]): FTP session closed.

доступ я не получил, mod_geoip сказал — «error initializing session: Permission denied»
Этого я и добивался 🙂

Также обратите внимание что мы добавили отдельный лог файл для GeoIP модуля, рекомендую сразу настроить его ротацию. Ато часто бывает что логи вдруг начинают занитьмать неприлично много места … особенно если годами не ротируются 🙂

Создадим для лога /var/log/proftpd/geoip.log отдельный файлик настроек ротации:

deb:~$ sudo vim /etc/logrotate.d/proftpd-geoip

И добавим туда такие настройки:

/var/log/proftpd/geoip.log
{
        weekly
        missingok
        rotate 7
        compress
        delaycompress
        notifempty
        create 640 root adm
        sharedscripts
        postrotate
                # reload could be not sufficient for all logs, a restart is safer
                invoke-rc.d proftpd restart 2>/dev/null >/dev/null || true
        endscript
}

Как видно из настроек, я буду ротировать лог /var/log/proftpd/geoip.log раз в неделю (weekly), если у вас сервис FTP высоконагружен и запросов очень много, то возможно больше подойдет посуточная ротация (daily вместо weekly) — решайте сами 🙂 Мне раз в неделю более чем достаточно.

Хай щастить!

  1. Комментов пока нет

  1. Трэкбэков пока нет.

Why ask?