Fail2ban обязательная защита сервера VPS

Основной задачей программы Fail2ban является обнаружение и блокирование отдельных IP-адресов, с которых производятся попытки несанкционированного проникновения в защищаемую систему. Такие "враждебные" IP-адреса определяются по результатам наблюдения за файлами журналов - log-файлами (например, /var/log/secure, /var/log/auth.log, /var/log/apache/access.log и т.д.). Если с какого-либо IP-адреса выполняется слишком много попыток зарегистрироваться в защищаемой системе или производятся какие-либо другие подозрительные действия, то хост с этим IP-адресом блокируется на некоторый интервал времени, определённый системным администратором, т.е. ни один пакет, посланный с такого заблокированного хоста, не будет принят. Такая блокировка выполняется посредством изменения правил (rules) сетевого экрана (iptables).

Описанная выше функциональная схема позволяет защищаться от так называемых "brute force" атак, т.е. от многочисленных попыток войти в систему с различными вариантами паролей. Атаки такого рода достаточно часто практикуются сетевыми взломщиками.

В операционной системе Ubuntu 18.04.4 LTS, 20.04.1 LTS Fail2ban ставиться очень просто, если вам нужна только защита SSH и вы используете для настройки фаервола Настройка правил фаервола (iptables) с помощью UFW.

$ sudo apt install fail2ban

И всё, ваш ssh демон -защищен!!!

  • Установка в Debian
    # apt install fail2ban
  • Параметры настройки, содержащиеся в .local-файлах, имеют преимущество над аналогичными параметрами, записанными в .conf-файлах. На практике это означает, что сначала считывается содержимое .conf-файлов, а затем содержимое .local-файлов, поэтому значения ранее определённых параметров могут быть заменены.
    cd /etc/fail2ban;
    cp -p fail2ban.conf fail2ban.local;
    cp -p jail.conf jail.local;
  • jail.local
    [DEFAULT]
     
    # "ignoreip" can be an IP address, a CIDR mask or a DNS host
    ignoreip = 127.0.0.1/8
    # bantime в секундах, если указать отрицательное число (-1), то заблокирует навечно.
    bantime  = 600
    maxretry = 3
     
    # Адрес, на который слать уведомления о событиях
    destemail = admin@example.org
    # Имя пользователя от которого приходят сообщения, по умолчанию Fail2Ban
    sendername = you name computer
     
     
    # Какое из действий выполнить, например  action_mw, action_mwl и др.
    action = %(action_mwl)s
  • рабочий jail.local для SSH, Pure-FTPd (syslog вместо auth.log)
    jail.local
    [DEFAULT]
    ignoreip = 127.0.0.1/8
    #bantime  = -1
    bantime  = 600
    maxretry = 3
    backend = auto
    destemail = admin@example.org
     
    # ACTIONS
    banaction = iptables-multiport
    #mta = sendmail
    mta = mail
    protocol = tcp
    chain = INPUT
    action = %(action_mwl)s
     
    # JAILS
     
    [ssh]
     
    enabled  = true
    #mta = mail[name=ssh Atacced!!!]
    port     = ssh
    filter   = sshd
    logpath  = /var/log/auth.log
    maxretry = 6
     
    [pure-ftpd]
     
    enabled  = true
    #mta = mail[name=pure-ftpd Atacced!!!]
    port     = ftp,ftp-data,ftps,ftps-data
    filter   = pure-ftpd
    #logpath  = /var/log/auth.log
    logpath  = /var/log/syslog
    maxretry = 6
  • Можно вручную тестировать фильтры, например для Pure-FTPd быстрая установка и настройка в любом Linux
    syslog
    Nov 19 15:56:17 cz5234 pure-ftpd: (?@10.26.10.251) [WARNING] Authentication failed for user [dark33]
    Nov 19 15:56:19 cz5234 pure-ftpd: (?@10.26.10.251) [WARNING] Authentication failed for user [dark33]
    # fail2ban-regex /var/log/syslog /etc/fail2ban/filter.d/pure-ftpd.conf
  • RoundCube
    [roundcube-auth]
    
    enabled  = true
    filter   = roundcube-auth-new
    port     = http,https
    #logpath  = /var/log/roundcube/userlogins
    logpath  = /var/log/roundcube/errors

    Изменим регулярное выражение

    roundcube-auth-new.conf
    failregex = ^\s*(\[(\s[+-][0-9]{4})?\])?(: IMAP Error)?: (FAILED login|Login failed) for .*? from <HOST>(\. .* in .*?/rcube_imap\.php on line \d+ \(\S+ \S+\))?$

    Проверим правило

    # fail2ban-regex /var/log/roundcube/errors /etc/fail2ban/filter.d/roundcube-auth-new.conf

По молчанию утилиты Fail2ban нет в стандартном репозитории. Fail2ban можно поставить например из EPEL repository используя YUM.

Инсталляция Fail2ba в CentOS

yum update
yum install epel-release
yum install fail2ban

По умолчанию, в CentOS fail2ban выключен, включаем и запускаем:

systemctl enable fail2ban
systemctl start fail2ban

Создаем jail.local, в котором опишем наши настройки

cp -p jail.conf jail.local

Настроим Fail2ban nginx-limit-req для связки с Nginx. Предварительно вы должны настроить встроенный модуль ngx_http_limit_req_module. Добавим в jail.local

[nginx-limit-req]
enabled = true
filter  = nginx-limit-req
port    = http,https
logpath = /var/log/nginx/*error.log
bantime = 600
maxretry = 5

Сам фильтр идет в комплекте с и находится в файле /etc/fail2ban/filter.d/nginx-limit-req.conf Проверяем на ошибки:

fail2ban-client status nginx-limit-req

Управление запрещенными IP (manage bans IPs).

  • Для разблокирования конкретного IP, нужно узнать номер строки правила и потом удалить строку под этим номером с указанием имени Chain. Например, удалим 60 строку правила для цепи fail2ban-ssh:
    iptables -nvL --line-numbers
    iptables -D f2b-sshd 60
  • Для просмотра состояния и заблокированных ip используйте встроенную утилиту fail2ban-client
fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 3
|  |- Total failed:     18
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 6
   |- Total banned:     6
   `- Banned IP list:   106.13.144.207 180.76.246.205 200.160.111.222 157.245.193.50 179.111.233.126 43.154.104.207

Версия демона Fail2ban 0.8.6 присылает на почту уведомление с неправильной датой 1970-01-01 01:00. Варианты решения:

  • Обновить Fail2ban
  • Использовать в jail.local mta = mail вместо mta = sendmail
  • Во всех конфигурационных файлах "/etc/fail2ban/action.d/sendmail*.conf " заменить строчку
    Date: `date -u +"%%a, %%d %%h %%Y %%T +0000"`

    на

    Date: `date --rfc-2822 -u`

Лучший способ просмотреть полный список заблокированных IP-адресов - проверить файл журнала:

sudo zgrep 'Ban' /var/log/fail2ban.log*

Второй способ, посмотреть чистый список правил iptables:

sudo iptables -L INPUT -v -n | less
PQ VPS сервера в 28+ странах.