
Hari 22: Pipeline IaC, Dua Scanner Barengan Gagal
Bikin workflow GitHub Actions khusus infrastructure security. Checkov dan Trivy IaC scan Terraform barengan. Hasilnya pipeline MERAH — security gate bekerja!
Pipeline Khusus Infrastructure
Sebelumnya kita punya ci.yml yang scan application code — Gitleaks, Trivy SCA, Semgrep, Build & Test. Hari ini kita bikin workflow baru: infra.yml — khusus untuk scan Terraform.
Kenapa dipisah? Karena pipeline infra dan pipeline aplikasi punya trigger yang berbeda. Pipeline infra cuma perlu jalan saat ada perubahan di file Terraform. Tidak perlu jalan saat main.go diubah. Dengan memisah, kita hemat CI minutes dan pipeline jadi lebih fokus.
Buat infra.yml Workflow
Workflow ini punya 2 jobs yang berjalan paralel:
name: Infrastructure Security
on:
push:
paths:
- 'securebank-api/terraform/**'
- '.github/workflows/infra.yml'
pull_request:
paths:
- 'securebank-api/terraform/**'
- '.github/workflows/infra.yml'
Path filter securebank-api/terraform/** memastikan workflow hanya trigger saat file di direktori Terraform berubah. Push ke main.go atau Dockerfile tidak akan trigger pipeline ini.
Job 1: Checkov (IaC) Scan
checkov-scan:
name: Checkov (IaC) Scan
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Checkov
uses: bridgecrewio/checkov-action@v12
with:
directory: securebank-api/terraform/
framework: terraform
soft_fail: false # ← GAGALKAN pipeline jika ada findings
output_format: sarif
output_file_path: checkov-results.sarif
- name: Upload SARIF to GitHub Security
if: always()
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: checkov-results.sarif
Kunci di sini: soft_fail: false. Default-nya true — findings dicatat tapi pipeline tetap hijau. Dengan false, pipeline gagal kalau ada findings. Ini yang kita mau.
Output formatnya SARIF — standar industri untuk security findings. SARIF di-upload ke GitHub Security tab, jadi findings muncul di repo Security tab dengan lokasi file dan baris yang tepat.
Job 2: Trivy IaC Scan
trivy-iac-scan:
name: Trivy IaC Scan
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Trivy IaC
uses: aquasecurity/trivy-action@master
with:
scan-type: 'config'
scan-ref: 'securebank-api/terraform/'
format: 'json'
output: 'trivy-iac.json'
exit-code: '1' # ← GAGALKAN pipeline jika ada findings
severity: 'CRITICAL,HIGH,MEDIUM,LOW'
Kunci di sini: exit-code: '1'. Trivy mengembalikan exit code 1 kalau ada findings. GitHub Actions menganggap exit code non-zero sebagai failure. Tanpa exit-code: 1, Trivy mengembalikan 0 walaupun ada findings.
tfsec? Skip, Pakai Trivy IaC Saja
Tutorial asli pakai tfsec-action. Tapi tfsec sudah deprecated — Aqua Security mengintegrasikan semua tfsec rules ke Trivy. Jadi trivy config di pipeline = tfsec rule set + extra rules dari Aqua Security. Tidak perlu install tfsec terpisah.
Push dan Lihat Hasilnya
Setelah commit dan push, pipeline otomatis trigger (karena infra.yml ada di path filter). Hasilnya:
Jobs:
X Trivy IaC Scan — FAILED (11s)
X Checkov (IaC) Scan — FAILED (30s)
Pipeline MERAH. Kedua jobs gagal. Ini sesuai expected — Terraform masih intentionally misconfigured dari Day 20.
Checkov Annotations (10 findings)
GitHub Actions menampilkan annotations otomatis di pipeline run:
- CKV2_AWS_6 — S3 no public access block
- CKV_AWS_18 — S3 no access logging
- CKV_AWS_145 — S3 no KMS encryption
- CKV2_AWS_5 — SG not attached to resource
- CKV2_AWS_12 — Default SG doesn't restrict traffic
- CKV_AWS_260 — Ingress 0.0.0.0/0 port 80
- CKV_AWS_23 — SG no description
- CKV_AWS_24 — Ingress 0.0.0.0/0 port 22
- CKV_AWS_25 — Ingress 0.0.0.0/0 port 3389
- CKV_AWS_382 — Egress 0.0.0.0/0 all ports
Trivy IaC: Exit Code 1
Trivy IaC menemukan 14 findings (1 CRITICAL, 6 HIGH, 2 MEDIUM, 5 LOW) dan mengembalikan exit code 1. Pipeline gagal.
Artifacts Uploaded
checkov-sarif— SARIF report dari Checkovtrivy-iac-report— JSON report dari Trivy IaC
Pipeline RED = Security Gate Bekerja
Tujuan hari ini bukan bikin pipeline hijau. Tujuannya memastikan pipeline gagal ketika ada misconfiguration.
Bayangin kalau pipeline tetap hijau padahal ada 15 findings. Itu berarti security gate-nya rusak — findings tidak menggagalkan pipeline. Bahaya, karena tim menganggap semuanya aman.
Pipeline RED hari ini = security gate berfungsi sempurna. Findings terdeteksi, pipeline berhenti, tim harus fix sebelum merge.
Sekarang Punya 2 Pipeline
| Pipeline | File | Trigger | Scan |
|---|---|---|---|
| SecureBank CI | ci.yml |
Semua push/PR | Gitleaks, Trivy SCA, Semgrep, Build & Test |
| Infrastructure Security | infra.yml |
Perubahan terraform/** |
Checkov (IaC), Trivy IaC |
Kedua pipeline berjalan independen. Push ke main.go hanya trigger ci.yml. Push ke main.tf hanya trigger infra.yml. Push ke keduanya trigger keduanya.
Lesson Learned
1. soft_fail: false dan exit-code: 1 adalah kunci security gate. Tanpa setting ini, scanning tool akan catat findings tapi pipeline tetap hijau. Findings yang tidak menggagalkan pipeline = findings yang diabaikan.
2. Path filter = efisiensi CI. Workflow hanya trigger saat file yang relevan berubah. Push ke main.go tidak trigger infra pipeline. Hemat CI minutes dan bikin pipeline lebih fokus.
3. SARIF = format standar security findings. Checkov output SARIF, di-upload ke GitHub Security tab lewat codeql-action/upload-sarif. Findings muncul di repo Security tab dengan lokasi file dan baris. Tidak perlu buka report JSON — langsung di UI GitHub.
4. GitHub Actions annotations = visibility. 10 Checkov findings muncul sebagai annotations otomatis di pipeline run. Setiap annotation punya check ID, rule name, dan link ke guideline. Tim bisa langsung lihat apa yang salah tanpa unduh report.
5. Pipeline RED di training = sukses. Tujuan security gate bukan bikin pipeline hijau, tapi memastikan pipeline gagal saat ada issues. Hijau datang setelah issues di-fix (Day 23 besok).
6. tfsec deprecated, Trivy IaC penggantinya. Tidak perlu install tfsec terpisah. trivy config di pipeline = semua tfsec rules + extra dari Aqua Security. Satu tool, dua mode (SCA + IaC).
Kesimpulan
Hari ini kita bikin pipeline infrastructure security yang berjalan otomatis setiap ada perubahan Terraform. Dua scanner (Checkov + Trivy IaC) berjalan paralel, keduanya menggagalkan pipeline ketika ada misconfiguration.
Pipeline MERAH hari ini bukan kegagalan — itu bukti security gate bekerja. Findings terdeteksi, SARIF ter-upload ke GitHub Security, artifacts tersimpan.
Sekarang repo punya 2 pipeline: ci.yml untuk application security (Fase 1) dan infra.yml untuk infrastructure security (Fase 2). Kedua pipeline independen dengan trigger yang berbeda.
Besok: Hari 23 — IaC Remediation — fix semua misconfiguration di Terraform hingga pipeline infra menjadi hijau. Dari MERAH ke HIJAU.
Diskusi & Komentar
Hari 21: Checkov vs Trivy IaC, Mana Lebih Jago?
Next ArticleHari 22 Bonus: Perbaikan Pipeline Gitleaks yang Merah Diam-diam
Artikel Terkait
Hari 20: Terraform + Checkov, 15 Celah IaC Ketahuan
Bikin infrastructure as code pakai Terraform, lalu scan dengan Checkov. Hasilnya 15 celah keamanan ketahuan — S3 tanpa enkripsi, security group terbuka ke dunia.
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.
Hari 25: DAST Otomatis di CI Pipeline
ZAP baseline scan otomatis di GitHub Actions setiap push. Pakai Go binary langsung bukan Docker — lebih ringan. Hasil: 66 pass, 1 warn, pipeline merah.