Сегментация и файрволы
Один скомпрометированный веб-сервер не должен дотягиваться до твоей базы, хранилища секретов и CI-раннера. Сегментация, файрволы, security groups и микросегментация — это то, как ограничивают радиус поражения, и место, где плоские сети тихо рушатся.
Атакующий захватывает один из твоих веб-серверов через уязвимый эндпоинт загрузки картинок. В плоской сети этот единственный плацдарм — уже вся партия: с этого хоста он может открыть TCP-соединение к базе на 5432, к внутренней админ-панели на 8080, к sidecar с секретами, к CI-раннеру, который держит деплой-токен, и к любому другому сервису в VPC — потому что между ними никто и никогда не сказал «нет». Веб-серверу никогда и не требовалось говорить с CI-раннером, но сеть это позволяла, поэтому атакующий наследует всё, до чего веб-сервер может дотянуться. Пробой был на одном хосте, а потеря — на весь дата-центр. Сегментация — это дисциплина, которая делает эти два числа разными.
К концу урока ты сможешь ограничивать радиус поражения скомпрометированного хоста, проводя границы зон и удерживая их файрволами, security groups и микросегментацией.
Радиус поражения: число, которое сегментация реально двигает
Начни с допущения, от которого зрелый инженер не отказывается: что-то будет скомпрометировано. CVE в зависимости, утёкшие учётки, SSRF, разворачивающийся внутрь, — рано или поздно один хост станет хостом атакующего. Остаётся единственный вопрос: как далеко дотянется этот плацдарм. Эта достижимая поверхность и есть радиус поражения (blast radius), и сегментация существует именно для того, чтобы его сокращать.
Плоская сеть — одна большая подсеть, где каждый хост может набрать любой другой по любому порту, — максимизирует радиус поражения по построению. Компрометация любого узла равна достижимости всех остальных. Ровно эта структура превращает локализованный баг веб-уровня в разгул латерального движения: пробой Target 2013 года начался с учёток, украденных у подрядчика по вентиляции, и дотянулся до сети точек продаж, потому что сегменты, которые должны были отделять доступ подрядчика от систем обработки карт, не были обеспечены. Урок обобщается: латеральное движение возможно только по путям, которые сеть разрешает, поэтому защита — разрешать меньше путей.
Сегментация режет это плоское пространство на зоны с контролируемыми переходами. Классический трёхуровневый разрез — web / app / data: веб-уровень принимает трафик из интернета на 443, app-уровень принимает трафик только от веб-уровня, а data-уровень принимает трафик только от app-уровня. Теперь скомпрометированный веб-сервер дотягивается до app-уровня по одному порту — не до базы, не до хранилища секретов, не до CI. Атакующему придётся найти вторую уязвимость на каждой границе, чтобы двигаться дальше, и каждая граница — это место, где ты можешь его обнаружить и остановить.
Слои обеспечения: файрволы, security groups, микросегментация
Граница зоны настолько реальна, насколько реальна штука, которая её обеспечивает. Работу делают три слоя на трёх разных уровнях гранулярности.
Сетевой файрвол стоит на границе подсети или периметра и фильтрует трафик по 5-кортежу (source IP, destination IP, source port, destination port, протокол). Несогласуемая позиция — default-deny: набор правил начинает с того, что отбрасывает всё, и ты явно разрешаешь только те потоки, которых требует архитектура. Файрвол с default-allow и парой блокирующих правил — это решето: он открывается в тот миг, когда появляется новый сервис, под который никто не написал блокирующее правило. Default-deny отказывает закрыто: поток, который никто не разрешил, просто не происходит.
Security groups (облачный нативный примитив — у AWS, GCP, Azure есть эквивалент) опускают этот фильтр до уровня инстанса и делают его на основе идентичности, а не IP. Вместо «allow 10.0.2.0/24 → 5432» ты пишешь «allow source-группа app-sg → группа db-sg на 5432». Правило ссылается на роли, а не на адреса, поэтому переживает автоскейлинг и смену IP, и оно stateful: разрешаешь входящий запрос — ответ пропускается автоматически. Security groups по своей природе deny-by-default: инстанс без входящего правила не принимает ничего.
Микросегментация доводит это до предела: политика на ворклоад, часто на сервис или под, обеспечиваемая независимо от того, где он запущен. В Kubernetes это NetworkPolicy (или authorization-политика service mesh), которая говорит: поды с меткой app=checkout могут принимать трафик только от подов с меткой app=gateway на 8080, а по умолчанию в namespace с любой политикой — запрет всего остального. Это структурное ядро zero trust (NIST SP 800-207): сетевое расположение запроса не даёт ему ничего, каждый поток авторизуется по собственной идентичности. Микросегментация — это то, что сжимает east-west радиус поражения с «весь namespace» до «единственный сосед, с которым этот сервис законно говорит».
| Слой | Гранулярность | Селектор | Какой радиус ограничивает |
|---|---|---|---|
| Сетевой файрвол | Подсеть / периметр | 5-кортеж (IP, порт, протокол) | North-south, зона-в-зону |
| Security group | Инстанс | Source-группа / идентичность | Уровень-к-уровню, переживает смену IP |
| Микросегментация | Ворклоад / под | Метка / идентичность сервиса | East-west, под-к-поду |
Эшелонированная защита и где сегментация перестаёт помогать
Сегментация — это один слой эшелонированной защиты (defense in depth), а не вся защита. Она контролирует, кто до кого может дотянуться; она не проверяет, что они присылают, будучи допущенными. Если app-уровню разрешено запрашивать базу, а в приложении есть SQL-инъекция, файрвол пропустит вредоносный запрос насквозь — 5-кортеж в allowlist. Поэтому сегментацию надо сочетать с контролями на следующем слое внутрь (параметризованные запросы, аутентификация/авторизация на сервисе, валидация ввода) и слоем выше (WAF, TLS). Смысл эшелона в том, что отказ ни одного отдельного контроля не должен быть концом игры.
Две честные издержки не дают этому быть бесплатным. Операционная тяга: мелкозернистая политика — это масса правил, а правила дрейфуют: устаревший allow, который никто не убрал, становится ровно тем путём, который использует атакующий. Дисциплина — держать политику как код, ревьюить её и проверять на неиспользуемые allow. Сбой плохого исполнения: пересегментируй без хорошей наблюдаемости — и получишь загадочные аварии, где законный поток молча отброшен, команда не может отличить ошибку конфигурации от атаки и — хуже всего — под давлением кто-то «чинит» это, добавляя правило allow all, которое тихо снова уплощает сеть, которую ты сегментировал квартал.
▸Почему это работает
Почему в облаке предпочитают security groups на основе идентичности, а не правила файрвола на основе IP? Потому что IP там эфемерны. Автоскейлинг, отзыв spot-инстансов и rolling-деплои постоянно перерабатывают инстансы, поэтому правило, прибитое к IP (allow 10.0.2.37 → 5432), либо неверно в течение часа, либо настолько широко (allow 10.0.2.0/24), что заново создаёт плоскую зону внутри «сегментированной». Ссылка на source security group привязывает правило к роли, а не к адресу, поэтому оно остаётся верным, пока инстансы приходят и уходят, — и читается как намерение («app может дотянуться до db»), а не как CIDR-головоломка, которую будущему инженеру придётся реверсить.
Как читать политику по-зрелому
Когда ты ревьюишь дизайн сегментации, на самом деле ты задаёшь два вопроса. Первый: это default-deny? Если базовая линия — allow-с-исключениями, дизайн уже проигран: найди неявное правило any-any — и ты нашёл истинную достижимость всей сети. Второй: до чего дотягивается одна компрометация? Возьми самый открытый узел (уровень, смотрящий в интернет), считай его захваченным и проследи каждый поток, который ему разрешено сделать. Это множество и есть твой радиус поражения. Если в него входят база, хранилище секретов или CI — у тебя есть пути латерального движения, которые надо отрезать.
Твоё трёхуровневое приложение работает в облачном VPC с автоскейлингом на каждом уровне. Нужно, чтобы app-уровень дотягивался до базы на 5432 и больше ничего туда не дотягивалось. Выбери правило, которое лучше всего ограничивает радиус поражения.
Файрвол настроен как default-allow с горсткой явных блокирующих правил. Почему это неверная позиция для границы зоны?
В твоём Kubernetes namespace есть NetworkPolicy, разрешающая `app=gateway` → `app=checkout` на 8080. В поде checkout — баг удалённого выполнения кода, и под скомпрометирован. Что даёт здесь микросегментация?
Упорядочь эти области обеспечения от самой широкой (грубейшая сегментация) к самой узкой (тончайшая), как ты бы слоил их в эшелонированной защите:
- 1 Периметровый файрвол — north-south, граница подсети/зоны, 5-кортеж
- 2 Security group — уровень-к-уровню, на уровне инстанса, на основе идентичности
- 3 Микросегментация / NetworkPolicy — east-west, на ворклоад, на основе меток
- 01Объясни, что такое радиус поражения, почему плоская сеть его максимизирует и как трёхуровневая сегментация его сжимает.
- 02Сравни сетевые файрволы, security groups и микросегментацию и объясни, почему каждый default-deny и почему правила на основе идентичности лучше IP-правил в облаке.
Сегментация исходит из зрелого допущения, что какой-то хост будет скомпрометирован, и её задача — ограничить радиус поражения, то есть множество систем, до которых этот плацдарм может дотянуться. Плоская сеть максимизирует радиус поражения, потому что каждый хост может набрать любой другой; разрез сети на зоны web/app/data с контролируемыми переходами означает, что скомпрометированный веб-сервер дотягивается до одного порта в app-уровень, а не до базы, хранилища секретов или CI. Границы обеспечиваются на трёх уровнях гранулярности, все default-deny: сетевые файрволы фильтруют north-south по 5-кортежу на периметре, security groups опускают фильтр на основе идентичности и stateful до инстанса (правильный примитив в облаке, где IP меняются), а микросегментация применяет политику на ворклоад под-к-поду — структурное ядро zero trust, где расположение не даёт доверия. Сегментация — один слой эшелонированной защиты: она контролирует, кто до кого дотягивается, а не что присылают, будучи допущенными, поэтому её надо сочетать с контролями на уровне приложения, а её реальные издержки — дрейф политики и аварии от пересегментации без наблюдаемости. Когда читаешь дизайн, спрашивай две вещи: это default-deny и до чего реально дотягивается одна компрометация?
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.
Примени это
Примени этот урок в реальном проекте.