
Hari 20: Terraform + Checkov, 15 Celah IaC Ketahuan
Bikin infrastructure as code pakai Terraform, lalu scan dengan Checkov. Hasilnya 15 celah keamanan ketahuan — S3 tanpa enkripsi, security group terbuka ke dunia.
Dari Container ke Infrastructure
Sebelumnya di Fase 2 kita udah hardening Docker container dan sign image pakai Cosign. Sekarang kita masuk ke territory baru: Infrastructure as Code (IaC) Security.
Kalau Docker container itu packaging aplikasi, maka Terraform itu packaging infrastructure. VPC, S3 bucket, security group — semua didefinisikan sebagai kode. Dan kayak kode aplikasi, kode infrastruktur juga bisa punya celah keamanan.
Hari ini kita bikin Terraform config yang sengaja insecure untuk training, lalu scan pakai Checkov buat lihat berapa banyak celah yang ketahuan.
Install Tools
Dua tools yang dibutuhkan: Terraform buat bikin IaC, Checkov buat scan IaC.
# Terraform (via tfenv)
$ tfenv use latest
Terraform v1.15.6
# Checkov (via pip3)
$ pip3 install --user checkov
$ checkov --version
3.3.2
Bikin Infrastructure as Code
Kita bikin 3 resource AWS di Terraform: VPC, S3 bucket, dan Security Group. Semuanya sengaja dibikin insecure biar Checkov bisa nemuin celahnya.
main.tf
# VPC — intentionally misconfigured
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
}
# S3 Bucket — intentionally insecure
resource "aws_s3_bucket" "logs" {
bucket = "securebank-logs-${var.environment}"
# Missing: versioning, encryption, public access block
}
# Security Group — intentionally too open
resource "aws_security_group" "api" {
name = "securebank-api-sg"
vpc_id = aws_vpc.main.id
ingress {
from_port = 0
to_port = 65535
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"] # INTENTIONAL: open to world
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
Ada berapa banyak celah yang kamu bisa spot? Mari kita hitung pakai Checkov.
Scan dengan Checkov
$ checkov -d securebank-api/terraform/
Passed checks: 6, Failed checks: 15, Skipped checks: 0
15 celah ketahuan. Mari kita kelompokkan:
Security Group — 8 celah
| Check ID | Masalah |
|---|---|
| CKV_AWS_260 | Ingress 0.0.0.0/0 ke port 80 (HTTP) |
| CKV_AWS_24 | Ingress 0.0.0.0/0 ke port 22 (SSH) |
| CKV_AWS_25 | Ingress 0.0.0.0/0 ke port 3389 (RDP) |
| CKV_AWS_23 | SG dan rules tidak ada description |
| CKV_AWS_382 | Egress 0.0.0.0/0 ke semua port |
| CKV2_AWS_5 | SG tidak attached ke resource apapun |
| CKV2_AWS_12 | Default SG VPC tidak restrict traffic |
Satu Security Group yang buka semua port (0-65535) ke 0.0.0.0/0 ternyata trigger 8 rules sekaligus. Checkov mendeteksi setiap port berbahaya yang kebuka: SSH (22), HTTP (80), RDP (3389), dll.
S3 Bucket — 7 celah
| Check ID | Masalah |
|---|---|
| CKV2_AWS_6 | Tidak ada public access block |
| CKV2_AWS_62 | Tidak ada event notifications |
| CKV2_AWS_61 | Tidak ada lifecycle configuration |
| CKV_AWS_18 | Tidak ada access logging |
| CKV_AWS_145 | Tidak ada KMS encryption |
| CKV_AWS_144 | Tidak ada cross-region replication |
| CKV_AWS_21 | Tidak ada versioning |
S3 bucket yang cuma dikasih nama tanpa setting apapun ternyata bikin 7 masalah. Yang paling kritis: gak ada public access block (bucket bisa diakses publik), gak ada encryption (data gak terenkripsi), dan gak ada logging (gak ada audit trail).
Yang Passed — 6 checks
Bukan semua gagal. 6 checks yang passed:
- CKV_AWS_41 — No hard-coded AWS access key (pakai variable, bukan hardcoded)
- CKV_AWS_93 — S3 bucket policy tidak lockout root user
- CKV_AWS_20 — S3 ACL tidak public READ
- CKV_AWS_57 — S3 ACL tidak public WRITE
- CKV_AWS_277 — SG tidak buka port -1 (all protocols)
- CKV_AWS_19 — S3 SSE encryption (default S3 encryption aktif)
Yang passed kebanyakan karena "tidak melakukan sesuatu yang buruk" (tidak hardcode credentials, tidak bikin public ACL). Tapi yang failed jauh lebih banyak.
Kenapa IaC Security Itu Penting
Bayangin kalau Terraform ini langsung di-apply ke productiontanpa scan. Efeknya:
- S3 bucket tanpa encryption → data log sensitif tersimpan plaintext
- S3 bucket tanpa public access block → bucket bisa diubah ke public kapan saja
- Security group buka semua port ke 0.0.0.0/0 → semua orang bisa connect ke server di VPC itu
- VPC tanpa flow logging → gak ada audit trail untuk network traffic
Semua ini bisa dihindari dengan scan sebelum apply. Itulah kenapa IaC scanning penting — tangkap celah sebelum infrastruktur dibuat, bukan setelahnya.
Kenapa Tidak Perlu terraform init?
Awalnya aku coba terraform init buat download AWS provider, tapi timeout karena provider-nya besar (~500MB). Ternyata Checkov tidak butuh terraform init sama sekali.
Checkov melakukan static analysis file HCL. Dia parse file Terraform, analysa konfigurasi, lalu cek apakah sesuai dengan security best practices. Tidak perlu download provider, tidak perlu AWS credentials, tidak perlu connect ke AWS API.
Ini beda dengan terraform plan yang butuh provider dan credentials untuk validate config terhadap AWS API. Checkov cuma butuh file .tf saja.
Lesson Learned
1. Satu Security Group yang terbuka bisa trigger banyak rules. Buka port 0-65535 ke 0.0.0.0/0 itu trigger 8 Checkov rules sekaligus. Setiap port berbahaya (22, 80, 3389) punya rule sendiri-sendiri. Lebih baik buka hanya port yang dibutuhkan.
2. S3 bucket kosongan punya 7 masalah. Cuma bikin bucket tanpa setting apa pun sudah trigger 7 rules. S3 punya banyak security settings yang tidak aktif secara default: versioning, encryption, public access block, logging, lifecycle, replication.
3. Checkov tidak butuh terraform init. Static analysis HCL files tidak membutuhkan download provider. Berguna saat network lambat atau tidak ada AWS credentials. Cukup file .tf saja.
4. IaC scan lebih cepat dari manual review. Checkov scan 3 file Terraform dalam hitungan detik dan menemukan 15 issues. Manual review akan ambil waktu lama dan mudah ada yang terlewat. Otomatisasi = konsistensi.
5. Ada 2 rules untuk S3 encryption: CKV_AWS_19 (SSE) dan CKV_AWS_145 (KMS). Bucket tanpa keduanya pass SSE check (karena S3 default encryption) tapi fail KMS check. KMS encryption lebih kuat karena pakai customer-managed key, bukan S3-managed key.
6. Checkov memberi link guideline untuk setiap finding. Setiap failed check punya link ke Prisma Cloud docs yang menjelaskan kenapa ini penting dan cara fix-nya. Sangat helpful untuk belajar.
Kesimpulan
Hari ini kita bikin Terraform config dengan 3 resource (VPC, S3, Security Group) yang sengaja insecure, lalu scan pakai Checkov. Hasilnya: 15 celah keamanan ketahuan, 6 checks passed.
Checkov bekerja sebagai static analysis tool — tidak butuh terraform init, AWS credentials, atau connect ke AWS API. Cukup file .tf saja, dan Checkov langsung bisa menemukan misconfiguration.
Ini adalah "SAST untuk infrastructure." Sama seperti Semgrep scan Go code buat cari insecure code, Checkov scan Terraform code buat cari insecure infrastructure.
Celah-celah ini akan di-fix di Hari 23 — IaC Remediation. Besok kita coba tool lain: tfsec/Trivy buat scan IaC dan bandingkan temuan dengan Checkov.
Diskusi & Komentar
Hari 19: Sign Docker Image Pakai Cosign, Verifikasi Integritas
Next ArticleHari 21: Checkov vs Trivy IaC, Mana Lebih Jago?
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.