Backup & Recovery
O que precisa de backup
Server
| Arquivo | Conteudo | Critico? |
|---|---|---|
/var/lib/tatuzim/config.json |
Salt + KDF params + wrapped DEK | Sim |
/var/lib/tatuzim/db.enc |
Vault Stoolap criptografado (todo o estado) | Sim |
/var/lib/tatuzim/server.crt |
Cert TLS do proprio server | Nao (regenera no boot) |
/var/lib/tatuzim/server.key |
Key do server | Nao |
TATUZIM_MASTER_PASSPHRASE |
Senha mestra do vault | Sim — sem ela, backup e inutil |
Agent
| Arquivo | Conteudo | Critico? |
|---|---|---|
/var/lib/tatuzim-agent/identity/agent.crt |
Cert do agent | Nao (re-enroll regenera) |
/var/lib/tatuzim-agent/identity/agent.key |
Key do agent | Nao |
/var/lib/tatuzim-agent/state/processed.json |
Idempotencia | Nice-to-have |
Resumo: backup focado no server (e na passphrase). Agents sao descartaveis — re-enroll resolve.
step-ca
| Arquivo | Conteudo | Critico? |
|---|---|---|
| Root CA private key | Chave da CA raiz | Catastrofico se perdido |
| Intermediate CA private key | Chave online | Recuperavel (gerar novo intermediate via root offline) |
| Provisioner JWK (encriptado) | Provisioner config | Recuperavel (recriar via init) |
A root CA do step-ca DEVE estar offline em backup separado (USB, paper backup, Bitwarden).
Backup do server (procedimento)
Backup manual
# Server pode estar rodando (config.json + db.enc sao reescritos atomicamente no shutdown)
# Mas pra consistencia maxima, pare o server brevemente:
docker stop dev_tatuzim_server
DATE=$(date +%Y%m%d-%H%M%S)
mkdir -p /backup/tatuzim
docker run --rm \
-v tatuzim_tatuzim_vault:/source:ro \
-v /backup/tatuzim:/dest \
alpine \
sh -c "tar czf /dest/vault-$DATE.tgz -C /source config.json db.enc"
docker start dev_tatuzim_server
# Encrypt o backup (defense in depth — vault ja e encrypted at rest, mas backup geralmente vai pra storage externo)
gpg --symmetric --cipher-algo AES256 /backup/tatuzim/vault-$DATE.tgz
rm /backup/tatuzim/vault-$DATE.tgz
ls -la /backup/tatuzim/
# vault-20260523-193045.tgz.gpgBackup automatizado via cron
# /etc/cron.d/tatuzim-backup
0 3 * * * root /usr/local/bin/tatuzim-backup.sh# /usr/local/bin/tatuzim-backup.sh
#!/bin/bash
set -euo pipefail
DATE=$(date +%Y%m%d-%H%M%S)
DEST=/backup/tatuzim
mkdir -p "$DEST"
# Snapshot consistente — usa SIGINT pro server fazer re-seal correto
docker kill --signal=SIGINT dev_tatuzim_server 2>/dev/null || true
sleep 3
docker run --rm \
-v tatuzim_tatuzim_vault:/source:ro \
-v "$DEST":/dest \
alpine \
sh -c "tar czf /dest/vault-$DATE.tgz -C /source config.json db.enc"
docker start dev_tatuzim_server
# Encrypt (passphrase do backup vem de arquivo seguro)
gpg --batch --yes --passphrase-file /etc/tatuzim-backup-pass --symmetric \
"$DEST/vault-$DATE.tgz"
rm "$DEST/vault-$DATE.tgz"
# Rotacionar (manter ultimos 30 dias)
find "$DEST" -name "vault-*.gpg" -mtime +30 -delete
# Replicar pra storage remoto
rclone copy "$DEST/vault-$DATE.tgz.gpg" remote:tatuzim-backups/Verificar integridade do backup
Periodicamente, teste o restore em ambiente separado:
# Em uma maquina de teste
mkdir -p /tmp/tatuzim-restore-test/
gpg --decrypt /backup/tatuzim/vault-LATEST.tgz.gpg | tar xzf - -C /tmp/tatuzim-restore-test/
# Validar que arquivos abrem
docker run --rm --entrypoint /usr/local/bin/tatuzim \
-v /tmp/tatuzim-restore-test:/var/lib/tatuzim:ro \
-e TATUZIM_MASTER_PASSPHRASE=A-PASSPHRASE-DO-BACKUP \
tatuzim-server:dev \
unseal --root /var/lib/tatuzim
# Esperado: "Vault unsealed and verified at /var/lib/tatuzim"
rm -rf /tmp/tatuzim-restore-testRecovery (procedimento)
Cenario: vault do server foi corrompido ou perdido. Voce tem backup + passphrase.
1. Parar o server
docker compose down tatuzim-server2. Limpar vault corrompido
# Backup do estado atual (mesmo que corrompido) antes de tudo
docker run --rm \
-v tatuzim_tatuzim_vault:/source:ro \
-v /tmp:/dest \
alpine \
sh -c "tar czf /dest/vault-corrupted-$(date +%s).tgz -C /source ." || true
docker volume rm tatuzim_tatuzim_vault
docker volume create tatuzim_tatuzim_vault3. Restore do backup
# Decifrar
gpg --decrypt /backup/tatuzim/vault-20260523-193045.tgz.gpg > /tmp/vault-restore.tgz
# Restore pro volume
docker run --rm \
-v tatuzim_tatuzim_vault:/dest \
-v /tmp:/source:ro \
alpine \
sh -c "tar xzf /source/vault-restore.tgz -C /dest"
rm /tmp/vault-restore.tgz4. Validar antes de subir
docker run --rm --entrypoint /usr/local/bin/tatuzim \
-v tatuzim_tatuzim_vault:/var/lib/tatuzim \
-e TATUZIM_MASTER_PASSPHRASE=SUA-PASSPHRASE \
tatuzim-server:dev \
unseal --root /var/lib/tatuzim
# OK = passphrase certa, schema integro5. Subir server
docker compose up -d tatuzim-server
docker logs -f dev_tatuzim_server6. Re-validar agents
Se o backup e antigo, alguns agents podem ter sido enrolados depois — eles nao estarao no DB restaurado. Esses agents vao receber 401 agent_not_registered nas chamadas mTLS e precisam re-enroll.
Pra ver lista atual de agents:
docker stop dev_tatuzim_server
docker run --rm --entrypoint /usr/local/bin/tatuzim \
-v tatuzim_tatuzim_vault:/var/lib/tatuzim \
-e TATUZIM_MASTER_PASSPHRASE=... \
tatuzim-server:dev \
agente list --root /var/lib/tatuzim
docker start dev_tatuzim_serverCompare com lista de VPS ativos. Os que faltarem precisam re-enroll.
Recovery sem backup
Se voce nao tem backup:
- Server: re-init (
docker volume rm tatuzim_tatuzim_vault+ subir tudo do zero) - step-ca: pode reusar a mesma CA (se o volume
stepca_dataesta intacto) - Agents: todos precisam re-enroll (geram nova
agent_id, mas a CA confiada continua a mesma) - Audit log: perdido (sem chance de recuperar eventos passados)
Recovery do step-ca
Cenario: container do step-ca foi destruido.
Caso 1: volume `stepca_data` intacto
docker compose up -d step-ca
# Auto-reusa root CA + intermediate. Recupera o estado completo.Caso 2: volume perdido tambem (catastrofico)
Precisa regenerar a CA inteira. Isso significa:
- Novo root CA (necessita root.pem.bak do paper backup — voce TEM, certo?)
- Novo intermediate CA
- Todos os agents precisam baixar o NOVO
stepca-root.pem(substituir/etc/tatuzim-agent/stepca-root.pem) - Reenroll de todos os agents
- Cert do server tambem precisa ser refeito
Apos isso, sistema funciona — mas voce perdeu o audit log do tatuzim (a menos que tenha backup do vault).
Passphrase: o ponto unico de falha
Sem TATUZIM_MASTER_PASSPHRASE, o vault e inutil — mesmo com backup intacto. Estrategias:
- Password manager (Bitwarden, 1Password) compartilhado com 2+ pessoas confiaveis
- Paper backup em cofre fisico
- Shamir Secret Sharing pra dividir a senha em N partes onde K reconstroem (overkill pro MVP)
Nunca:
- Em CI/CD (env var de pipeline pode vazar)
- Em logs (ja mascarado pelo codigo, mas verifique)
- Em email/chat
Disaster Recovery: checklist
- Backup do vault rolando diariamente (cron)
- Backups replicados em storage externo (rclone pra B2/S3)
- Backup encriptado (GPG)
- Passphrase do backup separada da passphrase do vault
- Passphrase do vault em pelo menos 2 lugares (password manager + paper)
- Root CA do step-ca em paper backup ou USB offline
- Procedimento de restore testado pelo menos 1x (em ambiente nao-prod)
- Tempo de recovery estimado e aceitavel (RTO)
- Quanto de audit perdido em RPO aceitavel (ex: 24h se backup e diario)
Proximos passos
- Modelo de Seguranca
- FAQ — perguntas sobre recovery