RTFM.WIKI

Ordnung muß sein. Ordnung über alles (18+)

Инструменты пользователя

Инструменты сайта


linux:fail2ban

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. Но это уже совсем другая история. FIXME

Как правильно разблокировать 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]

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
 
linux/fail2ban.txt · Последнее изменение: 2017/09/03 16:08 — 127.0.0.1