Skip to content

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”]”

This runbook governs Rotating the Sigils — the periodic renewal of all cryptographic credentials used by the Alter.

CredentialFrequencyOwnerAutomation
VirusTotal API Key90 daysSecOpsManual (VT console)
AbuseIPDB API Key90 daysSecOpsManual (AbuseIPDB console)
OTX AlienVault Key90 daysSecOpsManual (OTX console)
Tailscale Auth Key180 daysNetOpstailscale authkey create
GPG Signing Key365 daysEvidence CustodianManual ceremony
FIDO2 Resident Key365 daysEvidence Custodianfido2-token re-enroll
Container Registry Token90 daysPlatformCI/CD pipeline
Tetragon gRPC Cert365 daysPlatformcert-manager
  1. Generate new key in provider console
  2. 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>
  3. Update enrich cache:
    Terminal window
    rm -rf /tmp/enrich-cache
    enrich-iocs.sh test/sample.json --no-vt --no-abuseipdb --no-otx
  4. Verify:
    Terminal window
    enrich-iocs.sh test/sample.json | jq '.enrichment[].source'
Terminal window
# 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>"
  1. Generate new subkey on offline machine:
    Terminal window
    gpg --expert --full-gen-key
    # Select: RSA (sign only), 4096 bits, 1y expiry
  2. Export public key:
    Terminal window
    gpg --export --armor <key-id> > /opt/synos/keys/evidence-signing.pub
  3. Update sign-evidence.sh to use new key:
    Terminal window
    sign-evidence.sh --key <new-key-id> ...
  4. Revoke old subkey after 30-day overlap:
    Terminal window
    gpg --revoke <old-subkey-id>
  1. Enroll new credential on FIDO2 token:
    Terminal window
    fido2-token -M -i <credential-id> /dev/hidraw0
  2. Update sign-evidence.sh:
    Terminal window
    sign-evidence.sh --fido2 --key <new-credential-id> ...
  3. Verify:
    Terminal window
    sign-evidence.sh MAL-TEST-001 verify --fido2
Terminal window
# GitHub Container Registry
gh auth token | docker login ghcr.io -u <user> --password-stdin
# Update in CI/CD
gh secret set CONTAINER_TOKEN --body "<token>" -R Lum0s-Solutions/synos

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

If credential compromise suspected:

  1. Immediately revoke compromised credential
  2. Generate replacement
  3. Deploy to all affected systems within 1 hour
  4. Audit access logs for anomalous activity
  5. Document in incident log
CredentialOwnerBackup
VT/AbuseIPDB/OTX@secops-lead@secops-backup
Tailscale@netops-lead@netops-backup
GPG/FIDO2@evidence-custodian@evidence-backup
Container/Registry@platform-lead@platform-backup