Поиск по сайту:

Как установить и настроить Fail2ban в Linux


Fail2ban — это бесплатное программное обеспечение с открытым исходным кодом, которое мы можем использовать для предотвращения перебора и DoS/DDoS-атак: оно сканирует файлы журналов на наличие нескольких неудачных попыток аутентификации и блокирует связанные IP-адреса, создавая специальные правила брандмауэра.

В этом руководстве мы увидим, как установить и настроить Fail2ban в Linux, а также изучим основные концепции его использования.

Из этого урока вы узнаете:

  • Как установить Fail2ban в некоторых наиболее используемых дистрибутивах Linux
  • Как настроить Fail2ban
  • Как использовать утилитуfail2ban-client

Монтаж

Fail2ban доступен в официальных репозиториях всех наиболее используемых дистрибутивов Linux. Чтобы установить его в Debian и дистрибутив на основе Debian, мы можем использовать следующую команду:

$ sudo apt install fail2ban


В Fedora мы выполняем установку с помощью менеджера пакетов dnf :

$ sudo dnf install fail2ban

Прежде чем мы сможем выполнить установку на RHEL или один из его клонов, таких как Rocky Linux, нам необходимо добавить репозиторий EPEL (дополнительный пакет для Enterprise Linux) в качестве источника программного обеспечения. В случае Rocky это очень простая операция, поскольку репозиторий настраивается автоматически при установке пакета epel-release :

$ sudo dnf install epel-release

Если вы используете сам RHEL, пакет можно загрузить и установить с сайта EPEL.

Чтобы убедиться, что служба Fail2ban активна и запущена при загрузке, мы запускаем следующую команду:

$ sudo systemctl enable --now fail2ban

Конфигурация фейл2бана

После установки пакета Fail2ban все его файлы конфигурации можно найти в каталоге /etc/fail2ban. Нам следует избегать изменения файлов, которые входят в состав установки (с расширением «.conf»), и вместо этого размещать пользовательские конфигурации в соответствующих файлах с расширениями «.local». Основной файл конфигурации Fail2ban — /etc/fail2ban/fail2ban.conf. Этот файл содержит общие настройки, такие как уровень журнала Fail2ban. Мы помещаем значения переопределения в файл /etc/fail2ban/fail2ban.local, который следует создать, если он не существует. Например, чтобы изменить уровень журнала с «INFO» (по умолчанию) на «DEBUG», мы должны написать:

[DEFAULT]
loglevel = DEBUG


Есть три основные «сущности», с которыми нам приходится иметь дело при работе с Fail2ban: фильтры, действия и тюрьмы. Давайте посмотрим на них.

Фильтры

Fail2ban сканирует файлы журналов и ищет неудачные попытки аутентификации. С помощью фильтров мы, по сути, сообщаем ему, как распознавать попытки аутентификации в файлах журналов определенных служб. Готовые к использованию фильтры можно найти в каталоге /etc/fail2ban/filter.d:

$ ls /etc/fail2ban/filter.d

3proxy.conf                domino-smtp.conf        mysqld-auth.conf        selinux-ssh.conf
apache-auth.conf           dovecot.conf            nagios.conf             sendmail-auth.conf
apache-badbots.conf        dropbear.conf           named-refused.conf      sendmail-reject.conf
apache-botsearch.conf      drupal-auth.conf        nginx-botsearch.conf    sieve.conf
apache-common.conf         ejabberd-auth.conf      nginx-http-auth.conf    slapd.conf
apache-fakegooglebot.conf  exim-common.conf        nginx-limit-req.conf    softethervpn.conf
apache-modsecurity.conf    exim.conf               nsd.conf                sogo-auth.conf
apache-nohome.conf         exim-spam.conf          openhab.conf            solid-pop3d.conf
apache-noscript.conf       freeswitch.conf         openwebmail.conf        squid.conf
apache-overflows.conf      froxlor-auth.conf       oracleims.conf          squirrelmail.conf
apache-pass.conf           gitlab.conf             pam-generic.conf        sshd.conf
apache-shellshock.conf     grafana.conf            perdition.conf          stunnel.conf
assp.conf                  groupoffice.conf        phpmyadmin-syslog.conf  suhosin.conf
asterisk.conf              gssftpd.conf            php-url-fopen.conf      tine20.conf
bitwarden.conf             guacamole.conf          portsentry.conf         traefik-auth.conf
botsearch-common.conf      haproxy-http-auth.conf  postfix.conf            uwimap-auth.conf
centreon.conf              horde.conf              proftpd.conf            vsftpd.conf
common.conf                ignorecommands          pure-ftpd.conf          webmin-auth.conf
counter-strike.conf        kerio.conf              qmail.conf              wuftpd.conf
courier-auth.conf          lighttpd-auth.conf      recidive.conf           xinetd-fail.conf
courier-smtp.conf          mongodb-auth.conf       roundcube-auth.conf     znc-adminlog.conf
cyrus-imap.conf            monit.conf              screensharingd.conf     zoneminder.conf
directadmin.conf           murmur.conf             selinux-common.conf

Действия

Действия Fail2ban определяются в каталоге /etc/fail2ban/action.d. Действия названы в честь программного обеспечения, используемого для реализации запрета. Давайте посмотрим пример. UFW (Uncomplicationd Firewall) — это менеджер брандмауэра, простой в использовании; это содержимое файла /etc/fail2ban/action.d/ufw.conf:

# Fail2Ban action configuration file for ufw
#
# You are required to run "ufw enable" before this will have any effect.
#
# The insert position should be appropriate to block the required traffic.
# A number after an allow rule to the application won't be of much use.

[Definition]

actionstart = 

actionstop = 

actioncheck = 

