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

IaC scanning

Облачные пробои — это обычно мисконфиг, а не эксплойт: публичный бакет, security-group, открытая на 0.0.0.0/0. Сканирование IaC читает план Terraform и роняет пайплайн до apply, поэтому плохой конфиг не доходит до облака.

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

Кто-то мёржит изменение в Terraform, чтобы добавить бакет под логи CDN. Три строки. Ревьюер бегло смотрит диф, не видит acl = "public-read", апрувит. Чего диф не показывает — это умолчание модуля: этот S3-модуль поставляется с незаблокированным публичным доступом, а на уровне аккаунта нет BlockPublicAccess. В деплой-джобе отрабатывает terraform apply, бакет становится живым, и через четыре часа его индексирует сканер-как-сервис, который ползает по облачным диапазонам в поисках открытых бакетов. Ни CVE, ни эксплойта, ни мастерства атакующего — просто умолчание, которое человеческий глаз не разглядел в дифе. Это и есть модальный облачный пробой, и ровно его ловит сканирование до apply.

К концу урока ты будешь знать, как сканирование IaC читает план Terraform, чтобы поймать облачный мисконфиг до apply, почему гейт в пайплайне лучше пост-деплой-детекта и где у этого гейта слепые зоны.

Почему угроза облака — мисконфиг, а не эксплойт

Картинка «облачного пробоя», которую носит в голове большинство инженеров, — это атакующий, выстраивающий хитрый эксплойт. Реальность скучнее и куда массовее: ресурс настроили открытым, и кто-то его нашёл. Бакет S3, чья политика разрешает Principal: "*". Security-group с 0.0.0.0/0 на порту 22 или 5432. Инстанс RDS с publicly_accessible = true. Незашифрованный том без KMS, на котором лежит PII. Ни одно из этого — не дефект софта: облако сделало ровно то, что сказал конфиг. Поэтому задача защищающегося не «патчить быстрее», а не дать неправильному конфигу вообще примениться.

Infrastructure-as-Code — это то, что делает такую профилактику возможной. Когда каждый бакет, security-group и IAM-политика объявлены в Terraform и проходят через пул-реквест, конфигурация становится ревьюируемым, тестируемым артефактом до того, как коснётся облака. Загвоздка: люди плохо читают дифы конфигов на безопасность. Опасная настройка — обычно отсутствие: пропущенный aws_s3_bucket_public_access_block, не указанный блок encryption, который падает на слабое умолчание, — а отсутствия в дифе не видны. Этот пробел и закрывает сканер: он оценивает эффективную конфигурацию, включая умолчания модулей, которых диф не показал, против библиотеки известных плохих паттернов.

Сканируй план, а не только файлы

Сканировать можно в двух местах, и разница между ними — это вся игра. Статическое сканирование исходников .tf (быстрый путь) парсит HCL и флагует очевидные плохие литералы — захардкоженный cidr_blocks = ["0.0.0.0/0"], acl = "public-read", написанный открытым текстом. Это мгновенно и не требует облачных учёток, но слепо ко всему вычисляемому: переменной, умолчанию модуля, for_each, значению, подтянутому из удалённого data-source.

Сканирование плана Terraform — зрелый ход. Ты запускаешь terraform plan -out=tfplan && terraform show -json tfplan > plan.json, затем направляешь сканер на plan.json. План — это разрешённое итоговое состояние: каждая переменная подставлена, каждый модуль развёрнут, каждое умолчание материализовано, — поэтому сканер видит бакет таким, каким он реально будет существовать, вместе с public-access-block. Именно это ловит баг из Hook: диф исходника был чистым, но у запланированного бакета нет блока публичного доступа, и план делает это видимым. Цена в том, что для получения плана нужен доступ на чтение к состоянию провайдера, поэтому он запускается чуть позже и с учётками — реальный компромисс, а не бесплатный апгрейд.

Policy-as-code: правила и есть гейт

Сканер хорош ровно настолько, насколько хороша его политика. Первый слой — встроенный набор правил вендора: tfsec, Checkov, Trivy или Terrascan поставляют сотни выверенных проверок («бакет S3 должен блокировать публичный доступ», «security-group не должна разрешать вход с 0.0.0.0/0 на порт 22», «хранилище RDS должно быть зашифровано»). Это даёт тебе базовую линию OWASP/CIS бесплатно в первый же день.

Слой, который разделяет команды, — это кастомный policy-as-code: твои собственные правила, под версионным контролем рядом с инфраструктурой, выраженные в движке политик (Rego у Open Policy Agent, кастомные проверки Checkov на Python/YAML или HashiCorp Sentinel). Здесь живут инварианты, специфичные для организации: «каждый ресурс обязан нести тег cost-center», «ни одна IAM-политика не может давать *:*», «все бакеты с данными должны использовать наш конкретный ключ KMS». Смысл policy-as-code в том, что правило само по себе — ревьюируемый, тестируемый, диффируемый артефакт: требование безопасности, закодированное один раз и применяемое на каждом PR всегда, вместо строки в вики, которую ревьюер якобы должен помнить. Это та же дисциплина shift-left, что и с мисконфигом: превращаешь то, что люди забывают, в то, что обеспечивает пайплайн.

