
Hari 14: Fake Secret, Gitleaks Gak Detect — Dan Fixnya
Hari keempat belas! Commit fake secret buat test pipeline — dan nemuin gap: Gitleaks gak detect file yang di-gitignore. Tambah --no-gitignore flag, sekarang catch semua leak.
Kenapa Perlu Test Pipeline Secara Sengaja?
Hari ini kita lakuin sesuatu yang kontra-intuitif: sengaja commit secret ke repository. Kenapa? Karena pipeline secret scanning cuma berguna kalau benar-benar jalan. Kalau setup-nya salah tapi kita percaya jalan, itu lebih bahaya daripada gak punya sama sekali.
False sense of security itu musuh terbesar DevSecOps.
Eksperimen: Commit Fake Secret
Bikin branch test/intentional-leak, tambah file configs/.env.production:
STRIPE_SECRET_KEY=sk_live_abc123verysecretkey
AWS_ACCESS_KEY_ID=AKIA3E4Y5Z6X7W8Q9R0T
AWS_SECRET_ACCESS_KEY=7hGjKmNpQrStUvWxYz2B4C6D8E0F1G2H3J4K5L6M
DATABASE_URL=postgresql://prodadmin:Xk9mP2vR7nLqW4jF@db.securebank.internal:5432/securebank_prod
Hasil Lokal: ✅ DETECTED
$ gitleaks detect --source securebank-api/configs/.env.production -v --no-git
Finding: AWS_ACCESS_KEY_ID=AKIA3E4Y5Z6X7W8Q9R0T
RuleID: aws-access-token
Finding: AWS_SECRET_ACCESS_KEY=7hGjKmNpQrStUvWxYz2B4C6D8E0F1G2H3J4K5L6M
RuleID: generic-api-key
leaks found: 2 ✅
Gitleaks berhasil deteksi dua secret saat scan langsung ke file.
Hasil di CI: ❌ NOT DETECTED
$ gitleaks detect --source . -v --config .gitleaks.toml
34 commits scanned.
no leaks found ❌
Gitleaks di CI bilang "no leaks found"! Ini gap kritis.
Root Cause: .gitignore vs Gitleaks
Ada dua pertahanan yang bekerja:
.gitignoremencegah accidental commit ✅ —git add configs/.env.productionditolak, butuhgit add -f(force)- Gitleaks men-scan semua file yang tracked di git — TAPI ternyata Gitleaks default menghormati
.gitignore!
Ini artinya: kalau seseorang git add -f .env.production (force-add bypass .gitignore), Gitleaks tidak akan detect file tersebut karena .gitignore memfilternya.
Diagram Pertahanan
Developer coba commit .env.production
│
▼
┌─────────────────┐
│ .gitignore │ ← Pertahanan 1: Block git add biasa ✅
│ (git add -f │
│ bisa bypass) │
└────────┬────────┘
│ force-add
▼
┌─────────────────┐
│ Gitleaks │ ← Pertahanan 2: SHOULD detect ✅
│ (--gitignore │
│ flag default) │ ← BUG: Skip file yang di-gitignore ❌
└─────────────────┘
.gitignore itu convenience feature, bukan security boundary. Tapi Gitleaks default-nya memperlakukan .gitignore sebagai security boundary — skip semua file yang di-list di sana.
Fix: --no-gitignore Flag
Satu baris yang bikin pipeline benar-benar aman:
# SEBELUM (bisa bypass)
- name: Run Gitleaks
run: gitleaks detect --source . -v --config .gitleaks.toml
# SESUDAH (catch everything)
- name: Run Gitleaks
run: gitleaks detect --source . -v --config .gitleaks.toml --no-gitignore
Dengan --no-gitignore, Gitleaks scan SEMUA file yang tracked di git, regardless of .gitignore. Walau seseorang git add -f file .env, Gitleaks tetap detect.
Lesson Learned
1. .gitignore bukan security boundary. Ini cuma convenience feature yang mencegah accidental commit. git add -f bisa bypass. Pipeline secret scanning harus tetap work regardless of .gitignore.
2. Default Gitleaks config itu insufficient untuk CI. Tanpa --no-gitignore, ada gap antara "file yang di-scan" dan "file yang tracked di git". Flag ini WAJIB di CI pipeline.
3. Intentional vulnerability test itu penting. Tanpa hari ini, kita gak bakal tahu bahwa Gitleaks CI gak detect file yang di-gitignore. Ini false sense of security yang dangerous.
4. AWS example keys (AKIAIOSFODNN7EXAMPLE) di-recognize Gitleaks sebagai example keys. Jadi gak di-flag sebagai finding. Buat test, gunakan key pattern yang lebih random.
5. PR context vs branch push berbeda di CI. GitHub Actions workflow hanya trigger di main, develop, dan PR ke main. Untuk test security gate, buat PR lebih realistis.
Lanjut ke Hari 15
Pipeline sekarang punya 5 lapis pertahanan yang terverifikasi:
.gitignore(pertahanan pertama — convenience)- Gitleaks dengan
--no-gitignore(pertahanan kedua — security) - SCA Scan (Trivy)
- SAST Scan (Semgrep)
- Build & Test
Besok: Hari 15 — Dokumentasi Fase 1, rangkum semua yang dipelajari.
Diskusi & Komentar
Hari 13: Threat Modeling STRIDE & DREAD untuk API Perbankan
Next ArticleHari 15: Fase 1 Selesai, 4 Quality Gates, 0 CVE
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.