linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • База знаний
  • Шпаргалка
  • Capstone
  • Собеседование
home/terraform/lessons/tf-garden-04-policy-violation

lesson ── terraform-garden ── ~18 мин ── 4 шагов

Troubleshooting Garden: Checkov fail в pipeline

Pipeline упал на Checkov. Сообщение: «CKV_AWS_53: Ensure S3 bucket has block public ACLs enabled» «CKV_AWS_21: Ensure all data stored in the S3 bucket have versioning enabled»

Реальные нарушения, не false-positive, public-access-block отключён, и versioning suspended. Но ресурс называется public_assets, и продукт-овнер сказал «это реально публичный ассет-сервер, нам нужен публичный доступ».

Реши: суппрессить с обоснованием или починить, и в любом случае не фейкать линтер «add comment to suppress».

▶ интерактивный sandbox

Поднимется пара контейнеров: terraform 1.9 и localstack 3.8 в одной сети. В браузере откроется терминал, можно сразу terraform init. Каждый шаг проверяется автоматически. TTL 45 минут, без регистрации.

запустить sandbox →

stack ── terraform · localstack · 1 GB RAM · самоуничтожается через 45 мин простоя

Шаги

  1. 01

    Запусти Checkov, поймай нарушения

    bash
    cd /home/student/tf-garden
    checkov -d . --quiet --compact 2>&1 | tee /tmp/checkov.log || true

    В логе должны быть строки про CKV_AWS_53 (block public acls) и CKV_AWS_21 (versioning). Сейчас оба check'а, FAILED.

    Это не баг линтера: HCL действительно выставил block_public_acls = false и status = "Suspended".

    ✓ Нарушения подтверждены. Теперь, решение.

  2. 02

    Versioning: чинить, не суппрессить

    Versioning Suspended, это почти всегда ошибка. Даже для публичного ассет-сервера: версии помогают восстановить случайно удалённое. Чиним:

    hcl
    resource "aws_s3_bucket_versioning" "public_assets" {
      bucket = aws_s3_bucket.public_assets.id
      versioning_configuration {
        status = "Enabled"
      }
    }

    Замени блок в main.tf. Можно sed'ом:

    bash
    sed -i 's/status\s*=\s*"Suspended"/status = "Enabled"/' main.tf

    ✓ Versioning включён. Это правило больше не упадёт.

  3. 03

    Public access: суппрессить с обоснованием

    Тут продукт-овнер прав, бакет для публичных ассетов, public-access нужен. Но просто #checkov:skip=CKV_AWS_53 без причины, плохо. Пишем с обоснованием:

    Замени блок aws_s3_bucket_public_access_block на:

    hcl
    # checkov:skip=CKV_AWS_53: bucket serves public marketing assets; public-access required by product
    # checkov:skip=CKV_AWS_54: same reason, public ACLs intentional for assets
    # checkov:skip=CKV_AWS_55: see above
    # checkov:skip=CKV_AWS_56: see above
    resource "aws_s3_bucket_public_access_block" "public_assets" {
      bucket                  = aws_s3_bucket.public_assets.id
      block_public_acls       = false
      block_public_policy     = false
      ignore_public_acls      = false
      restrict_public_buckets = false
    }

    Это явный sign-off: «знаю что делаю, потому что X». Следующий ревьювер прочитает, и либо согласится, либо переоткроет обсуждение по существу.

    подсказка

    Обоснование в комментарии важнее самого skip'а. Без причины, это «техдолг с зелёным CI», что хуже чем красный CI.

    ✓ Suppression с причиной поставлен. Это уже не cheat.

  4. 04

    Прогон Checkov: оставшиеся issues, только обоснованные

    bash
    checkov -d . --quiet --compact 2>&1 | tee /tmp/checkov2.log || true

    Раньше: 2 FAILED, теперь, 0 (или те же check'и помечены как SKIPPED, с твоим комментарием). CI станет зелёным.

    Если ты сделал что-то третье, суппрессишь CKV_AWS_21 (versioning), то это уже cheat: правило про versioning релевантно даже для публичного бакета. Перепроверь шаг про versioning.

    ✓ Pipeline чистый. Линтер тих, ресурс безопасен на сколько контекст позволяет.

    То же самое на OpenTofu

    Checkov и Trivy работают с plan.json и HCL, обе утилиты провайдер-агностичны. OpenTofu plan валиден для них так же как Terraform plan. Совет в реальном CI, гонять оба, потому что они находят разный набор issues. См. tf-opentofu-parity и tf-checkov.

    • → Checkov
    • → OpenTofu parity
    • → Policy as code

Что ты узнал

Когда сканер ругается, варианта три. Починить (если правило по делу), суппрессить (если ресурс правда исключение), чинить иначе (если правило формально право, но контекст другой). Голый skip без причины четвёртый, и он не вариант.

команды

  • checkov -d . --quietзапустить только failed checks; --quiet убирает шум passed
  • checkov -d . --check CKV_AWS_21точечная проверка одним check ID
  • checkov -d . --download-external-modules true --framework terraform_plan -f plan.jsonсканировать plan.json вместо HCL, точнее, нет ложных срабатываний на data

концепции

  • · Suppress только с причиной в комментарии, это для следующего ревьювера
  • · Versioning Suspended вместо Enabled, почти всегда ошибка; реально публичный, норм
  • · block_public_acls=false легитимен только для bucket, который должен быть публичным

← предыдущий

State: что внутри файла terraform.tfstate

следующий →

dynamic блоки: повторяющиеся подблоки

Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки