Как установить и настроить 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 также может использоваться для управления сервером (запуск, остановка, перезагрузка) и выполнения некоторых конфигураций во время выполнения.