
Hari 22 Bonus: Perbaikan Pipeline Gitleaks yang Merah Diam-diam
Pipeline Gitleaks merah sejak Day 14 karena flag --no-gitignore tidak pernah ada. Gitleaks detect scan git history, bukan working directory. Fix: hapus flag.
Pipeline Merah yang Tidak Disadari
Hari ini, saat ngecek pipeline GitHub Actions setelah push Day 22, aku nemuin sesuatu yang mengejutkan. Pipeline SecureBank CI — yang seharusnya hijau sejak Day 15 — ternyata merah sejak Day 14. Dan aku tidak sadar selama 8 hari.
Bukan job Build & Test, bukan Trivy SCA, bukan Semgrep. Yang gagal adalah Gitleaks — secret scanner kita. Dan penyebabnya? Flag yang tidak pernah ada.
Cerita Day 14: Tambah Flag --no-gitignore
Di Day 14, kita melakukan eksperimen intentional vulnerability test. Bikin branch test/intentional-leak dengan fake .env.production yang berisi fake AWS secret key, lalu git add -f (force add, bypass .gitignore).
Hasilnya: Gitleaks local detect 2 findings, tapi Gitleaks di CI tidak detect. Kesimpulan saat itu: Gitleaks respect .gitignore, jadi file yang di-git add -f tapi ada di .gitignore tetap di-skip oleh Gitleaks CI.
Fix saat itu: tambahkan --no-gitignore ke command Gitleaks di CI.
# .github/workflows/ci.yml — sebelum fix
- name: Run Gitleaks
run: gitleaks detect --source . -v --config .gitleaks.toml --no-gitignore
Pipeline hijau lagi. Setidaknya... itu yang aku kira.
Error Sebenarnya: unknown flag: --no-gitignore
Saat cek log Gitleaks job di Day 22, error-nya jelas:
Error: unknown flag: --no-gitignore
Exit code 126 — command not executed because invalid flag. Gitleaks tidak pernah jalan sejak Day 14. Pipeline hijau yang aku kira? Itu karena aku hanya lihat status overall pipeline dari gh run list, buka detail per-job.
Yang sebenarnya terjadi:
- Day 14: push
--no-gitignoreflag → Gitleaks gagal (exit 126) - Day 15-21: setiap push, Gitleaks gagal, tapi 3 job lain (Build, SCA, SAST) tetap sukses
- Aku lihat
gh run list→ lihat ada failed, tapi tidak investigasi karena fokus pada hari masing-masing - Day 22: baru sadar Gitleaks job selalu merah
Kenapa Tidak Ketahuan Selama 8 Hari?
Beberapa alasan:
1. Fokus pada job lain. Build & Test, Trivy SCA, dan Semgrep semua hijau. Saat lihat pipeline status, aku cek jobs yang hijau dan assume semuanya baik-baik saja.
2. Tidak buka detail pipeline run. gh run list menampilkan status overall (failed), tapi tidak menunjukkan job mana yang gagal. Perlu gh run view <id> untuk lihat detail. Aku jarang buka detail kalau overall status sudah "mostly green."
3. Error tidak terlihat di commit history. GitHub Actions badge di repo menampilkan "failing", tapi badge itu inline di README — tidak mencolok saat browsing repo.
4. Asumsi "fix works" tanpa verifikasi. Day 14 aku tambah --no-gitignore dan assume pipeline hijau. Tidak verify dengan cek log Gitleaks job. Asumsinya: "kalau flag dihapus/skip tidak ada masalah, berarti jalan."
Cara Kerja Gitleaks Detect Mode
Ini bagian paling penting dari lesson learned hari ini. Gitleaks detect mode bekerja dengan cara scan git history, bukan working directory.
gitleaks detect --source .
Command di atas tidak scan file di directory saat ini. Dia scan semua commit di git history. Setiap commit di-parse, setiap diff di-analisis, setiap string di-match terhadap secret patterns.
Ini berarti:
| Skenario | Di-scan? | Kenapa |
|---|---|---|
| File normal yang di-commit | ✅ | Ada di git history |
File yang di-git add -f (bypass .gitignore) |
✅ | Ada di git history — .gitignore tidak relevan |
File di .gitignore yang TIDAK di-commit |
❌ | Tidak ada di git history |
.gitignore tidak punya efek di Gitleaks detect mode. Karena Gitleaks scan commit history, bukan working directory. File yang git add -f sudah masuk ke commit history — Gitleaks akan menemukannya terlepas dari .gitignore.
Jadi kekhawatiran Day 14 sebenarnya tidak beralasan. Gitleaks CI sebenarnya sudah bisa detect git add -f file tanpa flag tambahan. Penambahan --no-gitignore justru merusak pipeline karena flag tersebut tidak pernah ada.
Flag yang Sebenarnya Ada di Gitleaks
Mari kita lihat flag yang benar-benar ada di Gitleaks detect mode:
Flags:
--follow-symlinks scan files that are symlinks to other files
--log-opts string git log options
--no-git treat git repo as a regular directory
--pipe scan input from stdin
-s, --source string path to source (default ".")
Global Flags:
-i, --gitleaks-ignore-path path to .gitleaksignore file
-c, --config config file path
--enable-rule strings only enable specific rules by id
--exit-code int exit code when leaks (default 1)
-v, --verbose show verbose output
Tidak ada --no-gitignore. Yang ada:
--no-git— scan sebagai directory biasa, bukan git history. Berbeda fungsinya.-i, --gitleaks-ignore-path— path ke.gitleaksignore(bukan.gitignore). File.gitleaksignoreberisi findings yang ingin di-ignore, bukan file yang ingin di-skip.
Fix: Hapus Flag Invalid
Fix-nya simpel — hapus flag yang tidak valid:
# .github/workflows/ci.yml — setelah fix
- name: Run Gitleaks
run: gitleaks detect --source . -v --config .gitleaks.toml
Hapus --no-gitignore, biarkan Gitleaks scan git history seperti yang seharusnya. Hasilnya:
$ gh run list --workflow="SecureBank CI" --limit 1
completed success fix: remove invalid --no-gitignore flag...
Pipeline hijau. Semua 4 jobs (Build & Test, Gitleaks, Trivy SCA, Semgrep) sukses.
Bagan Timeline
Day 1-13: Pipeline hijau (Gitleaks jalan normal)
Day 14: Tambah --no-gitignore → Gitleaks GAGAL (exit 126)
Day 15: Push progress → Gitleaks GAGAL → tidak sadar
Day 16: Push Dockerfile → Gitleaks GAGAL → tidak sadar
Day 17: Push image scan → Gitleaks GAGAL → tidak sadar
Day 18: Push docker-compose → Gitleaks GAGAL → tidak sadar
Day 19: Push Cosign → Gitleaks GAGAL → tidak sadar
Day 20: Push Terraform → Gitleaks GAGAL → tidak sadar
Day 21: Push Trivy IaC → Gitleaks GAGAL → tidak sadar
Day 22: Cek detail pipeline → SADAR! → Fix → Pipeline hijau
Selama 8 hari (Day 14-21), Gitleaks tidak pernah jalan di CI. Secret scanning mati diam-diam.
Lesson Learned
1. Selalu verifikasi flag exists sebelum menambahkannya. Saat Day 14 aku menambahkan --no-gitignore berdasarkan asumsi bahwa "Gitleaks pasti punya flag untuk ignore .gitignore." Tidak ada verifikasi. Cukup jalankan gitleaks detect --help untuk lihat daftar flag yang valid. Satu command, 5 detik, bisa menghemat 8 hari pipeline merah.
2. Monitor semua jobs, bukan hanya overall status. GitHub Actions menampilkan status overall (passed/failed), tapi yang penting adalah status per-job. Suatu pipeline bisa "failed" karena satu job, sementara tiga job lain hijau. Selalu buka gh run view <id> atau UI GitHub Actions untuk lihat detail job mana yang gagal.
3. "Pipeline hijau" tanpa verifikasi bukan keberhasilan. Setelah menambahkan --no-gitignore, aku assume pipeline hijau karena flag-nya "berhasil" ditambahkan. Tidak ada verifikasi dengan cek log Gitleaks job. Asumsi = blind spot. Verifikasi = certainty.
4. Gitleaks detect mode scan git history, bukan working directory. Ini adalah konsep fundamental yang aku salah pahami di Day 14. File yang git add -f sudah ada di git history → Gitleaks akan menemukannya. .gitignore tidak punya efek. Penambahan --no-gitignore tidak hanya invalid, tapi juga tidak diperlukan.
5. --no-git ≠ --no-gitignore. Dua flag yang mirip nama tapi beda fungsi. --no-git = scan sebagai directory biasa (bukan git history). --no-gitignore = tidak ada (tidak pernah ada). Jangan tertukar nama flag yang mirip.
6. Pipeline merah yang tidak disadari adalah kalah dengan pipeline merah yang terlihat. Selama 8 hari, aku pikir Gitleaks pipeline jalan normal. Kenyataannya, secret scanner mati total. Kalau ada secret leak yang terjadi di Day 15-21, tidak ada yang mendeteksinya. Bayangin kalau ini production — 8 hari tanpa secret scanning adalah celah besar.
Kesimpulan
Hari ini aku belajar sesuatu yang penting: tidak semua pipeline merah terlihat. Gitleaks pipeline merah diam-diam selama 8 hari karena aku tidak memverifikasi bahwa flag --no-gitignore benar-benar valid dan pipeline hijau setelahnya.
Ternyata, flag --no-gitignore tidak pernah ada di Gitleaks. Dan lebih penting lagi: flag tersebut tidak diperlukan. Gitleaks detect mode scan git history, bukan working directory — jadi .gitignore tidak punya efek. File yang git add -f sudah ada di commit history dan otomatis di-scan.
Fix-nya simpel: hapus flag invalid. Tapi lesson-nya besar: selalu verifikasi, jangan asumsi. Dan monitor semua jobs, bukan hanya overall status.
Diskusi & Komentar
Hari 22: Pipeline IaC, Dua Scanner Barengan Gagal
Next ArticleHari 23: 0 Finding, Pipeline IaC Hijau
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.