Hari 22: Pipeline IaC, Dua Scanner Barengan Gagal
5 min read

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!

devsecops
github-actions
checkov
trivy
iac-security
ci-cd
60-days-challenge
Share

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 Checkov
  • trivy-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.

Repo: github.com/stayrelevantid/chalange-devsecops

Enjoyed this article? Share it!

Share

Diskusi & Komentar

Artikel Terkait