Hari 23: 0 Finding, Pipeline IaC Hijau
5 min read

Hari 23: 0 Finding, Pipeline IaC Hijau

Dari 29 IaC findings ke 0 dalam satu hari. Fix KMS policy, S3 encryption, SG egress, dan temukan kalau Trivy ignore comment bukan seperti Checkov.

devsecops
terraform
checkov
trivy
iac-security
ci-cd
Share

Intro — 29 Findings, Satu Hari, Nol Sisa

Hari 20 kita bikin Terraform config dengan sengaja dibikin rentan — 15 Checkov failures. Hari 21 Trivy IaC nemuin 14 findings. Hari 22 masukin ke pipeline, pipeline merah. Hari ini, hari ke-23: fix semuanya.

Targetnya jelas: 0 failed di Checkov, 0 findings (MEDIUM+) di Trivy IaC, pipeline hijau.

Perjalanannya nggak cuma copy-paste skip comments. Ada tembok yang bikin bentar kepala pusing.

Apa yang Dikerjakan

Dari satu file main.tf yang penuh misconfiguration, jadi 8 file Terraform yang masing-masing punya tugas spesifik:

s3.tf — hardening untuk 3 S3 bucket: KMS encryption, versioning, public access block, access logging, cross-region replication, event notifications, lifecycle configuration.

network.tf — security group yang dibikin restriktif (port 443 dan 8080, hanya dari VPC), default SG dikunci total, CloudWatch log group dengan retensi 365 hari dan KMS-encrypted, VPC flow log.

compute.tf — subnet tanpa public IP, IAM instance profile, dummy EC2 instance dengan metadata options, encrypted EBS, monitoring aktif.

iam.tf — tiga role dengan least privilege: flow log role, EC2 instance role, S3 replication role.

notifications.tf — SNS topic dengan KMS encryption dan topic policy yang cuma ngijinin S3 service principal.

kms.tf — KMS key dengan key rotation aktif dan explicit key policy yang punya 4 statements untuk root account, CloudWatch, S3, dan SNS.

DESTROY.md — dokumentasi emergency teardown kalau-kalau Terraform nggak sengaja di-apply.

Tiga Tembok yang Ditembus

Tembok 1: Syntax Error di main.tf

Pas buka main.tf, ada error di line 85. Setelah dilihat lebih dekat, ternyata ada closing brace } kelebihan dan tiga definisi resource yang sama untuk replication_dest. Yang pertama punya skip comments, dua sisanya nggak. Yang ketiga bahkan nggak punya comment sama sekali — kayak hasil copy-paste yang lupa di-cleanup.

Solusinya simpel: hapus duplikat, sisain satu yang udah lengkap dengan skip comments.

Tembok 2: KMS Key Policy Tidak Explicit

Checkov rule CKV2_AWS_64 ngecek apakah KMS key punya policy attribute yang explicitly defined. KMS key sebelumnya cuma punya description, enable_key_rotation, dan tags. AWS sebenarnya auto-generate default policy, tapi Checkov nggak nganggep itu — dia mau policy attribute ditulis eksplisit di Terraform code.

Solusinya: tambahin policy = jsonencode({...}) dengan 4 statements:

  1. Root account — akses kms:* penuh
  2. CloudWatch Logs — Encrypt, Decrypt, GenerateDataKey, DescribeKey
  3. S3 — Encrypt, Decrypt, ReEncrypt, GenerateDataKey, DescribeKey
  4. SNS — GenerateDataKey, Decrypt

Plus data "aws_caller_identity" "current" {} untuk dapetin account ID tanpa hardcode ARN.

Tembok 3: Trivy Ignore Comment Nggak Berfungsi

Ini yang paling bikin kesel. Checkov support inline skip comments dengan format #checkov:skip=CKV_ID: reason di dalam resource block. Denger-denger Trivy juga punya #trivy:ignore:AVD-ID. Sayangnya pas dicoba, comment-nya muncul di output tapi finding-nya tetap kedeteksi.

