Avançado Cloud

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: createSecretsetSecrettestSecretfinishSecret.

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