Быстрая настройка защиты Mitigator

Материалы данной статьи призваны облегчить понимание основных принципов организации защиты при помощи Mitigator´а. Далее, в качестве примера, приводится один из вариантов настройки системы в первой итерации.

Рассматриваемая ситуация:

Существует сеть Х.Х.Х.0/24 и несколько сервисов, работающих в этой сети. Из них можно выделить хост Х.Х.Х.100/32, на котором сайт (HTTP, HTTPS) и приложение, работающее по проприетарным протоколам поверх TCP/7777, UDP/8888.

Одна из особенностей Mitigator — это порядок обработки трафика.

Вначале все пакеты обрабатываются в «Общей защите», затем, используя 5-tuple, правила маршрутизации распределяют трафик по политикам защиты, а после политик защиты трафик попадает на еще пару контрмер из «Общей защиты».

Поэтому сначала нужно настроить общую защиту.

Общая защита

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

ACL

ACL позволяет сбрасывать или пропускать пакеты по правилам для заголовков для IPv4, IPv6, TCP, UDP, ICMP. В ACL нужно прописать сброс всего изначально ненужного трафика. Например:

# Сброс спуфленных пакетов с адресами нашей сети
drop src X.X.X.0/24
# Сброс трафика с немаршрутизируемых сетей
drop src (0.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 127.0.0.0/8 169.254.0.0/16 192.0.2.0/24 198.51.100.0/24 203.0.113.0/24 198.18.0.0/15 224.0.0.0/4 240.0.0.0/4)
# Сброс пакетов амплификации по неиспользуемых нами протоколам
# Список портов и описание протоколов амплификации можно подсмотреть https://github.com/Phenomite/AMP-Research. Протоколы для амплификации постоянно добавляются, так что нужно периодически актуализировать список
drop udp sport (19 6881 389 751 11211 1434 5353 137 111 17 27960 520 1900 27015 7001 3283 5683 37810 2362 30718 502 5351 53413 32414 161 3702 177 17185)
# Если в сети никто не играет в онлайн игры
drop udp sport (27015 30120)
# Если в сети нужен трафик с любых NTP и DNS, то обработаем дальше в политике защиты.
# Но в корпоративной сети достаточно разрешить NTP и DNS трафик только по списку, например
pass udp sport 53 src (77.88.8.88 77.88.8.2)
drop udp sport 53
pass udp sport 123 src 194.190.168.1
drop udp sport 123
# Пропуск только используемых L4 протоколов: TCP, UDP, ICMP, IPSEC
pass protocol (1 6 17 50 51 )
# Если используются туннели GRE, IP-IP, L2TP
pass protocol (47 4 115)
# Сброс всего остального трафика
drop

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

Правильно настроенный ACL избавляет от множества проблем. Желательно подобный список использовать на границе сети, а еще лучше договориться с апстримом и прописать подобные правила на операторском маршрутизаторе.

DLIM

Контрмера DLIM лимитирует трафик в pps и bps по IP-адресу назначения. DLIM обрабатывает пакеты перед самым выходом из Mitigator´а, т.е. после всех фильтраций в общей защите и политиках защиты. DLIM используется для спасения сети за Mitigator ценой частичного сброса легитимного трафика в сторону жертвы.

Пример:

В стойке 40 серверов, каждый сервер подключен через 1GbE к ToR коммутатору, ToR коммутатор через 10GbE подключен к ядру сети. При этом аплинков у сети 100G. Если на какой-то один из серверов пойдет атака 25G, и для этого сервера плохо настроена защита, то будет забит линк ToR коммутатора и потеряны все 40 серверов. Чтобы этого избежать в DLIM для каждого адреса прописывается лимит в 1,1G. Таким образом в момент атаки до ToR коммутатора будет доходить только 1,1G и остальные 39 серверов будут спасены. При этом в отсутствие атаки сервер сможет полностью утилизировать свой линк.

