Настройка Fail2Ban в Linux для защиты SSH, Apache, MySQL, Exim

Настройка Fail2Ban в Linux для защиты SSH, Apache, MySQL, Exim

Fail2ban позволяет блокировать доступ к серверу или запущенным службам на основе анализа логов доступа и подключений. Fail2Ban автоматически может создавать правила файервола для блокировки конкретных IP адресов, если действия с этого IP определяются как подозрительные. Так, Fail2Ban может защитить ваш сервер от перебора паролей по SSH, DDoS атак, попыток эксплуатации эксплоитов, выполнении запрещенных действий.

Любой сервис сервера, порты которого открыты во внешний мир, потенциально уязвим. Порты некоторых сервисов можно закрыть, но так можно поступить не со всеми. Например, если вы хотите, чтобы у вас полноценно работала почтовая SMTP служба, вы не можете отключить ее или заблокировать порт на firewall и время от времени в логах можно наблюдать записи о попытке подбора пароля к учетной записи. Так происходит и с другими сервисами.

Обычно на всех своих серверах, я закрываю SSH доступа с наружи, т.к. подключаюсь к своим серверам со своего статического IP-адреса или через OpenVPN подключение. Но это не всегда возможно. На помощь приходит замена стандартных портов, либо настройка на сервере службы fail2ban. В этом примере мы покажем, как установить и использовать fail2ban в CentOS, однако вы можете использовать эту инструкцию и для других дистрибутивов Linux.

Установка и первичная настройка Fail2Ban в CentOS 8/7

Пакет для установки fail2ban находится в репозитории Epel, подключим его:

# yum install epel-release -y

После подключения репозитория, можно установить fail2ban через yum или dnf (в CentOS 8):

# yum install fail2ban -y

установка fail2ban в linux centos

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

[root@server ~]# systemctl enable fail2ban

Created symlink /etc/systemd/system/multi-user.target.wants/fail2ban.service → /usr/lib/systemd/system/fail2ban.service.

