Secrets na cloud — Secrets Manager, KMS, rotação automática
Credenciais em código-fonte, variáveis de ambiente sem criptografia ou arquivos .env commitados são o ponto de partida de grande parte dos incidentes em cloud. Gerenciar segredos corretamente exige ferramentas específicas, controle de acesso granular e rotação contínua.
O que não fazer
# Ruim: senha hardcoded no código
DB_PASSWORD = "minhaSenha123!"
# Ruim: .env com credenciais commitado no git
echo "AWS_SECRET_ACCESS_KEY=abc123" >> .env
git add .env && git commit -m "config"
# Ruim: variável de ambiente em texto puro em task definition ECS
"environment": [{ "name": "DB_PASS", "value": "minhaSenha123!" }]
Se credentials já foram commitadas, considere o repositório comprometido. Rotacione imediatamente e use git filter-repo para remover o histórico.
AWS Secrets Manager
Armazena, rotaciona e fornece segredos de forma controlada. Acesso auditado via CloudTrail. Integrado com RDS para rotação automática.
# Criar um segredo
aws secretsmanager create-secret \
--name prod/app/database \
--description "Credenciais do banco de produção" \
--secret-string '{"username":"app_user","password":"S3cret!@#"}'
# Recuperar o segredo (na aplicação)
aws secretsmanager get-secret-value \
--secret-id prod/app/database \
--query SecretString \
--output text
Consumindo no código — nunca armazene o valor em cache permanente:
import boto3, json
def get_db_credentials(secret_name: str) -> dict:
client = boto3.client("secretsmanager", region_name="us-east-1")
response = client.get_secret_value(SecretId=secret_name)
return json.loads(response["SecretString"])
creds = get_db_credentials("prod/app/database")
# creds["username"], creds["password"]
Rotação automática
Secrets Manager pode rotacionar senhas de bancos RDS automaticamente via Lambda:
# Habilitar rotação a cada 30 dias (RDS nativo)
aws secretsmanager rotate-secret \
--secret-id prod/app/database \
--rotation-rules AutomaticallyAfterDays=30 \
--rotate-immediately
Para segredos customizados, implemente uma Lambda com os quatro steps do rotation:
createSecret → setSecret → testSecret → finishSecret.
AWS KMS — gerenciamento de chaves
KMS gerencia chaves criptográficas. Secrets Manager usa KMS por baixo. Use KMS diretamente quando precisa criptografar dados próprios:
# Criptografar um valor com KMS
aws kms encrypt \
--key-id alias/minha-chave-app \
--plaintext fileb://dados-sensiveis.txt \
--output text \
--query CiphertextBlob | base64 --decode > dados.enc
# Descriptografar
aws kms decrypt \
--ciphertext-blob fileb://dados.enc \
--output text \
--query Plaintext | base64 --decode
Política de chave KMS — controle quem pode usar e quem pode administrar:
{
"Statement": [
{
"Sid": "AdminKey",
"Effect": "Allow",
"Principal": { "AWS": "arn:aws:iam::123456789:role/kms-admin" },
"Action": ["kms:Create*", "kms:Delete*", "kms:Put*"],
"Resource": "*"
},
{
"Sid": "AppUsage",
"Effect": "Allow",
"Principal": { "AWS": "arn:aws:iam::123456789:role/app-role" },
"Action": ["kms:Decrypt", "kms:GenerateDataKey"],
"Resource": "*"
}
]
}
Referência a segredos em vez de cópia
Em vez de buscar o segredo e injetá-lo como env var (que aparece em logs de processo), use referência direta:
// ECS Task Definition — referência ao Secrets Manager
"secrets": [
{
"name": "DB_PASSWORD",
"valueFrom": "arn:aws:secretsmanager:us-east-1:123456789:secret:prod/app/database:password::"
}
]
# Kubernetes — External Secrets Operator
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: db-secret
spec:
secretStoreRef:
name: aws-secrets-manager
kind: ClusterSecretStore
target:
name: db-credentials
data:
- secretKey: password
remoteRef:
key: prod/app/database
property: password
Checklist de secrets
- Nunca commite segredo em repositório (use pre-commit + gitleaks)
- Secrets Manager ou Parameter Store (SecureString) para todos os segredos
- KMS com chave gerenciada pelo cliente (CMK) para dados sensíveis
- Rotação automática habilitada (30-90 dias)
- Acesso auditado via CloudTrail
- Sem segredo em variável de ambiente em texto puro
- IAM: apenas a role da aplicação pode ler o segredo específico