Hari 6: Trivy SCA Quality Gate, Build Gagal Saat Ada CVE
4 min read

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.

devsecops
trivy
sca
ci-cd
github-actions
quality-gate
60-days-challenge
Share

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 berbayar
  • scan-ref: 'securebank-api' — karena go.mod ada di subdirektori, bukan di root repo
  • exit-code: '1' — ini yang bikin pipeline gagal kalau ada CVE. Tanpa ini, Trivy cuma nge-laporkan tapi build tetep hijau
  • if: 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.

Repo: github.com/stayrelevantid/chalange-devsecops

Enjoyed this article? Share it!

Share

Diskusi & Komentar

Artikel Terkait