Запас сверх 1G нужен, чтобы при всплесках нагрузки из-за погрешности лимитирования не был срезан легитимный трафик. Погрешность возникает из-за особенностей подсчета и прохождения трафика по сети. 10% запас как правило избыточен, но и в контексте данного примера нет задачи сбрасывать трафик точно по границе линка сервера.

Для текущей задачи сделаем предположение, что каждому адресу в сети достаточно 100 Mbps, кроме Х.Х.Х.100/32, у которого легитимного трафика может быть до 1Gbps.

При указании порогов для X.X.X.0/24, DLIM разложит сеть по /32 занесет с одинаковыми указанными значениями пороги. Затем для X.X.X.100/32 выставляем порог отдельно.

Если пользователь подпишется на уведомления по почте, «Весточке» или через «Telegram», он будет получать сообщения о превышении порога по каждому /32, что можно использовать как дополнительный мониторинг успешных атак.

Распределение трафика по политикам защиты

Теперь нужно создать политики защиты и распределить по ним трафик.

Создадим следующие политики:

policy_DNS
policy_NTP
policy_TCP_sport 80,443
policy_X.X.X.100_HTTP_HTTPS
policy_X.X.X.100_TCP_7777
policy_X.X.X.100_UDP_8888
policy_X.X.X.100
policy_net_X.X.X.0/24

Правила маршрутизации по политикам:

1. udp sport 53 -> policy_DNS
2. udp dport 53 -> policy_DNS
3. udp sport 123 -> policy_NTP
4. tcp sport 80, 443 -> policy_TCP_sport 80,443
5. tcp dst X.X.X.100 dport 80, 443 -> policy_X.X.X.100_HTTP_HTTPS
6. tcp dst X.X.X.100 dport 7777-> policy_X.X.X.100_TCP_7777
7. udp dst X.X.X.100 dport 8888 -> policy_X.X.X.100_UDP_8888
8. dst X.X.X.100 -> policy_X.X.X.100
9. dst X.X.X.0/24 -> policy_net_X.X.X.0/24

Настройка политик защиты

Еще одной особенностью MITIGATOR является подсистема автодетектирования в политиках защиты. Автодетектирование изменяет статус контрмеры при выполнении условия (предиката), либо при выявлении аномалии после обучения. После установки Mitigator уже содержит набор предикатов. Пользователю при настройке политики защиты нужно указать пороги для необходимых предикатов.

У порогов есть имена, характеризующие предикат, например:

  • ACL.TcpPps.On — порог включения контрмеры ACL при превышении по скорости пакетов c TCP-сегментами входящих в политику защиты
  • GEO.InputBps.Off — порог выключения контрмеры GEO при уменьшении скорости в bps входящего трафика в политику защиты
  • TCP.SYNACKFactor — порог включения контрмеры TCP, если соотношение сегментов SYN к ACK больше ожидаемого.

При необходимости возможно создание собственных предикатов через файл конфигурации.

Также через web-интерфейс в рамках политики можно задать параметры автодетектирования «Число анализируемых интервалов» и «Число обнаруженных интервалов», каждый интервал 5 секунд. «Число анализируемых интервалов» — указывает на каком временном периоде смотрятся значения предикатов, а «Число обнаруженных интервалов» — указывает в скольки интервалах должно произойти срабатывание предикатов прежде, чем поменять статус контрмеры. Изменяя эти параметры, можно управлять скоростью реакции и чувствительностью детектирования.

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

policy_DNS

1. udp sport 53 -> policy_DNS
2. udp dport 53 -> policy_DNS

Правилами 1,2 мы согнали весь DNS трафик на всю сеть в одну политику. Причем как запросы, так и ответы. В политике нужно включить в режиме автодетектирования контрмеры DNS, SORB и на постоянной основе LIM.

В контрмере VAL активировать сброс пустых UDP-пакетов.

