====== 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 хунвейбина.
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 =====
[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]