Mengamankan pipeline CI/CD yang kini menjadi target serangan utama: secret scanning dengan gitleaks, hardening GitHub Actions dari pinned action hingga OIDC pengganti long-lived credentials, dan security gates proporsional yang membuat rilis tetap cepat tanpa membuka celah

Setelah di episode 10 kita mengeraskan container, episode ini mengamankan tempat semuanya berjalan otomatis: pipeline CI/CD. Mengapa pipeline jadi target? Karena ia adalah titik di mana kode semua developer bertemu, secret tersimpan, dan artifact production lahir — satu kompromi pipeline memberi penyerang akses ke seluruh sistem sekaligus. Insiden seperti SolarWinds dan serangan tj-actions/changed-files (2025) membuktikan supply chain via CI bukan teori.
Tiga blok materi: menjaga secret tidak bocor (scanning), menghardaskan runner & workflow itu sendiri, lalu menanam security gates yang proporsional — melengkapi SAST/SCA/image scan dari episode sebelumnya menjadi pipeline utuh.
Secret di repository adalah temuan nomor satu yang paling mudah dicegah. Pola insidennya selalu sama: developer debug pakai API key asli → commit → push → key terekspos permanen (git history). Solusinya dua lapis:
Lapis 1 — pre-commit hook (mencegah commit keluar dari mesin):
cat > .pre-commit-config.yaml << 'EOF'
repos:
- repo: https://github.com/gitleaks/gitleaks
rev: v8.24.3
hooks:
- id: gitleaks
EOF
pre-commit install
gitleaks git --pre-commit --redact -vLapis 2 — scan di CI (menjaga bila lapis 1 dilewati --no-verify):
gitleaks detect --source . --report-path leaks.json --redact -vDan aturan respons wajib yang harus tertulis di proses tim: secret yang pernah ter-push dianggap kompromi, apa pun lamanya. Rotasi dulu, bersihkan history kemudian (git filter-repo) — urutannya tidak boleh dibalik, karena history cleanup tidak memberitahu siapa pun yang sudah clone.
Workflow YAML modern adalah kode eksekusi dengan izin cloud — perlakukan seperti kode sensitif.
uses: actions/checkout@v4 merujuk tag mutable — kalau repo upstream dikompromi, kalian ikut terinfeksi saat rebuild:
# Dapatkan SHA terbaru untuk tag v4
git ls-remote https://github.com/actions/checkout.git refs/tags/v4steps:
# rentan terhadap tag hijack
- uses: actions/checkout@v4
# aman: immutable reference
- uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v4.1.7Default GITHUB_TOKEN sering lebih luas dari kebutuhan. Kunci di level workflow, longgarkan hanya jika job butuh:
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write # hanya job ini yang push image
steps:
- run: echo "build & push"Kesalahan klasik organisasi: menyimpan AWS access key permanen di GitHub Secrets untuk deploy. Key itu bisa bocor lewat log, fork PR abuse, atau compromised runner. Alternatif modern: OIDC federation — workflow bertukar token ephemeral langsung dengan cloud provider:
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
id-token: write # minta OIDC token
contents: read
steps:
- uses: aws-actions/configure-aws-credentials@<sha> # pin SHA
with:
role-to-assume: arn:aws:iam::123456789012:role/gha-deploy
aws-region: ap-southeast-1Tidak ada secret yang tersimpan; trust relationship di IAM role membatasi repo + branch mana yang boleh assume. Masa hidup token 1 jam. Ini pola yang harus jadi default untuk semua deployment baru.
Important
Fork pull request dapat membaca secret repo publik jika workflow-nya salah konfigurasi. Aturan mutlak: job yang berjalan pada event pull_request_target dengan checkout kode PR tidak boleh punya akses secret. Audit workflow yang menggunakan trigger ini.
Sekarang rakit semua scanner dari episode 7–10 menjadi gate yang masuk akal:
| Gate | Trigger | Gagal Bila |
|---|---|---|
| gitleaks | Setiap push/PR | Ada secret baru |
| Semgrep | Setiap PR | Temuan ERROR baru vs baseline |
| Trivy fs (SCA) | Setiap PR + harian | CRITICAL dengan fix |
| Trivy image | Build release | CRITICAL dengan fix |
| ZAP baseline | Nightly staging | FAIL rule aktif |
Prinsip desain gate yang saya pegang:
security-waiver), karena gate tanpa pressure valve akan dimatikan total oleh manajemen saat deadline.echo $SECRET di step debug membocorkannya ke log publik repo open source. Gunakan masking bawaan + hindari print env.Inti yang harus dibawa pulang:
Di episode 12 kita masuk sisi manusia dari tooling: Security Code Review — metodologi review manual yang menemukan apa yang scanner lewatkan, cara memprioritaskan file mana yang layak dibaca mendalam, dan teknik komunikasi agar rekomendasi kalian benar-benar dieksekusi developer. Sampai jumpa di episode 12!