Исходный адрес статьи: https://www.linuxshop.ru/articles/a26710798-nastroyka_fail2ban
Fail2ban отслеживает файлы журналов (например, /var/log/auth.log, /var/log/apache/access.log), временно или постоянно запрещая подозрительную активность IP-адреса путем обновления существующих правил брандмауэра. Fail2ban позволяет автоматически выполнить различные действия, такие как заблокировать IP, используя правила iptables, или просто отправить уведомление по электронной почте администратору сервера. По умолчанию Fail2ban поставляется с правилами фильтра под различные сервисы (sshd, apache, mysql proftpd, и т. д.), но конфигурация может быть легко расширена для мониторинга любой другой службы. Все фильтры и действия настраиваются в файлах конфигурации, таким образом 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.
Главный конфигурационный файл находится по адресу /etc/fail2ban/jail.conf, однако настоятельно не рекомендуется сразу вносить в него правки, сначала скопируем его под именем jail.local. Это связано с тем что файлы *.local имеют приоритет над файлами *.conf. Настройку продолжим непосредственно в этом файле, это предусмотрено разработчиками, все что вы сконфигурируете в 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
Теперь мы можем перейти к редактированию общих правил защиты сервисов.
Первым делом очистим наш дефолный конфигурационный файл:
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
Допустим, на ваших сайтах есть разделы требующие аутентификации. Выполнить базовую защиту этих разделов от подбора паролей так же поможет 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-сервера или его полной неработоспособности.
В файле /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
Полезным будет поставить защиту от подбора паролей на почтовые ящики, если Вы используете этот популярный 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 вы используте (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 =
Добавим секцию для фильтра в главный конфигурационный файл:
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 от подбора паролей. Добавим секцию для фильтра в главный конфигурационный файл:
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-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