
Hari 25: DAST Otomatis di CI Pipeline
ZAP baseline scan otomatis di GitHub Actions setiap push. Pakai Go binary langsung bukan Docker — lebih ringan. Hasil: 66 pass, 1 warn, pipeline merah.
DAST Masuk Pipeline — Job ke-5 di CI
Kemarin (Day 24) ZAP dijalankan manual lewat terminal. Hari ini, ZAP dijalankan otomatis setiap kali ada push ke repo. Tidak ada lagi yang scan manual — semua otomatis di GitHub Actions.
Pipeline SecureBank CI sekarang punya 5 job parallel/sequential:
| Job | Fungsi | Status |
|---|---|---|
| Build & Test | Compile Go + unit test + coverage | ✅ Green |
| Secret Scan | Gitleaks deteksi leaked credentials | ✅ Green |
| SCA Scan | Trivy scan dependencies untuk CVE | ✅ Green |
| SAST Scan | Semgrep scan source code untuk insecure patterns | ✅ Green |
| DAST Scan | ZAP baseline scan application yang sedang jalan | ❌ Red |
4 job pertama sudah ada sejak Fase 1. Job ke-5 (DAST) baru ditambahkan hari ini.
Kenapa Pakai Go Binary, Bukan Docker?
Tutorial silabus menyarankan pakai Docker service container untuk menjalankan aplikasi di CI. Tapi setelah dipikir, ada pendekatan yang lebih ringan: build Go binary langsung.
Docker build di CI butuh:
- Build image (~30 detik — download base image, compile, layer cache)
- Container lifecycle (start, health check, stop, cleanup)
Go binary butuh:
go build -o securebank ./cmd/api(~5 detik)./securebank &(run as background process)
Total hemat ~25 detik. Dan karena DAST scan HTTP response header — hasilnya sama whether app jalan sebagai binary atau container. Docker tetap penting untuk production, tapi untuk DAST di CI, binary sudah cukup.
Cara Kerja DAST Job di CI
dast-scan:
needs: [build-and-test] # tunggu build & test selesai dulu
steps:
- checkout code
- setup Go 1.26
- go build -o securebank ./cmd/api
- run: JWT_SECRET=ci-test-secret PORT=8080 ./securebank &
- wait for health (curl retry 15x)
- zaproxy/action-baseline@v0.13.0
- upload artifact (zap report)
Urutannya simpel: build binary → start di background → tunggu healthy → ZAP scan → upload report.
needs: [build-and-test] berarti DAST scan hanya jalan kalau build dan test sudah lulus. Kalau build gagal, DAST scan nggak jalan — hemat CI minutes. Job lain (Gitleaks, Trivy, Semgrep) tetap parallel — mereka nggak butuh app jalan.
Hasil: Pipeline Merah — dan Itu Bagus
FAIL-NEW: 0 WARN-NEW: 1 PASS: 66
WARN-NEW: Storable and Cacheable Content [10049] x 2
66 check pass, 0 fail, 1 warn. Tapi ZAP action return exit code 1 karena ada WARN — pipeline merah.
Ini sengaja. Sama kayak Day 22 ketika Infrastructure Security pipeline sengaja merah sampai Day 23 fix. Pattern-nya konsisten: masukkan scanner ke pipeline → pipeline merah (expected) → fix finding → pipeline hijau.
Finding 10049 (Storable and Cacheable Content) terjadi karena 404 response dari path yang nggak didefinisikan (/ dan /robots.txt) tidak punya Cache-Control header. Go's http.HandleFunc hanya apply middleware ke route yang explicit didaftarkan (/health, /balance, /transfer). Path lain dapat 404 default tanpa middleware.
Fix-nya di Day 26: DAST Remediation.
Pelajaran yang Didapat
1. DAST di CI lebih efisien pakai binary, bukan Docker. Docker build butuh waktu lebih lama dan container lifecycle management. Untuk DAST yang cuma butuh HTTP response, Go binary langsung sudah cukup. Hasil scan identik — ZAP baca response header, bukan care app jalan di Docker atau binary.
2. ZAP action lebih ketat dari ZAP CLI. Local run: ZAP cuma fail kalau ada FAIL. ZAP action di CI: fail kalau ada WARN atau FAIL. Security gate lebih ketat di pipeline — ini поведen yang benar untuk CI/CD.
3. cmd_options: '-I' untuk skip INFO findings. ZAP baseline punya 3 level: FAIL, WARN, INFO. Tanpa -I, INFO findings juga bikin pipeline fail. Dengan -I, cuma FAIL dan WARN yang dianggap. INFO biasanya noise yang nggak perlu block pipeline.
4. needs di GitHub Actions = dependency graph. Job dengan needs nunggu job dependency selesai. Job tanpa needs jalan parallel. Kombinasi keduanya bikin pipeline efisien: scanner parallel (Gitleaks, Trivy, Semgrep) + sequential (build → DAST).
5. GitHub Actions auto-cleanup background process. Setelah job selesai, GitHub otomatis kill orphan process. Log menunjukkan: "Terminate orphan process: pid (3962) (securebank)". Nggak perlu manual kill atau trap — GitHub Actions handle sendiri.
Kesimpulan
Day 25 selesai. DAST scan otomatis di pipeline. CI sekarang punya 5 quality gate: Build & Test + Secret Scan + SCA + SAST + DAST. Pipeline merah karena 1 WARN finding yang belum di-fix — ini expected, fix di Day 26.
Pendekatan Go binary terbukti lebih efisien: pipeline total 2 menit 16 detik, DAST job sendiri cuma sekitar 1 menit. Dibanding kalau pakai Docker build + container, mungkin bisa 4-5 menit.
Besok Day 26: DAST Remediation — fix WARN 10049, tambah security headers yang masih kurang, pipeline hijau lagi. Sampai jumpa besok!
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.