Firewalls As Routers

Sep. 4th, 2026 10:18 am
cat_mucius: (Default)
[personal profile] cat_mucius
Одной из самых глупых и при этом долгоиграющих вещей, что я сделал за свою сетевую карьеру, было решение использовать файерволлы в качестве раутеров. Не повторяйте моих ошибок, друзья мои.

Допустить такую ошибку очень легко, поскольку любой файерволл и впрямь умеет быть раутером, поддерживая весь джентельменский набор - динамические протоколы, туннели, NAT, VRRP, DHCP и так далее. Иногда даже и VRF. Поэтому очень подкупает идея им и обойтись: зачем усложнять и платить больше - и деньгами, и временем-усилиями настраивать-поддерживать дополнительные компоненты?

Но обратите внимание, что в любом большом облаке - AWS, Azure, GCP - функции раутинга и фильтрации трафика строго разнесены. VPN Gateway - раутинг и туннелирование, NSG и Azure Firewall - фильтрация, и так далее. Это не случайно.

Раутер - животина простая, stateless. Принял пакет, нашёл наилучший маршрут, послал, забыл.

Файерволл же stateful. Он отслеживает сессии, ему принципиально, чтобы трафик тёк через него симметрично, в обе стороны. Если ответный пакет приходит на не ту ногу или зону, с которой был послан оригинальный, или и вовсе приходит на другой файерволл - он будет выкинут.

Более того, стандартной фичей файерволлов является RPF (Reverse Path Forwarding) - ещё до того, как приложить к пакету список правил, они смотрят, соответствует ли нога, на которую он пришёл, сети, с которой ожидается трафик на эту ногу. Если пакет с src=192.168.1.11 приходит на port2, но наилучший маршрут на этот адрес - это 192.168.1.0 через port1, то пакет опять же постигнет горькая судьбина. Смысл этого дела - anti-spoofing, борьба с попытками выдавать свои запросы за чужие.

(Там два варианта, на самом деле: более строгий, когда проверяется лишь оптимальный маршрут, попавший в таблицу - и более либеральный, когда и соответствие отвергнутому окей, лищь бы он был. В этом примере, если соседский раутер на port2 объявил, что 192.168.1.0 через него доступен - то файерволл может пакеты с этой сети и от него принять, хотя в обратную сторону пошлёт через port1).

Поэтому файерволл в качестве раутера вполне приемлем, если топология проста и статична, для любого трафика существует однозначный и симметричный путь в обе стороны. Если же есть возможность, что запрос пойдёт путём А, а ответ вернётся путём Б - в результате нормальной операции ли, в результате падения какого-то линка или компонента ли - схема должна быть пересмотрена. Иначе начинается невероятный трэш и мучительные попытки поддерживать симметрию костылями - и чем сложнее топология, тем они мучительнее, тем сложнее удержать схему в голове, тем проще налажать.

Файерволл должен сидеть на входе к ресурсам, которые он защищает, и гонять трафик по очень простой и неизменной схеме. Соединением сетей по топологии более сложной, чем звезда, должен заниматься отдельный слой из раутеров - включая туннелирование.

P.S. Пара не самых страшных, но всё же неприятных последствий, про которые не очень думаешь заранее:

- Невозможность представлять свою сеть соседям как единую AS (автономную систему) и использовать iBGP. Потому что если твои файерволлы представляются соседям с тем же номером AS - то вероятность того, что получив пакет от файерволла А сосед ответит через файерволл Б резко возрастает. Приходится каждый файерволл определять как AS саму по себе - что в определённых вариантах приводит опять же к асимметрии.

- Если у нас файерволлы в кластере, то использование туннелей и динамических протоколов раутинга увеличивает время введения запасного в дело. Если основной рухнул, перезагрузился и т.п. - пока запасной наладит IPsec, пока договорится со соседями по OSPF - время-то идёт. И в результате переключение вместо нескольких секунд занимает минуту - а поломаться за это время может многое.

Поэтому если рассудок и жизнь дороги вам...
cat_mucius: (Default)
[personal profile] cat_mucius
Благодаря посту Лео Каганова, узнал две очень интересные вещи:

1. Задумывались ли вы когда-либо, можно ли ограничить Certificate Authority выпуском сертификатов лишь для определённых доменов? это ведь довольно-таки напрашивается. Я вот задумывался, но был чересчур ленив, чтоб проверить. А оказывается, это уже с 2008-ого года часть стандарта RFC5280, пусть и очень редко используемая на практике - есть такой атрибут NameConstraints, который можно всобачить в сертификат CA - и браузеры будут его проверять. Если этот CA выпишет сертификат на вебсайт или, скажем, на адрес e-mail с доменом, который в этом атрибуте не указан - то при проверке это всплывёт и сертификат будет отвергнут.