Служба fail2ban хранит файлы конфигурации в директории /etc/fail2ban. Главный файл конфигурации — /etc/fail2ban/jail.conf. Так как данный файл может быть перезаписан при обновлении сервиса, для работы нужно создать файл jail.local. Также файлы в директории /etc/fail2ban/jail.d/ могут использоваться для переопределения настроек в выше указанных файлах. Файлы применяются в следующем порядке:

  • /etc/fail2ban/jail.conf
  • /etc/fail2ban/jail.d/*.conf
  • /etc/fail2ban/jail.local
  • /etc/fail2ban/jail.d/*.local

Использование Fail2Ban для защиты SSH от перебора паролей

Создадим файл и внесем настройки:

# nano /etc/fail2ban/jail.local

И добавим в него содержимое:

[DEFAULT]
# Ban hosts for one hour:
bantime = 3600
# Override /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport
[sshd]
enabled = true

Данная конфигурация устанавливает новое время для блокировки IP адресовм для всех служб, устанавливает использование iptables для блокировок и включается защиту для sshd.

Чтобы использовать для фильтрации firewalld, укажите:

banaction = firewallcmd-ipset

После изменения настроек перезапустите сервис:

# systemctl restart fail2ban

Чтобы посмотреть статус fail2ban, и проверить список защищаемых службы, выполните команду:

[root@server ~]# fail2ban-client status

Status
|- Number of jail: 1
`- Jail list: sshd

Вы можете запросить текущий статус блокировок fail2ban для конкретной службы:

# fail2ban-client status sshd

fail2ban-client status sshd

В файле jail.conf можно описать общие параметры, которые не будут переопределяться в jail.local.

Разблокируйте строку:

ignoreip = 127.0.0.1/8

Измените следующие значения:
bantime = 10m
— время на которое будет заблокирован IP
findtime = 10m
— время, в течение которого будут подсчитываться неудачные попытки авторизации.
maxretry = 3
— количество попыток до блокировки

Чтобы получать оповещения по электронной почте, вам нужно настроить следующие параметры:
destemail = [email protected]
–получатель
sender = [email protected]
— отправитель
mta = postfix
— SMTP служба, через которую осуществляется отправка

Чтобы настроить блокировку для отдельных сервисов, в файле /etc/fail2ban/jail.local после блока [DEFAULT] создается блок для нужного сервиса, например, как с sshd. Добавим в него некоторые настройки:

[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s

Мы указали какой порт блокировать и куда писать логи блокировки. Обратите внимание на директорию /etc/fail2ban/filter.d, там описываются фильтры с помощью которых будут анализироваться записи в журнале и проверять, указывает ли та или иная запись на неудачную аутентификацию. Если вывести список файлов в каталоге, можно обнаружить правила fail2ban для большинство популярных сервисов:
# ls /etc/fail2ban/filter.d

fail2ban/filter.d список поддерживаемых сервисов и служб

Файлы очень подробно описаны и можно изучить нужный вам, чтобы понимать, как происходят проверки журнала.

Логи Fail2Ban

Чтобы проверить журнал fail2ban, выполните команду:

# journalctl -b -u fail2ban

Так же можно проверить логи в реальном времени:

# tail -F /var/log/fail2ban.log

Вывод из лога:

2019-12-05 12:13:26,914 fail2ban.actions [9750]: NOTICE [sshd] Restore Ban 222.186.180.17
2019-12-05 12:13:26,930 fail2ban.actions [9750]: NOTICE [sshd] Restore Ban 222.186.180.223
2019-12-05 12:13:26,944 fail2ban.actions [9750]: NOTICE [sshd] Restore Ban 36.72.82.10
2019-12-05 12:13:26,958 fail2ban.actions [9750]: NOTICE [sshd] Restore Ban 40.117.135.57
2019-12-05 12:13:26,973 fail2ban.actions [9750]: NOTICE [sshd] Restore Ban 45.55.155.224
2019-12-05 12:13:26,988 fail2ban.actions [9750]: NOTICE [sshd] Restore Ban 67.205.135.127
2019-12-05 12:13:27,003 fail2ban.actions [9750]: NOTICE [sshd] Restore Ban 83.171.107.216
2019-12-05 12:13:43,362 fail2ban.filter [9750]: INFO [sshd] Found 183.87.134.98 - 2019-12-05 12:13:42
2019-12-05 12:13:45,571 fail2ban.filter [9750]: INFO [sshd] Found 183.87.134.98 - 2019-12-05 12:13:45
2019-12-05 12:15:46,109 fail2ban.filter [9750]: INFO [sshd] Found 112.64.170.178 - 2019-12-05 12:15:45
2019-12-05 12:17:05,317 fail2ban.actions [9750]: NOTICE [sshd] Unban 222.186.175.216

Как видите, fail2ban работает и периодически блокирует или убирает блокировку для IP адресов.

Чтобы проверить, какие IP адреса заблокированы в iptables службой fail2ban, выполните:

# iptables -L

iptables - правила для блокировки конкретных IP

Как видите, с открытым наружу ssh, время от времени кто-то пытается подобрать пароль и авторизоваться. Если проверить статистику через какое-то время, видно, что количество заблокированных IP растет.

список заблокированных IP в fail2ban

Защита Apache с помощью Fail2Ban

Если вы хотите настроить fail2ban для вашего apache (httpd), добавьте следующие настройки в jail.local:

# выявляем неудачные попытки ввода пароля
[apache]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/httpd/error_log
maxretry = 3
# блокирует IP, которые напрямую обращаются к скриптам с расширением php, asp, exe, pl, cgi, scgi
[apache-noscript]
enabled = true
port= http,https
filter = apache-noscript
logpath = /var/log/httpd/error_log
maxretry = 3
# выявляем попытки переполнения Апача
[apache-overflows]
enabled = true
port= http,https
filter = apache-overflows
logpath = /var/log/httpd/error_log
maxretry = 2
# выявляем неудачные попытки поиска в домашней директории на сервере
[apache-nohome]
enabled = true
port = http,https
filter = apache-nohome
logpath = /var/log/httpd/*error_log
maxretry = 2

После изменения конфигурационного файла, выполняем рестарт сервиса и проверяем статус:

[root@server ~]# fail2ban-client status apache

Status for the jail: apache
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/httpd/error_log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:

Для теста, я установил на сервер Joomla, после чего пытался открыть несуществующий файл и fail2ban меня заблокировал:

[root@server httpd]# fail2ban-client status apache-noscript

Status for the jail: apache-noscript
|- Filter
| |- Currently failed: 1
| |- Total failed: 6
| `- File list: /var/log/httpd/error_log
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: *.*.*.*

Настройка связки Fail2Ban и Nginx

Если веб-сервером у вас выступает nginx и на сайте есть разделы требующие авторизации, у вас так же могут быть проблемы с попытками перебора паролей. Для fail2ban мы можем указать использовать файл nginx-http-auth.conf, По умолчанию он уже описан в конфигурационном файле /etc/fail2ban/jail.conf:

[root@server ~]# cat /etc/fail2ban/jail.conf | grep nginx

[nginx-http-auth]
logpath = %(nginx_error_log)s
# To use 'nginx-limit-req' jail you should have `ngx_http_limit_req_module`
# and define `limit_req` and `limit_req_zone` as described in nginx documentation
# http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
# or for example see in 'config/filter.d/nginx-limit-req.conf'
[nginx-limit-req]
logpath = %(nginx_error_log)s
[nginx-botsearch]
logpath = %(nginx_error_log)s
logpath = %(nginx_access_log)s

Нам нужно ли включить его в конфигурационном файле /etc/fail2ban/jail.local добавив:

[nginx-http-auth]
enabled = true

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

# systemctl restart fail2ban

Защита MySQL с помощью Fail2Ban

Для защиты MySQL нужно добавить отдельный блок в конфигурационный файл jail.local:

[mysqld-auth]
enabled = true
filter = mysqld-auth
port = 3306
logpath = /var/log/mysql/error.log

Данная настройка защитит вас от перебора паролей для пользователя mysql (это очень частый брутфорс).

mysqld-auth - правило fail2ban для mysql

Правила Fail2Ban для Exim

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

[exim]
enabled = true
filter = exim
action = iptables-multiport[name=exim,port="25,465,587"]
logpath = /var/log/exim/mainlog

Таким образом вы можете настроить fail2ban для работы практически со всеми популярными сервисами и ваш сервер станет максимально безопасен.

Белый список IP в Fail2Ban, разблокировка IP-адресов

Чтобы разблокировать IP, который попал в блокировку fail2ban, используйте команду:

# fail2ban-client set SECTION unbanip IP
— где SECTION название секции в конфигурационном файле, по правилам которого был заблокирован ваш IP адрес. Например:

# fail2ban-client set apache-noscript unbanip 185.*.*.*

Вы можете добавить определенные IP адреса в исключения fail2ban (белый список). Для этого в конфигурационном файле jail.conf внесите IP в строку:

ignoreip =185.*.*.*

Добавив свой IP-адрес в исключения, я выполнил несколько атак подобно предыдущей и блокировки не произошло.

Как вы видите, fai2ban довольно просто в настройке, но вполне эффективное средство дополнительной защиты вашего сервера от злоумышленников. Для Windows к сожалению, я не видел бесплатных программ с подобным функционалом (можно попробовать реализовать блокировку IP адресов с помощью PowerShell – см. статью Защита RDP от перебора паролей).

Linux
Apache, Exim, MySQL, Настройка Fail2Ban в Linux для защиты SSH