Skip to main content
BlogDevOps

DevSecOps: Integrasikan Keamanan ke dalam CI/CD

Terapkan shift-left security dengan DevSecOps: integrasikan SAST, DAST, SCA, container image scanning, dan deteksi secret langsung ke dalam pipeline CI/CD GitHub Actions dengan contoh workflow nyata.

Matthews Wong

Software Engineer

November 202410 menit baca
DevSecOps: Integrasikan Keamanan ke dalam CI/CD

Foto oleh Unsplash

DevSecOps mengintegrasikan pengujian keamanan langsung ke dalam siklus delivery perangkat lunak, bukan menjadikannya fase terpisah setelah pengembangan selesai. Pendekatan 'shift-left' berarti setiap pull request secara otomatis dipindai untuk mencari kerentanan, secret yang terekspos, dan dependensi yang tidak aman — menangkap masalah ketika biaya perbaikannya paling rendah: sebelum mencapai production. Artikel ini memandu pembangunan pipeline DevSecOps praktis menggunakan GitHub Actions, Semgrep, Trivy, Gitleaks, dan OWASP ZAP.

Shift-Left Security: Pipeline DevSecOps

Pipeline CI/CD DevSecOps yang matang menjalankan beberapa security gate secara paralel: Static Application Security Testing (SAST) menganalisis source code untuk mencari kerentanan, Software Composition Analysis (SCA) memindai dependensi untuk CVE yang diketahui, deteksi secret memindai kredensial yang tidak sengaja di-commit, dan container image scanning memastikan image Docker Anda tidak membawa kerentanan yang diketahui. Setiap gate memiliki kriteria lulus/gagal yang jelas dan memblokir deployment saat menemukan temuan kritis.

SAST dan Dependency Scanning dengan Semgrep dan Trivy

Semgrep adalah tool SAST open-source dengan ratusan aturan yang selaras dengan OWASP. Tool ini memindai source code untuk SQL injection, XSS, secret yang di-hardcode, dan penggunaan API yang tidak aman. Trivy adalah scanner serbaguna yang menangani pemindaian dependensi filesystem (npm, pip, go.mod) dan container image scanning. Menjalankan keduanya di setiap pull request memberikan umpan balik langsung tentang regresi keamanan yang diperkenalkan oleh suatu perubahan.

# .github/workflows/devsecops.yml — Security gates in CI/CD
name: DevSecOps Pipeline
on: [push, pull_request]

jobs:
  sast:
    name: Static Analysis (SAST)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run Semgrep SAST
        uses: semgrep/semgrep-action@v1
        with:
          config: p/owasp-top-ten

  dependency-scan:
    name: Dependency Vulnerability Scan
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run Trivy on dependencies
        uses: aquasecurity/trivy-action@master
        with:
          scan-type: fs
          scan-ref: .
          severity: CRITICAL,HIGH
          exit-code: 1   # Fail build on critical/high vulns

  secrets-detection:
    name: Secrets Detection
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: gitleaks/gitleaks-action@v2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Container Image Scanning dalam Pipeline

Container image adalah permukaan serangan yang umum — base image seperti ubuntu:latest atau node:18 sering memiliki CVE yang diketahui dalam paket yang terinstall. Trivy image scanning memeriksa manifes image terhadap database CVE (NVD, GitHub Advisory Database) dan melaporkan kerentanan berdasarkan tingkat keparahan. Mengintegrasikan output SARIF dengan tab Security GitHub memberi Anda catatan permanen dari semua temuan di seluruh repositori Anda.

Build Docker Image dan Scanning Sebelum Push

Security gate berjalan setelah langkah Docker build tetapi sebelum push ke registry. Jika Trivy menemukan kerentanan critical atau high severity, langkah GitHub Actions keluar dengan kode 1, memblokir push. Langkah upload SARIF menggunakan if: always() untuk memastikan temuan dicatat bahkan saat build gagal — memberi tim keamanan visibilitas tentang apa yang diblokir dan alasannya.