Контрмера DNS валидирует формат DNS-сообщения и отвечает на DNS-запросы. Порогом DNS.UDP.Rps указать, после какого количества DNS-запросов активировать контрмеру.

Контрмера SORB блокирует IP-адреса, с которых идет трафика больше порогов в pps, bps. Достаточно будет указать пороги SORB.Input.Bps.On для включения контрмеры и SORB.Input.Bps.Off для выключения.

Контрмера LIM лимитирует в pps, bps пропущенный политикой трафик. В LIM указать пороги DNS-трафика, больше которых не хотелось бы видеть в сети.

policy_NTP

3. udp sport 123 -> policy_NTP

Правилом 3 собрали все входящие NTP-сообщения в одну политику. В политике нужно включить автодетектирование для ACL и держать включенной все время LIM.

В контрмере VAL активировать сброс пустых UDP-пакетов.

В ACL на случай атаки NTP Amplification можно прописать сброс по размеру ответов на getmonlist (440+8+20):

drop udp len 468
pass dport 123
drop

Указать пороги автодетектирования ACL.Input.Bps.On, ACL.Input.Bps.Off для включения и выключения контрмеры ACL.

LIM. Указать пороги в pps, bps.

policy_TCP_sport 80,443

4. tcp sport 80, 443 -> policy_TCP_sport 80,443

Так как для TCP SYN-ACK Reflection часто используют публичные веб-сервера, а хосты в защищаемой сети так или иначе будут бегать в Интернет за обновлениями, то лучше такой трафик вынести в отдельную политику правилом 4.

В политике в автодетектировании ACL, TCP, SORB и на постоянной основе LIM.

В ACL правила:

drop tcp tcp-flags S/SA
drop tcp dport 0–1023

Пороги автодетектирования:

ACL.Input.Bps.On, ACL.Input.Bps.Off, ACL.Input.Pps.On, ACL.Input.Pps.Off.

В контрмере TCP:

Действие над SYN+ACK-пакетами: «Проверять сбросом с отправкой RST+ACK»; Действие над ACK-пакетами: «Проверять сбросом»; Время работы в режиме «Проверять сбросом»: 1 минута.

Пороги автодетектирования:

TCP.InputPps.On, TCP.InputPps.Off, TCP.InputBps.On, TCP.InputBps.Off, TCP.AckRate.On, TCP.AckRate.Off, TCP.SynAckRate.On, TCP.SynAckRate.Off, TCP.RstFloodFactor, Low.Pps, Low.Bps.

Так как используются предикат на базе отношений количества одних пакетов к другим (TCP.RstFloodFactor), то на маленьких скоростях отношение может сильно изменяться. Поэтому для избежания ложных срабатываний, рекомендуется устанавливать пороги скорости (.Low.), ниже которого автодетектирование не будет менять статусы контрмерам.

В контрмере SORB установить пороги в pps, bps. Включить «Заносить IP-адреса в список временной блокировки».

Пороги автодетектирования:

SORB.Input.Bps.On, SORB.Input.Bps.Off, SORB.Input.Pps.On, SORB.Input.Pps.Off.

В контрмере LIM указать пороги в pps, bps.

policy_X.X.X.100_HTTP_HTTPS

5. tcp dst X.X.X.100 dport 80, 443 -> policy_X.X.X.100_HTTP_HTTPS

Правилом 5 отводим трафик web-сервера по адресу X.X.X.100. В политике в автодетектировании включены ACL, TCP, CRB, LCON, HTTP, ATLS, SORB, и если допустимо, то GEO.

В ACL правила:

drop tcp tcp-flags SA/SA
drop tcp sport 0–1023

Пороги автодетектирования:

ACL.Input.Bps.On, ACL.Input.Bps.Off, ACL.Input.Pps.On, ACL.Input.Pps.Off.

В контрмере TCP:

