Пришла в голову мысль сделать на маршрутизаторе Cisco некое подобие известного пакета fail2ban, используя средства только самого маршрутизатора.
Работает это так. В списке доступа, прикреплённом к интерфейсу граничного интернет-маршрутизатора, создаются правила-ловушки. Когда правило срабатывает, в лог записывается событие. Каждая строка такого события содержит специальную метку, чтобы их легче было отобрать. Лог анализируется, и все попавшие в ловушку IP адреса заносятся в специальную объектную группу. Эту группу можно использовать в том же списке доступа, чтобы забанить доступ злоумышленникам уже ко всем IP адресам и портам нашей сети.
Для понимания этой статьи нужно знать, что такое списки доступа (access lists), и для чего они нужны, а также знать, как использовать в списках доступа объектные группы (object-group).
Ловушки в списке доступа
Например, напишем правило для входящего списка доступа, под которое попадают все попытки залезть из интернета на телнет порт наших устройств. Обратите внимание, что в конце правила, проставляется уникальная метка «HONEYPOT001». По ней потом мы будем искать срабатывания в логе.
ip access-list extended acl-WAN-In
…
deny tcp any any eq telnet log HONEYPOT001
…
Важно правильно выбрать критерии для ловушек.
Попытки подключиться извне по 23-му порту (телнет), пожалуй, самые распространенные. В этом случае, объектная группа моментально будет заполнена IP адресами ботов со всего интернета, а память, выделяемая под списки доступа, просто закончится.
Можно отлавливать попытки подключиться к вашему оборудованию по 22-му порту (ssh). Их на порядок меньше, чем по телнету. Можно отлавливать попытки обращения к какому-либо одному вашему устройству.
Большое количество ботов лезет на порт 7547, пытаясь подключиться по протоколу CPE WAN Management.
Ещё одним вариантом будет отлавливать попытки использования Smart Install Client, включенного на порту 4786.
Также, можно сделать ловушку на 80-м порту, выбрав IP адрес, на котором у вас нет web-сервера. Тут главное, чтобы в неё не попались роботы поисковиков.
Вот пример ловушки на IP адресе [192.0.2.10].
ip access-list extended acl-WAN-In
…
deny tcp any host 192.0.2.10 eq www log HONEYPOT002
…
Анализ лога
Логирование на маршрутизаторе, разумеется, должно быть заранее включено, тогда в лог попадает, что-то вроде этого:
225435: Jan 11 08:57:13.838: %SEC-6-IPACCESSLOGP: list acl-WAN-In denied tcp 123.199.32.7(59472) -> 192.0.2.9(23), 1 packet [HONEYPOT001]
Мы видим, что с внешнего IP адреса [123.199.32.7] пошла попытка обращения на 23-й порт нашего IP адреса [192.0.2.9]. Метка «HONEYPOT001» в строке тоже присутствует. Кстати, [123.199.32.7] — реальный пойманный во время написания статьи злоумышленник.
Для разбора лога будем использовать Embedded Event Manager (EEM) – инструмент автоматизации задач и настройки поведения программного обеспечения, встроенный в Cisco IOS.
В конфигурационном режиме маршрутизатора создадим апплет, который анализирует лог и, при нахождении в строке лога метки «HONEYPOT001», вырезает IP адрес злоумышленника и добавляет этот адрес в объектную группу hosts BlackList.
event manager applet honeypot
event syslog occurs 1 pattern "HONEYPOT001"
action 100 regexp "([0-9]+.[0-9]+.[0-9]+.[0-9]+)" "$_syslog_msg" result IP_address
action 200 if $_regexp_result eq "1"
action 210 cli command "enable"
action 220 cli command "conf t"
action 230 cli command "object-group network hosts-BlackList"
action 240 cli command "h $IP_address"
action 250 cli command "end"
action 260 syslog msg "IP address $IP_address added to blacklist"
action 270 end
action 300 cli command "exit"
- когда в логе встречается очередная строка с меткой «HONEYPOT001», происходит событие;
- в самом обработчике события из строки лога по шаблону «([0-9]+.[0-9]+.[0-9]+.[0-9]+)» вырезается IP адрес атакующего, и присваивается переменной IP_address (action 100);
- если адрес успешно вырезан, и никаких проблем с разбором строки не случилось (action 200), то выполняются консольные команды, добавляющие IP адрес в объектную группу (action 210 – 250);
- в лог делается запись о сработке ловушки (action 260).
Блокировка доступа
Первое, что приходит в голову – это использовать объектную группу для полной блокировки злоумышленников ко всем ресурсам нашей сети.
Правило блокировки должно находиться в списке доступа выше правила с ловушкой, чтобы забаненный IP адрес не попадался в ловушку снова и снова.
ip access-list extended acl-WAN-In
…
deny ip object-group hosts-BlackList any
…
deny tcp any any eq telnet log HONEYPOT001
…
Амнистия
Рано или поздно, объектная группа превысит все допустимые размеры, поэтому придется делать амнистию вычищая из нее старые IP адреса. Для этого напишем апплет, который будет это делать, например, один раз в неделю в полночь в воскресенье.
На пути написания нам встретятся два подводных камня.
Нельзя удалить объектную группу, которая используется в списке доступа. Поэтому сначала нужно выяснить номер строки списка доступа, в котором используется группа. В нашем примере это строка 60. Этот номер будем использовать, чтобы удалить строчку с группой из списка доступа, а потом вернуть назад на прежнее место.
Нельзя создать пустую объектную группу. Поэтому сразу при создании группы мы добавим в нее IP адрес [255.255.255.255]. Этот адрес никогда не пересылается маршрутизаторами, соединяющими локальную сеть с другими сетями, поэтому мы не ожидаем соединений с него.
event manager applet DeleteBlackList
event timer cron name timer-cron1 cron-entry "@weekly"
action 100 cli command "enable"
action 200 cli command "conf t"
action 210 cli command "ip access-list ext acl-WAN-In"
action 215 cli command "no 60"
action 220 cli command "exit"
action 225 cli command "no object-group net hosts-BlackList"
action 230 cli command "object-group net hosts-BlackList "
action 240 cli command "host 255.255.255.255"
action 245 cli command "exit"
action 250 cli command "ip access-list ext acl-WAN-In"
action 255 cli command "60 deny ip object-group hosts-BlackList any"
action 260 cli command "exit"
action 265 cli command "end"
action 300 syslog msg "Completed"
action 400 cli command "exit"
- удаляем из списка доступа правило с объектной группой. (action 210 – 220);
- удаляем саму группу (action 225);
- создаем объектную группу заново, и вставляем в нее широковещательный IP адрес. (action 230 – 245);
- возвращаем в список доступа правило на старое место. (action 250 – 260).
Что делать, если не поддерживаются метки в списке доступа
Многие IOS-ы, несмотря на то, что функция «ACL Syslog Correlation» в них заявлена, не разрешают помечать метками строки списков доступа.
В этом случае можно воспользоваться так называемыми сгенерированными хэш-значениями. (device-generated hash value), которые будут добавляться в строки сообщений лога.
Если же IOS-не поддерживает оба варианта, тогда придется немного усложнить разбор.
Модифицируем правило с ловушкой в списке доступа. Вместо «log» будем использовать «log-input».
ip access-list extended acl-WAN-In
…
deny tcp any any eq telnet log-input
…
В этом случае в лог будет дополнительно попадать информация о названии физического интерфейса и, возможно, об MAC адресе маршрутизатора-соседа, переславшего пакет.
Например, в лог попадает вот такое сообщение:
Jan 11 00:20:23 172.25.100.43 2394768: Jan 10 20:20:22.808: %FMANFP-6-IPACCESSLOGP: SIP1: fman_fp_image: list acl-WAN-In denied tcp 123.199.32.7(7537) Port-channel1.88-> 192.0.2.9(23), 1 packet
Тогда правило активации события примет вот такой вид:
event syslog occurs 1 pattern "Port-channel1.88-> 192.0.2."
Что почитать
Про однозначную идентификацию правил, сгенерировавших сообщение в лог:
ACL Syslog Correlation
Про Embedded Event Manager:
Embedded Event Manager Configuration Guide
Автор: YakovlevAndrey