Настройка fail2ban

04.03.2019

Настройка fail2ban

Fail2ban отслеживает файлы журналов (например, /var/log/auth.log, /var/log/apache/access.log), временно или постоянно запрещая подозрительную активность IP-адреса путем обновления существующих правил брандмауэра. Fail2ban позволяет автоматически выполнить различные действия, такие как заблокировать IP, используя правила iptables, или просто отправить уведомление по электронной почте администратору сервера. По умолчанию Fail2ban поставляется с правилами фильтра под различные сервисы (sshd, apache, mysql proftpd, и т. д.), но конфигурация может быть легко расширена для мониторинга любой другой службы. Все фильтры и действия настраиваются в файлах конфигурации, таким образом Fail2ban является отличным гибким инструментом для предотвращения взлома вашего сервера.


Установка Fail2ban

Для установки на Debian\Ubuntu выполните следующее:

root@host:~$  sudo apt-get update
root@host:~$  sudo apt-get install fail2ban

Для CentOS\RHEL:

root@host:~$ yum install epel-release
root@host:~$ yum install fail2ban fail2ban-systemd

Структура конфигурационных файлов

Файлы настроек находятся в каталоге /etc/fail2ban/. Для понимания работы утилиты, рассмотрим их более детально:

action.d/*.* - конфигурация выполняемых действий;

fail2ban.conf - дефолтный конфигурационный файл;

fail2ban.d/*.* - пользовательские настройки администратора для Fail2ban;

filter.d/*.* - шаблоны для анализа логов и настройки шаблонов;

jail.conf — дефолтные настройки сервисов;

jail.d/*.* - пользовательские настройки администратора для сервисов.

Файлы paths-arch.conf, paths-common.conf, paths-debian.conf и paths-opensuse.conf хранят в себе настройки путей для различных операционных систем семейства Linux.

Первоначальная настройка Fail2ban

Главный конфигурационный файл находится по адресу /etc/fail2ban/jail.conf, однако настоятельно не рекомендуется сразу вносить в него правки, сначала скопируем его под именем jail.local. Настройку продолжим непосредственно в этом файле, это предусмотрено разработчиками, все что вы сконфигурируете в jail.local будет автоматически перезаписывать настройки в jail.conf:

root@host:~$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Первым делом в конфигурационный файл необходимо внести ваш IP адрес, чтобы правила Fail2ban на него не распространялись, иначе после запуска службы вы рискуете внести себя в бан и доступ к серверу будет утерян:

root@host:~$ vim /etc/fail2ban/jail.local

Необходимо найти и раскоментировать строку #ignoreip, добавив через пробел свой внешний статический IP адрес. В результате у вас должно получиться следующее:

ignoreip = 127.0.0.1/8 ::1 178.20.***.**

где 178.20.***.** - Ваш IP адрес.

Здесь же, в секции [DEFAULT] можно задать значения findtime и maxretry, например:

bantime = 600
findtime = 3600
maxretry = 6

Параметры findtime и maxretry определяют условия, при которых будут блокироваться вредоносные пользователи. Maxretry определяет количество попыток входа, а findtime – интервал времени, в течение которого пользователь должен пройти аутентификацию. Если клиент превысил любой из этих показателей, он будет заблокирован. Bantime определяет длительность блокировки в секундах. Эти параметры в статье будут встречаться неоднократно. Если в настройке какого либо из сервисов вы их не зададите, они будут автоматически браться с секции [DEFAULT].

Не забывайте перезапускать Fail2ban после каждого редактирования конфигурационного файла.

Важно! Путь к файлу хранения логов (logpath) обязан быть указан правильно, иначе перезапуск Fail2ban завершится ошибкой. В случае отсутствия лог-файла по указанному пути, его можно создать командой touch, например:

root@host:~$ touch /var/log/yourlog.log
root@host:~$ chmod 755 /var/log/yourlog.log

Теперь мы можем перейти к редактированию общих правил защиты сервисов.

Защита сервиса sshd с помощью Fail2ban

Первым делом очистим наш дефолный конфигурационный файл:

root@host:~$ cat /dev/null > /etc/fail2ban/jail.d/defaults-debian.conf

В каталоге jail.d/*.*, отвечающим за настройку сервисов, создадим файл sshd.conf и добавим в него следующие строки:

vim /etc/fail2ban/jail.d/sshd.local
[sshd]
enabled = true
port: 22002
logpath = %(sshd_log)s
backend = %(sshd_backend)s
bantime = 600
findtime = 650
maxretry = 5

Чтобы применить изменения перезапустим сервис и внесем его в автозагрузку:

root@host:~$ systemctl restart fail2ban
root@host:~$ systemctl enable fail2ban

Рассмотрим детально наши действия. Мы их будем выполнять неоднократно для настройки других защищаемых сервисов:

[sshd] # обозначение конфигурируемого сервиса, в данном случае sshd

enabled = true # правило разрешающее мониторинг сервиса.

port: 2102 # Если вы для службы ssh используете стандартный порт 22, эту строку можно не указывать, однако, если вы используете нестандартный порт для подключения настраиваемого сервиса, в нашем примере это 2102, его обязательно необходимо указать.

bantime = 900 # время в секундах, на которое нарушитель будет заблокирован

findtime = 300 # время обнаружения

maxretry = 3 # допустимое количество ошибок аутентификации. На четвертой попытке нарушитель будет заблокирован.

Как это работает: Нарушитель с IP-адресом 123.123.12.13 пытается подобрать пароль к учетной записи на вашем сервере. Параметр findtime задает время, на которое ip адрес попадает под мониторинг от первого момента, когда он начинает фигурировать в логах /var/log/auth.log. Если в течении 300 секунд (5 минут), у нарушителя будет более чем три ошибки аутентификации, он будет заблокирован на 900 секунд (15 минут).

Проверить состояние правила можно командой:

root@host:~$ fail2ban-client status sshd

Мы увидим следующее:

Status for the jail: sshd
|- Filter
| |- Currently failed:	1
| |- Total failed:	24
| `- File list:	/var/log/auth.log
`- Actions
|- Currently banned:	1
|- Total banned:	1
`- Banned IP list: 123.123.12.13

Защита NGINX

a) Фильтр аутентификации

Допустим, на ваших сайтах есть разделы требующие аутентификации. Выполнить базовую защиту этих разделов от подбора паролей так же поможет Fail2ban. По умолчанию, защита NGINX доступна из коробки, однако её необходимо активировать. Для этого, в конфигурационном файле /etc/fail2ban/jail.conf находим блок [nginx-http-auth], где изначально указан только logpath. Добавляем в него значения:

root@host:~$ vim /etc/fail2ban/jail.local

на выходе у нас должно получиться следующее:

[nginx-http-auth]
enabled = true
filter   = nginx-http-auth
port     = http,https
bantime = 600
maxretry = 6

logpath = %(nginx_error_log)s

Обратите внимание на то, как указаны пути к логам. Начиная с версии Fail2ban 0.9.х, писать полные пути не обязательно. Если расположение логов защищаемого сервиса стандартное, то пути к ним предусмотрены разработчиками. Значение %(nginx_error_log)s будет равнозначно пути /var/log/nginx/error. log. Вы можете использовать оба варианта.

Теперь создадим файл nginx-http-auth.conf

root@host:~$ vim /etc/fail2ban/filter.d/nginx-http-auth.conf

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

[Definition]
failregex = ^ \[error\] \d+#\d+: \*\d+ user "\S+":? (password mismatch|was not found in ".*"),
client: , server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$

            ^ \[error\] \d+#\d+: \*\d+ no user/password was provided for basic authentication,
client: , server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$

ignoreregex =

б) Фильтр доступа к скриптам

Fail2ban является довольно гибки и функциональным инструментом. Если необходимого инструмента в jail.conf нет, опытный администратор может его написать сам. Например, мы хотим заблокировать ip адрес, который обращается к файлам с расширениями php, asp, exe, pl, cgi, scgi. Это очень полезный фильтр для обнаружения всякого рода эксплойтов.

Внимание! Будьте внимательны при использовании этого фильтра. Оно имеет смысл если у вас статический сайт, или вы четко уверены, к выполнению каких скриптов необходимо применить фильтрацию. Если сайт разрабатывали не вы, обратитесь за консультацией к разработчику

Для начала отредактируем главный конфигурационный файл:

root@host:~$ vim /etc/fail2ban/jail.local

В него необходимо добавить секцию [nginx-noscript], которая по умолчанию не существует:

[nginx-noscript]
enabled = true
port = http,https
filter = nginx-noscript
logpath = %(nginx_access_log)s
bantime = 600
maxretry = 6

Теперь создадим файл фильтра, к которому будет отсылаться наше правило при анализе access.log web-сервера:

root@host:~$ vim /etc/fail2ban/filter.d/nginx-noscript.conf

Вносим в него следующее:

[Definition]
failregex = ^ -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi)
ignoreregex =

Изменения вступят в силу после перезагрузки сервиса Fail2ban

root@host:~$ systemctl restart fail2ban

в) Фильтр сканеров

Сами по себе сканеры не несут какой либо угрозы сайту, однако сканирование вашего сайта может быть тем самым звоночком, что злоумышленник ищет его уязвимые места. Определить сканеры легко по всплеску ошибок 403 и 404 в /var/log/nginx/access.log. Итак, приступим:

root@host:~$ vim /etc/fail2ban/jail.local

Добавляем следующие блоки:

[nginx-404]
enabled = true
filter = nginx-404
port = http,https
logpath = %(nginx_access_log)s
bantime = 86400
findtime = 600
maxretry = 30

[nginx-403]
enabled = true
filter = nginx-403
port = http,https
logpath = %(nginx_access_log)s
bantime = 86400
findtime = 600
maxretry = 30

Создаем правило фильтрации для ошибок 403:

root@host:~$ vim /etc/fail2ban/filter.d/nginx-403.conf

[Definition]
failregex = ^ .* "(GET|POST) [^"]+" 403
ignoreregex = .*(robots.txt|favicon.ico|jpg|png)

Создаем правило фильтрации для ошибок 404:

root@host:~$ vim /etc/fail2ban/filter.d/nginx-404.conf

[Definition]
failregex = ^ .* "(GET|POST) [^"]+" 404
ignoreregex = .*(robots.txt|favicon.ico|jpg|png)

Перезапускаем сервис:

root@host:~$ systemctl restart fail2ban

Рассмотренный фильтр так же очень полезен при настройке фильтрации для web-сервера Apache. Он служит своего рода защитой от DDoS аттак и существенно может улучшить производительность web-сервера. Логика данного фильтра следующая: 404 - это код состояния HTTP, который указывает, что запрошенная веб-страница не может быть найдена на сервере. Другими словами, запрошенная веб-страница не существует или не работает.

И хакеры используют это как инструмент DDoS. Они генерируют тысячи запросов в минуту к несуществующим веб-страницам, что приводит к снижению производительности web-сервера или его полной неработоспособности.

Защита APACHE

В файле /etc/fail2ban/jail.local так же предусмотрена защита web-сервера Apache. Настройка аналогична настройке web-сервера NGINX, который мы рассмотрели в предыдущем разделе. Пройдемся кратко, по основным доступным фильтрам и за что они отвечают:

[apache-auth] - Определяет неудачные попытки ввода пароля.

[apache-badbots] - Определяем ботов, которые ищут email адреса

[apache-noscript] - Блокируем доступ к определенным скриптам

[apache-overflows] - Предотвращаем попытки переполнения Apache

[apache-nohome] - Блокируем неудачные попытки поиска домашней директории

[apache-botsearch] - Определяем ботов, которые перебором ищут популярные скрипты.

Каждое из правил активируется добавлением в блок строки enabled = true. Так же, в каждом блоке вы можете задать правила bantime, findtime и maxretry, которые рассмотрены выше.

Для примера, создадим несколько правил обнаружения:

root@host:~$ vim /etc/fail2ban/jail.local

Добавляем блоки:

[apache-auth]
enabled = true
filter = apache-auth
port = http,https
logpath = %(apache_error_log)s
bantime = 3600
maxretry = 3

[apache-badbots]
enabled = true
filter = apache-badbots
port = http,https
logpath = %(apache_error_log)s
bantime = 3600
maxretry = 1

[apache-noscript]
enabled = true
filter = apache-noscript
port = http,https
logpath = %(apache_error_log)s
bantime = 3600
maxretry = 6

[apache-overflows]
enabled = true
filter = apache-overflows
port = http,https
logpath = %(apache_error_log)s
bantime = 3600
maxretry = 2

Если вы используете Apache с PHP, вам может понадобиться раздел [php-url-fopen]

[php-url-fopen]
enabled = true
port = http,https
filter = php-url-fopen
logpath = /var/log/apache*/*access.log

Защита Dovecot

Полезным будет поставить защиту от подбора паролей на почтовые ящики, если Вы используете этот популярный IMAP\POP3-сервер. Добавим секцию для фильтра в главный конфигурационный файл:

root@host:~$ vim /etc/fail2ban/jail.local

[dovecot-pop3imap]
enabled = true
filter = dovecot-pop3imap
action = iptables-multiport[name=dovecot-pop3imap, port="pop3,imap", protocol=tcp]
logpath = /var/log/maillog
maxretry = 20
findtime = 1200
bantime = 1200

Фильтр:

root@host:~$ vim /etc/fail2ban/filter.d/dovecot-pop3imap.conf

[Definition]
failregex = (?: pop3-login|imap-login): .*(?:Authentication failure|Aborted login \(auth
failed|Aborted login \(tried to use disabled|Disconnected \(auth failed|Aborted login \(\d+
authentication attempts).*rip=``

Защита FTP сервера

Выставить защиту вашего FTP сервера так же не трудно. Однако, перед настройкой вы должны учесть, какой из FTP вы используте (vsFTPd, proFTPd, Pure-FTPd etc), настройки могут отличаться. Например, если вы используете Pure-FTPd, добавим секцию для фильтра в главный конфигурационный файл:

root@host:~$ vim /etc/fail2ban/jail.local

[pure-ftpd]
enabled = true
port = ftp,ftp-data,ftps,ftps-data
filter = pure-ftpd
logpath = /var/log/messages
maxretry = 3

Создадим фильтр:

root@host:~$ vim /etc/fail2ban/filter.d/pure-ftpd.conf

[Definition]

__errmsg = (?:Authentication failed for user)
failregex = pure-ftpd(?:\[\d+\])?: \(.+?@\) \[WARNING\] %(__errmsg)s \[.+\]\s*$
pure-ftpd: \(\?\:?@\) \[WARNING\] (?:Authentication failed for user) \[.+\]\s*$
ignoreregex =

Защита ISPmanager

Добавим секцию для фильтра в главный конфигурационный файл:

root@host:~$ vim /etc/fail2ban/jail.local

[isp-manager]
enabled = true
filter = isp-manager
action = iptables-multiport[name=ISP, port="443,1500"]
logpath = /usr/local/ispmgr/var/ispmgr.journal
maxretry = 5
bantime = 10800

Создадим фильтр:

oot@host:~$ vim /etc/fail2ban/filter.d/isp-manager.conf

[Definition]
failregex = \s+nobody\s+auth
ignoreregex =

Защита Wordpress

Рассмотрим защиту популярного движка Wordpress от подбора паролей. Добавим секцию для фильтра в главный конфигурационный файл:

root@host:~$ vim /etc/fail2ban/jail.local

[wp-login]
enabled = true
port = http,https
action = iptables-multiport[name=WP, port="http,https", protocol=tcp]
filter = wp-login
logpath = укажите путь к access.log вашего движка WP
maxretry = 3

Создадим фильтр:

root@host:~$ vim /etc/fail2ban/filter.d/wp-login.conf

[Definition]
failregex = ^ .* "POST /wp-login.php
ignoreregex =

Управление fail2ban

Программа Fail2Ban состоит из fail2ban-server и fail2ban-client. Серверная часть работает в фоновом режиме и отвечает за отработку всех активированных правил. Клиент - ваши непосредственные правила, которые взаимодействуют с сервисом.

Основные команды:

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

root@host:~$ systemctl restart fail2ban
root@host:~$ systemctl status fail2ban

Полный список правил:

root@host:~$ sudo iptables –L

Проверка срабатывания правила:

root@host:~$ fail2ban-regex <путь_к_лог_файлу>
/etc/fail2ban/filter.d/<JAIL_NAME>.conf

 Проверить работу служб:

root@host:~$ fail2ban-client status

Показать состояние указанного jail:

root@host:~$ fail2ban-client status sshd

Допустим, произошла ошибка, и ip адрес 123.123.12.13 не является нарушителем и нам его необходимо разблокировать:

root@host:~$ fail2ban-client set <JAIL_NAME> unbanip 123.123.12.13

Если необходимо добавить разрешение для данного ip адреса выполните:

root@host:~$ fail2ban-client set <JAIL_NAME> addignoreip 123.123.12.13

Удалить ip адрес из доверенных:

root@host:~$ fail2ban-client set <JAIL_NAME> delignoreip 123.123.12.13

Для просмотра списка всех доверенных адресов:

root@host:~$ fail2ban-client get <JAIL_NAME> ignoreip

Однако, все разрешения которые вы внесете используя команду addignoreip - временные и после перезапуска службы Fail2ban этот список будет автоматически очищен. Если вам необходимо внести ip адрес на постоянной основе и внести его в конфигурационный файл /etc/fail2ban/jail.d/<JAIL_NAME>.conf добавив с новой строки ещё один параметр:

ignoreip = 123.123.12.13>

В эту строку вы можете через пробел добавить как несколько IP адресов, так и целые подсети, например 172.16.1.0/24

< Назад к списку новостей