Действие над SYN пакетами: «Проверять сбросом TCP-сессии»; Действие над ACK-пакетами: «Проверять».

Пороги автодетектирования:

TCP.SYNACKFactor, TCP.InputPps.On, TCP.InputPps.Off, TCP.InputBps.On, TCP.InputBps.Off, TCP.AckRate.On, TCP.AckRate.Off, TCP.RstFloodFactor, TCP.RstRate.On, TCP.RstRate.Off, Low.Pps, Low.Bps.

В контрмере CRB установить порог скорости создания новых TCP-соединений с одного адреса. Активировать добавление в список временной блокировки.

Пороги автодетектирования:

CRB.SynPps.On, CRB.SynPps.Off.

LCON. Установить порог одновременных соединений с одного адреса. Активировать блокировку адресов.

Пороги автодетектирования:

LCON.InputPps.On, LCON.InputPps.Off, LCON.InputBps.On, LCON.InputBps.Off.

HTTP. Выбрать подходящий способ проверки, например, HTML Meta Refresh. При включении автодетектирования запускается обучение, дополнительные пороги можно не задавать. Если по HTTP запросы редкие, то от ложных срабатываний рекомендуется установить HTTP.Low.Rps.

ATLS. Выбрать режим работы: активный. Другие параметры можно менять если известны особенности работы сервера, либо для фильтрации определенной атаки. При включении автодетектирования запускается обучение, дополнительные пороги по ситуации.

SORB. Установить пороги в pps, bps. Включить «Заносить IP-адреса в список временной блокировки».

Пороги автодетектирования:

SORB.Input.Bps.On, SORB.Input.Bps.Off, SORB.Input.Pps.On, SORB.Input.Pps.Off.

GEO. Если пользователи сервиса географически локализованы, и допустимо в момент атаки пожертвовать трафиком из других регионов, то можно использовать GEO c детектированием по пропущенному трафику.

Создать группу стран для которых трафик пропускать. Например, Россия, Украина, Белоруссия.

Создать одну или несколько групп стран для которых лимитировать пропуск трафика. Например, США и Канада — 10Mbps, 10Kpss, Франция и Германия — 50Mbps, 50Kpps.

Для остальных указать действие по умолчанию: «Сбрасывать».

Пороги автодетектирования:

GEO.PassBps.On, GEO.PassBps.Off, GEO.PassPps.On, GEO.PassPps.Off.

Детектирование по пропущенному трафику позволит включать GEO, когда другие контрмеры неэффективно фильтруют. Включение GEO понизит уровень пропущенного трафика, на что может сработать предикат выключения GEO, что вызовет увеличение пропущенного и включение GEO. Управлять циклом можно через указание параметров автодетектирования в политике «Число анализируемых интервалов» и «Число обнаруженных интервалов». Чем больше «Число анализируемых интервалов», тем дольше не будет выключаться контрмера после падения уровня трафика ниже порога отключения.

policy_X.X.X.100_TCP_7777

6. tcp dst X.X.X.100 dport 7777-> policy_X.X.X.100_TCP_7777

Правилом 6 выделили трафик проприетарного протокола на хосте X.X.X.100. В автодетектировании ACL, CRB, LCON, SORB, и если допустимо, то GEO. Необходимые режимы работы TCP сильно зависит от поведения клиентского приложения. Если есть возможность модифицировать клиентское приложение, то нужно встроить поддержку MCR. Если модификация невозможна, но известен протокол, то можно попробовать создать контрмеру в рамках BPF.

GEO. Аналогично политике policy_X.X.X.100_HTTP_HTTPS.

Пороги автодетектирования:

GEO.PassBps.On, GEO.PassBps.Off, GEO.PassPps.On, GEO.PassPps.Off.

В ACL правила:

drop tcp tcp-flags SA/SA
drop tcp sport 0–1023

Пороги автодетектирования:

ACL.Input.Bps.On, ACL.Input.Bps.Off, ACL.Input.Pps.On, ACL.Input.Pps.Off.

