Hari 22 Bonus: Perbaikan Pipeline Gitleaks yang Merah Diam-diam
7 min read

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.

devsecops
gitleaks
ci-cd
secret-scanning
lesson-learned
60-days-challenge
Share

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-gitignore flag → 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 .gitleaksignore berisi 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.

Repo: github.com/stayrelevantid/chalange-devsecops

Enjoyed this article? Share it!

Share

Diskusi & Komentar

Artikel Terkait