2. Оказывается, российское правительство заставляет компании и, опосредствованно, их пользователей переходить на сертификаты, восходящие к единственному государственному корню - "Russian Trusted Root CA". Вот, скажем, сайт Сбербанка: https://sberbank.com, https://sberbank.ru.

Yandex browser уже распространяется с сертификатами этих гос-CA.

Таким образом, люди оказываются перед выбором: либо получать ошибки TLS от российских сайтов (а браузеры сегодня уже не позволяют их легко проигнорировать), либо рисковать перехватом своего трафика: имея на руках ключ от CA, которому пользователи вынуждены доверять (и, который, само собой, не ограничен никакими NameConstraints), ФСБ и подобные конторы с лёгкостью сгенерируют сертификат на любой сайт в мире на ходу, прямо в процессе запроса. Любой продвинутый современный файерволл умеет это делать.

И вот кто-то на Хабре предложил очень интересное, хоть и неидеальное решение:
- пересоздать корневой гос-CA как подчинённый CA своего собственного root CA - для этого надо просто взять из его публичного файла пару полей. Эта техника известна как cross-signing.
- пересоздать его с этими самыми NameConstraints, дав ему право удостоверять лишь российские домены - .ru, .su и .рф.
- установить и свой root CA, и новоявленный sub-CA, как доверяемые в браузер (конечно, не в яндексов).

Таким образом, при обращении на https://sberbank.ru произойдёт следующее:
1. браузер получит сертификат сайта (от самого сайта или от гос-перехватчика - непринципиально);
2. найдёт подписавший его CA в списке доверенных, проверит, помимо дат и прочих стандартных проверок, его NameConstraints, убедится, что имя www.sberbank.ru соответствует разрешённому домену .ru;
3. примет сайтов сертификат, установит соединение, покажет содержание сайта без ошибок и предупреждений.

А вот если при обращении на https://facebook.com браузер получает сертификат, подписанный Russian Trusted Sub CA или Russian Trusted Root CA - значит, сертификат сайта подделан перехватчиком (поскольку Фейсбук у этих CA заказывать сертификаты вряд ли будет). И тогда проверка провалится на 2-м шаге и браузер покажет предупреждение.

Таким образом, от перехвата трафика российских сайтов, где б они не находились, эта техника не защищает - а от перехвата зарубежных таки да.




Начал думать, для каких ещё целей можно применить cross-signing. Скажем, если есть какая-то очень high-security сеть, которая тем не менее нуждается в доступе к определённым интернет-сервисам - можно делать подобное переподписывание для того, чтобы компьютеры в ней доверяли единственному (местному) CA, а все публичные были бы ограничены лишь необходимыми целями.

Если надо обращаться на https://webservice.co.il и у него есть сертификат от GlobalSign - можно переподписать сертификат от GlobalSign так, чтобы его NameConstraints позволяли лишь webservice.co.il. Причём:
- это можно делать на ходу, на файерволле;
- заранее установленного доверия к GlobalSign на клиентских компьютерах не требуется;
- и что интересно: в отличие от стандартного TLS interception это не требует реального перехвата! он возможен, но опционален. Не нужно подделывать сертификат вебсайта. Если это, скажем, сайт банка - админ не суёт нос в чувствительный трафик. Если соединение требует и клиентского сертификата (то, что называется mutual TLS) - то оно может состояться, в то время как перехват его убьёт.
- и если нужно, скажем, отменить доверие к GlobalSign - это можно сделать в одной точке, на файерволле, ничего не меняя на хостах в сети.

Ещё пример: допустим, есть партнёрская компания, какая-нибудь Acme Corporation, сотрудники которой посылают нам мейлы, подписанные сертификатами от их какого-нибудь AcmePrivateEmailCA. Наши компьютеры этому их частному CA, вестимо, не доверяют, Outlook ругается на непроверяемую подпись. И мы оказываемся перед выбором - либо так и оставить, либо добавить AcmePrivateEmailCA в список доверенных. Если мы это сделаем совсем беспечно - то это позволит компьютерам и https-соединения открывать на сайты, подписанные сертификатами от AcmePrivateEmailCA (чего мы вовсе не намеревались позволять), и получать почту от любых других доменов.

А cross-signing эту проблему решает. Переподписываем AcmePrivateEmailCA как наследника нашего OurDearRootCA, указываем ему:
nameConstraints = critical, permitted;email:acme.com

Распространяем переподписанный AcmePrivateEmailCA на компьютеры и вуаля. Мейл от vasya@acme.com будет принят без предупреждений; мейл от vasya@gmail.com - с предупреждением о недоверенной подписи; https-соединение на вебсайт, заверенное этим CA - провалится.

Идеи? Критика?

July 2011

S M T W T F S
     12
3456789
10111213141516
17181920212223
2425 262728 2930
31      

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 8th, 2026 03:22 am
Powered by Dreamwidth Studios