В контрмере CRB установить порог скорости создания новых tcp-соединений с одного адреса. Активировать добавление в список временной блокировки.

Пороги автодетектирования:

CRB.SynPps.On, CRB.SynPps.Off.

TCP. Нужно тестировать влияние разных режимов контрмеры TCP на клиентский трафик. Допустим, оказалось, что клиентское приложение хорошо проходит режим Действие над SYN пакетами: Проверять сбросом TCP-сессии, но сервер приложения зависает от большого всплеска пакетов на его порту. Что создает риск, что пока будет детектироваться атака, то сервер зависнет. Поэтому контрмеру нужно всегда держать включенной с режимами:

Действие над SYN пакетами: «Проверять сбросом TCP-сессии»; Действие над ACK-пакетами: «Проверять».

LCON. Установить порог одновременных соединений с одного адреса. Активировать блокировку адресов.

Пороги автодетектирования:

LCON.InputPps.On, LCON.InputPps.Off, LCON.InputBps.On, LCON.InputBps.Off.

SORB. Установить пороги в pps, bps. Включить «Заносить IP-адреса в список временной блокировки».

Пороги автодетектирования:

SORB.Input.Bps.On, SORB.Input.Bps.Off, SORB.Input.Pps.On, SORB.Input.Pps.Off.

policy_X.X.X.100_UDP_8888

7. udp dst X.X.X.100 dport 8888 -> policy_X.X.X.100_UDP_8888

Трафик еще одного критического приложения на адресе X.X.X.100 направили в политику правилом 7. Защита UDP-приложения может оказаться очень нетривиальной задачей. Поэтому рекомендуется обращаться в поддержку для обсуждения сценария защиты конкретного UDP-приложения. В Mitigator встроена специализированная защита для множества UDP-приложений, но в основном игровых. Если есть возможность модифицировать клиентское приложение, то нужно встроить поддержку MCR. Если модификация невозможна, но известен протокол, то можно попробовать создать контрмеру в рамках BPF.

В общем случае:

GEO. Аналогично другим политикам.

Пороги автодетектирования:

GEO.PassBps.On, GEO.PassBps.Off, GEO.PassPps.On, GEO.PassPps.Off.

ACL. Если известно, что клиентское приложение устанавливает соединения только с определенного порта или диапазона, то остальное можно запретить. Иначе блокируем только системные порты.

pass udp sport 8877
drop

или

drop udp sport 0–1023

VAL. Включить сброс пустых пакетов.

SORB. Установить пороги в pps, bps. Так как возможен спуфинг адресов, то контрмера может оказаться неэффективна. Добавление адресов в TBL — по ситуации.

Пороги автодетектирования:

SORB.Input.Bps.On, SORB.Input.Bps.Off, SORB.Input.Pps.On, SORB.Input.Pps.Off.

REX. Если получается шаблонизировать payload udp-пакетов, то прописать сигнатуры трафика: pass (\xDE\xAD\xBE\xEF){3,9} , остальные пакеты сбрасывать. Иначе пытаться заблокировать трафик конкретной атаки: drop badbotpayload, остальные пакеты пропускать.

LIM. В данном случае обязательно нужно указать пороги в LIM, так велика вероятность пропуска трафика атаки, что вызовет срабатывание DLIM для адреса X.X.X.100 и скажется на трафике в других политиках с этим адресом. Значение порогов указывать меньше, чем в DLIM.

policy_X.X.X.100

8. dst X.X.X.100 -> policy_X.X.X.100

Правилом 8 собираем оставшиеся трафик для хоста X.X.X.100. Контрмеры в автодетектировании TCP, SORB и постоянно ACL, LIM.

ACL. Прописать, какие еще пакеты ожидаются на этот хост. Если из Интернета на другие порты подключения не ожидаются, то сбрасывать SYN.

