Блокировка IP на Mitigator с Nginx и log2ban

Описана настройка следующей схемы защиты web-сервера:

  • log2ban анализирует access.log, куда Nginx пишет о запросах;
  • IP добавляется в список заблокированных через Mitigator API.

Клиент Mitigator API

Имеется скрипт mitigator.py (скачать) для управления Mitigator´ом, в частности, для временной блокировки IP-адреса через Mitigator API. При необходимости скрипт можно доработать самостоятельно для совершения любых других действий на Mitigator´е. Скрипт использует только стандартные модули, работает с Python 2.7+ и Python 3.

Для запуска скрипта нужна учетная запись Mitigator и ID политики защиты (например, 42 в URL .../policies/42 при заходе на Mitigator). Также скрипт принимает IP и время блокировки в секундах. Описание всех параметров печатается с ключом --help (-h).

Настройка log2ban

Утилита log2ban анализирует логи и при обнаружении привышения за отведенное лимита запросов время выполняет действия по блокировке. По ссылке приведена инструкция по установке в разделе «Install scripts» и команда запуска log2ban. Вместо встроенного ipset-control.sh при интеграции нужно пользоваться API или интерфейсом Mitigator´а.

Разместим скрипт блокировки:

install mitigator.py /usr/local/bin

Настройки log2ban указываются в log2ban.py:

  • Команда, которая будет выполняться для блокировки IP:

    BAN_IP_COMMAND = "mitigator.py --server <server> --user <user> --password <password> --no-verify --policy <policy> tbl block --ip \"%s\" --time <bantime>"

    Метки <server>, <user>, <password>, <policy> и <bantime> нужно заменить на реальные значения; \"%s\" оставить как есть — ip-адрес будет передан log2ban при выполненнии. Ключ --no-verify нужен, если Mitigator работает с самоподписанным сертификатом, и необходимо отключить его проверку.

  • Настройка подключения к базе данных MONGODB_HOST. Если база заблокированных IP не нужна, указывается MONGODB_HOST = None.

  • Команда для чтения лога ECHO_LOG_COMMAND, формат лога (см. документацию).

Проверка работы

Трафик должен идти через Mitigator, должна быть включена общая защита и защита выбранной политики.

Имитировать атаку можно утилитой httperf:

httperf --server 192.0.2.20 --num-conn 100

При успешной настройке через несколько секунд после запуска httperf на сервере можно видеть, что log2ban отработал и вызвал исполнение скрипта блокировки

На Mitigator´е можно в карточке TBL политики проверить, что IP атакующего (192.0.2.20 в примере) находится в списке временно заблокированных.