open atlas
↑ К треку
Безопасность облака и инфраструктуры CLOUD · 04 · 03

Детект мисконфигураций

Публичный бакет и открытый порт Postgres — два пробоя, которые случаются снова и снова. Детект находит их постфактум; превентивные ограждения делают мисконфиг структурно невозможным. Зрелый инженер строит оба и ведёт превенцией.

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

На непропорционально большую долю облачных инцидентов приходятся всего два пробоя, и оба почти комично скучны. Первый: у бакета с экспортами клиентов ACL переключают в публичный — иногда инженер делится демо-ассетом, иногда так выставлен дефолт в Terraform, который никто не прочитал, — и исследователь (или краулер) находит его по словарю имён бакетов за один вечер. Второй: ingress security-group открывает 0.0.0.0/0 на порту 5432, и управляемый Postgres, который должен общаться только с прикладным слоем, теперь отвечает всему интернету, где боты подбора учёток найдут его за часы. Ни 0-day, ни вредоноса, ни хитрой цепочки — просто конфиг, который говорит «да» там, где должен сказать «нет». Детект сообщает, что это случилось. Зрелый ход — сделать так, чтобы это не могло случиться.

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

Две экспозиции, которые реально пробивают

Мисконфигурация — это ресурс, чьё эффективное состояние выдаёт доступ, которого не должно быть, и слово «эффективное» здесь несущее. Случай публичного бакета редко сводится к одному переключателю: достижимость S3-бакета — это разрешённая сумма его ACL, политики бакета, настройки Block Public Access на уровне аккаунта и любой политики access-point поверх. Инженер может оставить политику бакета закрытой и всё равно выставить наружу каждый объект, перещёлкнув один ACL объекта, потому что самый разрешающий грант побеждает, если только явный deny или ограждение Block Public Access его не перебьёт. Вот почему «мы проверили политику, она в порядке» — это не то же самое, что «бакет приватный».

Случай открытого сервиса — та же форма на другом ресурсе. Управляемая БД, кэш Redis, внутренняя админ-панель, узел Elasticsearch — каждый должен жить за приватной подсетью или жёстким allowlist. Мисконфиг — это ingress security-group (или правило NSG, или правило файрвола) с источником 0.0.0.0/0, дотягивающийся до чувствительного порта: 5432, 3306, 6379, 9200, 27017. Ущерб не теоретический: достижимую из интернета базу находят массовые сканеры — Shodan, Censys и флот ботов подбора учёток — обычно за часы после выхода в онлайн, а не за недели. Решает окно экспозиции, а не изощрённость эксплойта.

Как на самом деле работает детект

Детект механически — это обход: принять read-only роль в каждом аккаунте, вызвать describe/list API (GetBucketPolicyStatus, GetPublicAccessBlock, DescribeSecurityGroups, DescribeNetworkAcls), разрешить эффективную экспозицию каждого ресурса и выдать находку, когда она пересекает правило. Трудная часть — не вызовы API, а корректный расчёт эффективного доступа. Наивное правило, читающее только политику бакета, упускает путь через ACL объекта; наивное правило по security-group, флагующее ingress 0.0.0.0/0, упускает, что инстанс может стоять в приватной подсети без маршрута к интернет-шлюзу, делая открытое правило безвредным — это ложноположительное срабатывание, которое, повторённое тысячу раз, приучает команду игнорировать инструмент.

Поэтому зрелый инженер считает задержку детекта ключевой метрикой. Инструмент CSPM, обходящий ресурсы раз в 24 часа, оставляет 24-часовое окно, в котором публичный бакет полностью открыт, а ты об этом не знаешь. Событийный детект — привязка событий об изменении конфигурации (CloudTrail, правила AWS Config, EventBridge) к оценке ресурса в момент его изменения — схлопывает это окно с часов до секунд. Но даже секунды — это окно, а окно — это шанс. Что приводит к настоящему уроку.

Превенция бьёт детект

Детект отвечает на «совершил ли кто-то эту ошибку?» постфактум. Превентивный контроль — ограждение — отвечает «эту ошибку нельзя совершить» до факта. Канонический пример — Block Public Access для S3 на уровне аккаунта: с ним никакая политика бакета, ACL или грант объекта не сделают ни один бакет публичным, точка. Вызов API, который создал бы публичный грант, отклоняется. Окна экспозиции нет, потому что «публично» никогда не было достижимым состоянием. Сравни с правилом детекта, которое находит публичные бакеты, и раннбуком, который их закрывает: подход на детекте имеет окно, зависит от того, прочтёт ли кто-то алерт, и срабатывает снова каждый раз, когда новый инженер делает ту же ошибку.

Механизм, делающий превенцию масштабируемой по всей организации, — это политика-ограждение, навязанная над аккаунтом: AWS Service Control Policies (SCP) на уровне Organization, Azure Policy с эффектом deny или ограничения GCP Organization Policy. Они оцениваются до создания или изменения ресурса и отклоняют действие напрямую — s3:PutBucketPublicAccessBlock, который отключил бы блок; правило ingress с 0.0.0.0/0 на порту БД; назначение публичного IP инстансу базы. Ограждение на уровне организации нельзя обойти инженеру с admin в отдельном аккаунте — ровно то свойство, которого детекту не хватает.

