AWS KMS: Chave Gerenciada pela AWS ou CMK? Guia Prático para Criptografia no S3
Você acabou de habilitar a criptografia no seu bucket S3 e se deparou com a escolha entre AWS Managed Key e Customer Managed Key (CMK) — e a diferença não é apenas de nomenclatura. A decisão impacta diretamente controle operacional, custos de API e capacidade de auditoria. Este guia sobre AWS KMS resolve essa escolha com critérios objetivos.
TL;DR — AWS KMS: Chave Gerenciada pela AWS vs. CMK
| Critério | AWS Managed Key | Customer Managed Key (CMK) |
|---|---|---|
| Custo de armazenamento | Gratuito | ~$1/mês por chave |
| Custo por chamada de API | Cobrado normalmente | Cobrado normalmente |
| Controle de política de chave | Não | Sim (total) |
| Rotação automática | A cada 1 ano | Opcional (configurável) |
| Compartilhamento entre contas | Não | Sim |
| Auditoria granular via CloudTrail | Parcial | Completa |
| Caso de uso típico | Workloads internos sem requisitos de compliance rígidos | Dados regulados, multi-conta, acesso condicional |
Como o AWS KMS Funciona na Prática
O KMS não armazena seus dados — ele protege as chaves de dados que o S3 usa para criptografar objetos. O S3 usa envelope encryption: gera uma chave de dados simétrica (AES-256), criptografa o objeto com ela, depois chama o KMS para criptografar a própria chave de dados. O objeto no bucket carrega a chave de dados criptografada junto com o conteúdo.
Na leitura, o S3 chama kms:Decrypt para recuperar a chave de dados em texto claro, descriptografa o objeto em memória e entrega ao cliente. Cada operação de leitura ou escrita gera uma chamada ao KMS — isso é o que aparece na sua fatura.
- PUT Object: S3 solicita ao KMS uma nova chave de dados via
GenerateDataKey. - KMS responde com a chave em texto claro e a versão criptografada pela CMK.
- S3 criptografa o objeto com a chave em texto claro, descarta a versão plaintext e armazena o objeto junto com a chave de dados criptografada.
- GET Object: S3 chama
Decryptno KMS para recuperar a chave de dados e descriptografar o objeto.
AWS Managed Key vs. CMK — Quando Cada Uma Faz Sentido
A AWS Managed Key (aws/s3) é criada automaticamente quando você habilita SSE-KMS sem especificar uma chave. Você não paga pelo armazenamento dela, mas também não controla sua política. Não é possível conceder acesso a outras contas, adicionar condições de contexto de criptografia ou revogar acesso granularmente. Para a maioria dos workloads internos sem requisitos de compliance externos, ela é suficiente.
A CMK entra em cena quando você precisa de controle real. Casos concretos: bucket compartilhado entre contas AWS diferentes, necessidade de revogar acesso de uma aplicação específica sem afetar outras, auditoria de qual role chamou Decrypt e quando, ou conformidade com normas que exigem gestão explícita de chaves (PCI-DSS, HIPAA, LGPD em contextos regulados).
Pense na AWS Managed Key como a fechadura padrão do prédio — funciona, mas o síndico (AWS) guarda a cópia. A CMK é a fechadura que você instalou: você controla quem tem cópia, quando troca e quem entrou no registro.
Estrutura de Custos do AWS KMS
O custo tem duas dimensões independentes: armazenamento de chaves e chamadas de API. A confusão mais comum é achar que usar AWS Managed Key elimina todos os custos de KMS — não elimina. As chamadas de API são cobradas da mesma forma.
- Armazenamento de chave: AWS Managed Keys são gratuitas. CMKs custam aproximadamente $1/mês por chave ativa. Verifique o valor atual na página de preços do KMS.
- Chamadas de API: As primeiras 20.000 requisições por mês são gratuitas. Acima disso, há cobrança por requisição. Workloads com alto volume de leitura em S3 podem gerar custos significativos — cada
GetObjectcom SSE-KMS resulta em uma chamadaDecrypt. - Chaves de importação e HSM dedicado: Modelos com material de chave importado ou CloudHSM têm estrutura de custo diferente. Consulte a documentação oficial para esses cenários.
Se o volume de chamadas é uma preocupação, o S3 suporta cache de chaves de dados via S3 Bucket Keys — isso reduz o número de chamadas ao KMS agrupando operações sob uma única chave de dados por bucket, diminuindo o custo de API em workloads de alto throughput.
Criando e Configurando uma CMK para S3 via AWS CLI
O fluxo completo envolve criar a chave, definir sua política, habilitar rotação e configurar o bucket para usá-la. Cada etapa tem uma razão operacional — a política de chave é o que determina quem pode usar a CMK, e ela precisa incluir explicitamente o root da conta para evitar que você perca acesso à própria chave.
1. Criar a CMK com metadados descritivos
aws kms create-key \
--description "CMK para bucket S3 de dados regulados" \
--key-usage ENCRYPT_DECRYPT \
--origin AWS_KMS \
--region us-east-1
O comando retorna o KeyId e o ARN da chave. Anote o ARN — você vai precisar dele nas próximas etapas.
2. Criar um alias legível para a chave
aws kms create-alias \
--alias-name alias/s3-dados-regulados \
--target-key-id <KeyId-retornado-acima> \
--region us-east-1
3. Habilitar rotação automática anual
aws kms enable-key-rotation \
--key-id alias/s3-dados-regulados \
--region us-east-1
4. Aplicar política de chave
A política abaixo concede acesso administrativo ao root da conta e permissão de uso criptográfico a uma role específica. O bloco do root é obrigatório — sem ele, você pode criar uma chave que nenhuma entidade consegue gerenciar.
🔽 Clique para expandir — Política de Chave KMS (JSON)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "Allow use of the key by application role",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/MinhaAppRole"
},
"Action": [
"kms:Decrypt",
"kms:GenerateDataKey",
"kms:DescribeKey"
],
"Resource": "*"
}
]
}
aws kms put-key-policy \
--key-id alias/s3-dados-regulados \
--policy-name default \
--policy file://kms-key-policy.json \
--region us-east-1
5. Configurar o bucket S3 para usar a CMK
aws s3api put-bucket-encryption \
--bucket meu-bucket-regulado \
--server-side-encryption-configuration '{
"Rules": [{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "aws:kms",
"KMSMasterKeyID": "arn:aws:kms:us-east-1:123456789012:key/<seu-key-id>"
},
"BucketKeyEnabled": true
}]
}' \
--region us-east-1
O parâmetro BucketKeyEnabled: true ativa o S3 Bucket Keys, que reduz chamadas ao KMS agrupando operações — especialmente relevante para buckets com alto volume de objetos.
IAM: Permissões Mínimas para Acesso ao Bucket com CMK
Um erro frequente em produção: a role da aplicação tem acesso ao S3, mas não tem permissão de kms:Decrypt. O resultado é um erro AccessDenied que aparece como falha no S3, não no KMS — o que leva o time a investigar bucket policy quando o problema está na chave.
🔽 Clique para expandir — Política IAM mínima para leitura/escrita com CMK
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "S3Access",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::meu-bucket-regulado/*"
},
{
"Sid": "KMSAccess",
"Effect": "Allow",
"Action": [
"kms:Decrypt",
"kms:GenerateDataKey",
"kms:DescribeKey"
],
"Resource": "arn:aws:kms:us-east-1:123456789012:key/<seu-key-id>"
}
]
}
Diagnóstico: AccessDenied que Parece Ser do S3, Mas É do KMS
O cenário clássico: aplicação em produção começa a falhar com AccessDenied ao fazer GetObject. O time verifica bucket policy, ACLs, block public access — tudo parece correto. O erro persiste.
O que aconteceu de verdade: a role da aplicação foi recriada (ou a política foi atualizada) e perdeu a permissão kms:Decrypt. O S3 retorna AccessDenied porque não consegue descriptografar o objeto, mas a mensagem de erro não menciona KMS explicitamente na maioria dos SDKs.
A verificação correta começa no CloudTrail, não no S3:
aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=EventName,AttributeValue=Decrypt \
--start-time 2024-01-15T00:00:00Z \
--end-time 2024-01-15T23:59:59Z \
--region us-east-1
Se você ver eventos Decrypt com errorCode: AccessDenied no CloudTrail, o problema está na política da CMK ou na política IAM da role — não no bucket. Verifique qual principal está tentando a chamada e compare com a política de chave atual:
aws kms get-key-policy \
--key-id alias/s3-dados-regulados \
--policy-name default \
--region us-east-1
Esse padrão — sintoma no S3, causa no KMS — é o que mais consome tempo em diagnóstico de acesso. O CloudTrail com CMK é o que torna esse diagnóstico possível em minutos em vez de horas. Com AWS Managed Key, a visibilidade é mais limitada.
Verificando o Status da Chave e Rotação
Antes de confiar que uma chave está operacional, confirme seu estado e se a rotação está ativa. Uma chave no estado Disabled ou PendingDeletion causa falhas silenciosas em operações de escrita — novos objetos não são criptografados e o S3 retorna erro.
aws kms describe-key \
--key-id alias/s3-dados-regulados \
--region us-east-1
aws kms get-key-rotation-status \
--key-id alias/s3-dados-regulados \
--region us-east-1
(7-30 dias) Disabled --> PendingDeletion : ScheduleKeyDeletion PendingDeletion --> Enabled : CancelKeyDeletion PendingDeletion --> Deleted : Prazo expirado Deleted --> [*] : Irreversível
- Enabled: Estado operacional normal. Chave disponível para uso criptográfico.
- Disabled: Chave existe mas não pode ser usada. Objetos já criptografados não podem ser descriptografados até reabilitação.
- PendingDeletion: Período de espera configurável (7-30 dias). Reversível antes do prazo.
- Deleted: Irreversível. Dados criptografados exclusivamente por esta chave são permanentemente inacessíveis.
Conclusão e Próximos Passos com AWS KMS
Para a maioria dos buckets S3 sem requisitos de compliance externos, a AWS Managed Key com S3 Bucket Keys habilitado é o ponto de partida correto — sem custo de armazenamento de chave e com redução de chamadas de API. Quando você precisar de controle granular de acesso, compartilhamento entre contas ou auditoria completa via CloudTrail, migre para uma CMK.
A migração de SSE-S3 ou AWS Managed Key para CMK em um bucket existente é feita via put-bucket-encryption — novos objetos passam a usar a CMK, objetos existentes mantêm a criptografia anterior até serem reescritos.
- AWS KMS Developer Guide
- Using SSE-KMS with S3
- S3 Bucket Keys — Redução de custos KMS
- Preços do AWS KMS
Glossário — Termos Essenciais do AWS KMS
| Termo | Definição |
|---|---|
| CMK (Customer Managed Key) | Chave KMS criada e gerenciada pelo cliente, com controle total de política, rotação e acesso. |
| AWS Managed Key | Chave criada e gerenciada pela AWS em nome do serviço (ex: aws/s3). Sem controle de política pelo cliente. |
| Envelope Encryption | Padrão onde uma chave de dados criptografa o conteúdo, e o KMS criptografa a chave de dados. Usado pelo S3 com SSE-KMS. |
| S3 Bucket Keys | Funcionalidade que reduz chamadas ao KMS agrupando operações sob uma chave de dados por bucket. |
| Key Policy | Documento de política JSON que define quem pode usar e gerenciar uma CMK. Tem precedência sobre políticas IAM. |
Comentários
Postar um comentário