Глазами "защитника": как мы участвовали в Positive Hack Days CityF "Противостояние".
Часть 6. Нестандартный метод защиты SSH С частью 5 (описание хода сражения) можно ознакомиться постом ранее .
- Почему нам нельзя перенастраивать сетевое оборудование, если мы его защищать должны? Без этого никак.
- А, вы телеком-защитники. Тогда вам можно, но сервисы должны быть доступны и чтобы не терялось управление. Иначе мы подойдем к вам и спросим: "Что за дела?". Если не сможете быстро починить - вернем к настройкам до начала соревнований, а вам выставим штрафные баллы. Поэтому с изменением сетевых настроек будьте аккуратны.
- Это не проблема. А если для обеспечения безопасности нам нужно будет развернуть трафик по-другому, завязать узлом, но при этом все будет работать?
- Тогда мы придем к вам с бумажкой - записать, что и как вы делали, интересно ведь.
- А зачем ты на Positive Hack Days решил Balabit использовать? Чем он там поможет?
- Будем админов мониторить. Они обещали периодически на серверах взводить дырявые сервисы.
- Ну, как знаешь.
Это два реальных разговора при подготовке к PHDays. До определенного момента я сам не думал, что они будут настолько плотно взаимосвязаны. Естественно, после разговора с организаторами я подумывал, что надо бы и удивить, раз грозился. По ходу соревнований вектор настроения потихоньку сдвинулся от первоначального желания в сторону "забетонироваться". Но чудесным образом получилось так, что в итоге они слились. И об этом пойдет рассказ.
Как я уже писал в части 5 , и говорил на сцене PHDays, довольно интересное и нестандартное у нас получилось решение по защите уязвимых серверов Unix, управляемых по SSH.
Напомню, сама по себе архитектура упрощенно выглядела следующим образом:
Но, как упоминалось в части 4 и части 5 , использовать ACL на firewall с правилом default deny нам не разрешили организаторы. Поэтому изначально из псевдоинтернета трафик шел к серверам DMZ по всем протоколам и портам. Но в этой статье речь пойдет о SSH.
Сервера, которые нам поставили в DMZ, практически все были уязвимы к CVE-2015-5600, что означало отсутствие защиты от перебора паролей и перегруза CPU. Совмещаем эти 2 условия - и получаем идеальную для хакеров ситуацию: "Не подберу - так хоть завалю". При этом, начиная с вечера первого дня, сервера появлялись, как тараканы в общаге. SSH был дырявый везде. Обновления, содержащие фикс к указанной уязвимости, были далеко не во всех репозитариях. То есть, зайти единоразово на все линукса разных версий и втоптать пару команд, чтобы дальше оно само - не вариант. Только сырцы, только хардкор. Лень - двигатель прогресса. Возможно, человек, плотнее в повседневной жизни работающий с Open Source решениями и Unix, пошел бы в сторону реализации своего репозитария либо еще как, но во мне в 3 часа ночи проснулся архитектор.
Я вспомнил об одиноко стоящем Balabit SCB, который, несмотря на игнор первого дня, исправно крутился и жрал некоторые ресурсы вычислительной инфраструктуры организаторов. Поскольку я настраивал еще самую первую инсталляцию Balabit в СНГ, не считая остальных в течение нескольких лет, мысль попробовать пустить через него SSH смотрится вполне закономерно.
Настроив пару проксирующих правил на Balabit, я его просканировал. Модуль проброса SSH zorp-ssh оказался неуязвимым к CVE-2015-5600, равно как и к другим, известным на тот день сканеру MaxPatrol, уязвимостям. Теперь осталось придумать, как разделить трафик таким образом, чтобы SSH к серверам в DMZ балабитизировался, а остальные протоколы шли своим обычным путем.
Рассмотрим на примере SSH, но таким же образом можно поступить и с RDP, и с Telnet, и с VNC, и с ICA (правда, чуть попотеть).
По задумке, реализованной в схеме сети, к серверам из DMZ хакеры попадали по всем протоколам и портам, проходя через пограничный firewall.
Поскольку как пограничный firewall использовался не ACL на роутере, а CheckPoint, стандартные для firewall фичи типа NAT можно было настраивать во всю мощь. Как firewall, защищающий сервера "ЦОД" - Cisco ASAv.Чтобы не запутать в сетевых терминологиях и реализации NAT двух разных производителей, опишу вендорнезависимую концепцию, применимую на оборудовании любых производителей, поддерживающих такую технологию.
Для заворота трафика SSH на Balabit можно пойти такими путями:
1. Выделенные порты для серверов.
- Выделить диапазон портов на Balabit.
- Реализовать динамический NAT many-to-one на пограничном CheckPoint таким образом, чтобы пакеты, прилетающие из псевдоинтернета в направлении серверов DMZ на порт SSH, транслировались в пакет, где src ip подменяется на IP CheckPoint, dst ip - на IP Balabit, dst port - на выделенный для этого сервера порт на Balabit.
Packet: | SRC IP | DST IP | PROTO/PORT |
Original | ANY | DMZ_srv1 | TCP/22 |
Translated | CheckPoint_ip | Balabit_ip | TCP/port1 |
Original | ANY | DMZ_srv2 | TCP/22 |
Translated | CheckPoint_ip | Balabit_ip | TCP/port2 |
Original | ANY | DMZ_srv3 | TCP/22 |
Translated | CheckPoint_ip | Balabit_ip | TCP/port3 |
Original | ANY | DMZ_srv4 | TCP/22 |
Translated | CheckPoint_ip | Balabit_ip | TCP/port4 |
- Открыть доступ для этих TCP-сессий на вход в Firewall ЦОД:
Packet: | SRC IP | DST IP | PROTO/PORT |
To_Balabit | CheckPoint_ip | Balabit_ip | TCP/port1-port4 |
- Настроить правила проксирования на Balabit с возвратом на нужный сервер, порт 22 (SSH):
Packet: | SRC IP | DST IP | PROTO/PORT |
Original | CheckPoint_ip | Balabit_ip | TCP/port1 |
Translated(proxied) | Balabit_ip | DMZ_srv1 | TCP/22 |
Original | CheckPoint_ip | Balabit_ip | TCP/port2 |
Translated(proxied) | Balabit_ip | DMZ_srv2 | TCP/22 |
Original | CheckPoint_ip | Balabit_ip | TCP/port3 |
Translated(proxied) | Balabit_ip | DMZ_srv3 | TCP/22 |
Original | CheckPoint_ip | Balabit_ip | TCP/port4 |
Translated(proxied) | Balabit_ip | DMZ_srv4 | TCP/22 |
- Разрешить выход таких пакетов с Balabit в сторону DMZ на обоих firewall:
Packet: | SRC IP | DST IP | PROTO/PORT |
From_Balabit | Balabit_ip | DMZ_subnet | TCP/22 |
Готово. SSH-сессия функционально не нарушена, другой трафик не задет, условия игры соблюдены.
2. Выделенный пул адресов.
- Выделить в ЦОД подсеть той же размерности, что и DMZ.
- Поместить в нее интерфейс Balabit, принимающий трафик.
- Настроить маршрутизацию.
- Сконфигурировать Balabit с IP-адресами той же подсети.
- Реализовать статический NAT one-to-one на пограничном firewall:
Packet: | SRC IP | DST IP | PROTO/PORT |
Original | ANY | DMZ_subnet | TCP/22 |
Translated | CheckPoint_ip | Balabit_subnet | TCP/22 |
Можно, конечно, и не прятать SRC IP за адрес CheckPoint, но тогда необходимо, чтобы DMZ строился на серых адресах. На «противостоянии» DMZ строили на "белых"…
- Разрешить входящий трафик на Firewall ЦОД:
Packet: | SRC IP | DST IP | PROTO/PORT |
To_Balabit | CheckPoint_ip | Balabit_subnet | TCP/22 |
- Настроить правила проксирования на Balabit:
Packet: | SRC IP | DST IP | PROTO/PORT |
Original | CheckPoint_ip | Balabit_ip1 | TCP/22 |
Translated(proxied) | Balabit_ip0 | DMZ_srv1 | TCP/22 |
Original | CheckPoint_ip | Balabit_ip2 | TCP/22 |
Translated(proxied) | Balabit_ip0 | DMZ_srv2 | TCP/22 |
Original | CheckPoint_ip | Balabit_ip3 | TCP/22 |
Translated(proxied) | Balabit_ip0 | DMZ_srv3 | TCP/22 |
Original | CheckPoint_ip | Balabit_ip2 | TCP/22 |
Translated(proxied) | Balabit_ip0 | DMZ_srv2 | TCP/22 |
- и разрешение на обоих firewall:
Packet: | SRC IP | DST IP | PROTO/PORT |
From_Balabit | Balabit_ip0 | DMZ_subnet | TCP/22 |
где Balabit_ip0 - адрес Balabit, сконфигурированный на интерфейсе как основной, а не IP alias (Balabit_ip1...4). Можно, конечно, настроить так, чтобы src ip был Balabit_ip1...4, но в ситуации на PHDays это было лишним.
===
В обоих случаях, чтобы иметь возможность пускать определенные подсети на сервера DMZ мимо Balabit, необходимо на пограничном firewall перед описанными правилами поставить такое:
Packet: | SRC IP | DST IP | PROTO/PORT |
Original | TRUSTED_NET | DMZ_subnet | IP/ANY |
Translated | TRUSTED_NET | DMZ_subnet | IP/ANY |
Видно, что подобное решение немного напрягает при масштабировании его на большое количество серверов. Нельзя сделать "настроил и забыл" для всей подсети одной строкой. Дополнительные затраты времени вызывает необходимость:
В случае 1 - добавления правила для каждого нового сервера DMZ и на Balabit, и на firewall.
В случае 2 - разработка сетевого дизайна и настройка сети (единоразово), а также добавление нового правила на Balabit для каждого сервера DMZ.
То есть, в обоих случаях - настраивать Balabit для каждого сервера. Задача, по сути, не громоздкая, занимает 5-10 минут, и при статичности жизни сервера вполне терпима, но если все часто течет и меняется...
Оба этих ограничения связаны с тем, что сеть с точки зрения L3 была плоской, с одной таблицей маршрутизации. Есть решение, которое помогло бы прозрачно балабитизировать всю подсеть одним махом, а там хоть каждую секунду добавляйте-удаляйте сервера в подсети. Но для этого потребуется единоразово настроить MPLS L3VPN либо vrf lite на активном сетевом оборудовании (если поддерживает) и аккуратно соединить с его помощью Balabit и пограничный firewall.
Но это уже тема для совсем отдельной статьи...
Вижу немой вопрос в глазах читателей: а как же ты настроил на PHDays?
Ответ: по варианту №1 – выделенные порты.