1. Centralize Secret Management
- Use a proper vault (AWS Secrets Manager, GCP Secret Manager, HashiCorp Vault, Doppler, 1Password, etc.).
- Grant IAM roles or service accounts granular access; never share master credentials between services.
- Version secrets just like code so you know when a JWT signing key changed.
2. Keep Secrets Out of Git
- Treat
.envfiles as build artifacts, not source files. Generate them from your vault during deployment. - If you must keep a
.env.example, replace real secrets with placeholders and document the required length/format. - Use
git-secretsor pre-commit hooks to scan for Base64/hex patterns that resemble keys.
3. Automate Rotation
- Schedule a rotation window (e.g., every 90 days) and tie it to CI/CD pipelines.
- For JWT/HMAC keys, deploy the new version alongside the old one. Accept both for a limited time, then delete the old entry.
- For API keys, expose a self-serve regeneration button that invalidates the previous key after a configurable delay.
4. Monitor Access
- Emit audit logs whenever a secret is read, created, or destroyed.
- Feed those logs into your SIEM to watch for unusual spikes or access from unknown hosts.
- Alert the owning team immediately when a key is read outside of a deployment window.
5. Test Locally Without Risk
- Generate throwaway values with our Secret Key Generator or format-specific tools such as the Webhook Secret Generator.
- Inject them into Docker Compose files via environment variables so you do not need to commit them.
- After testing, destroy temporary values and clean your shell history.
Well-managed secrets mean you ship faster and sleep better. Take a few minutes to audit your flows and update anything that still relies on copy-pasted strings.