actionban = [ -n "<application>" ] && app="app <application>"
            ufw insert   from  to  $app

actionunban = [ -n "<application>" ] && app="app <application>"
              ufw delete  from  to  $app

[Init]
# Option: insertpos
# Notes.:  The position number in the firewall list to insert the block rule
insertpos = 1

# Option: blocktype
# Notes.: reject or deny
blocktype = reject

# Option: destination
# Notes.: The destination address to block in the ufw rule
destination = any

# Option: application
# Notes.: application from sudo ufw app list
application = 

Действие состоит из двух основных разделов: «Определение» и «Инициализация». Команды, указанные в первом, выполняются в разных ситуациях: в качестве предварительного шага (actioncheck), при запуске тюрьмы (actionstart), при ее остановке (actionstop), для блокировки (actionban) и разблокировки (actionunban) IP-адреса.



Раздел «Init» содержит настройки для конкретных действий. Например, в действии ufw, о котором мы сообщали выше, вы можете видеть, что оно содержит инструкции о положении правила брандмауэра в списке правил (insertpos=1) и используемом типе блока (отклонить или запретить).

Тюрьмы

Наконец, у нас есть тюрьмы. Тюрьма по сути связывает фильтр и одно или несколько действий. Основной файл конфигурации Fail2ban для тюрем: /etc/fail2ban/jail.conf; файлы конфигурации drop-in можно разместить в каталоге /etc/fail2ban/jail.d.

Джейлы называются в честь используемого ими фильтра: например, если джейл называется «sshd»,  он связан с фильтром /etc/fail2ban/filter.d/sshd.conf, если только он не явно указанный с помощью опции «фильтр». Название тюрьмы указывается в квадратных скобках. Debian по умолчанию предоставляет переопределение тюрьмы sshd. Он определен в файле /etc/fail2ban/jail.d/defaults-debian.conf:

[sshd]
enabled = true

Параметры по умолчанию для тюрьмы «sshd» находятся в основном файле конфигурации тюрьмы. Debian предоставляет это переопределение с параметром «enabled», установленным на «true», просто чтобы убедиться, что джейл активен. Вот некоторые параметры, которые можно использовать при определении тюрьмы или в разделе «по умолчанию» (эффективно для всех существующих ячеек):

Option Role Default value
filter Filter used by the jail The filter corresponding to the jail name under /etc/fail2ban/filter.d
logpath Specifies the path(s) of the logfiles to be monitored service-dependent
action Actions(s) to be used by the jail. Actions are named after the file in which they are defined, without the extension %(action)s – see below
ignoreip List of IP addresses to ignore None
bantime The ban duration expressed in seconds or with explicitly time suffixes 10m
findtime The interval of time during which the specified number of failed authentication attempts must occur for an IP to be banned 10m
maxretry The number of failures which must occur in the specified findtime to trigger a ban 5

Как определяется действие по умолчанию

Если вы посмотрите на основной файл конфигурации тюрьмы (/etc/fail2ban/jail.conf), в разделе «default», вы увидите, что действие определено следующим образом (строка 268) :

action = %(action_)s

В приведенном выше определении переменная _action является «расширенной», и ее значение присваивается параметру «action». Сама переменная _action определена несколькими строками выше (строка 212 в Debian):

action_ = __ %(banaction)s[port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]

В этом выражении используются некоторые другие переменные:

  • Banaction: это «основное» действие бана, по умолчанию установленное в iptables-multiport.
  • порт: порты, которые будут запрещены – по умолчанию установлено значение 0:65535, которое будет переопределено в определенных тюрьмах.
  • протокол: протокол, используемый в правиле брандмауэра для принудительного выполнения запрета – TCP по умолчанию.
  • цепочка: цепочка, в которую должны быть добавлены прыжки в бан-действиях, ожидающих этот параметр

Переменные порта, протокола и цепочки используются в квадратных скобках, разделенных запятыми. При таком синтаксисе они передаются как «аргументы» и заменяют соответствующие заполнители, содержащиеся в определении действия. Здесь «action_» — это один из доступных макросов, который просто обеспечивает запрет. Остальные определены под ним. Некоторые примеры:

  • action_mw — принудительно блокирует и отправляет электронное письмо, содержащее отчет whois, на указанную почту.
  • action_mwl — то же, что и выше, но включает соответствующие строки журнала.

Давайте запретим!

Давайте проверим, что error2ban работает правильно, и позволим ему инициировать бан. Как мы видели ранее, время поиска по умолчанию составляет 10 минут, а значение maxretry по умолчанию равно 5: это означает, что если мы провалим 5 попыток аутентификации за 10 минут, наш IP (192.168.122.1 для этого примера) будет заблокирован.



Пытаюсь подключиться по SSH к хосту с IP 192.168.122.93, намеренно вводя неправильный пароль. Это вызывает бан на удаленном хосте. Мы можем убедиться в этом, взглянув на журнал Fail2ban:

$ sudo tail /var/log/fail2ban.log

Соответствующие строки:

2023-09-27 15:54:47,028 fail2ban.actions
[2829]: NOTICE [sshd] Ban 192.168.122.1

Как видите, IP 192.168.122.1 забанен. Более удобный способ проверить все активные баны — использовать утилиту fail2ban-client. Чтобы получить список запрещенных IP-адресов, мы используем его с подкомандой «banned»:

$ fail2ban-client banned
[{'sshd': ['192.168.122.1']}]

Вместо этого, чтобы разблокировать IP-адрес (из всех тюрем), мы передаем его в качестве аргумента подкоманде unban:

$ sudo fail2ban-client unban 192.168.122.1

Утилитаfail2ban-client также может использоваться для управления сервером (запуск, остановка, перезагрузка) и выполнения некоторых конфигураций во время выполнения.

Выводы