# Container image scanning with Trivy
  container-scan:
    name: Container Image Scan
    runs-on: ubuntu-latest
    needs: [sast]
    steps:
      - uses: actions/checkout@v4

      - name: Build Docker image
        run: docker build -t myapp:${{ github.sha }} .

      - name: Scan image with Trivy
        uses: aquasecurity/trivy-action@master
        with:
          image-ref: myapp:${{ github.sha }}
          format: sarif
          output: trivy-results.sarif
          severity: CRITICAL,HIGH
          exit-code: 1

      - name: Upload SARIF to GitHub Security
        uses: github/codeql-action/upload-sarif@v3
        if: always()
        with:
          sarif_file: trivy-results.sarif

Gunakan policy-as-code untuk pengecualian kerentanan. Daripada hardcode threshold severity, pertahankan file .security/policy.yml yang menentukan CVE ID mana yang diterima dengan tanggal kedaluwarsa dan justifikasi. Ini menciptakan audit trail yang dapat diaudit dari keputusan risiko yang diterima dan secara otomatis mengakhiri pengecualian agar ditinjau secara berkala.

Dynamic Application Security Testing (DAST)

DAST menguji aplikasi yang sedang berjalan dengan mengirimkan request HTTP yang dikustomisasi untuk menemukan kerentanan keamanan yang hanya muncul saat runtime — hal-hal seperti autentikasi yang rusak, insecure direct object reference, dan header CORS yang salah konfigurasi yang tidak bisa dideteksi SAST hanya dengan melihat kode. OWASP ZAP adalah tool DAST open-source yang paling banyak digunakan, dan GitHub Action-nya membuat integrasi menjadi mudah.

OWASP ZAP Baseline Scan terhadap Staging

ZAP baseline scan adalah passive scan yang tidak secara aktif menyerang aplikasi — ia merayapi situs, mengamati respons, dan menandai masalah keamanan tanpa mengirimkan payload berbahaya. Aman untuk dijalankan terhadap environment staging di setiap CI/CD run. Untuk pengujian yang lebih menyeluruh, ZAP full scan mencakup aturan active attack tetapi sebaiknya dijalankan lebih jarang dan di environment yang terisolasi.

# DAST with OWASP ZAP against a staging environment
  dast:
    name: Dynamic Analysis (DAST)
    runs-on: ubuntu-latest
    needs: [container-scan]
    steps:
      - name: ZAP Baseline Scan
        uses: zaproxy/action-baseline@v0.12.0
        with:
          target: https://staging.myapp.com
          rules_file_name: .zap/rules.tsv
          cmd_options: >
            -I            # ignore warnings (only fail on alerts)
            -j            # output JSON report
            -a            # include alpha active scan rules
False Positive akan Menghambat Adopsi

Pipeline DevSecOps yang memblokir setiap build dengan false positive akan segera dilewati atau dinonaktifkan oleh developer yang frustrasi. Mulailah hanya dengan aturan yang memiliki kepercayaan tinggi, setel threshold secara konservatif (hanya CRITICAL dan HIGH, bukan MEDIUM), dan tetapkan proses yang jelas untuk menerima false positive dengan justifikasi. Tooling keamanan harus membantu developer, bukan menggangu mereka.

Deteksi Secret dan Keamanan Supply Chain

Gitleaks memindai seluruh riwayat Git untuk mencari kredensial yang tidak sengaja di-commit — AWS key, GitHub token, password database, JWT secret. Menjalankannya dengan fetch-depth: 0 memindai setiap commit di repositori, bukan hanya yang terbaru. Untuk keamanan supply chain, generate dan publikasikan Software Bill of Materials (SBOM) menggunakan Syft atau mode pembuatan SBOM Trivy — ini mendokumentasikan setiap dependensi dalam container image Anda untuk keperluan compliance dan respons insiden.

Konsep Kunci DevSecOps

