Die Kardinalregel
Alles in Git committet ist permanent bis zur aktiven Umschreibung.
Schicht 1: niemals Geheimnisse committen
# .env.example
DATABASE_URL=postgres://localhost/myapp
JWT_SECRET=replace-me
# .gitignore
.env
.env.local
.env.*.local
*.pem
*.key
secrets/
Schicht 2: Pre-Commit-Erkennung
brew install gitleaks
repos:
- repo: https://github.com/gitleaks/gitleaks
rev: v8.18.0
hooks:
- id: gitleaks
gitleaks detect --redact --source=.
Schicht 3: server-seitige Ablehnung
Ein pre-receive-Hook auf dem Server kann Pushes mit Geheimnissen ablehnen.
Schicht 4: CI-Scan
- uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Schicht 5: verschlusselte Geheimnisse in Git
sops -e -i secrets.yaml
sops secrets.yaml
git add secrets.yaml
git commit -m "Update encrypted secrets"
Wenn ein Geheimnis durchsickert
- Sofort rotieren.
- Nutzungslogs auditieren.
- Historie umschreiben.
- Force-Push.
- Benachrichtigen.
# patterns.txt
AKIAIOSFODNN7EXAMPLE==>REDACTED
sk_live_abc123==>REDACTED
Wiederherstellung auf dem Host
Selbst nach Force-Push behalt GitHub "dangling" Commits zugreifbar fur SHA fur einige Zeit.