Credential Rotation Runbook: Rotating the Sigils
owner: “Security Operations” classification: “RESTRICTED” tags: [“credentials”, “rotation”, “secrets”, “api-keys”, “fido2”, “gpg”]
Section titled “owner: “Security Operations” classification: “RESTRICTED” tags: [“credentials”, “rotation”, “secrets”, “api-keys”, “fido2”, “gpg”]”1. Purpose
Section titled “1. Purpose”This runbook governs Rotating the Sigils — the periodic renewal of all cryptographic credentials used by the Alter.
2. Rotation Schedule
Section titled “2. Rotation Schedule”| Credential | Frequency | Owner | Automation |
|---|---|---|---|
| VirusTotal API Key | 90 days | SecOps | Manual (VT console) |
| AbuseIPDB API Key | 90 days | SecOps | Manual (AbuseIPDB console) |
| OTX AlienVault Key | 90 days | SecOps | Manual (OTX console) |
| Tailscale Auth Key | 180 days | NetOps | tailscale authkey create |
| GPG Signing Key | 365 days | Evidence Custodian | Manual ceremony |
| FIDO2 Resident Key | 365 days | Evidence Custodian | fido2-token re-enroll |
| Container Registry Token | 90 days | Platform | CI/CD pipeline |
| Tetragon gRPC Cert | 365 days | Platform | cert-manager |
3. Rotation Procedures
Section titled “3. Rotation Procedures”3.1 VirusTotal / AbuseIPDB / OTX Keys
Section titled “3.1 VirusTotal / AbuseIPDB / OTX Keys”- Generate new key in provider console
- Update in secret store:
Terminal window synos-secrets set VT_API_KEY <new-key>synos-secrets set ABUSEIPDB_API_KEY <new-key>synos-secrets set OTX_API_KEY <new-key> - Update enrich cache:
Terminal window rm -rf /tmp/enrich-cacheenrich-iocs.sh test/sample.json --no-vt --no-abuseipdb --no-otx - Verify:
Terminal window enrich-iocs.sh test/sample.json | jq '.enrichment[].source'
3.2 Tailscale Auth Key
Section titled “3.2 Tailscale Auth Key”# Create new key (reusable, ephemeral=false)tailscale authkey create --reusable --tag=chamber-node --expiry=180d
# Update in all chamber nodes (via Ansible/salt)ansible chamber-nodes -m shell -a "tailscale up --authkey=<new-key>"3.3 GPG Signing Key
Section titled “3.3 GPG Signing Key”- Generate new subkey on offline machine:
Terminal window gpg --expert --full-gen-key# Select: RSA (sign only), 4096 bits, 1y expiry - Export public key:
Terminal window gpg --export --armor <key-id> > /opt/synos/keys/evidence-signing.pub - Update sign-evidence.sh to use new key:
Terminal window sign-evidence.sh --key <new-key-id> ... - Revoke old subkey after 30-day overlap:
Terminal window gpg --revoke <old-subkey-id>
3.4 FIDO2 Resident Key
Section titled “3.4 FIDO2 Resident Key”- Enroll new credential on FIDO2 token:
Terminal window fido2-token -M -i <credential-id> /dev/hidraw0 - Update sign-evidence.sh:
Terminal window sign-evidence.sh --fido2 --key <new-credential-id> ... - Verify:
Terminal window sign-evidence.sh MAL-TEST-001 verify --fido2
3.5 Container Registry Token
Section titled “3.5 Container Registry Token”# GitHub Container Registrygh auth token | docker login ghcr.io -u <user> --password-stdin
# Update in CI/CDgh secret set CONTAINER_TOKEN --body "<token>" -R Lum0s-Solutions/synos4. Verification Checklist
Section titled “4. Verification Checklist”After each rotation, verify:
- All services authenticate with new credentials
- Enrichment pipeline works (
enrich-iocs.sh test) - Evidence signing works (
sign-evidence.sh test verify) - Tailscale mesh connected (
tailscale status) - CI/CD builds pass
5. Emergency Rotation
Section titled “5. Emergency Rotation”If credential compromise suspected:
- Immediately revoke compromised credential
- Generate replacement
- Deploy to all affected systems within 1 hour
- Audit access logs for anomalous activity
- Document in incident log
6. Contacts
Section titled “6. Contacts”| Credential | Owner | Backup |
|---|---|---|
| VT/AbuseIPDB/OTX | @secops-lead | @secops-backup |
| Tailscale | @netops-lead | @netops-backup |
| GPG/FIDO2 | @evidence-custodian | @evidence-backup |
| Container/Registry | @platform-lead | @platform-backup |