87 lines
1.8 KiB
Markdown
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?
|