
Hari 32: Scan K8s Misconfig — 3 Scanner, 20+ Temuan
Kubesec, Checkov, Trivy scan deployment.yaml yang sengaja insecure. Hasilnya: 14 advise, 20 failed, 16 findings. Ini perbandingan POV 3 scanner K8s.
Hari 32. SecureBank API jalan di K8s. Tapi deployment.yaml kemarin sengaja dibuat insecure — no securityContext, no resources, no probes. Hari ini saatnya di-scan.
Tidak pakai 1 scanner, tapi 3: Kubesec, Checkov, dan Trivy. Mau lihat POV masing-masing, apa yang mereka tangkap dan apa yang mereka lewatkan.
Tiga Scanner, Tiga Pendekatan
Kubesec — pakai scoring system. Tiap security control yang missing punya poin (1-3). Total score = 0 artinya tidak ada satu pun best practice yang diterapkan. Simple, langsung jelas. Punya check unik: AppArmor annotation.
Checkov — pakai CIS Kubernetes Benchmark. 89 checks, paling comprehensive. Output SARIF untuk GitHub Security tab. Menangkap yang unik: liveness/readiness probe, image digest, dan NetworkPolicy — yang dua scanner lain tidak cek.
Trivy — pakai severity level (HIGH/MEDIUM/LOW). 100 checks dengan link ke AVD docs. Catch-all finding KSV-0118 "using default security context" sebagai HIGH — menangkap semua yang tidak explicitly set securityContext dalam satu finding.
Hasil Scan
| Scanner | Checks | Passed | Failed |
|---|---|---|---|
| Kubesec | 14 | 0 | 14 (score 0) |
| Checkov | 89 | 69 | 20 |
| Trivy | 100 | 84 | 16 (3H/3M/10L) |
Yang menarik: semua 3 scanner sepakat di 8 finding utama:
- No securityContext (pod + container)
- allowPrivilegeEscalation not set
- runAsNonRoot not set
- No readOnlyRootFilesystem
- Capabilities not dropped
- No seccompProfile
- No resource limits/requests
- runAsUser/runAsGroup not set
Yang Unik per Scanner
Kubesec menemukan AppArmor annotation yang tidak dicek kedua lainnya. AppArmor adalah kernel security module untuk profile-based restriction. Sayangnya jarang dipakai di K8s.
Checkov menemukan liveness/readiness probe — Pod tanpa probe tidak bisa auto-restart kalau unhealthy. Juga image digest (pin image ke SHA, bukan tag yang bisa berubah) dan NetworkPolicy (Pod tanpa policy terbuka ke semua traffic).
Trivy menemukan KSV-0118 — "using default security context" sebagai HIGH. Ini catch-all: daripada per-property, Trivy bilang "kamu pakai default security context, itu berbahaya" dalam satu finding. Lebih ringkas tapi kurang granular.
Kenapa Pakai 3 Scanner?
Karena masing-masing punya blind spot. Kubesec tidak cek probe. Checkov tidak cek AppArmor. Trivy tidak cek NetworkPolicy. Pakai ketiganya = coverage maksimal.
Untuk CI gate kelak, Trivy paling cocok karena severity-based (bisa set threshold: fail jika ada HIGH). Checkov untuk SARIF ke GitHub Security. Kubesec untuk quick score di MR/PR comment.
Pelajaran Hari Ini
3 POV lebih baik dari 1. Masing-masing scanner punya filosofi berbeda — Kubesec scoring, Checkov CIS mapping, Trivy severity. Daripada debat scanner mana yang "terbaik", pakai ketiganya. Blind spot satu scanner tertutup oleh yang lain.
Probe = security. Checkov menganggap liveness/readiness probe sebagai security check. Awalnya aku pikir probe cuma ops, tapi ternyata Pod yang unhealthy tapi tidak auto-restart bisa mengakibatkan traffic routing issue — user dapat response dari Pod yang sebenarnya sudah crash.
"default security context" adalah smell. Trivy KSV-0118 menangkap ini sebagai HIGH. Artinya: kalau tidak explicitly set securityContext, berarti pakai default Kubernetes — yang memungkinkan root, tidak restrict privilege escalation. Explicit > implicit di security.
Repo
Semua code, reports, dan comparison doc ada di: https://github.com/stayrelevantid/chalange-devsecops
Kesimpulan
20+ misconfiguration teridentifikasi di 3 kategori: SecurityContext (HIGH), Resources (MEDIUM), Probes (MEDIUM). Besok Day 33 — fix semua, re-scan, target 0 failed across 3 scanners. Challenge accepted.
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.