DevSecOps: Integrasikan Keamanan ke dalam CI/CD

Foto oleh Unsplash
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.
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.
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.
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.
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.

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.
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.
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 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.
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.sarifGunakan 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.
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.
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/[email protected]
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 rulesPipeline 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.
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.
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.