
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 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.