lesson ── terraform-garden ── ~18 мин ── 4 шагов
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 минут, без регистрации.
stack ── terraform · localstack · 1 GB RAM · самоуничтожается через 45 мин простоя
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".
✓ Нарушения подтверждены. Теперь, решение.
Versioning Suspended, это почти всегда ошибка. Даже для публичного ассет-сервера: версии помогают восстановить случайно удалённое. Чиним:
resource "aws_s3_bucket_versioning" "public_assets" {bucket = aws_s3_bucket.public_assets.id
versioning_configuration {status = "Enabled"
}
}
Замени блок в main.tf. Можно sed'ом:
sed -i 's/status\s*=\s*"Suspended"/status = "Enabled"/' main.tf
✓ Versioning включён. Это правило больше не упадёт.
Тут продукт-овнер прав, бакет для публичных ассетов, public-access
нужен. Но просто #checkov:skip=CKV_AWS_53 без причины, плохо.
Пишем с обоснованием:
Замени блок aws_s3_bucket_public_access_block на:
# 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.
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 чистый. Линтер тих, ресурс безопасен на сколько контекст позволяет.
Checkov и Trivy работают с plan.json и HCL, обе утилиты провайдер-агностичны. OpenTofu plan валиден для них так же как Terraform plan. Совет в реальном CI, гонять оба, потому что они находят разный набор issues. См. tf-opentofu-parity и tf-checkov.
Когда сканер ругается, варианта три. Починить (если правило по делу), суппрессить (если ресурс правда исключение), чинить иначе (если правило формально право, но контекст другой). Голый skip без причины четвёртый, и он не вариант.
команды
checkov -d . --quietзапустить только failed checks; --quiet убирает шум passedcheckov -d . --check CKV_AWS_21точечная проверка одним check IDcheckov -d . --download-external-modules true --framework terraform_plan -f plan.jsonсканировать plan.json вместо HCL, точнее, нет ложных срабатываний на dataконцепции