Rotação automática de credenciais
A rotação automática reduz a janela de risco de credenciais comprometidas e atende requisitos de compliance (PCI DSS exige rotação a cada 90 dias). O CipherVault rotaciona credenciais nativas em 9 plataformas, executadas pelo Sensor Service.
Plataformas suportadas
| Platform | Como |
|---|---|
| PostgreSQL | ALTER USER x WITH PASSWORD $1 via pg |
| MySQL/MariaDB | ALTER USER x@'%' IDENTIFIED BY ? via mysql2 |
| SQL Server | ALTER LOGIN [x] WITH PASSWORD via mssql |
| Oracle DB | ALTER USER x IDENTIFIED BY via oracledb |
| MongoDB | db.updateUser command |
| Redis | ACL SETUSER (v6+) ou CONFIG SET requirepass |
| Elasticsearch | POST /_security/user/:user/_password |
| AWS IAM | CreateAccessKey + DeleteAccessKey |
| Generic API Key | shell commands customizados (Shell / Python / JavaScript / Java via JBang) |
Nota: rotação de credenciais é diferente de Dynamic Secrets. Rotação atualiza periodicamente uma credencial persistente (que vive no DB do app); Dynamic Secrets emite credenciais efêmeras sob demanda com TTL ≤ 24h. Veja Dynamic Secrets.
Como funciona (zero downtime)
O Sensor Service mantém a credencial nova e antiga válidas durante
grace_window antes de revogar a antiga:
- T-0 — Sensor gera nova credencial e faz
ALTER USER(ou equivalente) - T-0 a T-graceWindow — versão antiga e nova ficam ativas em paralelo
- T-graceWindow — versão antiga é revogada (DROP USER, DeleteAccessKey, etc.)
graceWindow padrão é 5 minutos (configurável). Aplicações que usam o SDK
detectam a nova versão automaticamente via cache TTL.
Configurando rotação (PostgreSQL)
curl -X POST https://cv.acme.com.br/secrets \
-H "Authorization: Bearer $CV_TOKEN" \
-d '{
"name": "billing-master",
"category": "database",
"environment": "prd",
"value": "senha_inicial_change_me",
"rotation_policy_days": 30,
"metadata": {
"platform": "postgresql",
"host": "db-billing.internal.acme.com.br",
"port": 5432,
"database": "billing",
"target_username": "app_user",
"admin_credential_id": 42
}
}'
admin_credential_id aponta para outro secret no CV — credencial admin
que o sensor usa para executar ALTER USER.
Self-rotation das credenciais cloud (do CV para os providers)
A v1.5 trouxe rotação das credenciais que o CV usa para acessar AWS, GCP e IBM (Sensor coleta secrets da cloud, mas precisa de uma cred para isso — essa cred também rotaciona).
Padrão "create → test → delete":
- Sensor cria nova cred no provider (
CreateAccessKeyna AWS, etc.) - Testa que funciona (
STS:GetCallerIdentity, etc.) - Persiste no CV
- Só então deleta a antiga
Se qualquer etapa antes do persist falhar, a cred atual continua intacta — rollback automático.
| Provider | Mecanismo |
|---|---|
| AWS | IAM Access Keys |
| GCP | Service Account Keys |
| IBM | IAM API Keys |
Não suportado: Azure, OCI, Huawei (paradigmas distintos), e PAMs por design (são rotacionadores, não rotacionados).
Configuração:
- Manual: botão "Rotacionar credenciais" no card da integração ou
POST /cloud-integrations/:id/rotate-credentials - Auto: opt-in via toggle
auto_rotate. Rotação imediata após primeiro sync + scheduler 24h com leader-lock + retry 1h em failure
Custom rotation script
Para plataformas não suportadas nativamente, use custom_script com
selector de linguagem (Shell / Python 3 / Node / Java via JBang).
Variáveis disponíveis:
{{new_password}}no template$NEW_SECRETno env
O Sensor é responsável pela execução; o backend só encaminha
script_language + script_body opacos.
Boas práticas
- Comece com staging. Habilite rotação em homologação por 2 semanas antes de produção.
- Monitore o
next_rotation. Configure alertas Prometheus para rotações próximas e para falhas. - Use grace window generosa. Aplicações com cache longo precisam de 10–30 min.
- Teste rollback. Pelo menos uma vez por trimestre em ambiente de teste.
- Rotação de admin separada. A credencial admin do Sensor deve ter ciclo próprio (ex.: semestral, com aprovação manual via Approvals).
- Considere Dynamic Secrets se o caso de uso é JIT (job batch, ETL diário) em vez de credencial persistente — TTL muito menor (minutos vs. dias).