1.8 KiB
1.8 KiB
ANTI-PATTERN: Secrets im Code
KONTEXT
Django-Projekte, Docker-Container, CI/CD-Pipelines.
WAS IST PASSIERT?
# 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
# 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
# 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)
# 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,tokenin Codebase
CHECKLISTE
.envin.gitignore?- Keine Secrets in Docker Images?
- CI/CD Variables als "masked" markiert?
- Secret Rotation dokumentiert?