8.5 KiB
8.5 KiB
Credential Rotation Checklist
Last audited: March 2026
Purpose: Prioritized list of credentials that should be rotated, with exact locations and steps.
After rotating any credential, update it in Vaultwarden (collection: Homelab) as the source of truth before updating the compose file or Portainer stack.
Priority Legend
| Symbol | Meaning |
|---|---|
| 🔴 CRITICAL | Live credential exposed in git — rotate immediately |
| 🟠 HIGH | Sensitive secret that should be rotated soon |
| 🟡 MEDIUM | Lower-risk but should be updated as part of routine rotation |
| 🟢 LOW | Default/placeholder values — change before putting service in production |
🔴 CRITICAL — Rotate Immediately
1. OpenAI API Key
- File:
hosts/vms/homelab-vm/hoarder.yaml:15 - Service: Hoarder AI tagging
- Rotation steps:
- Go to platform.openai.com/api-keys
- Delete the old key
- Create a new key
- Update
hosts/vms/homelab-vm/hoarder.yaml—OPENAI_API_KEY - Save new key in Vaultwarden → Homelab → Hoarder
- Redeploy hoarder stack via Portainer
2. Gmail App Password — Authentik + Joplin SMTP (REDACTED_APP_PASSWORD)
- Files:
hosts/synology/calypso/authentik/docker-compose.yaml(SMTP password)hosts/synology/atlantis/joplin.yml(SMTP password)
- Rotation steps:
- Go to myaccount.google.com/apppasswords
- Revoke the old app password
- Create a new app password (label: "Homelab SMTP")
- Update both files above with the new password
- Save in Vaultwarden → Homelab → Gmail App Passwords
- Redeploy both stacks
3. Gmail App Password — Vaultwarden SMTP (REDACTED_APP_PASSWORD)
- File:
hosts/synology/atlantis/vaultwarden.yaml - Rotation steps: Same as above — create a separate app password per service
- Revoke old, create new
- Update
hosts/synology/atlantis/vaultwarden.yaml—SMTP_PASSWORD - Redeploy vaultwarden stack
4. Gmail App Password — Documenso SMTP (REDACTED_APP_PASSWORD)
- File:
hosts/synology/atlantis/documenso/documenso.yaml:47 - Rotation steps: Same pattern — revoke, create new, update compose, redeploy
5. Gmail App Password — Reactive Resume SMTP (REDACTED_APP_PASSWORD)
- File:
hosts/synology/calypso/reactive_resume_v5/docker-compose.yml - Rotation steps: Same pattern
6. Gitea PAT — retro-site.yaml (now removed)
- Status: ✅ Hardcoded token removed from
retro-site.yaml— now uses${GIT_TOKEN}env var - Action: Revoke the old token
REDACTED_GITEA_TOKENin Gitea- Go to
https://git.vish.gg/user/settings/applications - Revoke the token associated with
retro-site.yaml - The stack now uses the
GIT_TOKENGitea secret — no file update needed
- Go to
7. Gitea PAT — Ansible Playbook (now removed)
- Status: ✅ Hardcoded token removed from
ansible/automation/playbooks/setup_gitea_runner.yml - Action: Revoke the old token
REDACTED_GITEA_TOKENin Gitea- Go to
https://git.vish.gg/user/settings/applications - Revoke the associated token
- Future runs of the playbook will prompt for the token interactively
- Go to
🟠 HIGH — Rotate Soon
8. Authentik Secret Key
- File:
hosts/synology/calypso/authentik/docker-compose.yaml:58,89 - Impact: Rotating this invalidates all active sessions — do during a maintenance window
- Rotation steps:
- Generate a new 50-char random key:
openssl rand -base64 50 - Update
AUTHENTIK_SECRET_KEYin the compose file - Save in Vaultwarden → Homelab → Authentik
- Redeploy — all users will need to re-authenticate
- Generate a new 50-char random key:
9. Mastodon SECRET_KEY_BASE + OTP_SECRET
- File:
hosts/synology/atlantis/mastodon.yml:67-68 - Impact: Rotating breaks all active sessions and 2FA tokens — coordinate with users
- Rotation steps:
- Generate new values:
docker run --rm tootsuite/mastodon bundle exec rake secret docker run --rm tootsuite/mastodon bundle exec rake secret - Update
SECRET_KEY_BASEandOTP_SECRETinmastodon.yml - Save in Vaultwarden → Homelab → Mastodon
- Redeploy
- Generate new values:
10. Grafana OAuth Client Secret (Authentik Provider)
- File:
hosts/vms/homelab-vm/monitoring.yaml:986 - Rotation steps:
- Go to Authentik → Applications → Providers → Grafana provider
- Edit → regenerate client secret
- Copy the new secret
- Update
GF_AUTH_GENERIC_OAUTH_CLIENT_SECRETinmonitoring.yaml - Save in Vaultwarden → Homelab → Grafana OAuth
- Redeploy monitoring stack
🟡 MEDIUM — Routine Rotation
11. Watchtower HTTP API Token (REDACTED_WATCHTOWER_TOKEN)
- Files (must update all at once):
hosts/synology/atlantis/watchtower.ymlhosts/synology/atlantis/grafana_prometheus/prometheus.ymlhosts/synology/atlantis/grafana_prometheus/prometheus_mariushosting.ymlhosts/synology/calypso/grafana_prometheus/prometheus.ymlhosts/synology/setillo/prometheus/prometheus.ymlhosts/synology/calypso/watchtower.yamlcommon/watchtower-enhanced.yamlcommon/watchtower-full.yaml
- Rotation steps:
- Choose a new token:
openssl rand -hex 32 - Update
WATCHTOWER_HTTP_API_TOKENin all watchtower stack files - Update
bearer_tokenin all prometheus.yml scrape configs - Save in Vaultwarden → Homelab → Watchtower
- Redeploy all affected stacks (watchtower first, then prometheus)
- Choose a new token:
12. Shlink API Key
- File:
hosts/vms/homelab-vm/shlink.yml:41 - Rotation steps:
- Log into Shlink admin UI
- Generate a new API key
- Update
DEFAULT_API_KEYinshlink.yml - Save in Vaultwarden → Homelab → Shlink
- Redeploy shlink stack
13. Spotify Client ID + Secret (YourSpotify)
- Files:
hosts/physical/concord-nuc/yourspotify.yamlhosts/vms/bulgaria-vm/yourspotify.yml
- Rotation steps:
- Go to developer.spotify.com/dashboard
- Select the app → Settings → Rotate client secret
- Update both files with new
SPOTIFY_CLIENT_IDandSPOTIFY_CLIENT_SECRET - Save in Vaultwarden → Homelab → Spotify API
- Redeploy both stacks
14. SNMPv3 Auth + Priv Passwords
- Files:
hosts/synology/atlantis/grafana_prometheus/snmp.yml(exporter config)hosts/vms/homelab-vm/monitoring.yaml(prometheus scrape config)
- Note: Must match the SNMPv3 credentials configured on the target devices (Synology NAS, switches)
- Rotation steps:
- Change the SNMPv3 user credentials on each monitored device (DSM → Terminal & SNMP)
- Update
auth_passwordandpriv_passwordinsnmp.yml - Update the corresponding values in
monitoring.yaml - Save in Vaultwarden → Homelab → SNMP
- Redeploy monitoring stack
🟢 LOW — Change Before Production Use
These are clearly placeholder/default values that exist in stacks but are either:
- Not currently deployed in production, or
- Low-impact internal-only services
| Service | File | Credential | Value to Replace |
|---|---|---|---|
| NetBox | hosts/synology/atlantis/netbox.yml |
Superuser password | REDACTED_PASSWORD123! |
| Paperless | hosts/synology/calypso/paperless/docker-compose.yml |
Admin password | REDACTED_PASSWORD123! |
| Seafile | hosts/synology/calypso/seafile-server.yaml |
Admin password | REDACTED_PASSWORD123! |
| Gotify | hosts/vms/homelab-vm/gotify.yml |
Admin password | REDACTED_PASSWORD |
| Invidious (old) | hosts/physical/concord-nuc/invidious/invidious_old/invidious.yaml |
PO token | Rotate if service is active |
Post-Rotation Checklist
After rotating any credential:
- New value saved in Vaultwarden under correct collection/folder
- Compose file updated in git repo
- Stack redeployed via Portainer (or
docker compose up -d --force-recreate) - Service verified healthy (check Uptime Kuma / Portainer logs)
- Old credential revoked at the source (Google, OpenAI, Gitea, etc.)
.secrets.baselineupdated if detect-secrets flags the new value:detect-secrets scan --baseline .secrets.baseline git add .secrets.baseline && git commit -m "chore: update secrets baseline after rotation"