claude-vault/knowledge/anti-patterns/secrets-in-code.md
2026-02-04 16:49:53 +01:00

87 lines
1.8 KiB
Markdown

# 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?