Содержание
fail2ban - украл, выпил - в тюрьму!
Что это и для чего? Выбираем приложения для мониторинга - 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 = [email protected] sender = fail2ban action = iptables-multiport[name=SSH, port=ssh, protocol=tcp] mail-whois[name=SSH, [email protected], 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
Действительно, 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
у вас уже включен
Для создания файла с паролями проще всего воспользоваться утилитой 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
<Directory "/var/www/html/fail2ban-apache"> AuthType Basic AuthName "No pasaran!" AuthUserFile /etc/httpd/conf.d/.f2b-apache Require valid-user </Directory>
Перезапускаем 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 есть модуль 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. Но это уже совсем другая история.
Как правильно разблокировать IP
Синтаксис
// Для версий <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, [email protected], sender=fail2ban]
Обсуждение