Como implementar política de senhas e rotação de credenciais no ciclo de vida do serviço
1. Fundamentos da Gestão de Credenciais no Ciclo de Vida do Serviço
1.1. Definição de política de senhas: complexidade, comprimento e lifecycle
Uma política de senhas eficaz define regras claras para criação, uso e descarte de credenciais ao longo de todo o ciclo de vida do serviço. Os parâmetros fundamentais incluem:
- Complexidade: mínimo 16 caracteres, combinação de maiúsculas, minúsculas, números e símbolos
- Comprimento mínimo: 20 caracteres para serviços críticos, 14 para serviços internos
- Lifecycle: rotação a cada 30-90 dias dependendo da criticidade, com proibição de reuso das últimas 10 senhas
1.2. Mapeamento de credenciais no ciclo de vida
Cada fase exige tratamento específico:
- Desenvolvimento: senhas temporárias, sem acesso a dados reais
- Staging: credenciais isoladas, espelhando produção mas com dados sintéticos
- Produção: rotação automática, acesso restrito e auditado
- Descomissionamento: revogação imediata de todas as credenciais
1.3. Diferenças entre senhas estáticas, tokens temporários e chaves de API
| Tipo | Duração | Rotação | Uso típico |
|---|---|---|---|
| Senha estática | Indeterminada | Manual/periódica | Acesso humano |
| Token temporário | Minutos a horas | Automática | Autenticação entre serviços |
| Chave de API | Meses a anos | Programada | Integrações externas |
2. Projetando uma Política de Senhas Robusta para Ambientes de Serviço
2.1. Critérios de complexidade
Implemente validação programática no momento da criação:
# Exemplo de validação de senha em Python
def validar_senha(senha):
erros = []
if len(senha) < 20:
erros.append("Mínimo 20 caracteres")
if not re.search(r"[A-Z]", senha):
erros.append("Falta maiúscula")
if not re.search(r"[a-z]", senha):
erros.append("Falta minúscula")
if not re.search(r"[0-9]", senha):
erros.append("Falta número")
if not re.search(r"[!@#$%^&*]", senha):
erros.append("Falta caractere especial")
return erros
2.2. Políticas de expiração por criticidade
# Configuração de rotação em YAML
servicos:
banco-dados-producao:
rotacao_dias: 30
notificacao_antecipada: 7
janela_rotacao: "03:00-05:00 UTC"
api-externa:
rotacao_dias: 90
notificacao_antecipada: 14
janela_rotacao: "02:00-04:00 UTC"
2.3. Implementação de OTP e MFA para serviços críticos
# Geração de OTP baseado em tempo (TOTP)
import pyotp
secret = pyotp.random_base32()
totp = pyotp.TOTP(secret)
codigo_atual = totp.now() # Válido por 30 segundos
3. Automação da Rotação de Credenciais com Ferramentas de Secret Management
3.1. Integração com HashiCorp Vault
# Rota dinâmica de senha de banco de dados no Vault
vault write database/roles/producao \
db_name=mysql-producao \
creation_statements="CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}';GRANT SELECT ON *.* TO '{{name}}'@'%';" \
default_ttl="1h" \
max_ttl="24h"
3.2. Uso de AWS Secrets Manager para rotação programada
# Script de rotação automática com AWS CLI
aws secretsmanager rotate-secret \
--secret-id producao/database \
--rotation-lambda-arn arn:aws:lambda:us-east-1:123456789:function:rotate-db \
--rotation-rules AutomaticallyAfterDays=30
3.3. Exemplo prático: script de rotação com notificação e rollback
#!/bin/bash
# rotate_credentials.sh
SECRET_NAME="api-key-producao"
BACKUP=$(aws secretsmanager get-secret-value --secret-id $SECRET_NAME --query SecretString --output text)
echo "Rotacionando $SECRET_NAME..."
if aws secretsmanager rotate-secret --secret-id $SECRET_NAME; then
echo "Rotação bem-sucedida"
# Testar nova credencial
if curl -f -H "Authorization: Bearer $(aws secretsmanager get-secret-value --secret-id $SECRET_NAME --query SecretString --output text)" https://api.exemplo.com/health; then
echo "Nova credencial válida"
else
echo "Falha no teste - revertendo"
aws secretsmanager put-secret-value --secret-id $SECRET_NAME --secret-string "$BACKUP"
fi
else
echo "Falha na rotação"
exit 1
fi
4. Estratégias de Rotação Durante o Ciclo de Vida do Serviço
4.1. Rotação em deploy com injeção em contêiner
# Docker Compose com secrets injetados
version: '3.8'
services:
app:
image: minha-app:latest
secrets:
- db_password
environment:
- DB_PASSWORD_FILE=/run/secrets/db_password
secrets:
db_password:
external: true
4.2. Rotação contínua sem downtime com blue/green
# Estratégia de rotação com duas versões simultâneas
1. Deploy versão blue com nova credencial
2. Manter versão green com credencial antiga ativa
3. Roteamento progressivo para blue
4. Após validação, revogar credencial green
5. Repetir processo na próxima rotação
4.3. Procedimento de rotação de emergência
# Script de rotação emergencial
EMERGENCY_SCRIPT="
1. Isolar serviço afetado
2. Gerar nova credencial imediatamente
3. Atualizar todos os consumidores em < 5 minutos
4. Revogar credencial comprometida
5. Registrar incidente no SIEM
6. Notificar equipe de segurança
"
5. Auditoria e Monitoramento de Conformidade de Credenciais
5.1. Logs de acesso e rastreamento de rotações
# Configuração de auditoria no Vault
vault audit enable file file_path=/var/log/vault_audit.log
# Formato do log
{
"time": "2024-01-15T10:30:00Z",
"type": "credential_rotation",
"service": "database-producao",
"user": "automation",
"result": "success"
}
5.2. Alertas para expiração iminente
# Alerta via Prometheus + Alertmanager
- alert: CredentialExpiringSoon
expr: time() - secret_last_rotation > 7776000 # 90 dias
for: 5m
labels:
severity: warning
annotations:
summary: "Credencial {{ $labels.secret }} expira em breve"
5.3. Relatórios de auditoria para compliance
# Relatório PCI-DSS para credenciais
Relatório Mensal de Conformidade:
- Total de credenciais ativas: 47
- Rotações realizadas no mês: 23
- Credenciais com rotação pendente: 2 (atraso máximo 3 dias)
- Última rotação: 2024-01-15
- Próxima rotação agendada: 2024-02-15
6. Tratamento de Credenciais no Descomissionamento de Serviços
6.1. Revogação imediata de credenciais
# Revogação em lote de credenciais
aws secretsmanager list-secrets --filter "Key=tag:Service,Values=servico-antigo" | \
jq -r '.SecretList[].Name' | \
while read secret; do
aws secretsmanager delete-secret --secret-id $secret --force-delete-without-recovery
done
6.2. Rotação de credenciais compartilhadas
# Após remoção de serviço que compartilhava credenciais
1. Identificar todos os consumidores atuais
2. Gerar nova senha
3. Atualizar consumidores remanescentes
4. Revogar senha anterior
5. Documentar mudança
6.3. Armazenamento seguro para fins forenses
# Arquivamento criptografado de credenciais descomissionadas
gpg --encrypt --recipient auditoria@empresa.com \
--output credenciais_arquivadas_$(date +%Y%m).gpg \
credenciais_descomissionadas.txt
# Armazenar em bucket S3 com versionamento e MFA delete
7. Integração com Pipeline CI/CD e Orquestração Kubernetes
7.1. Injeção de credenciais via volumes efêmeros
# Kubernetes Deployment com secrets montados
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-producao
spec:
template:
spec:
containers:
- name: app
volumeMounts:
- name: secrets
mountPath: /etc/secrets
readOnly: true
volumes:
- name: secrets
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: vault-database
7.2. External Secrets Operator para sincronização com Vault
# ExternalSecret resource
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: database-credentials
spec:
refreshInterval: "1h"
secretStoreRef:
name: vault-backend
kind: SecretStore
target:
name: database-secret
data:
- secretKey: password
remoteRef:
key: secret/data/producao/database
property: password
7.3. Pipeline GitLab CI com rotação automática
# .gitlab-ci.yml
stages:
- rotate
- deploy
- verify
rotate-credentials:
stage: rotate
script:
- aws secretsmanager rotate-secret --secret-id $CI_ENVIRONMENT_NAME/db
- sleep 30 # Aguarda propagação
only:
- main
deploy:
stage: deploy
script:
- kubectl rollout restart deployment/app-$CI_ENVIRONMENT_NAME
needs: ["rotate-credentials"]
verify:
stage: verify
script:
- curl -f https://app.exemplo.com/health
needs: ["deploy"]
8. Boas Práticas e Desafios Comuns na Implementação
8.1. Evitar hardcoding e arquivos .env versionados
# Incorreto - nunca versionar
.env:
DB_PASSWORD=minhasenha123
# Correto - usar secrets management
kubectl create secret generic db-secret \
--from-literal=password=$(vault read -field=password secret/data/producao/db)
8.2. Gerenciamento de credenciais para serviços legados
# Abordagem para serviços sem suporte a rotação
1. Implementar proxy com rotação de credenciais
2. Usar sidecar container para injeção
3. Agendar janelas de manutenção para rotação manual
4. Documentar procedimento de fallback
8.3. Treinamento da equipe e documentação
# Checklist de treinamento
- [ ] Como usar o Vault/Secrets Manager
- [ ] Procedimento de rotação de emergência
- [ ] Como criar novas credenciais seguindo política
- [ ] Como auditar logs de acesso
- [ ] Procedimento de descomissionamento seguro
Referências
- HashiCorp Vault: Dynamic Secrets — Documentação oficial sobre rotação dinâmica de senhas de banco de dados com Vault
- AWS Secrets Manager: Rotating Secrets — Guia completo de rotação automática de credenciais usando AWS Lambda
- Kubernetes External Secrets Operator — Documentação do operador que sincroniza secrets entre Vault/AWS/Azure e Kubernetes
- NIST SP 800-63B: Digital Identity Guidelines — Padrões oficiais para políticas de senhas e autenticação
- OWASP: Credential Stuffing Prevention — Guia de prevenção contra ataques de reuso de credenciais
- GitLab CI/CD: Using Vault Secrets — Tutorial de integração de secrets management com pipelines CI/CD
- PCI DSS Requirement 8: Identify and Authenticate — Requisitos oficiais para gerenciamento de credenciais em ambientes PCI