drop tcp tcp-flags S/SA
drop tcp dport 0–1023
drop udp dport 0–1023
pass icmp icmp-type (0 3 8 11)

TCP:

Действие над SYN+ACK-пакетами: «Проверять сбросом с отправкой RST+ACK»; Действие над ACK-пакетами: «Проверять сбросом»; Время работы в режиме «Проверять сбросом»: 1 минута.

Пороги автодетектирования:

TCP.InputPps.On, TCP.InputPps.Off, TCP.InputBps.On, TCP.InputBps.Off, TCP.AckRate.On, TCP.AckRate.Off, TCP.SynAckRate.On, TCP.SynAckRate.Off, TCP.RstFloodFactor, Low.Pps, Low.Bps.

В контрмере SORB установить пороги в pps, bps. Включить «Заносить IP-адреса в список временной блокировки».

Пороги автодетектирования:

SORB.Input.Bps.On, SORB.Input.Bps.Off, SORB.Input.Pps.On, SORB.Input.Pps.Off.

В контрмере LIM указать пороги в pps, bps.

policy_net_X.X.X.0/24

9. dst X.X.X.0/24 -> policy_net_X.X.X.0/24

Последним правилом собираем весь оставшиеся трафик сети. Нужно стараться делать так,чтобы в политике Default не было трафика. При описании очередных сервисов нужно будет добавлять правила перед этим правилом. Так как нам мало известно о трафике в этой политике, то делаем совсем грубые настройки. В автодетектировании TCP, SORB и постоянно LIM.

VAL. Активировать все доп.режимы.

TCP:

Действие над SYN пакетами: «Проверять сбросом TCP-сессии»; Действие над ACK-пакетами: «Проверять сбросом»; Время работы в режиме «Проверять сбросом»: 1 минута.

Пороги автодетектирования:

TCP.AckRate.On, TCP.AckRate.Off, TCP.SynAckRate.On, TCP.SynAckRate.Off, TCP.RstFloodFactor, TCP.SynRate.On, TCP.SynRate.Off, TCP.SYNACKFactor, TCP.Low.Pps, TCP.Low.Bps, TCP.InputPps.On, TCP.InputPps.Off, TCP.InputBps.On, TCP.InputBps.Off.

SORВ. Установить пороги в pps, bps. Включить «Заносить IP-адреса в список временной блокировки».

Пороги автодетектирования:

SORB.Input.Bps.On, SORB.Input.Bps.Off, SORB.Input.Pps.On, SORB.Input.Pps.Off.

LIM. Так как политика настроена плохо, при этом возможна атака сразу на все адреса сети,но на каждый хост может не быть превышение в DLIM, то это и может вызвать отказ позади стоящих устройств. Поэтому необходимо ограничить общий выходной трафик во внутреннюю сеть.

В контрмере LIM указать пороги в pps, bps на границе производительности стоящих позади Mitigator устройств.

Дополнительно рекомендуется в каждой политике защиты изменить значения порогов Policy.Status.DropBps, Policy.Status.DropPps, Policy.Status.InputPps, Policy.Status.InputBps. Тогда в списке политик цветовая индикация статусов политик будет более адекватной.

Также нужно настроить автоматический захват пакетов с отправкой на почту. Для этого нужно в системных настройках прописать почтовый сервер, а в карточке «Захват пакетов» задать параметры захвата, и указать пороги PCAP.* Это полезно, если атака оказалась успешной и нужно скорректировать защиту.

Заключение

В данной статье рассмотрен пример, который позволяет осветить основной подход к настройке Mitigator.

Подробные сведения о работе конкретных контрмер представлены во встроенной в Mitigator справке.

В любом сценарии внедрения в сеть при наличии возможности рекомендуется использовать BGP для направления трафика на Mitigator, даже если планируется всегда пропускать через него трафик. Такой вариант дает больше гибкости в настройке защиты и повышает отказоустойчивость.