Setelah baca dokumentasi Trivy dengan saksama, ternyata Trivy tidak support inline ignore comments untuk Terraform. Cuma .trivyignore atau .trivyignore.yaml files. Ini beda dengan Checkov yang support inline skips di dalam resource block.

Tapi kita nggak mau pakai .trivyignore file karena dulu sempat bikin pipeline false green — semua CVE ke-ignore tanpa diketahui. Jadi solusinya: set severity threshold di CI ke CRITICAL,HIGH,MEDIUM — skip LOW. Dua findings yang tersisa (AWS-0089: S3 logging untuk log destination dan replication destination) emang LOW dan secara logis emang nggak butuh access logging sendiri — itu ibarat naruh log di dalam log.

Hasil Akhir

Checkov

Passed checks: 102, Failed checks: 0, Skipped checks: 10

102 check lolos, 0 gagal. 10 skip semuanya punya justifikasi yang ditulis di comment.

Trivy IaC (MEDIUM+ severity)

Misconfigurations: 0

Bersih. 2 findings LOW di-accept sebagai risk dengan dokumentasi di comment.

Pipeline GitHub Actions

  • Infrastructure Security: SUCCESS (28 detik)
  • SecureBank CI: SUCCESS (46 detik)

Kedua pipeline hijau.

Lesson Learned

1. Checkov dan Trivy punya mekanisme suppression yang berbeda. Jangan asumsi tool A dan tool B kerja sama dalamannya. Checkov support inline skip comments di dalam resource block. Trivy cuma support file-based suppression. Beda tool, beda pendekatan, beda cara nge-handle findings yang nggak relevan.

2. Severity threshold itu valid, bukan kecurangan. Nggak semua finding harus 0. Ada LOW findings yang punya justifikasi yang jelas — kayak log destination yang nggak butuh logging sendiri. Yang penting CRITICAL, HIGH, dan MEDIUM harus 0. Itu yang dipegang ketat.

3. KMS key policy harus explicit walau AWS punya default. Checkov CKV2_AWS_64 ngecek keberadaan policy attribute, bukan isinya. Default policy yang AWS auto-generate nggak dihitung. Kalau nggak ditulis eksplisit di code, dianggap misconfiguration.

4. data.aws_caller_identity.current adalah best practice. Daripada hardcode account ID di ARN, pakai data source Terraform untuk dapetin secara dinamis. Lebih clean, lebih portable, nggak ada secret di code.

5. Cross-region S3 access logging nggak didukung AWS. S3 server access logging butuh target bucket di region yang sama. Replication destination di region berbeda nggak bisa log ke access_logs bucket di primary region. Ini limitasi AWS, bukan bug di scanner — scanner benar nge-flag ini, tapi fixnya bukan dengan nambahin logging, melainkan dengan accept risk.

Kesimpulan

Day 23 selesai. Dari total 29 findings (15 Checkov + 14 Trivy IaC) ke 0. Pipeline Infrastructure Security hijau pertama kalinya sejak dibikin di Day 22. 7 file Terraform baru, 102 Checkov checks pass, KMS key policy, S3 encryption, SG restriction, IAM least privilege — semua pada tempatnya.

Key insight hari ini: DevSecOps yang mature bukan tentang bikin semua angka jadi 0. Tapi tentang paham mana yang harus 0 (CRITICAL/HIGH/MEDIUM), mana yang bisa di-accept sebagai risk (LOW dengan justifikasi), dan mana yang perlu skip dengan alasan teknis.

Besok Day 24: DAST Setup dengan OWASP ZAP. Pindah dari static analysis (IaC) ke dynamic analysis — scan API yang sedang jalan. Sampai jumpa besok!


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

Enjoyed this article? Share it!

Share

Diskusi & Komentar

Artikel Terkait