spinny:~/writing $ less devsecops-shift-left-security-guide.md
12Eine Schwachstelle, die beim Schreiben von Code entdeckt wird, kostet einen Entwickler Minuten zur Behebung. Dieselbe Schwachstelle, die erst in der Produktion entdeckt wird, kostet einen Sprint. Und wenn ein Angreifer sie zuerst findet, kostet es Millionen. Das ist das Kernargument hinter **Shift-Left Security** - Sicherheitspruefungen so frueh wie moeglich im Entwicklungszyklus durchzufuehren.34DevSecOps nimmt diese Idee und macht sie zur Praxis: Sicherheit ist keine separate Phase am Ende, sondern ein kontinuierlicher Prozess, der in jede Entwicklungsphase eingewoben ist - von der ersten Codezeile bis zum Produktions-Deployment.56## Die Kosten spaeter Sicherheit78Der IBM Cost of a Data Breach Report hat durchgehend gezeigt, dass die Kosten fuer die Behebung von Sicherheitsproblemen exponentiell steigen, je spaeter sie entdeckt werden:910| Phase | Kosten der Behebung | Zeitaufwand |11|-------|---------------------|-------------|12| **IDE / Lokale Entwicklung** | Minuten | Sekunden bis Minuten |13| **Code Review / PR** | Stunden | Minuten bis Stunden |14| **CI/CD Pipeline** | Tage | Stunden bis Tage |15| **Staging / QA** | Wochen | Tage |16| **Produktion** | Monate | Wochen bis Monate |17| **Nach einem Angriff** | Millionen ($) | Monate bis Jahre |1819Die Schlussfolgerung ist klar: Jede Phase, um die Sie Sicherheit vorverlegen, spart eine Groessenordnung an Kosten und Zeit.2021## Die DevSecOps Pipeline2223Eine ausgereifte DevSecOps Pipeline integriert Sicherheitspruefungen in jeder Phase:2425```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]3334 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```4243Gehen wir jede Phase mit konkreten Tools und Konfigurationen durch.4445## Phase 1: Sicherheit in der IDE4647Die schnellste Feedback-Schleife. Schwachstellen erkennen, bevor Sie die Datei ueberhaupt speichern.4849### Empfohlene Tools5051- **Semgrep**: leichtgewichtige statische Analyse mit Community-Regeln fuer OWASP-Schwachstellen52- **Snyk IDE Extension**: Echtzeit-Schwachstellenscanning fuer Abhaengigkeiten53- **GitLens + GitLeaks**: Secrets in Ihrem Editor erkennen54- **ESLint Security Plugins**: `eslint-plugin-security` fuer Node.js, `eslint-plugin-no-unsanitized` fuer DOM XSS5556### Beispiel: ESLint Security-Konfiguration5758```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```7576## Phase 2: Pre-commit Hooks7778Die zweite Verteidigungslinie. Laueft automatisch vor jedem Commit und verhindert, dass gefaehrlicher Code ins Repository gelangt.7980### Gitleaks: Secrets abfangen, bevor sie Git erreichen8182Der haeufigste Sicherheitsfehler in Codebasen ist das Committen von Secrets - API Keys, Datenbankpasswoerter, Tokens. Sobald ein Secret in der Git-Historie landet, ist es extrem schwer, es vollstaendig zu entfernen (selbst mit Force-Pushes koennen Forks und Caches es beibehalten).8384```yaml85# .pre-commit-config.yaml86repos:87 - repo: https://github.com/gitleaks/gitleaks88 rev: v8.21.089 hooks:90 - id: gitleaks9192 - repo: https://github.com/semgrep/semgrep93 rev: v1.90.094 hooks:95 - id: semgrep96 args: ['--config', 'auto']97```9899Installieren und aktivieren:100101```bash102pip install pre-commit103pre-commit install104```105106Jetzt scannt jeder `git commit` automatisch nach geleakten Secrets und gaengigen Schwachstellen. Wenn etwas gefunden wird, wird der Commit blockiert.107108### Benutzerdefinierte Gitleaks-Regeln109110Sie koennen benutzerdefinierte Muster fuer die Secrets Ihrer Organisation hinzufuegen:111112```toml113# .gitleaks.toml114title = "Custom Gitleaks Config"115116[[rules]]117id = "internal-api-key"118description = "Internal API key detected"119regex = '''INTERNAL_KEY_[A-Za-z0-9]{32}'''120tags = ["key", "internal"]121```122123## Phase 3: CI/CD Pipeline Security124125Hier geschieht die eigentliche Arbeit. Ihre CI Pipeline sollte bei jedem Pull Request mehrere Sicherheitsscans durchfuehren.126127### SAST (Static Application Security Testing)128129SAST-Tools analysieren Quellcode ohne ihn auszufuehren und suchen nach Mustern, die auf Schwachstellen hinweisen.130131```yaml132# .github/workflows/security.yml133name: Security Scan134on:135 pull_request:136 branches: [main]137138jobs:139 sast:140 name: Static Analysis141 runs-on: ubuntu-latest142 steps:143 - uses: actions/checkout@v4144145 - name: Run Semgrep146 uses: semgrep/semgrep-action@v1147 with:148 config: >-149 p/owasp-top-ten150 p/typescript151 p/nodejs152 p/react153 generateSarif: true154155 - name: Upload SARIF156 uses: github/codeql-action/upload-sarif@v3157 with:158 sarif_file: semgrep.sarif159```160161Das Semgrep-Ruleset `p/owasp-top-ten` erkennt die haeufigsten Schwachstellen: SQL Injection, XSS, SSRF, Path Traversal, Insecure Deserialization und mehr.162163### SCA (Software Composition Analysis)164165SCA scannt Ihre Abhaengigkeiten auf bekannte Schwachstellen. Dies ist entscheidend - ueber 80% des Codes moderner Anwendungen stammt aus Open-Source-Abhaengigkeiten.166167```yaml168 dependency-scan:169 name: Dependency Audit170 runs-on: ubuntu-latest171 steps:172 - uses: actions/checkout@v4173174 - name: Run Snyk175 uses: snyk/actions/node@master176 env:177 SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}178 with:179 args: --severity-threshold=high180181 - name: npm audit182 run: npm audit --audit-level=high183```184185### Container Security mit Trivy186187Wenn Sie Docker Images erstellen, ist das Scannen auf Schwachstellen unerlaesslich. **Trivy** ist der beliebteste Open-Source Container Scanner.188189```yaml190 container-scan:191 name: Container Security192 runs-on: ubuntu-latest193 steps:194 - uses: actions/checkout@v4195196 - name: Build image197 run: docker build -t my-app:${{ github.sha }} .198199 - 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'207208 - name: Upload Trivy SARIF209 uses: github/codeql-action/upload-sarif@v3210 with:211 sarif_file: trivy-results.sarif212```213214### SBOM-Generierung215216Eine **Software Bill of Materials (SBOM)** ist ein vollstaendiges Inventar jeder Komponente in Ihrer Anwendung. Sie wird zunehmend von Compliance-Frameworks und staatlichen Vorschriften verlangt (die US Executive Order on Cybersecurity schreibt SBOM fuer Bundessoftware vor).217218```yaml219 sbom:220 name: Generate SBOM221 runs-on: ubuntu-latest222 steps:223 - uses: actions/checkout@v4224225 - name: Generate SBOM with Syft226 uses: anchore/sbom-action@v0227 with:228 format: spdx-json229 output-file: sbom.spdx.json230231 - name: Upload SBOM232 uses: actions/upload-artifact@v4233 with:234 name: sbom235 path: sbom.spdx.json236```237238## Phase 4: Sichere Docker Images239240Ein Produktions-Docker-Image sollte dem Prinzip der geringsten Berechtigung folgen. So sieht ein gehaertetes Dockerfile aus:241242```dockerfile243# Build stage244FROM node:22-alpine AS builder245WORKDIR /app246COPY package.json package-lock.json ./247RUN npm ci248COPY . .249RUN npm run build250251# Production stage252FROM node:22-alpine AS runner253WORKDIR /app254255# Install dumb-init before dropping root256RUN apk add --no-cache dumb-init257258# Don't run as root259RUN addgroup -S app && adduser -S app -G app260261# 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 ./265266# Drop to non-root user267USER app268ENTRYPOINT ["dumb-init", "--"]269270# Health check271HEALTHCHECK --interval=30s --timeout=3s --retries=3 \272 CMD wget -qO- http://localhost:3000/health || exit 1273274EXPOSE 3000275CMD ["node", "dist/server.js"]276```277278Wichtige Praktiken:2792801. **Multi-Stage Builds verwenden**: Die Builder-Phase enthaelt Entwicklungsabhaengigkeiten; die Runner-Phase enthaelt nur Produktionscode2812. **Nicht als Root ausfuehren**: Erstellen Sie einen Nicht-Root-Benutzer und wechseln Sie zu diesem2823. **Alpine Images verwenden**: Kleinere Angriffsflaeche (weniger Pakete standardmaessig installiert)2834. **Image-Versionen festlegen**: `node:22-alpine` statt `node:latest`, um Supply-Chain-Angriffe zu vermeiden2845. **`npm ci` verwenden**: Deterministische Installationen aus der Lock-Datei, nicht `npm install`285286## Phase 5: Secret Management287288Hartcodierte Secrets sind die haeufigste Ursache fuer Sicherheitsverletzungen bei entwicklerverursachten Vorfaellen.289290### Was Sie NICHT tun sollten291292```typescript293// NEVER do this294const API_KEY = "sk-1234567890abcdef";295const DB_PASSWORD = "supersecret123";296297const client = new Client({298 connectionString: `postgres://admin:${DB_PASSWORD}@db.example.com/prod`299});300```301302### Was Sie stattdessen tun sollten303304```typescript305// Use environment variables306const client = new Client({307 connectionString: process.env.DATABASE_URL308});309310// Or use a secret manager311import { SecretManagerServiceClient } from '@google-cloud/secret-manager';312313const 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```319320### Secret Management Hierarchie321322```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]328329 style A fill:#d4edda330 style C fill:#fff3cd331 style E fill:#ffeeba332 style G fill:#f8d7da333```334335## Die OWASP Top 10: Eine Kurzreferenz336337Jeder Entwickler sollte die OWASP Top 10 kennen. Kurzfassung:338339| # | Schwachstelle | Was ist das | Praevention |340|---|---------------|-------------|-------------|341| 1 | **Broken Access Control** | Benutzer greifen auf Ressourcen zu, auf die sie keinen Zugriff haben sollten | Standardmaessig verweigern, serverseitig validieren |342| 2 | **Cryptographic Failures** | Schwache Verschluesselung, Klartext-Daten | Starke Algorithmen verwenden (AES-256, bcrypt), ueberall TLS |343| 3 | **Injection** | SQL, NoSQL, OS Command Injection | Parametrisierte Abfragen, Eingabevalidierung |344| 4 | **Insecure Design** | Fehlerhafte Architektur | Threat Modeling, sichere Entwurfsmuster |345| 5 | **Security Misconfiguration** | Standard-Zugangsdaten, offene Cloud-Buckets | Gehaertete Standardwerte, automatisierte Konfigurations-Audits |346| 6 | **Vulnerable Components** | Bekannte CVEs in Abhaengigkeiten | SCA Scanning, regelmaessige Updates |347| 7 | **Auth Failures** | Schwache Passwoerter, fehlerhafte Sessions | MFA, Rate Limiting, sicheres Session Management |348| 8 | **Data Integrity Failures** | Unsignierte Updates, nicht vertrauenswuerdige CI/CD | Code Signing, SBOM, Pipeline-Integritaet |349| 9 | **Logging Failures** | Keine Audit-Trails | Strukturiertes Logging, Alarmierung bei Anomalien |350| 10 | **SSRF** | Server-Side Request Forgery | Allowlist fuer ausgehende URLs, Eingaben validieren |351352## Vollstaendiger GitHub Actions Security Workflow353354Ein vollstaendiger, produktionsreifer Workflow, der alles oben Genannte kombiniert:355356```yaml357# .github/workflows/security.yml358name: Security Pipeline359on:360 pull_request:361 branches: [main]362 push:363 branches: [main]364365permissions:366 contents: read367 security-events: write368369jobs: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 }}380381 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/nodejs389390 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: true406407 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'419420 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```431432```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]441442 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```447448## Metriken zum Verfolgen449450Wie wissen Sie, ob Ihr DevSecOps-Programm funktioniert? Verfolgen Sie diese Metriken:451452- **Mean Time to Remediate (MTTR)**: Wie schnell Sie Schwachstellen nach der Erkennung beheben453- **Vulnerability Escape Rate**: Prozentsatz der Schwachstellen, die die Produktion erreichen454- **False Positive Rate**: Zu viele False Positives fuehren zu Alarmmmuedigkeit und ignorierten Warnungen455- **Dependency Freshness**: Durchschnittsalter Ihrer Abhaengigkeiten (aelter = hoehere Wahrscheinlichkeit bekannter CVEs)456- **SBOM Coverage**: Prozentsatz der Projekte mit aktuellen SBOMs457458## Erste Schritte: Ein praktischer Fahrplan459460Versuchen Sie nicht, alles auf einmal umzusetzen. Ein phasenweiser Ansatz funktioniert besser:461462```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]467468 A --> A1[Add Gitleaks pre-commit hooks]469 A --> A2[Enable npm audit in CI]470 A --> A3[Add .gitignore for .env files]471472 B --> B1[Add Semgrep to GitHub Actions]473 B --> B2[Add Snyk dependency scanning]474 B --> B3[Set up SARIF upload to GitHub]475476 C --> C1[Add Trivy container scanning]477 C --> C2[Harden Dockerfiles]478 C --> C3[Generate SBOMs]479480 D --> D1[Secret manager integration]481 D --> D2[Runtime protection - DAST]482 D --> D3[Policy as code - OPA]483```484485## Fazit486487DevSecOps bedeutet nicht, weitere Tools zu Ihrer Pipeline hinzuzufuegen - es geht darum, Sicherheit zu einem natuerlichen Bestandteil der Softwareentwicklung zu machen. Das Ziel ist nicht, jeden PR mit Sicherheitswarnungen zu blockieren, sondern Entwicklern schnelles Feedback zu geben, damit sie Probleme beheben koennen, solange der Code noch frisch im Gedaechtnis ist.488489Beginnen Sie mit den Grundlagen: Pre-commit Hooks fuer Secrets, Dependency Scanning in CI und Container Scanning fuer Docker Images. Dann iterieren Sie basierend auf den Beduerfnissen Ihres Teams.490491Sicherheit ist kein Feature, das man einmal ausliefert. Es ist eine Praxis, die man in jeden Commit einbaut.492493> **DevSecOps Starter Checkliste:**494>495> - [x] Gitleaks Pre-commit Hooks installiert496> - [x] .env und Secret-Dateien in .gitignore497> - [x] Semgrep SAST in CI Pipeline498> - [x] Snyk oder npm audit fuer Dependency Scanning499> - [x] Trivy fuer Container Image Scanning500> - [x] Nicht-Root-Benutzer in Dockerfiles501> - [x] Secrets in Umgebungsvariablen oder Secret Manager502> - [x] SBOM-Generierung bei jedem Release503> - [x] OWASP Top 10 Bewusstsein im gesamten Team504
:DevSecOps fuer Entwickler: Ein praktischer Leitfaden fuer Shift-Left Securitylines 1-504 (END) — press q to close