Pular para o conteúdo principal

Rotacionando Webhook Secrets

O webhook secret é o segredo compartilhado que o DVS usa para assinar com HMAC cada entrega de webhook. Rotacioná-lo periodicamente (ou imediatamente após qualquer suspeita de exposição) é uma boa prática.

Quando rotacionar

  • Rotação de rotina: a cada 12 meses por política da OSIGU.
  • Rotação imediata: quando há suspeita de que o secret foi exposto (comitado em um repositório público, vazado em logs, funcionário desligado com acesso).
  • Iniciada pela OSIGU: quando o monitoramento da OSIGU detecta padrões suspeitos de assinatura ou entrega.

Como funciona a rotação

  1. 1Solicitar rotação

    Envie e-mail para support@osigu.com com o assunto Webhook secret rotation — <seu tenant slug>. Inclua o motivo e o ID do endpoint de webhook (se disponível).

  2. 2OSIGU emite um novo secret

    O operador da OSIGU executa o endpoint de admin e envia o novo secret em plaintext por um canal seguro (link de vault no 1Password, e-mail criptografado, entrega presencial — nunca por e-mail simples).

  3. 3Período de tolerância de 24 horas

    Por 24 horas após a rotação, o DVS continua aceitando verificação de signature com ambos o secret novo e o anterior. Isso evita mensagens perdidas em webhooks em trânsito. Após 24 horas, apenas o novo secret é válido.

  4. 4Atualizar o receiver

    Atualize a variável de ambiente / secret store com o novo valor. Recomendamos fortemente suportar ambos os secrets simultaneamente durante o período de tolerância.

Padrão de receiver: suportar dois secrets durante a rotação

Este padrão permite trocar de secrets sem perder webhooks. Adicione o secret anterior como fallback por 24 horas e depois remova-o.

SECRETS = [
os.environ["DVS_WEBHOOK_SECRET_CURRENT"],
os.environ.get("DVS_WEBHOOK_SECRET_PREVIOUS"), # opcional, somente durante a janela de tolerância
]

def verify_with_any(raw_body, signature_header, timestamp_header):
for secret in SECRETS:
if secret and verify_dvs_signature(raw_body, signature_header, timestamp_header, secret):
return True
return False

Após 24 horas, remova DVS_WEBHOOK_SECRET_PREVIOUS do ambiente.

O que o DVS faz durante a rotação

  • O DVS assina todos os novos webhooks com o secret novo imediatamente.
  • O hash do secret anterior é mantido por 24h e aceito pelo receiver (desde que o fallback acima esteja implementado).
  • Após 24 horas, o secret anterior é expurgado do armazenamento do DVS.

O que a rotação NÃO faz

  • Não altera o URL do webhook.
  • Não altera o ID do endpoint.
  • Não pausa a entrega de webhooks — os eventos continuam fluindo.

Perdeu o secret?

Caso o secret não esteja mais disponível (ex.: a única pessoa com acesso saiu da empresa), não é possível recuperá-lo do DVS — os secrets são armazenados com hash bcrypt do nosso lado, nunca em plaintext. Solicite uma rotação; a OSIGU emite um novo.