Secret rotation runbook Akira
Routine settimanale
Il workflow GitHub Actions secret-rotation-reminder.yml legge
infra/group_vars/all/_secrets_manifest.yml e apre una issue quando trova
secret oltre la finestra di rotazione.
Manual check
./scripts/check_secrets_age.sh
Check alternativo, senza Ansible e adatto a CI:
python3 scripts/check_secrets_age.py
Rotation procedure
ansible-playbook -i infra/inventory/staging.yml \
infra/playbooks/rotate_secrets.yml \
--tags rotate \
--vault-password-file ~/.akira-vault-pass.txt
Il playbook chiede il nome del secret, conferma esplicita e genera un nuovo valore one-shot. Dopo la generazione:
-
Apri il vault cifrato:
ansible-vault edit infra/group_vars/all/vault.yml \--vault-password-file ~/.akira-vault-pass.txt -
Sostituisci il valore del secret ruotato.
-
Aggiorna
infra/group_vars/all/_secrets_manifest.ymlimpostandolast_rotationalla data corrente. -
Re-deploy dei service owner indicati dal manifest.
-
Esegui smoke test post-rotation.
-
Commit di
vault.ymlcifrato e manifest aggiornato sul branch task.
Re-deploy owner
Usa il campo owner_service del manifest per scegliere il playbook:
ansible-playbook -i infra/inventory/staging.yml infra/playbooks/deploy_management.yml \
--vault-password-file ~/.akira-vault-pass.txt
ansible-playbook -i infra/inventory/staging.yml infra/playbooks/deploy_signaling.yml \
--vault-password-file ~/.akira-vault-pass.txt
ansible-playbook -i infra/inventory/staging.yml infra/playbooks/deploy_stateful.yml \
--vault-password-file ~/.akira-vault-pass.txt
Smoke test
ansible-playbook -i infra/inventory/staging.yml infra/playbooks/smoketest.yml \
--vault-password-file ~/.akira-vault-pass.txt
Periodicita' raccomandate
- JWT secret: 30gg
- DB passwords: 90gg
- Service passwords (Redis, Kamailio, FreeSWITCH ESL): 90gg
- API tokens esterni (hcloud, SMTP, IMAP, AI provider): 180gg
- SSH key e backup long-lived: 365gg
- External service token low-touch (SignalWire, Telegram): 365gg
Note operative
Il manifest non contiene valori segreti. Ogni secret aggiunto a
infra/group_vars/all/vault.yml deve avere una voce corrispondente in
_secrets_manifest.yml, altrimenti resta fuori dai reminder automatici.