В статье описаны методы определения и динамической защиты, а также реализация мониторинга SYN-flood атак по SNMP с помощью инструментария Cacti. Материал является частичным переводом документации с официального сайта разработчика метода и содержит, помимо всего остального, дополнения для корректной работы в системе.
Принцип динамической защиты заключается в подстройке параметров систем Linux и FreeBSD для работы с TCP в зависимости от величины очереди на SYN. В процессе работы по cron’у или периодическому запуску пуллером из Cacti скрипт проверяет значение очереди и регулирует подстроечные параметры ядра для снижения порога.
Установка и настройка сводится к следующему:
- Скачать архив с исполняемым скриптом и файлом конфигурации synflood-defender
- Распаковать архив в систему и изменить путь внутри sh-файла на валидный
- Внести изменения в файл snmpd.conf (с аналогичной адаптацией)
# Synflood-Defender extension extend synflooddefender /change/this/programpath/synflood-defender.sh
- Перечитать и перезапустить SNMP daemon. Это приведет к добавлению в дерево MIB нового OID, позже используемого Cacti:
NET-SNMP-EXTEND-MIB::nsExtendOutLine."synflooddefender".1
- Скачать темплейты для Cacti по ссылке выше (Tarball) и импортировать их в веб-приложение
- Добавить сбор данных для устройства:
- перейти Console » Management » Data Sources
- нажать Add в правом верхнем углу
- выбрать Selected Data Template: Synflood-Defender
- выбрать устройство в поле Host
- подтвердить выбор кнопкой Create
- Создать график:
- перейти Console » Management » Graph Management
- нажать Add в правом верхнем углу
- выбрать Selected Graph Template: Synflood-Defender
- указать устройство в поле Host
- после нажатия Create указать Data Source: Synflood-Defender
В процессе развертывания комплекса на системе под управлением Linux Ubuntu в логи Cacti повалили ошибки:
07/01/2013 10:25:02 PM - CMDPHP: Poller[0] Host[1] DS[55] WARNING: Result from SNMP not valid. Partial Result: U 07/01/2013 10:25:02 PM - CMDPHP: Poller[0] WARNING: SNMP Get Timeout for Host:'127.0.0.1', and OID:'NET-SNMP-EXTEND-MIB::nsExtendOutLine."synflooddefender".1'
При это скрипт работал исправно при запуске вручную из консоли. Попытка получения данных посредством snmp запроса выдала ошибку:
# snmpwalk -v2c -c public localhost NET-SNMP-EXTEND-MIB NET-SNMP-EXTEND-MIB: Unknown Object Identifier (Sub-id not found: (top) -> NET-SNMP-EXTEND-MIB)
Это означало, что в системе не хватает определений MIB. Решение тривиальное — доустановить их:
apt-get install snmp-mibs-dowloader
Ссылки: