Passa al contenuto principale

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:

  1. Apri il vault cifrato:

    ansible-vault edit infra/group_vars/all/vault.yml \
    --vault-password-file ~/.akira-vault-pass.txt
  2. Sostituisci il valore del secret ruotato.

  3. Aggiorna infra/group_vars/all/_secrets_manifest.yml impostando last_rotation alla data corrente.

  4. Re-deploy dei service owner indicati dal manifest.

  5. Esegui smoke test post-rotation.

  6. Commit di vault.yml cifrato 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.