Настройка 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 нужно добавить в автозагрузку, чтобы он автоматически запускался при рестарте системы:
[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
В файле jail.conf можно описать общие параметры, которые не будут переопределяться в jail.local.
Разблокируйте строку:
ignoreip = 127.0.0.1/8
Измените следующие значения:bantime = 10m
— время на которое будет заблокирован IPfindtime = 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
Чтобы проверить журнал 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
Как видите, с открытым наружу ssh, время от времени кто-то пытается подобрать пароль и авторизоваться. Если проверить статистику через какое-то время, видно, что количество заблокированных IP растет.
Защита 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 (это очень частый брутфорс).
Правила 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