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.gpg

Backup 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-test

Recovery (procedimento)

Cenario: vault do server foi corrompido ou perdido. Voce tem backup + passphrase.

1. Parar o server

docker compose down tatuzim-server

2. 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_vault

3. 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.tgz

4. 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 integro

5. Subir server

docker compose up -d tatuzim-server
docker logs -f dev_tatuzim_server

6. 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_server

Compare com lista de VPS ativos. Os que faltarem precisam re-enroll.

Recovery sem backup

Se voce nao tem backup:

  1. Server: re-init (docker volume rm tatuzim_tatuzim_vault + subir tudo do zero)
  2. step-ca: pode reusar a mesma CA (se o volume stepca_data esta intacto)
  3. Agents: todos precisam re-enroll (geram nova agent_id, mas a CA confiada continua a mesma)
  4. 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:

  1. Novo root CA (necessita root.pem.bak do paper backup — voce TEM, certo?)
  2. Novo intermediate CA
  3. Todos os agents precisam baixar o NOVO stepca-root.pem (substituir /etc/tatuzim-agent/stepca-root.pem)
  4. Reenroll de todos os agents
  5. 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

By Borlot.com.br on 23/05/2026