La regola cardinale
Qualsiasi cosa committata in Git e permanente fino a riscrittura attiva della storia.
Livello 1: mai committare segreti
# .env.example
DATABASE_URL=postgres://localhost/myapp
JWT_SECRET=replace-me
# .gitignore
.env
.env.local
.env.*.local
*.pem
*.key
secrets/
Livello 2: rilevamento pre-commit
brew install gitleaks
repos:
- repo: https://github.com/gitleaks/gitleaks
rev: v8.18.0
hooks:
- id: gitleaks
gitleaks detect --redact --source=.
Livello 3: rifiuto lato server
Un hook pre-receive sul server puo rifiutare push contenenti segreti.
Livello 4: scansione CI
- uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Livello 5: segreti criptati in Git
sops -e -i secrets.yaml
sops secrets.yaml
git add secrets.yaml
git commit -m "Update encrypted secrets"
Se un segreto trapela
- Ruotare immediatamente.
- Auditare i log di utilizzo.
- Riscrivere la storia.
- Force-push.
- Notificare.
# patterns.txt
AKIAIOSFODNN7EXAMPLE==>REDACTED
sk_live_abc123==>REDACTED
Recupero sull'host
Anche dopo force-push, GitHub mantiene commit "dangling" accessibili per SHA per qualche tempo.