Hari 27: AI Review Terraform, Bukan Sekadar Scanner
4 min read

Hari 27: AI Review Terraform, Bukan Sekadar Scanner

Terraform sudah 0 findings di scanner, tapi AI nemuin 6 hal yang scanner nggak cover: variable validation, IAM tightening, S3 lifecycle, outputs, dan parameterization.

devsecops
terraform
ai
iac-security
cis-benchmark
well-architected
Share

Scanner Bilang Aman, AI Bilang Belum

Day 23 kita fix semua Checkov + Trivy IaC findings sampai 0. Pipeline hijau. Scanner bilang aman. Tapi apakah 0 findings di scanner berarti Terraform itu production-ready?

Ternyata nggak. Scanner cek rule-based: apakah S3 di-encrypt? Apakah SG nggak open ke 0.0.0.0/0? Apakah IAM role ada? Tapi scanner nggak cek:

  • Apakah variable environment cuma accept dev, staging, prod?
  • Apakah IAM trust policy bisa di-confuse dari account lain?
  • Apakah S3 versioning bikin versi lama menumpuk tanpa cleanup?
  • Apakah ada outputs.tf untuk visibility resource attributes?

Itu yang AI review tangkap hari ini.

Apa yang AI Temukan (6 Improvements)

1. Variable Validation — Shift-Left untuk Configuration

Tanpa validation, typo di environment = "devv" akan propagate ke semua resource tags. Dengan validation, error ketangkap saat terraform plan — sebelum resource dibuat.

variable "environment" {
  validation {
    condition     = contains(["dev", "staging", "prod"], var.environment)
    error_message = "environment must be one of: dev, staging, prod."
  }
}

6 variables yang ditambahin validation: aws_region, replication_region, environment, instance_type, kms_deletion_window, log_retention_days. Semua punya format atau range validation.

2. IAM Trust Policy Tightening

Trust policy sebelumnya cuma: Principal: { Service: "s3.amazonaws.com" }. Tanpa Condition, S3 dari ANY account bisa assume role tersebut. Ini namanya confused deputy attack — service dari account lain nyamar jadi service yang di-trust.

Fix: tambah Condition: aws:SourceAccount ke 3 trust policies (flow log, EC2, replication). Sekarang hanya service dari account yang sama yang bisa assume.

3. S3 Non-Current Version Lifecycle

Versioning aktif = setiap update bikin version baru. Tanpa noncurrent_version_transition, versi lama menumpuk permanent di S3 — cost membengkak.

noncurrent_version_transition {
  noncurrent_days = 30
  storage_class   = "STANDARD_IA"
}
noncurrent_version_transition {
  noncurrent_days = 90
  storage_class   = "GLACIER"
}
noncurrent_version_expiration {
  noncurrent_days = 365
}

Move versi lama: STANDARD → STANDARD_IA (30 hari) → GLACIER (90 hari) → expire (365 hari).

4. Outputs — Documentation Bukan Boilerplate

12 outputs: VPC ID, S3 bucket names+ARNs, KMS key ARN+alias, security group ID, subnet ID, flow log group, SNS topic ARN. Tanpa outputs, harus cek AWS console atau terraform show setiap mau tau resource attributes. Dengan outputs, terraform output langsung kasih jawaban.

5. Parameterization — KMS + CloudWatch

Sebelumnya KMS deletion_window_in_days = 30 dan CloudWatch retention_in_days = 365 di-hardcode di resource. Sekarang jadi variable dengan validation range. Tim bisa override di terraform.tfvars tanpa edit resource block.

6. Subnet prevent_destroy

Subnet nggak punya prevent_destroy lifecycle. Kalau seseorang terraform destroy, subnet hilang tanpa peringatan. Tambah prevent_destroy = true.

Hasil Akhir

  • Checkov: 102 passed, 0 failed, 10 skipped — sama dengan sebelumnya
  • Trivy IaC: 0 findings (MEDIUM+) — sama dengan sebelumnya
  • Pipeline Infrastructure Security: SUCCESS (29 detik)
  • Pipeline SecureBank CI: SUCCESS (4 menit 28 detik)

Scanner count nggak berubah — yang berubah adalah kualitas Terraform yang scanner nggak bisa lihat.

Pelajaran yang Didapat

1. Scanner = rule-based, AI = context-aware. Cekov ngecek "apakah S3 di-encrypt?" (ya/tidak). AI ngecek "apakah variable validation ada?" (best practice, bukan rule). Scanner cek technical compliance, AI cek operational maturity.

2. Confused deputy attack itu nyata. AWS pernah publish advisory tentang ini (CVE-2021-20246). Tanpa aws:SourceAccount di trust policy, service dari account lain bisa assume role. Scanner nggak nemuin ini — perlu AI atau manual review.

3. KMS deletion window max 30 hari. Awalnya mau set 90 hari untuk "production safety". Ternyata AWS limit adalah 7-30. Kalau set 90, terraform apply akan fail. Variable validation membantu catch ini saat terraform plan.

4. S3 lifecycle itu cost optimization, bukan security. Tapi Well-Architected Framework nggak cuma soal security — juga soal cost. Non-current version lifecycle mencegah cost membengkak dari versioning yang aktif.

5. Outputs itu self-documenting. Tim baru yang baca Terraform config bisa langsung paham resource apa yang dibikin dari outputs.tf. Nggak perlu trace semua .tf file untuk cari VPC ID atau bucket ARN.

Kesimpulan

Day 27 selesai. Terraform sudah 0 scanner findings sejak Day 23, tapi hari ini AI review nemuin 6 improvements yang scanner nggak cover. Variable validation, IAM tightening, S3 lifecycle, outputs, parameterization, dan prevent_destroy.

Key insight: 0 scanner findings bukan berarti production-ready. Scanner cek rule compliance, bukan best practice. AI review menambah lapisan quality yang rule-based scanner nggak bisa berikan.

Besok Day 28: Compliance as Code dengan Chef InSpec — test infrastruktur yang sedang berjalan, bukan Terraform yang belum di-apply. Sampai jumpa besok!


Repo: https://github.com/stayrelevantid/chalange-devsecops

Enjoyed this article? Share it!

Share

Diskusi & Komentar

Artikel Terkait