База знаний

Часто задаваемые вопросы, на которые мы уже ответили

Fail2ban

Основное предназначение fail2ban — защита от несанкционированного доступа, что возможно благодаря тщательному отслеживанию сетевой активности на основных портах и чтению журналов записей.

Чтобы блокировать адрес, fail2ban создает правило в брандмауэре netfilter. Блокировка настраивается путем внесения изменений в правила iptables.

Программа особенно эффективна против так называемых brute-force атак, поскольку она нейтрализует атакующего таким образом, что все пакеты, отправленные с устройства, IP-адрес которого по той или иной причине попал в черный список, отбрасываются.

Установка

CentOS 7/Red Hat

$ yum install fail2ban

Ubuntu/Debian

$ apt install fail2ban

CentOS 6

  • Добавляем репозиторий:
$ rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
  • Устанавливаем fail2ban:
$ yum install fail2ban

Запуск

$ systemctl enable fail2ban
$ systemctl start fail2ban

или

$ service fail2ban start

Настройка

Процесс настройки fail2ban не зависит от дистрибутива Linux.

Основной конфигурационный файл jail.conf находится в каталоге /etc/fail2ban/. Однако, его не рекомендуется менять и для настройки используют подключаемые файлы из каталога /etc/fail2ban/jail.d.

Существующие фильтры лежат в директории /etc/fail2ban/filter.d. Можно изменять существующие фильтры или на их основе делать собственные.

Существующие правила реагирования хранятся в директории /etc/fail2ban/action.d.

Как правило, все стандартные файлы содержат подробные комментарии.

Действия

Файлы с настройкой действий находятся в каталоге /etc/fail2ban/action.d.

Остановимся на описании самых используемых действий:

  • iptables — создание простого правила в netfilter с помощью одноименной утилиты;
  • iptables-multiport — использование модуля multiports, позволяющий добавлять диапазоны портов для блокировки;
  • iptables-ipset — использование ipset для придания более лаконичного вида правилам;
  • iptables-allports — блокирует для адреса все порты.

Фильтры

Фильтры, в основном, представляют набор регулярных выражений для поиска ключевых слов в log-файлах. Они находятся в каталоге /etc/fail2ban/filter.d.

Для создания и настройки своих фильтров, можно использовать имеющиеся файлы в качестве шаблона.

Файлы с фильтрами должны иметь расширение .conf. В дальнейшем использовать указанный фильтр можно, обратившись к нему в правиле по имени файла без расширения.

Например, чтобы использовать фильтр /etc/fail2ban/filter.d/my.conf в правиле надо указать:

filter = my

Указание параметров на примере

Для нового правила необходимо создать конфигурационный файл в каталоге /etc/fail2ban/jail.d:

$ vi /etc/fail2ban/jail.d/service.conf
[ssh]
enabled = true
port = ssh
filter = sshd
action = iptables[name=sshd, port=ssh, protocol=tcp]
logpath = /var/log/auth.log
maxretry = 10
findtime = 600
ignoreip = 127.0.0.1/8

Разберем параметры:

  • ssh — название для правила.
  • enabled позволяет быстро включать (true) или отключать (false) правило;
  • port — порт целевого сервиса. Принимается буквенное или цифирное обозначение.
  • filter — фильтр (критерий поиска), который будет использоваться для поиска подозрительных действий. По сути, это имя файла из каталога /etc/fail2ban/filter.d без .conf на конце.
  • action — действие, совершаемое в случае срабатывания правила. В квадратных скобках указаны название для правила, сетевой порт и протокол для блокирования.
  • logpath — расположение лог-файла, в котором фильтр будет искать подозрительную активность на основе описанных критериев.
    • Примечание: Если путь к файлу хранения логов указан некорректно, перезапуск Fail2ban завершится сообщением об ошибке. Если файла не существует, его нужно создать. Лог должен иметь права доступа 755.
  • maxretry — количество действий, которые разрешено совершить до блокировки.
  • findtime — время в секундах, в течение которого учитывается maxretry.
  • bantime — время, на которое будет блокироваться IP-адрес.
  • ignoreip — игнорировать защиту, если запросы приходят с перечисленных адресов.

Если какой-то из параметров не указан в конкретном правиле, для него берется значение по умолчанию, описанное в правиле DEFAULT.

Примечание: Для применения новые правил необходимо перезапустить fail2ban одной из следующих команд:

$ systemctl restart fail2ban

или

$ service fail2ban restart

Работа со списком заблокированных адресов

Просмотр

Формат команды:

fail2ban-client status <имя правила>

Без имени правила будет отображен весь список активных правил.

  • Получить список правил можно командой:
$ fail2ban-client status
  • Получить статистику заблокированных адресов можно следующей командой:
$ fail2ban-client status ssh
`- action
|- Currently banned: 2
|  `- IP list:       31.207.47.55 10.212.245.29

Удаление адреса из списка

Формат команды:

fail2ban-client set <имя правила> unbanip 

Пример:

$ fail2ban-client set ssh unbanip 31.207.47.55

Примеры

Блокировка доступа по SSH

[ssh-iptables]
# 'enabled = true' означает что защита SSH включена.
# Ее можно отключить с помощью 'enabled = false'.
enabled  = true
# Использовать фильтр: /etc/fail2ban/filter.d/sshd.conf
filter   = sshd
# Действия, выполняемые при блокировке IP адреса:
action   = iptables[name=SSH, port=ssh, protocol=tcp]
# Отправлять уведомления на admin@example.com
sendmail-whois[name=SSH, dest=admin@example.com, sendername="Fail2Ban"]
# Файл с логами, которые будет отслеживать Fail2Ban:
logpath  = /var/log/secure
# если в течение 1 часа
findtime    = 3600
# произведено 5 неудачных попыток залогиниться
maxretry    = 5
# IP адрес будет забанен на 24 часа
bantime     = 86400

NGINX DDoS (req limit)

Данное правило поможет защитить веб-сервер nginx от DDoS-атак. В некоторых сборках, для данного правила может не оказаться готового фильтра, поэтому в данном примере, мы его создадим вручную.

  • Создаем фильтр:
vi /etc/fail2ban/filter.d/nginx-limit-req.conf
[Definition]
ngx_limit_req_zones = [^"]+
failregex = ^\s*\[error\] \d+#\d+: \*\d+ limiting requests, excess: [\d\.]+ by zone "(?:%(ngx_limit_req_zones)s)", client: 
ignoreregex =
  • Создаем правило в fail2ban:
vi /etc/fail2ban/jail.d/nginx-ddos.conf
[nginx-ddos]
enabled = true
port = http,https
filter = nginx-limit-req
action = iptables-multiport[name=nginxddos, port="http,https", protocol=tcp]
logpath = /var/log/nginx/error.log
Была ли эта статья полезной?