
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.
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
environmentcuma acceptdev,staging,prod? - Apakah IAM trust policy bisa di-confuse dari account lain?
- Apakah S3 versioning bikin versi lama menumpuk tanpa cleanup?
- Apakah ada
outputs.tfuntuk 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!
Diskusi & Komentar
Artikel Terkait
Hari 5: Trivy SCA Scan Nemukan 4 CVE di Golang API
Hari kelima 60 hari DevSecOps! Scan dependensi Go pakai Trivy dan nemukan 4 CVE termasuk 1 CRITICAL — termasuk library deprecated jwt-go.
Hari 8: Semgrep SAST Scan Temukan Kode Tidak Aman
Hari kedelapan 60 hari DevSecOps! Install Semgrep, buat kode insecure (MD5), dan scan ketemu 2 finding — MD5 weak hash dan HTTP server tanpa TLS.
Hari 10: MD5 ke Bcrypt, Pipeline Hijau Lagi
Hari kesepuluh 60 hari DevSecOps! Fix SAST findings — ganti MD5 ke bcrypt, hapus custom rule HTTP TLS, dan pipeline CI kembali hijau setelah 4 job semua pass.