
Hari 30: Fase 2 Selesai — Retrospektif 15 Hari Container Security
15 hari, 17 security fixes, dari Dockerfile mentah sampai distroless 7.97MB. Pipeline 8 scanner paralel dengan security gate. Ini retrospektif Fase 2.
Hari 30. Separuh perjalanan 60 hari DevSecOps selesai. Fase 2 tutup tirai. Saatnya duduk, tarik napas, dan tulis retrospektif.
Dari 15 hari ini, ada banyak yang dipelajari. Bukan cuma tools, tapi juga pola pikir security. Mari kita rangkum.
Apa yang Dibangun di Fase 2?
Dalam 15 hari (Day 16-30), SecureBank API berubah dari kode Go mentah jadi container yang hardened, di-infrastructure-kan dengan Terraform, di-scan dengan DAST, dan di-pipeline-kan jadi satu kesatuan.
Container Security (Day 16-19):
- Multi-stage Dockerfile: golang:1.26-alpine → distroless static
- Image size: 350MB → 7.97MB (44x lebih kecil)
- 8-layer hardening di docker-compose: non-root user, read-only filesystem, tmpfs, no-new-privileges, cap_drop ALL, resource limits
- Cosign v3.1.1 image signing dan verification
IaC Security (Day 20-23):
- 10 Terraform files: VPC, S3, EC2, IAM, KMS, SNS/SQS
- Checkov: 102 checks passed, 0 failed
- Trivy IaC: 0 findings (CRITICAL/HIGH/MEDIUM)
- Remediasi: S3 encryption KMS, SG restricted, IAM least privilege, KMS rotation
DAST (Day 24-26):
- OWASP ZAP Baseline Scan: 0 FAIL, 66 PASS, 1 WARN (false positive)
- Remediasi: 8 security headers via SecurityHeadersHandler wrapper
- Go binary approach di CI (~5s vs ~30s Docker build, hasil identik)
Compliance + Consolidation (Day 27-29):
- AI-assisted IaC fix: variable validation, IAM Condition, S3 lifecycle
- InSpec compliance: 3/3 controls PASS (local only)
- Pipeline consolidation: 2 workflow files jadi 1, 8 jobs + security gate
Lima Pelajaran Terbesar
1. Distroless = attack surface minimal. Image 7.97MB tanpa shell, tanpa package manager. Attacker yang dapat RCE tidak bisa apa-apa. Trade-off: no HEALTHCHECK, butuh K8s liveness probe.
2. Checkov + Trivy IaC saling melengkapi. Checkov untuk policy detail (102 checks), Trivy untuk severity gate (CRITICAL/HIGH/MEDIUM). Pakai keduanya, bukan pilih satu.
3. ZAP false positive butuh dokumentasi. Rule 10049 (cacheability) justru correct behavior untuk API. continue-on-error: true solusinya, tapi alasannya harus dicatat supaya developer berikutnya tidak bingung.
4. Pipeline consolidation = maintainability. 2 file workflow jadi 1. 8 jobs paralel, security gate sebagai final checkpoint. "Apakah pipeline aman?" jadi pertanyaan yes/no, bukan "cek 7 job satu-satu".
5. 0 scanner findings bukan production-ready. AI review menemukan 6 improvements yang scanner lewati (variable validation, IAM Condition, S3 lifecycle). Scanner menemukan pattern, bukan design flaw.
Angka-Angka Fase 2
| Metrik | Hasil |
|---|---|
| Image size reduction | 44x (350MB → 7.97MB) |
| CVE di base image | 0 |
| Checkov checks | 102/0 passed/failed |
| Trivy IaC findings | 0 (MEDIUM+) |
| ZAP findings | 0 FAIL, 1 WARN false positive |
| Security headers | 8 implemented |
| InSpec controls | 3/3 PASS |
| Pipeline jobs | 8 (paralel + security gate) |
| Workflow files | 1 (was 2) |
| Unit tests | 25 all PASS |
Tantangan Terbesar
ZAP rule 10049 bikin pipeline RED dari Day 25-26. Ternyata false positive untuk API — dual personality: response yang tidak ada Cache-Control di-mark "storable", response dengan Cache-Control juga di-mark. Solusinya continue-on-error: true dengan dokumentasi yang jelas.
Gitleaks --no-gitignore flag ternyata tidak pernah ada. Pipeline RED dari Day 14 sampai Day 22. Asumsi yang salah tertulis di dokumentasi Fase 1. Lesson: selalu validasi dengan --help sebelum menulis dokumentasi.
Koneksi ke Fase 3
Docker image yang sudah hardened dan signed akan di-deploy ke Kubernetes. K8s liveness probe akan gantikan Dockerfile HEALTHCHECK (distroless tidak punya shell). Terraform infra jadi target IaC scan lanjutan. Pipeline 8 jobs akan ditambah K8s manifest scanner.
Carry-over dari Fase 1: rate limiter (DREAD 9.6), user-scoped authorization (8.4), RBAC (6.6) masih unmitigated. Sebagian akan di-address di Fase 3.
Repo
Semua code ada di: https://github.com/stayrelevantid/chalange-devsecops
Retrospektif lengkap ada di: docs/fase-2-infra-container.md dan progress/retrospektif/fase-2-retrospektif.md
Kesimpulan
30 hari. Separuh perjalanan. 2 fase selesai. Dari setup repo sampai pipeline 8 scanner paralel. Besok mulai Fase 3 — Kubernetes & Runtime Security. Challenge baru: k3d cluster, OPA Gatekeeper, Falco, RBAC, Network Policies.
Sampai jumpa di Fase 3.
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.