СлойКогда действуетКонтроль публичного бакетаКонтроль открытого сервисаОкно?
Превентивное ограждение (орг)До применения измененияSCP запрещает отключать Block Public AccessSCP запрещает 0.0.0.0/0 на портах БДНет
Гейт IaC / пайплайнаНа plan / до applyPolicy-as-code (OPA, Checkov) валит planСкан plan отклоняет открытый ingressИзменения в консоли проскальзывают
Событийный детектСекунды после измененияConfig-правило срабатывает на смену ACLПравило срабатывает на мутацию SGСекунды
Периодический обход CSPMЧасы / раз в суткиОбход эффективного доступа находит егоМежаккаунтный скан находит егоЧасы — сутки
Почему это работает

Почему бы не включить орг-ограждение везде и не отказаться от детекта совсем? Потому что превентивные контроли грубы, а легитимные исключения существуют — публичный бакет статического сайта, origin для CDN, намеренно смотрящий в интернет сервис за WAF. Сплошной SCP, запрещающий все публичные бакеты, ломает их, поэтому команды вырезают исключения, а исключения — это места, где прячется дрейф. Детект — страховочная сетка, ловящая то, что проскользнуло через путь-исключение или слой, который ты забыл оградить. Зрелая позиция — эшелонированная защита: превенция как основной контроль, детект как подстраховка, исходящая из того, что у превенции есть дыра, — никогда одно вместо другого.

Как зрелый инженер выстраивает контроли по порядку

Перед лицом «у нас постоянно появляются публичные бакеты» рефлекс джуна — купить сканер и написать раннбук. Рефлекс зрелого инженера — спросить, почему это состояние вообще достижимо, и продвинуть контроль настолько влево и настолько вверх, насколько он дотянется: орг-ограждение, запрещающее опасное действие, затем гейт IaC, чтобы ошибка падала на ревью с привязанным владельцем кода, затем событийный детект для консольных путей, которых гейт не видит, затем периодический обход как финальная подстраховка для всего, что верхние слои упустили. Каждый нижний слой существует лишь чтобы ловить сбои слоя над ним. Детект сам по себе никогда не ответ — это признание, что превенция несовершенна, развёрнутое осознанно как сетка, а не как пол.

Выбери лучший вариант

Бакет с PII клиентов постоянно переключают в публичный инженеры, делящиеся демо-ассетами. Данные никогда не должны быть публичными. Выбери контроль, который реально закрывает дыру.

Викторина

Почему расчёт «эффективного доступа» — трудная часть детекта публичного бакета, а не просто чтение политики бакета?

Викторина

Postgres, достижимый из интернета на `0.0.0.0/0:5432`, создан через консоль в 14:00. Твой CSPM обходит раз в сутки в 02:00. В чём реальный риск и устойчивый фикс?

Расставь шаги по порядку

Упорядочь контроли мисконфигурации от действующего раньше всех (наибольшее плечо) к действующему последним (финальная подстраховка):

  1. 1 Орг-превентивное ограждение (SCP / Org Policy) — запрещает опасное действие до его применения
  2. 2 Гейт IaC / пайплайна (policy-as-code) — валит plan на ревью, с владельцем кода
  3. 3 Событийный детект — срабатывает за секунды после изменения в консоли/SDK, которого гейт не видит
  4. 4 Периодический обход CSPM — суточный межаккаунтный скан как финальная подстраховка
Вспомните перед уходом
  1. 01
    Пройди по тому, как ты бы обнаруживал публичный S3-бакет в масштабе, и объясни, почему «эффективный доступ» делает наивный детект ненадёжным.
  2. 02
    Почему зрелый инженер ведёт превентивными ограждениями вместо детекта для проблемы публичного бакета и открытого сервиса, и как здесь выглядит эшелонированная защита?
Итог

Два облачных пробоя, которые продолжают случаться, скучны намеренно: бакет хранилища, переключённый в публичный, и база или админ-сервис, выставленные на 0.0.0.0/0. Оба решаются окном экспозиции, а не мастерством эксплойта — открытый порт базы массовые сканеры находят за часы, а публичный бакет краулер по словарю — за один вечер. Обнаружение их в масштабе — это read-only обход, который обязан разрешить эффективный доступ (ACL плюс политика плюс Block Public Access плюс политика access-point), потому что проверка по одному слою даёт ложноотрицательные срабатывания, скрывающие живую экспозицию. Но детект всегда периодичен и потому запаздывает, бежа наперегонки с атакующим через окно экспозиции. Зрелый ход — сделать плохое состояние недостижимым: вести орг-уровневыми превентивными ограждениями — Block Public Access, SCP, запрещающими 0.0.0.0/0 на портах баз, — которые отклоняют изменение до его применения и не обходятся админом аккаунта, затем наслаивать гейты IaC, событийный детект и периодический обход как подстраховки. Превенция — пол; детект — сетка, которую ты разворачиваешь, зная, что у пола есть прорехи. Так что когда кто-то говорит «у нас постоянно публичные бакеты», твой первый вопрос не «какой сканер» — а «почему публичность всё ещё достижимое состояние и какое ограждение делает её недостижимой?»

Практика

Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.

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

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

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

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

Trademarks belong to their respective owners. Editorial reference only.