spinny:~/writing $ vim devsecops-shift-left-security-guide.md
1~2Kerentanan yang ditemukan saat menulis kode hanya membutuhkan waktu beberapa menit untuk diperbaiki oleh developer. Kerentanan yang sama jika tertangkap di production menghabiskan satu sprint penuh. Dan jika penyerang menemukannya lebih dulu, biayanya jutaan dolar. Ini adalah argumen inti di balik **shift-left security** - memindahkan pemeriksaan keamanan sedini mungkin dalam siklus pengembangan.3~4DevSecOps mengambil ide ini dan mengubahnya menjadi praktik: keamanan bukan fase terpisah di akhir, melainkan proses berkelanjutan yang dijalin ke setiap tahap pengembangan, dari baris kode pertama hingga deployment production.5~6## Biaya Keamanan yang Terlambat7~8Laporan Cost of a Data Breach dari IBM secara konsisten menunjukkan bahwa biaya perbaikan masalah keamanan tumbuh secara eksponensial semakin lambat ditemukan:9~10| Tahap | Biaya Perbaikan | Waktu Perbaikan |11|-------|------------|-------------|12| **IDE / Local Dev** | Menit | Detik hingga menit |13| **Code Review / PR** | Jam | Menit hingga jam |14| **CI/CD Pipeline** | Hari | Jam hingga hari |15| **Staging / QA** | Minggu | Hari |16| **Production** | Bulan | Minggu hingga bulan |17| **Post-breach** | Jutaan ($) | Bulan hingga tahun |18~19Kesimpulannya jelas: setiap tahap yang Anda pindahkan keamanan lebih awal menghemat satu orde besaran dalam biaya dan waktu.20~21## Pipeline DevSecOps22~23Pipeline DevSecOps yang matang mengintegrasikan pemeriksaan keamanan di setiap tahap:24~25```mermaid26graph LR27 IDE[IDE / Editor] --> PC[Pre-commit Hooks]28 PC --> PR[Pull Request]29 PR --> CI[CI Pipeline]30 CI --> Build[Build / Package]31 Build --> Deploy[Deploy]32 Deploy --> Runtime[Runtime / Production]33~34 IDE -.- S1[SAST\nSecret Detection\nLinting]35 PC -.- S2[Secrets Scan\nFormat Check]36 PR -.- S3[Code Review\nDependency Audit]37 CI -.- S4[SAST\nSCA\nContainer Scan\nSBOM]38 Build -.- S5[Image Signing\nArtifact Verification]39 Deploy -.- S6[Policy Enforcement\nAdmission Control]40 Runtime -.- S7[DAST\nWAF\nMonitoring]41```42~43Mari kita uraikan setiap tahap dengan tools dan konfigurasi konkret.44~45## Tahap 1: Keamanan di IDE46~47Loop umpan balik tercepat. Tangkap kerentanan bahkan sebelum Anda menyimpan file.48~49### Tools yang Direkomendasikan50~51- **Semgrep**: analisis statis ringan dengan community rules untuk kerentanan OWASP52- **Snyk IDE Extension**: pemindaian kerentanan dependency secara real-time53- **GitLens + GitLeaks**: deteksi secrets di editor Anda54- **ESLint Security Plugins**: `eslint-plugin-security` untuk Node.js, `eslint-plugin-no-unsanitized` untuk DOM XSS55~56### Contoh: Konfigurasi ESLint Security57~58```json59{60 "extends": ["eslint:recommended"],61 "plugins": ["security", "no-unsanitized"],62 "rules": {63 "security/detect-object-injection": "warn",64 "security/detect-non-literal-regexp": "warn",65 "security/detect-unsafe-regex": "error",66 "security/detect-buffer-noassert": "error",67 "security/detect-eval-with-expression": "error",68 "security/detect-no-csrf-before-method-override": "error",69 "security/detect-possible-timing-attacks": "warn",70 "no-unsanitized/method": "error",71 "no-unsanitized/property": "error"72 }73}74```75~76## Tahap 2: Pre-commit Hooks77~78Garis pertahanan kedua. Berjalan otomatis sebelum setiap commit, memblokir kode berbahaya dari masuk ke repository.79~80### Gitleaks: Tangkap Secrets Sebelum Masuk ke Git81~82Kesalahan keamanan paling umum di codebase adalah meng-commit secrets - API keys, database passwords, tokens. Begitu secret masuk ke git history, sangat sulit untuk dihapus sepenuhnya (bahkan dengan force pushes, fork dan cache mungkin tetap menyimpannya).83~84```yaml85# .pre-commit-config.yaml86repos:87 - repo: https://github.com/gitleaks/gitleaks88 rev: v8.21.089 hooks:90 - id: gitleaks91~92 - repo: https://github.com/semgrep/semgrep93 rev: v1.90.094 hooks:95 - id: semgrep96 args: ['--config', 'auto']97```98~99Install dan aktivasi:100~101```bash102pip install pre-commit103pre-commit install104```105~106Sekarang setiap `git commit` secara otomatis memindai secrets yang bocor dan kerentanan umum. Jika sesuatu ditemukan, commit diblokir.107~108### Custom Gitleaks Rules109~110Anda dapat menambahkan pola kustom untuk secrets organisasi Anda:111~112```toml113# .gitleaks.toml114title = "Custom Gitleaks Config"115~116[[rules]]117id = "internal-api-key"118description = "Internal API key detected"119regex = '''INTERNAL_KEY_[A-Za-z0-9]{32}'''120tags = ["key", "internal"]121```122~123## Tahap 3: Keamanan CI/CD Pipeline124~125Di sinilah pekerjaan berat terjadi. Pipeline CI Anda harus menjalankan beberapa pemindaian keamanan pada setiap pull request.126~127### SAST (Static Application Security Testing)128~129Tools SAST menganalisis source code tanpa mengeksekusinya, mencari pola yang mengindikasikan kerentanan.130~131```yaml132# .github/workflows/security.yml133name: Security Scan134on:135 pull_request:136 branches: [main]137~138jobs:139 sast:140 name: Static Analysis141 runs-on: ubuntu-latest142 steps:143 - uses: actions/checkout@v4144~145 - name: Run Semgrep146 uses: semgrep/semgrep-action@v1147 with:148 config: >-149 p/owasp-top-ten150 p/typescript151 p/nodejs152 p/react153 generateSarif: true154~155 - name: Upload SARIF156 uses: github/codeql-action/upload-sarif@v3157 with:158 sarif_file: semgrep.sarif159```160~161Ruleset `p/owasp-top-ten` dari Semgrep menangkap kerentanan paling umum: SQL injection, XSS, SSRF, path traversal, insecure deserialization, dan lainnya.162~163### SCA (Software Composition Analysis)164~165SCA memindai dependency Anda untuk kerentanan yang diketahui. Ini sangat penting - lebih dari 80% kode aplikasi modern berasal dari dependency open-source.166~167```yaml168 dependency-scan:169 name: Dependency Audit170 runs-on: ubuntu-latest171 steps:172 - uses: actions/checkout@v4173~174 - name: Run Snyk175 uses: snyk/actions/node@master176 env:177 SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}178 with:179 args: --severity-threshold=high180~181 - name: npm audit182 run: npm audit --audit-level=high183```184~185### Container Security dengan Trivy186~187Jika Anda membangun Docker images, memindainya untuk kerentanan adalah hal yang esensial. **Trivy** adalah container scanner open-source paling populer.188~189```yaml190 container-scan:191 name: Container Security192 runs-on: ubuntu-latest193 steps:194 - uses: actions/checkout@v4195~196 - name: Build image197 run: docker build -t my-app:${{ github.sha }} .198~199 - name: Run Trivy200 uses: aquasecurity/trivy-action@master201 with:202 image-ref: my-app:${{ github.sha }}203 format: 'sarif'204 output: 'trivy-results.sarif'205 severity: 'CRITICAL,HIGH'206 exit-code: '1'207~208 - name: Upload Trivy SARIF209 uses: github/codeql-action/upload-sarif@v3210 with:211 sarif_file: trivy-results.sarif212```213~214### Pembuatan SBOM215~216**Software Bill of Materials (SBOM)** adalah inventaris lengkap setiap komponen dalam aplikasi Anda. Semakin diperlukan oleh framework kepatuhan dan regulasi pemerintah (US Executive Order on Cybersecurity mewajibkan SBOM untuk software federal).217~218```yaml219 sbom:220 name: Generate SBOM221 runs-on: ubuntu-latest222 steps:223 - uses: actions/checkout@v4224~225 - name: Generate SBOM with Syft226 uses: anchore/sbom-action@v0227 with:228 format: spdx-json229 output-file: sbom.spdx.json230~231 - name: Upload SBOM232 uses: actions/upload-artifact@v4233 with:234 name: sbom235 path: sbom.spdx.json236```237~238## Tahap 4: Docker Images yang Aman239~240Docker image production harus mengikuti prinsip least privilege. Inilah tampilan Dockerfile yang diperkuat:241~242```dockerfile243# Build stage244FROM node:22-alpine AS builder245WORKDIR /app246COPY package.json package-lock.json ./247RUN npm ci248COPY . .249RUN npm run build250~251# Production stage252FROM node:22-alpine AS runner253WORKDIR /app254~255# Install dumb-init before dropping root256RUN apk add --no-cache dumb-init257~258# Don't run as root259RUN addgroup -S app && adduser -S app -G app260~261# Copy only what's needed262COPY --from=builder --chown=app:app /app/dist ./dist263COPY --from=builder --chown=app:app /app/node_modules ./node_modules264COPY --from=builder --chown=app:app /app/package.json ./265~266# Drop to non-root user267USER app268ENTRYPOINT ["dumb-init", "--"]269~270# Health check271HEALTHCHECK --interval=30s --timeout=3s --retries=3 \272 CMD wget -qO- http://localhost:3000/health || exit 1273~274EXPOSE 3000275CMD ["node", "dist/server.js"]276```277~278Praktik utama:279~2801. **Gunakan multi-stage builds**: tahap builder memiliki dev dependencies; tahap runner hanya memiliki kode production2812. **Jangan jalankan sebagai root**: buat pengguna non-root dan beralih ke pengguna tersebut2823. **Gunakan Alpine images**: permukaan serangan lebih kecil (lebih sedikit paket terinstal secara default)2834. **Pin versi image**: `node:22-alpine` alih-alih `node:latest` untuk menghindari serangan supply chain2845. **Gunakan `npm ci`**: instalasi deterministik dari lock file, bukan `npm install`285~286## Tahap 5: Secret Management287~288Hard-coded secrets adalah penyebab nomor satu pelanggaran dalam insiden yang disebabkan developer.289~290### Yang TIDAK Boleh Dilakukan291~292```typescript293// NEVER do this294const API_KEY = "sk-1234567890abcdef";295const DB_PASSWORD = "supersecret123";296~297const client = new Client({298 connectionString: `postgres://admin:${DB_PASSWORD}@db.example.com/prod`299});300```301~302### Yang Harus Dilakukan Sebagai Gantinya303~304```typescript305// Use environment variables306const client = new Client({307 connectionString: process.env.DATABASE_URL308});309~310// Or use a secret manager311import { SecretManagerServiceClient } from '@google-cloud/secret-manager';312~313const client = new SecretManagerServiceClient();314const [version] = await client.accessSecretVersion({315 name: 'projects/my-project/secrets/db-password/versions/latest',316});317const dbPassword = version.payload?.data?.toString();318```319~320### Hierarki Secret Management321~322```mermaid323graph TD324 A[Secret Manager\nAWS Secrets Manager\nGCP Secret Manager\nHashiCorp Vault] --> B[Best: Rotated, audited, centralized]325 C[Environment Variables\nInjected at deploy time] --> D[Good: Not in code, but static]326 E[.env files\nWith .gitignore] --> F[Acceptable: Local development only]327 G[Hard-coded in source] --> H[NEVER: Instant breach risk]328~329 style A fill:#d4edda330 style C fill:#fff3cd331 style E fill:#ffeeba332 style G fill:#f8d7da333```334~335## OWASP Top 10: Referensi Cepat336~337Setiap developer harus mengetahui OWASP Top 10. Versi ringkas:338~339| # | Kerentanan | Apa Itu | Pencegahan |340|---|--------------|-----------|------------|341| 1 | **Broken Access Control** | Pengguna mengakses resource yang seharusnya tidak boleh | Tolak secara default, validasi di sisi server |342| 2 | **Cryptographic Failures** | Enkripsi lemah, data plaintext | Gunakan algoritma kuat (AES-256, bcrypt), TLS di mana-mana |343| 3 | **Injection** | SQL, NoSQL, OS command injection | Parameterized queries, validasi input |344| 4 | **Insecure Design** | Arsitektur yang cacat | Threat modeling, pola desain yang aman |345| 5 | **Security Misconfiguration** | Credential default, cloud buckets terbuka | Default yang diperkuat, audit konfigurasi otomatis |346| 6 | **Vulnerable Components** | CVE yang diketahui dalam dependency | Pemindaian SCA, pembaruan rutin |347| 7 | **Auth Failures** | Password lemah, session rusak | MFA, rate limiting, manajemen session yang aman |348| 8 | **Data Integrity Failures** | Update yang tidak ditandatangani, CI/CD tidak tepercaya | Code signing, SBOM, integritas pipeline |349| 9 | **Logging Failures** | Tidak ada audit trail | Logging terstruktur, alerting pada anomali |350| 10 | **SSRF** | Server-side request forgery | Allowlist URL keluar, validasi input |351~352## Workflow GitHub Actions Security Lengkap353~354Workflow lengkap dan siap production yang menggabungkan semua hal di atas:355~356```yaml357# .github/workflows/security.yml358name: Security Pipeline359on:360 pull_request:361 branches: [main]362 push:363 branches: [main]364~365permissions:366 contents: read367 security-events: write368~369jobs:370 secrets-scan:371 name: Secret Detection372 runs-on: ubuntu-latest373 steps:374 - uses: actions/checkout@v4375 with:376 fetch-depth: 0377 - uses: gitleaks/gitleaks-action@v2378 env:379 GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}380~381 sast:382 name: Static Analysis (SAST)383 runs-on: ubuntu-latest384 steps:385 - uses: actions/checkout@v4386 - uses: semgrep/semgrep-action@v1387 with:388 config: p/owasp-top-ten p/typescript p/nodejs389~390 dependency-audit:391 name: Dependency Scan (SCA)392 runs-on: ubuntu-latest393 steps:394 - uses: actions/checkout@v4395 - uses: actions/setup-node@v4396 with:397 node-version: 22398 - run: npm ci399 - run: npm audit --audit-level=high400 - uses: snyk/actions/node@master401 env:402 SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}403 with:404 args: --severity-threshold=high405 continue-on-error: true406~407 container-scan:408 name: Container Scan409 runs-on: ubuntu-latest410 needs: [sast, dependency-audit]411 steps:412 - uses: actions/checkout@v4413 - run: docker build -t app:${{ github.sha }} .414 - uses: aquasecurity/trivy-action@master415 with:416 image-ref: app:${{ github.sha }}417 severity: CRITICAL,HIGH418 exit-code: '1'419~420 sbom:421 name: SBOM Generation422 runs-on: ubuntu-latest423 needs: [container-scan]424 steps:425 - uses: actions/checkout@v4426 - uses: anchore/sbom-action@v0427 with:428 format: spdx-json429 output-file: sbom.spdx.json430```431~432```mermaid433graph TD434 PR[Pull Request] --> S1[Secret Detection]435 PR --> S2[SAST - Semgrep]436 PR --> S3[SCA - Snyk + npm audit]437 S2 --> S4[Container Scan - Trivy]438 S3 --> S4439 S4 --> S5[SBOM Generation]440 S5 --> Deploy[Deploy]441~442 S1 -.- F1[Block if secrets found]443 S2 -.- F2[Block on critical vulns]444 S3 -.- F3[Block on high severity]445 S4 -.- F4[Block on critical CVEs]446```447~448## Metrik yang Harus Dilacak449~450Bagaimana Anda tahu program DevSecOps Anda berhasil? Lacak metrik-metrik ini:451~452- **Mean time to remediate (MTTR)**: seberapa cepat Anda memperbaiki kerentanan setelah deteksi453- **Vulnerability escape rate**: persentase kerentanan yang mencapai production454- **False positive rate**: terlalu banyak false positive menyebabkan kelelahan alert dan peringatan yang diabaikan455- **Dependency freshness**: usia rata-rata dependency Anda (lebih tua = lebih mungkin memiliki CVE yang diketahui)456- **SBOM coverage**: persentase proyek dengan SBOM yang up-to-date457~458## Memulai: Roadmap Praktis459~460Jangan coba mengimplementasikan semuanya sekaligus. Pendekatan bertahap bekerja lebih baik:461~462```mermaid463flowchart TD464 A[Week 1-2: Foundations] --> B[Week 3-4: CI/CD Integration]465 B --> C[Month 2: Container Security]466 C --> D[Month 3+: Advanced]467~468 A --> A1[Add Gitleaks pre-commit hooks]469 A --> A2[Enable npm audit in CI]470 A --> A3[Add .gitignore for .env files]471~472 B --> B1[Add Semgrep to GitHub Actions]473 B --> B2[Add Snyk dependency scanning]474 B --> B3[Set up SARIF upload to GitHub]475~476 C --> C1[Add Trivy container scanning]477 C --> C2[Harden Dockerfiles]478 C --> C3[Generate SBOMs]479~480 D --> D1[Secret manager integration]481 D --> D2[Runtime protection - DAST]482 D --> D3[Policy as code - OPA]483```484~485## Kesimpulan486~487DevSecOps bukan tentang menambahkan lebih banyak tools ke pipeline Anda - ini tentang menjadikan keamanan bagian alami dari cara Anda membangun software. Tujuannya bukan memblokir setiap PR dengan peringatan keamanan, melainkan memberikan umpan balik cepat kepada developer sehingga mereka bisa memperbaiki masalah saat kode masih segar di pikiran mereka.488~489Mulai dengan dasar-dasarnya: pre-commit hooks untuk secrets, dependency scanning di CI, dan container scanning untuk Docker images. Kemudian iterasi berdasarkan kebutuhan tim Anda.490~491Keamanan bukan fitur yang Anda kirim sekali. Ini adalah praktik yang Anda bangun ke dalam setiap commit.492~493> **DevSecOps Starter Checklist:**494>495> - [x] Gitleaks pre-commit hooks terinstal496> - [x] File .env dan secret di .gitignore497> - [x] Semgrep SAST di CI pipeline498> - [x] Snyk atau npm audit untuk pemindaian dependency499> - [x] Trivy untuk pemindaian container image500> - [x] Pengguna non-root di Dockerfiles501> - [x] Secrets di environment variables atau secret manager502> - [x] Pembuatan SBOM pada setiap release503> - [x] Kesadaran OWASP Top 10 di seluruh tim504~
NORMAL · devsecops-shift-left-security-guide.md [readonly]504 lines · :q to close