open atlas
↑ К треку
Основы безопасности SECF · 04 · 03

Сегментация и файрволы

Один скомпрометированный веб-сервер не должен дотягиваться до твоей базы, хранилища секретов и CI-раннера. Сегментация, файрволы, security groups и микросегментация — это то, как ограничивают радиус поражения, и место, где плоские сети тихо рушатся.

SECF Middle ◷ 15 min
Уровень
ОсновыJuniorMiddleSenior

Атакующий захватывает один из твоих веб-серверов через уязвимый эндпоинт загрузки картинок. В плоской сети этот единственный плацдарм — уже вся партия: с этого хоста он может открыть 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. 1 Периметровый файрвол — north-south, граница подсети/зоны, 5-кортеж
  2. 2 Security group — уровень-к-уровню, на уровне инстанса, на основе идентичности
  3. 3 Микросегментация / NetworkPolicy — east-west, на ворклоад, на основе меток
Вспомните перед уходом
  1. 01
    Объясни, что такое радиус поражения, почему плоская сеть его максимизирует и как трёхуровневая сегментация его сжимает.
  2. 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-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 6 завершено
Связанные уроки

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

Примени это

Примени этот урок в реальном проекте.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.