# ANTI-PATTERN: Secrets im Code ## KONTEXT Django-Projekte, Docker-Container, CI/CD-Pipelines. ## WAS IST PASSIERT? ```python # SCHLECHT: Secrets hardcoded DATABASES = { 'default': { 'PASSWORD': 'super_secret_123', # Im Git! } } # SCHLECHT: API-Key im Code STRIPE_API_KEY = 'sk_live_abc123...' # SCHLECHT: Im Dockerfile ENV DATABASE_PASSWORD=production_password ``` ## WARUM WAR ES SCHLECHT? - **Security Breach:** Jeder mit Repo-Zugang hat die Credentials - **Git History:** Selbst nach Löschen bleibt der Commit in der History - **Rotation:** Passwort-Änderung erfordert Code-Deployment - **Compliance:** Verstößt gegen SOC2, GDPR, PCI-DSS ## DIE BESSERE ALTERNATIVE ### Django Settings ```python # GUT: Environment Variables import os DATABASES = { 'default': { 'PASSWORD': os.environ.get('DATABASE_PASSWORD'), } } # Oder mit django-environ import environ env = environ.Env() environ.Env.read_env() # .env Datei DATABASE_PASSWORD = env('DATABASE_PASSWORD') ``` ### Docker / Kubernetes ```yaml # GUT: Kubernetes Secret apiVersion: v1 kind: Secret metadata: name: db-credentials type: Opaque stringData: password: ${PASSWORD} # Wird beim Deploy injiziert # Deployment env: - name: DATABASE_PASSWORD valueFrom: secretKeyRef: name: db-credentials key: password ``` ### CI/CD (GitLab) ```yaml # GUT: CI/CD Variables (masked) deploy: script: - echo "$DATABASE_PASSWORD" # Aus GitLab Variables ``` ## ERKENNUNGSREGELN - Pre-commit Hook: `detect-secrets` - GitLab/GitHub Secret Scanning aktivieren - grep nach `password`, `secret`, `key`, `token` in Codebase ## CHECKLISTE - [ ] `.env` in `.gitignore`? - [ ] Keine Secrets in Docker Images? - [ ] CI/CD Variables als "masked" markiert? - [ ] Secret Rotation dokumentiert?