Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
В вопросах именно сетевой безопасности функционально выделяются два компонента:
IDS - Intrusion Detection System, система обнаружения вторжений, компонент, который обнаруживает сам факт злонамеренного сетевого вторжения. Это может быть выделенная система типа DPI (Deep Packet Inspection), пропускающая через себя трафик, анализатор статистики NetFlow или же эта функция может быть встроена в приложение, ну или реализована как анализатор логов (fail2ban).
IPS - Intrusion Prevention System, система предотвращения вторжений, компонент, блокирующий злоумышленнику сетевой доступ к атакуемому приложения. Реализована эта система может быть как встроенная в приложение функция, настраиваемый пакетный фильтр на хосте, как фаерволл на периметре защищаемого сегмента сети или же обычный сетевой маршрутизатор с BGP. Вот про этот вариант сегодня и поговорим.
Все маршрутизаторы имеют возможность устанавливать пакетные фильтры - наборы правил, в соответствии с которыми фильтруется проходящий трафик. Эти наборы правил обычно приходится вносить в конфигурацию маршрутизатора в виде ACL (access control list), а затем применять на интерфейсах, что не очень оперативно на самом деле и не очень хорошо поддается автоматизации. Нужно же эти списки распространить по всей сети. Так же следует учитывать, что размеры ACL обычно ограничены возможностями маршрутизатора.
Эти проблемы давно известны, и на самом деле в жизни для оперативного предотвращения вторжений используется чуть-чуть другой подход - блекхолинг (интересно, можно ли сейчас на англоязычных ресурсах применять этот термин?). Для всей провайдерской сети выбирается один "проклятый" адрес, из числа немаршрутизируемых сетей, например, из сети 198.18.0.0/15 или даже 192.0.0.0/24 - 192.0.0.0/32. Далее на каждом роутере в сети маршрут на этот хост заворачивается в Null, а затем маршруты на адреса злоумышленников объявляются в сеть с nexthop как раз 192.0.0.0 ну и, разумеется, с community no-export. Маршруты распространяются по всей сети по протоколу BGP - и готово, трафик НА адреса злоумышленников будет уничтожен на первом же маршрутизаторе.
И вот тут Вы имеете полное право воскликнуть "Ну а что толку? Мне же нужно заблокировать трафик ОТ злоумышленника!". Но толк будет. Даже если не применять опцию unicast reverse path forwarding check, которая "занулит" так же и трафик ОТ злоумышленника, "ломатель" не сможет получать ответы от жертв, что не позволит провести сложные типы атак. Он перестанет быть "ломателем", а будет в лучшем случае DOS-ером.
Если же у Вас стоят маршрутизаторы с поддержкой BGP address family flow, то все концептуально упрощается - эта address family как раз и предназначена для распространения ACL по сети. А в этих ACL можно запретить трафик ОТ адреса злоумышленника и все будет работать самым правильным образом. Но увы, не все это умеют.
Таким образом, для обеспечения IPS нужно просто обеспечить передачу адресов злодеев в виде ACL (или маршрутов) по сети. Это делается легко и непринужденно, если у Вас на сети развернуто решение наподобие Arbor Peakflow SP, и тогда дальше можно не читать.
А вот если нет, если хочется обеспечить такой IPS на основе информации из логов сетевых устройств, nginx, sshd, snort, suricata и т.п., то думаю тут может помочь ban2bgp.
Это приложение продолжает тему полезных мелочей для админа с BGP на Rust (BGPExplorer).
ban2bgp позволяет обеспечить временный бан указанных через http rest api адресов в виде анонсов по BGP flow acl и/или blackhole routes. В контрибе есть пример настройки для fail2ban - злодей после попытки взлома Вашего сервера или попыток логинов на сетевые устройства может быть отключен на часик не только от одного устройства, но и от всей Вашей сети.
Для установки проще взять исходники с гитхаба, предполагается что уже есть git и rust.
$ git clone https://github.com/wladwm/ban2bgp
$ cd ban2bgp
$ cargo build
Настроим BGP route-reflector (считаем что RR имеет адрес 10.0.0.1, наша AS 65535, машина с ban2bgp имеет адрес 10.1.1.1):
conf t
ip route 192.0.0.0 255.255.255.255 Null0
router bgp 65535
neighbor 10.1.1.1 remote-as 65535
neighbor 10.1.1.1 update-source Loopback0
neighbor 10.1.1.1 transport connection-mode passive
address-family ipv4
neighbor 10.1.1.1 activate
neighbor 10.1.1.1 route-reflector-client
end
Создадим ini с настройками ban2bgp:
$ cat > ban2bgp.ini <<EOF
[main]
httplisten=127.0.0.1:8080
listen=0.0.0.0:1179
nexthop=192.0.0.0
communities=666:666
peers=10.0.0.1 AS65535
duration=3600
skiplist=10.0.0.0/24
EOF
$
И запустим
$ cargo run
Теперь попробуем забанить 198.18.0.1 на час:
curl "http://127.0.0.1:8080/api/add?net=198.18.0.1&dur=3600"
Проверяем на RR:
#show route 198.18.0.1
Routing entry for 198.18.0.1/32
Known via "bgp 65535", distance 200, metric 0, type internal
Routing Descriptor Blocks
192.0.0.0, from 10.1.1.1
По истечении времени бана маршрут будет отозван автоматически.
Для отдачи команд ban2bgp с других хостов его http rest api разумеется нужно спроксировать или запустить не на 127.0.0.1.
Параметры ban2bgp.ini:
httplisten - адрес и порт для запуска http rest api, по умолчанию 0.0.0.0:8080
listen - необязательный адрес с портом для прослушивания для входящих подключений BGP. По умолчанию 0.0.0.0:179. Разумеется, если порт <1024, то нужно быть рутом.
nexthop - ipv4 nexthop для блокирующих маршрутов. На всех роутерах нужно статически завернуть в Null.
nexthop6 - ipv6 nexthop для блокирующих маршрутов. На всех роутерах нужно статически завернуть в Null.
communities - разделенный пробелами список community для маршрутов.
peers - разделенный запятыми список пиров BGP, формат пира <ip> AS<n>.
duration - длительность бана по умолчанию в секундах.
skiplist - разделенный запятыми список сетей, которые банить нельзя, защита от ошибок.
Список эндпоинтов http rest api:
/api/add?net=198.18.0.0/32&dur=3600 добавить бан, net - ipv4/ipv6 маршрут для добавления, dur - время бана в секундах
/api/remove?net=198.18.0.0/32 удалить бан
/api/json блочная операция, в POST нужно отправить JSON со списком операций, например: {"add":{"duration":86400,"nets":["33.3.3.3"]},"remove":["11.1.1.1","22.2.2.2"]}
/api/ping Проверка доступности, отвечает "pong"
/api/dumprib Возвращает список блокируемых адресов