Мисконфиг в TerraformЧем опасенЧто флагует сканФикс в HCL
Бакет S3 без public_access_blockБакет можно сделать публичным; утечка данныхHIGH — нет блока (умолчание модуля)aws_s3_bucket_public_access_block всё true
SG вход 0.0.0.0/0 → 22SSH открыт в интернет; брутфорс / сканHIGH — широко открытый входОграничь cidr_blocks до бастиона / VPN
RDS publicly_accessible = trueБаза достижима из публичного интернетаHIGH — публичная БДПоставь false; доступ через приватную подсеть
EBS / RDS без блока encryptionPII в покое не зашифрован; провал комплаенсаMEDIUM — шифрование выключеноstorage_encrypted = true + ключ KMS
IAM-политика с ”:Скомпрометированная роль = захват всего аккаунтаHIGH — wildcard-привилегияLeast-privilege: действия + ARN ресурсов
Почему это работает

Почему гейтить в пайплайне, а не просто гонять CSPM-инструмент (Cloud Security Posture Management), который сканирует живой аккаунт? Потому что CSPM обнаруживает бакет уже после того, как он стал публичным: окно между apply и следующим сканом CSPM — это реальная экспозиция, и ровно в это окно краулеры его находят. Гейт в пайплайне — это профилактика: мисконфиг отклоняется до того, как он возникнет. Эти двое не соперники — CSPM твоя страховка от дрейфа, ручных изменений в консоли и ресурсов, созданных вне Terraform, — но самый дешёвый мисконфиг для починки тот, что вообще не дошёл до облака, и только гейт до apply даёт тебе это.

Слепые зоны гейта — и где он кусается

Скан до apply необходим, но не достаточен, и зрелый инженер знает его границы. Он видит только то, чем управляет Terraform: бакет, который коллега создал руками в консоли, или настройку, изменённую вживую после apply (дрейф), для него невидимы. Он ловит известные плохие паттерны, поэтому новый мисконфиг без правила проходит чистым. И у него есть острая эксплуатационная грань — ложные срабатывания. Включи все правила на HIGH и блокируй по всем — и первая неделя превратится в стену находок на легитимных исключениях (по-настоящему публичный бакет маркетинговых ассетов, порт, открытый по дизайну). Сбой здесь — усталость от алертов: разработчики учатся лепить сплошной # tfsec:ignore на всё, и гейт становится театром. Зрелая практика — жёстко гейтить только по выверенному набору высокой важности, отправлять средние в предупреждения и требовать, чтобы каждое подавление несло встроенное обоснование и владельца, — чтобы исключение было зафиксированным решением, а не молчаливым лазом.

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

Команда добавляет сканирование IaC. Новый бакет S3 под логи проходит скан исходников, но фактически публичен, потому что умолчание модуля оставляет публичный доступ незаблокированным. Выбери подход, который надёжно ловит этот класс багов как гейт до деплоя.

Викторина

Почему зрелый инженер сканирует JSON `terraform plan`, а не только исходники `.tf`?

Викторина

Команда включает все правила на HIGH и блокирует пайплайн по всем. За неделю разработчики начинают лепить сплошные ignore-комментарии повсюду. Что пошло не так и каков зрелый фикс?

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

Упорядочь гейт сканирования IaC до apply от пул-реквеста до облака:

  1. 1 Разработчик открывает PR с изменением Terraform
  2. 2 CI запускает `terraform plan -out=tfplan`
  3. 3 Экспорт разрешённого плана в JSON (`terraform show -json`)
  4. 4 Сканер policy-as-code проверяет plan.json по встроенным + кастомным правилам
  5. 5 Провал на находках высокой важности → мёрж/apply заблокированы; проход → `apply` отрабатывает
Вспомните перед уходом
  1. 01
    Объясни, почему зрелый инженер сканирует разрешённый план Terraform, а не только исходник .tf, и чего это стоит.
  2. 02
    Что такое policy-as-code, почему гейтить в пайплайне, а не полагаться на CSPM, сканирующий живой аккаунт, и где слепые зоны гейта?
Итог

Большинство облачных пробоев — не эксплойты, а мисконфиг, который облако применило ровно как сказано: публичный бакет S3, security-group, открытая на 0.0.0.0/0 по SSH, публично доступная база, незашифрованный том с PII. Infrastructure-as-Code делает профилактику возможной, превращая каждый ресурс в ревьюируемый артефакт до того, как он коснётся облака, но люди не могут надёжно заметить опасность, потому что это обычно отсутствие — пропущенный блок публичного доступа, не выставленный флаг шифрования, — которого в дифе не видно. Сканирование IaC закрывает этот пробел: сканируй разрешённый JSON terraform plan (а не только исходник .tf, который слеп к умолчаниям модулей и вычисляемым значениям) против базовой линии вендора плюс кастомного policy-as-code и роняй пайплайн до apply, чтобы плохой конфиг не дошёл до аккаунта. Policy-as-code делает каждый инвариант организации тестируемым, диффируемым правилом, применяемым на каждом PR, вместо строки в вики, которую ревьюер должен помнить. У гейта есть границы — он видит только ресурсы под управлением Terraform, ловит только известные паттерны, а пере-гейтинг плодит усталость от алертов, превращающую его в театр, — поэтому сочетай его со страховкой CSPM от дрейфа, жёстко гейть только по выверенному набору высокой важности и делай каждое подавление владеемым, обоснованным решением. Теперь, читая трёхстрочный диф Terraform, добавляющий бакет, твой первый вопрос: что говорит план о том, как этот ресурс реально выглядит, когда разрешатся умолчания модуля?

Практика

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

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

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

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

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

Trademarks belong to their respective owners. Editorial reference only.