
Hari 6: Trivy SCA Quality Gate, Build Gagal Saat Ada CVE
Hari keenam 60 hari DevSecOps! Masukkin Trivy ke CI pipeline sebagai quality gate — build otomatis gagal kalau ada CVE CRITICAL atau HIGH di dependensi.
Dari Scan Lokal ke Scan Otomatis di CI
Kemarin kita jalanin Trivy di lokal dan nemuin 4 CVE. Tapi masalahnya: kalau developer lupa jalanin scan sebelum push, CVE bisa aja lolos ke main branch. Hari ini kita masukkin Trivy ke CI pipeline biar setiap push dan pull request otomatis di-scan — dan build gagal kalau ada CVE yang CRITICAL atau HIGH.
Ini konsep yang namanya quality gate: bukan cuma nge-laporkan masalah, tapi juga nge-blok kalau masalahnya serius.
Job Baru di Pipeline: SCA Scan
Pipeline yang kemarin cuma punya 2 job (Build & Test + Secret Scan), sekarang punya 3 yang jalan paralel:
sca-scan:
name: SCA Scan (Trivy)
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Run Trivy SCA
uses: aquasecurity/trivy-action@master
with:
scan-type: 'fs'
scan-ref: 'securebank-api'
format: 'json'
output: 'trivy-sca.json'
severity: 'CRITICAL,HIGH'
exit-code: '1'
- name: Upload Trivy Report
if: always()
uses: actions/upload-artifact@v4
with:
name: trivy-sca-report
path: trivy-sca.json
Beberapa keputusan desain yang penting:
trivy-action@master— pake action resmi dari Aqua Security, gratis dan gak perlu lisensi. Ini beda sama Gitleaks yang action-nya butuh lisensi berbayarscan-ref: 'securebank-api'— karenago.modada di subdirektori, bukan di root repoexit-code: '1'— ini yang bikin pipeline gagal kalau ada CVE. Tanpa ini, Trivy cuma nge-laporkan tapi build tetep hijauif: always()— report tetep di-upload meskipun pipeline gagal, penting buat debugging
Masalah: Pipeline Hijau Padahal Ada 4 CVE
Setelah push ke GitHub, pipeline hijau — semua job pass. Padahal kemarin Trivy di lokal nemuin 4 CVE. Kenapa?
Setelah download dan cek artifact trivy-sca.json dari CI, hasilnya: 0 vulnerabilities. Trivy di CI gak nemuin apapun.
Ternyata penyebabnya .trivyignore yang kita bikin di Day 05. File ini isinya daftar CVE yang di-ignore:
CVE-2020-26160
CVE-2024-45337
CVE-2025-22869
CVE-2023-39325
Trivy otomatis baca file ini saat scan dari root repo. Jadi di CI, semua CVE di-ignore dan Trivy melaporkan "clean" — padahal sebenarnya ada 4 vulnerability.
Solusi: Hapus .trivyignore dari Repo
Kualitas gerbang (quality gate) itu harus benar-benar memblokir kalau ada masalah. Kalau CVE di-ignore, gerbangnya gak berguna.
Solusinya: hapus .trivyignore dari repo. File ini sekarang memang sengaja gak ada supaya pipeline gagal dan membuktikan quality gate bekerja.
Setelah hapus dan push ulang:
Pipeline: ❌ FAILED
SCA Scan (Trivy): Found 4 vulnerabilities (1 CRITICAL, 3 HIGH)
- CVE-2024-45337 (CRITICAL) — golang.org/x/crypto
- CVE-2020-26160 (HIGH) — dgrijalva/jwt-go
- CVE-2025-22869 (HIGH) — golang.org/x/crypto
- CVE-2023-39325 (HIGH) — golang.org/x/net
Build sekarang gagal seperti yang diharapkan. Quality gate berfungsi dengan baik.
Perbandingan Sebelum dan Sesudah
| Aspek | Sebelum (dengan .trivyignore) | Sesudah (tanpa .trivyignore) |
|---|---|---|
| Pipeline status | ✅ hijau (false positive) | ❌ merah (benar) |
| CVE ditemukan | 0 (semua di-ignore) | 4 (1 CRITICAL, 3 HIGH) |
| Quality gate | Tidak berfungsi | Berfungsi |
| Trivy report | 0 vulnerabilities | 4 vulnerabilities |
Lesson Learned
1. Quality gate harus benar-benar nge-blok. Kalau ada mekanisme ignore yang bikin gate-nya tembus, ya berarti gatenya gak berguna. exit-code: 1 itu bagus, tapi kalau .trivyignore meng-ignore semua CVE, ya sama aja gak ada gate.
2. .trivyignore itu alat lokal, bukan untuk CI. File ini bagus buat dokumentasi accepted risk dan buat scan lokal yang lebih bersih. Tapi di CI, kita pengen tau semua vulnerability yang ada supaya bisa diputuskan apakah aman atau tidak.
3. trivy-action gratis dan gak butuh lisensi. Ini beda sama gitleaks-action@v2 yang butuh lisensi berbayar. Aqua Security nyediain GitHub Action gratis buat Trivy, jadi langsung bisa dipake tanpa workaround install binary manual.
4. scan-ref harus ngarah ke direktori yang bener. Karena proyek kita ada di securebank-api/ (bukan root repo), harus explicit-setting scan-ref: 'securebank-api'. Kalau gak, Trivy gak bakal nemuin go.mod.
5. if: always() penting buat artifact. Tanpa ini, report gak bakal ke-upload kalau pipeline gagal. Padahal itulah saatnya kitabutuh report paling — buat tau kenapa pipeline gagal dan CVE apa yang ditemukan.
Kesimpulan
Hari ke-6 ini pipeline punya 3 lapis pertahanan: build/test, secret scanning, dan sekarang SCA scanning dengan quality gate. Kalau ada CVE CRITICAL atau HIGH di dependensi, pipeline langsung gagal — gak bisa merge ke main.
Yang penting dari hari ini: .trivyignore bikin quality gate gak berfungsi. Setelah dihapus, pipeline benar-benar gagal kalau ada vulnerability. Ini yang namanya shift-left security — masalah keamanan ketemu sedini mungkin, bahkan sebelum code masuk ke main branch.
Besok lanjut ke Hari 7: SCA Remediation — patch semua CVE, ganti jwt-go ke golang-jwt, dan bikin pipeline kembali hijau.
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 3: Ngecek Kebocoran Secret di Kode Pakai Gitleaks
Hari ketiga 60 hari DevSecOps! Pakai Gitleaks buat scan secret yang bocor di repo — ternyata tool ini cukup pintar bedainya secret asli dan contoh.
Hari 4: Gitleaks di CI, Refactor Config ke Env Var
Hari keempat 60 hari DevSecOps! Integrasikan Gitleaks ke pipeline CI, refactor config ke env vars, dan 3 kali fix error CI — akhirnya pipeline hijau.