Hari 20: Terraform + Checkov, 15 Celah IaC Ketahuan
6 min read

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.

devsecops
terraform
checkov
iac-security
infrastructure-as-code
60-days-challenge
Share

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.

Repo: github.com/stayrelevantid/chalange-devsecops

Enjoyed this article? Share it!

Share

Diskusi & Komentar

Artikel Terkait