RTFM.WIKI

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

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

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


Боковая панель


Навигация

Линкшэринг

ALARM!

Добавить новую страницу

You are not allowed to add pages
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 = 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

Действительно, 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, dest=root@gmail.com, sender=fail2ban]
This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies

Discussion

Enter your comment. Wiki syntax is allowed:
 
linux/fail2ban.txt · Последнее изменение: 2017/09/03 16:08 (внешнее изменение)