Hari 32: Scan K8s Misconfig — 3 Scanner, 20+ Temuan
3 min read

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.

devsecops
kubernetes
k8s security
kubesec
checkov
trivy
Share

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:

  1. No securityContext (pod + container)
  2. allowPrivilegeEscalation not set
  3. runAsNonRoot not set
  4. No readOnlyRootFilesystem
  5. Capabilities not dropped
  6. No seccompProfile
  7. No resource limits/requests
  8. 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.

Enjoyed this article? Share it!

Share

Diskusi & Komentar

Artikel Terkait