====== fail2ban - украл, выпил - в тюрьму! ====== {{:linux:fail2ban_logo.png?nolink |}} Что это и для чего? Выбираем приложения для мониторинга - Roundcube, FTP сервер, SSH или что-то ещё. Задаём количество неверных попыток авторизации. fail2ban парсит лог файл и банит брутфорсеров. Админ спокойно спит играет в CS работает. ===== Установка ===== В нашем примере будет CentOS 7 и jail'ы для SSH и nginx/apache с http-auth. Скорее всего EPEL у вас подключен. Если нет, то # yum install epel-release Устанавливаем пакет fail2ban, активируем сервис, запускаем его и проверяем статус. # yum install fail2ban # systemctl enable fail2ban Created symlink from /etc/systemd/system/multi-user.target.wants/fail2ban.service to /usr/lib/systemd/system/fail2ban.service. # systemctl start fail2ban # fail2ban-client status Status |- Number of jail: 0 `- Jail list: Если вам больше по душе firewalld, то установка выглядит так # yum install firewalld ipset systemd-python fail2ban fail2ban-systemd ===== Настройка ===== Все настройки fail2ban хранятся в каталоге ''/etc/fail2ban''. Стандартные настройки и правила находятся в файле ''jail.conf''. Этот файл не следует редактировать, так как он может быть перезаписан при обновлении пакета fail2ban.
# # YOU SHOULD NOT MODIFY THIS FILE. # # It will probably be overwritten or improved in a distribution update. # # Provide customizations in a jail.local file or a jail.d/customisation.local. # For example to change the default bantime for all jails and to enable the # ssh-iptables jail the following (uncommented) would appear in the .local file. # See man 5 jail.conf for details. #
Поэтому создадим отдельный файл ''jail.local'' для наших правил. Всё что мы запишем в ''jail.local'' будет иметь приоритет выше, чем в ''jail.conf''. Где-то я прочитал, что правила применяются в следующем порядке. * /etc/fail2ban/jail.conf * /etc/fail2ban/jail.d/*.conf * /etc/fail2ban/jail.local * /etc/fail2ban/jail.d/*.local Создаём файл ''jail.local''. Или если у нас правило только для SSH, то можно создать файл ''sshd.local'' в каталоге ''/etc/fail2ban/jail.d'' # nano /etc/fail2ban/jail.local И добавляем следующее [DEFAULT] bantime = 3600 banaction = iptables-multiport [sshd] enabled = true bantime = 7200 # если порт отличный от 22, то укажем это ниже # port = 1337 destemail = root@gmail.com sender = fail2ban action = iptables-multiport[name=SSH, port=ssh, protocol=tcp] mail-whois[name=SSH, dest=root@gmail.com, sender=fail2ban] Итак. 1. Мы установили время блокировки для **всех** сервисов на 1 час. 2. Так у нас не установлен в системе firewalld, то переопределяем banaction **UPD** не нужно! В ''jail.conf'' уже указан нужный ''banaction''. 3. Активировали jail для sshd и установили время блокировки равное 2 часам и указали email для уведомлений. Если бы мы использовали firewalld, то ''banaction'' выглядел бы так Файл ''/etc/fail2ban/jail.d/00-firewalld.conf'' # This file is part of the fail2ban-firewalld package to configure the use of # the firewalld actions as the default actions. You can remove this package # (along with the empty fail2ban meta-package) if you do not use firewalld [DEFAULT] banaction = firewallcmd-ipset Перезапускаем fail2ban и смотрим статус # systemctl restart fail2ban # fail2ban-client status Status |- Number of jail: 1 `- Jail list: sshd За 10 минут пока я писал эту заметку уже попались в цепкие клешни тюремщика 3 хунвейбина. Вот уроды! Вывод ''iptables -L -n'' Chain f2b-sshd (1 references) target prot opt source destination REJECT all -- 120.193.59.8 0.0.0.0/0 reject-with icmp-port-unreachable REJECT all -- 116.31.116.9 0.0.0.0/0 reject-with icmp-port-unreachable REJECT all -- 58.57.65.112 0.0.0.0/0 reject-with icmp-port-unreachable Вывод ''fail2ban-client status sshd'' Status for the jail: sshd |- Filter | |- Currently failed: 2 | |- Total failed: 93 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 3 |- Total banned: 3 `- Banned IP list: 58.57.65.112 116.31.116.9 120.193.59.8 Действительно, [[http://ciplogic.com/index.php/blog/83-fail2ban-doing-real-work|Fail2Ban Doing Real Work]] Спустя 5 дней хунвейбинов прибавилось # fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 2 | |- Total failed: 5336 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 8 |- Total banned: 591 ===== Jail пример для apache ===== С sshd всё понятно. Теперь установим apache (затем nginx), сделаем аутентификацию по паролю, установим максимальное количество попыток ввести правильный пароль равным например 5 и заблокируем редисок на 3 часа. Скорее всего ''mod_auth'' у вас уже включен * [[https://httpd.apache.org/docs/2.4/mod/mod_authn_file.html|mod_authn_file]] * [[https://httpd.apache.org/docs/2.4/mod/mod_auth_basic.html|mod_auth_basic]] Для создания файла с паролями проще всего воспользоваться утилитой **htpasswd**. Если установлен apache (пакет httpd), то ничего дополнительно устанавливать не надо.\\ Если установлен nginx, то нужно установить пакет **httpd-tools**, в состав которого входит утилита **htpasswd**. # yum install httpd-tools Начнем с примера для Apache. Создадим тестовый каталог где будет доступ по паролю # mkdir /var/www/html/fail2ban-apache Добавим пользователя john # htpasswd -c /etc/httpd/conf.d/.f2b-apache john New password: Re-type new password: Adding password for user john Добавим в ''httpd.conf'' AuthType Basic AuthName "No pasaran!" AuthUserFile /etc/httpd/conf.d/.f2b-apache Require valid-user Перезапускаем Apache # systemctl restart httpd и если всё нормально, то теперь создадим отдельный jail файл для Apache [apache-http-auth] enabled = true port = http,https filter = apache-auth logpath = /var/log/httpd/error_log maxretry = 5 Проверяем - 5 раз неправильно вводим пароль и смотрим логи **fail2ban.log** # tail -f /var/log/fail2ban.log 2017-08-24 09:06:15,082 fail2ban.filter [21528]: INFO [apache-http-auth] Found 192.168.13.77 2017-08-24 09:06:15,257 fail2ban.actions [21528]: NOTICE [apache-http-auth] Ban 192.168.13.77 **error_log Apache** # tail -f /var/log/httpd/error_log [Thu Aug 24 09:06:14.588231 2017] [auth_basic:error] [pid 21348] [client 192.168.13.77:59127] AH01617: user john: authentication failure for "/fail2ban-apache/": Password Mismatch Так выглядит вывод команды **fail2ban-client status apache-http-auth** Status for the jail: apache-http-auth |- Filter | |- Currently failed: 0 | |- Total failed: 5 | `- File list: /var/log/httpd/error_log `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: 192.168.13.77 ===== Jail пример для nginx ===== Для ограничения доступа в nginx есть модуль [[https://nginx.ru/ru/docs/http/ngx_http_auth_basic_module.html|ngx_http_auth_basic_module]] Создаём jail файл [nginx-http-auth] enabled = true port = http,https filter = nginx-http-auth logpath = /var/log/nginx/error.log maxretry = 5 bantime = 10800 В ''nginx.conf'' добавляем location /fail2ban-nginx { auth_basic "No pasaran!"; auth_basic_user_file conf/htpasswd; } ===== Другие примеры ===== В каталоге ''/etc/fail2ban/filter.d'' много других фильтров. Когда-нибудь обязательно их попробую. Очень интересно проверить работу фильтров 3proxy, exim и vsftpd. Но это уже совсем другая история. FIXME ===== Как правильно разблокировать IP ===== * http://serverfault.com/questions/285256/how-to-unban-an-ip-properly-with-fail2ban * http://stackoverflow.com/questions/24344281/fail2ban-how-unban-ip-using-fail2ban-client Синтаксис // Для версий <0.8.8 fail2ban-client get [имя_jail] actionunban [IP] // Для версий 0.8.8 и выше fail2ban-client set [имя_jail] unbanip [IP] Пример для SSH // Для версий <0.8.8 fail2ban-client get ssh-iptables actionunban 192.168.13.99 //Для версии 0.8.8 и выше fail2ban-client set ssh-iptables unbanip 192.168.13.99 ===== Whitelist ===== Морда чекинг фейс контроль вайт листинг - http://www.fail2ban.org/wiki/index.php/Whitelist [DEFAULT] # "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not # ban a host which matches an address in this list. Several addresses can be # defined using space separator. ignoreip = 127.0.0.1 192.168.1.0/24 8.8.8.8 ===== Уведомления на почту ===== 1. fail2ban failed to start: ERROR Error in action definition sendmail-whois В каталоге ''/etc/fail2ban/action.d'' нет файла ''sendmail-whois.conf'' # yum install fail2ban-sendmail fail2ban-mail 2. Не приходят письма Если установлен Exim, то указываем ''mta = mail'' grep 'mta *=' /etc/fail2ban/jail.{conf,local} /etc/fail2ban/jail.conf:mta = mail Недостаточно указать в ''[DEFAULT]'' секции ''destemail'' и ''sendername''. Должен быть ещё правильный ''action''. Пример action = iptables-multiport[name=SSH, port=ssh, protocol=tcp] mail-whois[name=SSH, dest=root@gmail.com, sender=fail2ban]