Интеграция с FastNetMon

Описана следующая схема защиты:

  • FastNetMon анализирует трафик, выявляет атаки и вызывает скрипт при началах и окончаниях атак.
  • Скрипт анализирует отчет FastNetMon и переключает защиты на Mitigator´е в зависимости от характеристик атаки.

Обзор FastNetMon

FastNetMon выявляет начало, окончание и характеристики атаки, анализируя трафик, который может сниматься с сетевых интерфейсов или поступать от агрегаторов (NetFlow, sFlow). FastNetMon не выявляет источник атаки (IP-адреса отправителей или признаки пакетов), но можно определить, какие ресурсы требуется защищать от каких видов атак.

FastNetMon может вызывать внешнюю программу при разных событиях:

  • начало атаки (ban);
  • отчет об атаке (attack_details);
  • окончание атаки (unban).

В отчет об атаке входит (пример):

  • атакованный IP-адрес (защищаемый ресурс);
  • направление атаки (аномалия входящего или исходящего трафика);
  • тип атаки (SYN flood, ICMP flood, IP fragmentation или неизвестная);
  • протокол, на уровне которого происходит атака;
  • статистика трафика атаки;
  • (опционально) образец трафика атаки в текстовом виде.

Настройка FastNetMon

Здесь описан простейший вариант настройки FastNetMon для тестирования. При наличии развернутого FastNetMon в этом шаге достаточно настроить интеграцию (выделено в тексте).

Установим FastNetMon (Debian, Ubuntu):

apt-get install fastnetmon

Сеть защищаемых ресурсов (например, 10.0.2.0/24) нужно записать в файл:

echo "10.0.2.0/24" > /etc/networks_list

FastNetMon настраивается в /etc/fastnetmon.conf. В версии дистрибутива множество настроек с комментариями; мы составим более простые настройки (готовый файл).

Будем захватывать трафик через libpcapс интерфейса span0 (медленный способ только для тестов!):

pcap = on
interfaces = span0

Настроим анализ только входящего трафика:

process_incoming_traffic = on
process_outgoing_traffic = off

Оповещать об атаках; не реже, чем раз в 30 секунд проверять, не кончилась ли атака, и если кончилась, оповещать об этом:

enable_ban = on
ban_time = 30
unban_only_if_attack_finished = on

Самое главное — вызов скрипта интеграции при событиях, связанных с атаками. Скрипту нужны подробности об атаке (отчет), при этом описания пакетов не нужны:

notify_script_path = /usr/local/bin/fastnetmon.py
notify_script_pass_details = on
ban_details_records_count = 0

Отключим захват образцов трафика в формате PCAP и их обработку. На практике это может быть полезно, но для наших целей не нужно:

collect_attack_pcap_dumps = off
process_pcap_attack_dumps_with_dpi = off

Наконец, лимиты трафика. Для простоты ограничим только суммарный трафик в пакетах и байтах. Можно также задать ограничения отдельно на трафик TCP, UDP и ICMP, а также на количество соединений (требуется включить их отслеживание):

ban_for_pps = on
ban_for_bandwidth = on

threshold_pps = 20000
threshold_mbps = 1000

Также FastNetMon позволяет настроить разные лимиты для групп подсетей, но при оповещении не будет известно, для какой группы превышен лимит — это можно определить только по атакованному адресу.

Настройка скрипта реагирования

FastNetMon вызывает fastnetmon.py (скачать), который разбирает параметры и отчет об атаке, чтобы управлять Mitigator´ом через mitigator.py (скачать).

Разместим скрипты на машине с FastNetMon:

wget http://docker.mitigator.ru/integrate/mitigator.py \
        -O /usr/local/bin
wget http://docker.mitigator.ru/integrate/fastnetmon/fastnetmon.py \
        -O /usr/local/bin

В /usr/local/bin/fastnetmon.py нужно настроить доступ к Mitigator´у:

SERVER = 'mitigator.local'
USER = 'admin'
PASSWORD = 'admin'
EXTRA = ['--no-verify']
LOG = '/var/log/fastnetmon-mitigator.log'

Помимо адреса Mitigator´а (SERVER), логина (USER) и пароля (PASSWORD) можно указать дополнительные опции mitigator.py. В данном случае отключается проверка TLS, что актуально, если сертификат самоподписанный.

Функция policy_by_ip() переводит IP-адрес атакованного ресурса в ID политики Mitigator´а (42 из policies/42 в URL). В примере всегда выбирается политика по умолчанию:

def policy_by_ip(ip):
    return 1

Скрипт работает так:

  • При начале атаки включает политику защиты.
  • По отчету об атаке:
    • при SYN flood или атаке на TCP включает контрмеру TCP;
    • при ICMP flood или атаке на ICMP включает контрмеру ACL;
    • в прочих случаях включает контрмеру SORB.
  • При окончании атаки выключает контрмеры TCP, ACL, SORB и политику защиты.

Расчет сделан на то, что TCP защищается специальной контрмерой, в ACL можно настроить сброс ICMP (что не рекомендуется, но допустимо под атакой), а прочий трафик можно лимитировать по объему.

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

На Mitigator´е включим общую защиту.

В политике по умолчанию настроим:

  • для контрмеры ACL правило drop icmp;
  • для контрмеры SORB порог по пакетам 100, нарушителей заносить во временный «черный список».

Ни защиту политики, ни контрмеры включать не будем — это сделает скрипт.

Запустим ICMP flood (утилитой hping3 из пакета hping3), адрес жертвы из защищаемой подсети:

hping3 --icmp --flood 10.0.2.254

Через несколько секунд FastNetMon обнаружит атаку, на Mitigator´е включится защита политики и контрмера ACL, и трафик начнет сбрасываться.

После остановки атаки в течение 30 секунд защиты будут выключены.

В случае каких-либо проблем ошибки будут записаны в журнал FastNetMon (/var/log/fastnetmon.log) и в журнал скрипта (/var/log/fastnetmon-mitigator.log).