Rotação de Secrets

A rotação regular de secrets é uma prática essencial de segurança. Aprenda a configurar e automatizar a rotação de variáveis de ambiente usando o CriptEnv.

Info

A rotação de secrets reduz a janela de exposição caso uma credencial seja comprometida. Recomendamos rodar a cada 30-90 dias, dependendo do nível de sensibilidade.

Por que rotacionar?

  • Reduz o impacto de vazamentos e comprometimentos
  • Atende a requisitos de compliance (SOC2, ISO 27001, LGPD)
  • Remove acessos de funcionários que saíram da empresa
  • Mantém boas práticas de higiene de segurança

Rotação Manual

1

Gere o novo secret

Gere o novo secret no serviço correspondente (banco de dados, API, etc.). Certifique-se de que o novo secret está funcionando antes de atualizar no CriptEnv.

2

Atualize no CriptEnv

Use o CLI para atualizar a variável com o novo valor:

Atualizar variável
# Atualizar uma variável específica
criptenv set DATABASE_URL "nova-url-do-banco" --project meu-app

# Atualizar interativamente
criptenv set --interactive --project meu-app
3

Sincronize com as integrações

Se você tem integrações configuradas (Vercel, Railway, etc.), a sincronização automática propagará a mudança. Caso contrário, sincronize manualmente:

Sincronizar integrações
# Sincronizar todas as integrações
criptenv sync --project meu-app

# Sincronizar uma integração específica
criptenv sync --provider vercel --project meu-app
4

Verifique a aplicação

Confirme que a aplicação está funcionando corretamente com o novo secret. Monitore logs e métricas por alguns minutos.

Rotação Automatizada

Configure a rotação automática usando o GitHub Actions ou seu sistema de CI/CD preferido.

Rotação automática com GitHub Actions
name: Secret Rotation

on:
  schedule:
    # Executa todo dia 1 do mês às 3h UTC
    - cron: '0 3 1 * *'
  workflow_dispatch:  # Permite execução manual

jobs:
  rotate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Gerar novo secret
        id: generate
        run: |
          NEW_SECRET=$(openssl rand -hex 32)
          echo "secret=$NEW_SECRET" >> $GITHUB_OUTPUT

      - name: Atualizar no CriptEnv
        env:
          CRIPTENV_TOKEN: ${{ secrets.CRIPTENV_TOKEN }}
        run: |
          npm install -g @criptenv/cli
          criptenv set API_KEY "${{ steps.generate.outputs.secret }}" \
            --project meu-app \
            --environment production

      - name: Sincronizar com Vercel
        run: |
          criptenv sync --provider vercel --project meu-app

      - name: Notificar equipe
        uses: slackapi/slack-github-action@v1
        with:
          payload: |
            {"text": "✅ API Key rotacionada com sucesso no projeto meu-app"}
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}

Políticas de Rotação

Defina políticas de rotação por tipo de secret:

Tipo de SecretFrequência RecomendadaPrioridade
API KeysA cada 30 diasAlta
Database credentialsA cada 90 diasAlta
JWT secretsA cada 30 diasAlta
Third-party tokensA cada 90 diasMédia
Encryption keysA cada 180 diasCrítica

Rotação via SDK

rotate.ts
import { CriptEnv } from '@criptenv/sdk';
import crypto from 'crypto';

const criptenv = new CriptEnv({
  token: process.env.CRIPTENV_TOKEN!,
  projectId: 'seu-project-id',
});

async function rotateSecret(keyName: string) {
  // Gera um novo valor
  const newValue = crypto.randomBytes(32).toString('hex');

  // Atualiza no CriptEnv
  await criptenv.set(keyName, newValue);

  console.log(`Secret ${keyName} rotacionado com sucesso`);
  return newValue;
}

// Rotacionar múltiplos secrets
async function rotateAll() {
  const keys = ['API_KEY', 'JWT_SECRET', 'ENCRYPTION_KEY'];
  for (const key of keys) {
    await rotateSecret(key);
  }
  // Sincroniza com integrações
  await criptenv.sync();
}

rotateAll();

Info

Ao rotacionar secrets em produção, certifique-se de que todos os serviços dependentes são atualizados simultaneamente para evitar downtime. Considere usar rotação com período de sobreposição (overlap) onde tanto o secret antigo quanto o novo são válidos por um período.