Terminologi DevSecOps penting yang akan Anda temui di lapangan: SAST, DAST, SCA, CVE, shift-left security, and SBOM.

DevSecOps adalah pergeseran budaya sekaligus pergeseran teknis. Mulailah dengan langkah kecil: tambahkan Gitleaks untuk mencegah secret masuk ke repositori, kemudian tambahkan Trivy dependency scanning, lalu container scanning. Rayakan keberhasilan ketika pipeline menangkap kerentanan nyata. Investasikan dalam pelatihan keamanan bagi developer agar tim memahami mengapa gate tersebut ada — tim yang memahami konteks keamanan secara proaktif menulis kode yang lebih aman.

Artikel Terkait

FAQ

Pertanyaan Umum

Jawaban singkat untuk pertanyaan yang paling sering diajukan pembaca tentang topik ini.

Tool apa saja yang digunakan dalam pipeline DevSecOps di artikel ini, dan apa fungsi masing-masing?

Pipeline ini menggunakan Semgrep untuk SAST (memindai source code untuk kerentanan seperti SQL injection dan XSS), Trivy untuk dependency scanning (npm, pip, go.mod) sekaligus container image scanning terhadap database CVE, Gitleaks untuk deteksi secret di seluruh riwayat Git, dan OWASP ZAP untuk DAST terhadap environment staging. Setiap tool menargetkan permukaan serangan yang berbeda sehingga menjalankan keempatnya bersama memberikan cakupan keamanan yang luas di setiap pull request.

Apa perbedaan antara SAST dan DAST, dan mengapa pipeline ini menggunakan keduanya?

SAST (Static Application Security Testing) menganalisis source code tanpa menjalankan aplikasi, menangkap masalah seperti secret yang di-hardcode dan penggunaan API yang tidak aman. DAST (Dynamic Application Security Testing) mengirimkan request HTTP yang dikustomisasi ke aplikasi yang sedang berjalan untuk menemukan kerentanan seperti autentikasi yang rusak, insecure direct object reference, dan header CORS yang salah konfigurasi — hal-hal yang tidak bisa dideteksi SAST hanya dari kode. Menggunakan keduanya memastikan cakupan saat compile time dan saat runtime.

Bagaimana pipeline menangani temuan keamanan — apakah deployment diblokir secara otomatis?

Ya. Jika Trivy menemukan kerentanan critical atau high severity saat container image scanning, langkah GitHub Actions keluar dengan kode 1 yang memblokir push ke registry. Langkah upload SARIF menggunakan if: always() agar temuan tetap tercatat meskipun build gagal, sehingga tim keamanan memiliki audit trail permanen tentang apa yang diblokir dan alasannya.

Apa pendekatan yang disarankan untuk mengelola false positive tanpa menghambat produktivitas developer?

Artikel ini menyarankan untuk memulai hanya dengan aturan yang memiliki kepercayaan tinggi dan menyetel threshold secara konservatif — hanya menandai temuan CRITICAL dan HIGH, bukan MEDIUM. Disarankan pula menetapkan proses yang jelas untuk menerima false positive dengan justifikasi tertulis. Menggunakan file policy-as-code (.security/policy.yml) untuk melacak CVE ID yang diterima beserta tanggal kedaluwarsa dan justifikasinya menciptakan audit trail yang dapat diaudit dan memaksa tinjauan berkala atas pengecualian.

Bagaimana pipeline menangani keamanan supply chain di luar pemindaian kode aplikasi?

Gitleaks memindai seluruh riwayat Git (menggunakan fetch-depth: 0) untuk menangkap kredensial yang tidak sengaja di-commit seperti AWS key, GitHub token, dan JWT secret. Selain itu, artikel ini merekomendasikan untuk generate dan mempublikasikan Software Bill of Materials (SBOM) menggunakan Syft atau mode pembuatan SBOM Trivy, yang mendokumentasikan setiap dependensi dalam container image untuk keperluan audit compliance dan respons insiden.