Home Comunidade Eventos YouTube Networks Desafios // produtos Academy News CTI | CVE Contato

03 - Gerenciamento de Chaves (KMS, HSM)

#chaves#fips#hsm#kms#rotacao
video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione video: https://youtu.be/... no frontmatter da nota.

Gerenciamento de Chaves (KMS, HSM)

Gerenciamento de chaves é a disciplina de criar, distribuir, usar, rotacionar e destruir chaves criptográficas ao longo de todo o ciclo de vida, garantindo que o valor da criptografia não se perca pela chave errada no lugar errado. Em produção, a chave é o ativo que concentra todo o valor do sistema: dado cifrado com chave protegida é inútil para o atacante, e chave exposta junto do dado devolve o problema original. Serviços como o AWS KMS resolvem a operação corrente com material protegido em hardware, políticas de uso por chave e trilha completa de auditoria, enquanto HSMs dedicados atendem requisitos regulatórios que exigem controle exclusivo sobre o segredo. Este arquivo cobre o ciclo de vida da chave, a operação do KMS com CMKs e aliases, a distinção entre key policies e IAM, o papel do HSM em cenários FIPS e os custos por requisição.

Conceito: a chave como ativo central

A criptografia moderna assume que o algoritmo é público e que a segurança mora inteiramente na chave. Essa premissa muda o desenho da arquitetura: o dado pode estar replicado em muitas regiões, mas a chave precisa estar em um lugar único, protegido, auditável e sob política própria. O serviço de chaves funciona como gargalo deliberado, um choke point onde toda operação de cifra e decifra passa por autenticação, autorização e registro, convertendo o acesso ao dado em evento verificável.

A hierarquia de chaves organiza esse gargalo. Na base fica o material protegido pelo serviço ou pelo HSM; acima ficam as chaves de cliente, as CMKs, que representam uma identidade lógica de chave; na ponta ficam as chaves de dados efêmeras usadas no envelope encryption para cifrar payloads de qualquer tamanho. Cada nível minimiza o tempo de vida e a exposição do material, e o desenho correto da hierarquia é decisão de arquitetura, não detalhe de implementação.

O problema que o gerenciamento de chaves resolve

Sem um sistema dedicado, chaves acabam em código, variáveis de ambiente, arquivos de configuração e repositórios git, com rotação manual ou inexistente e nenhum registro de quem as usou. Esses erros não são teóricos: segredo versionado em repositório é achado recorrente em vazamento, e chave sem rotação significa que um comprometimento antigo vale para sempre. O gerenciamento centralizado resolve os três problemas de uma vez: a chave nunca sai do serviço em texto claro, o uso depende de autorização fina por identidade e toda operação gera trilha imutável.

Há também o problema operacional de rotacionar sem parar nada. Rotação de chave manual em produção envolve janelas de migração, riscos de incompatibilidade e coordenação entre times, o que na prática significa que não acontece. Serviços gerenciados automatizam esse ciclo, e a automação é justamente o que torna a rotação uma política executável em vez de uma promessa.

Ciclo de vida da chave

O ciclo de vida completo vai da criação ao destruição programada, e cada fase tem um cuidado específico de produção.

Fase O que acontece Cuidado de produção
Criação Geração dentro do serviço, nunca no código da aplicação Definir dono, domínio de uso e política inicial
Distribuição A chave nunca sai do KMS em texto claro Payloads usam envelope encryption com chave de dados
Uso Toda operação via API autenticada e autorizada Trilha no CloudTrail com alarmes para padrões anômalos
Rotação Material novo a cada 12 meses em chaves simétricas Rotação não recifra dados antigos, apenas limita exposição futura
Revogação Desabilitar a chave ou restringir a política Testar o processo de revogação antes de precisar dele
Auditoria Trilha de cada operação no CloudTrail Alarmes para Decrypt em massa e uso fora do horário
Destruição Janela de espera seguida de eliminação irreversível Inventário de dependências antes de agendar a exclusão

A fase de destruição é a mais delicada: toda chave destruída torna permanentemente ilegível todo dado cifrado por ela, então o inventário de dependências precisa ser revisado e a destruição, programada com janela de espera que permita abortar. A fase de rotação tem nuance inversa: o material antigo é retido para decifrar dados históricos, então rotação encolhe a janela de exposição futura, não resolve vazamento passado.

AWS KMS: CMKs, aliases e key policies

A CMK, hoje chamada de KMS key, é o objeto lógico que representa uma chave, com material protegido pelo serviço e um documento de política próprio. As APIs principais são Encrypt, Decrypt e GenerateDataKey para chaves simétricas, e Sign e Verify para assimétricas. O alias é o indirecionamento que desacopla aplicação de chave: o código referencia alias/financeiro-dados, e a chave por trás pode ser trocada sem redeploy, o que é essencial em rotação manual e migração de domínio. A política da chave, a key policy, é o documento obrigatório que define quem administra e quem usa.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Administracao restrita ao papel de seguranca",
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111122223333:role/seguranca-key-admin" },
      "Action": ["kms:Create*", "kms:PutKeyPolicy", "kms:ScheduleKeyDeletion", "kms:DescribeKey"]
    },
    {
      "Sid": "Uso delegado ao IAM para a aplicacao",
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111122223333:role/app-pagamentos" },
      "Action": ["kms:Decrypt", "kms:GenerateDataKey"],
      "Resource": "*"
    }
  ]
}

O padrão desse documento é o mais importante do tópico: administração restrita a um papel de segurança e uso delegado ao IAM para os papéis de aplicação. A primeira declaração impede que qualquer pessoa altere a política ou destrua a chave, e a segunda permite que o controle granular de uso fique nas políticas IAM, que o time de plataforma já administra. O Resource: "*" no bloco de uso é exigência do serviço para key policies, não um erro, porque a política está anexada à chave em si.

Rotação automática e rotação manual

A rotação automática do KMS, disponível para chaves simétricas, cria material novo a cada 12 meses mantendo o mesmo identificador de chave. Nada na aplicação muda, nada precisa ser recifrado, e o material antigo permanece disponível para decifrar dados históricos. Essa transparência é o que torna a rotação uma configuração em vez de um projeto. Chaves assimétricas não suportam rotação automática, porque o certificado e a chave pública publicados não podem trocar silenciosamente; nesses casos a estratégia é criar chave nova, trocar o alias e manter a chave antiga para verificação de assinaturas antigas.

A nuance que confunde é o efeito real da rotação sobre dados já cifrados. Como o material antigo decifra o histórico, um atacante que obteve o material de hoje ainda lê o passado. A rotação limita a exposição futura e reduz o valor de material antigo ao longo do tempo, e a proteção do histórico vem do desenho do envelope encryption, com chaves de dados de vida curta por objeto ou por lote.

Key policies versus IAM policies

A avaliação de permissão do KMS tem lógica própria, e entendê-la evita tanto o acesso indevido quanto a frustração de política que não funciona.

Aspecto Key policy IAM policy
Anexada a A chave individual Usuário, grupo ou papel
Obrigatoriedade Toda chave precisa de key policy Complementa, nunca substitui
Granularidade Chave específica Conjunto de chaves por padrão e wildcard
Mantenedor típico Time de segurança, dono do domínio de dados Time de plataforma, gestor de identidades
Papel no modelo Define administração e delega uso ao IAM Concede uso apenas onde a key policy permitir

A regra de avaliação funciona assim: o acesso é permitido quando a key policy autoriza diretamente, ou quando a key policy delega ao IAM e a política IAM também autoriza; uma negação explícita em qualquer um dos dois vence tudo. O erro clássico é criar política IAM perfeita e esquecer que a key policy da chave nunca delegou ao IAM, e o resultado é acesso negado sem explicação óbvia. O padrão recomendado é a key policy conceder kms:* ao papel administrador e delegar o restante ao IAM, mantendo a administração fora do alcance do gerenciamento de identidades comum.

Condições de acesso e EncryptionContext

Além de definir quem pode usar a chave, o KMS permite restringir como ela é usada. Condições como kms:ViaService limitam as chamadas a um serviço específico, aws:PrincipalOrgID restringe o uso à organização, e o EncryptionContext cria vínculo entre a chave e o uso declarado, porque o contexto informado na decifração precisa ser idêntico ao da cifragem. O EncryptionContext é o mecanismo que impede, por exemplo, que um material cifrado para snapshot de produção decifre dados de outro domínio, mesmo com a mesma CMK. Em serviços como DynamoDB e S3 com SSE-KMS, o contexto é preenchido automaticamente pelo serviço, e políticas podem exigi-lo como condição.

# Cifra vinculando o uso a um contexto declarado
aws kms encrypt \
    --key-id alias/financeiro-dados \
    --encryption-context dominio=pagamentos,ambiente=producao \
    --plaintext fileb://payload.bin

# A decifração só funciona com o contexto idêntico ao da cifra
aws kms decrypt \
    --ciphertext-blob fileb://payload.cipher \
    --encryption-context dominio=pagamentos,ambiente=producao

O uso disciplinado do contexto transforma a chave genérica em chave com escopo verificável, e vale para auditoria tanto quanto para segurança. Alarmes sobre Decrypt sem contexto ou com contexto inesperado são detecção de abuso de baixo custo.

HSM e requisitos regulatórios (FIPS)

O HSM, hardware security module, é um dispositivo resistente a violação física que gera e guarda chaves sem jamais expô-las em texto claro, nem para o operador. A validação relevante é a FIPS 140, com níveis de 1 a 3, onde o nível 3 exige proteção contra ataques físicos ativos. O AWS KMS roda sobre HSMs validados, o que já atende à maioria das exigências; o AWS CloudHSM vai além, oferecendo HSMs dedicados de locação única, sob controle exclusivo do cliente, o que é requisito de reguladores específicos, emissores de certificado e arquiteturas de root of trust.

Aspecto AWS KMS AWS CloudHSM
Modelo Multitenant, totalmente gerenciado Locação única, operado pelo cliente
Validação FIPS Hardware subjacente validado em nível 3 Dispositivo dedicado validado em nível 3
Rotação Automática para chaves simétricas Manual, via SDK ou PKCS#11
Integração com serviços Nativa com S3, RDS, EBS e dezenas de outros Nenhuma nativa, uso por aplicação
Alta disponibilidade Gerida pelo serviço Cluster com dois ou mais HSMs
Custo Por chave e por requisição Fixo por hora de HSM provisionado
Quando usar Padrão para a maioria dos workloads Exigência regulatória, CAs, root of trust próprio

O custo operacional do CloudHSM é o ponto frequentemente subestimado: gestão de cluster, cópia de segurança de chaves, configuração de cliente e ausência de rotação automática são responsabilidades novas e permanentes. Quando o regulador exige HSM dedicado mas o workload usa serviços gerenciados, o caminho intermediário é o custom key store, em que uma chave do KMS tem seu material alojado dentro do CloudHSM, unindo integração nativa e controle exclusivo.

Separação de funções

O princípio é que quem administra chaves não lê dados, e quem lê dados não altera políticas. Em termos práticos: o papel de segurança administra políticas, rotação e destruição, mas não tem permissão de Decrypt; os papéis de aplicação usam Decrypt e GenerateDataKey, mas não podem alterar nada. Essa separação é verificável em auditoria pelo próprio desenho das políticas, e não por promessa de processo. Chaves de domínios sensíveis costumam residir em conta dedicada de segurança, usada por delegação cross-account pelas contas de aplicação, o que adiciona mais uma fronteira administrativa.

A separação entre ambientes é igualmente importante: chaves de produção não podem ser usadas a partir de contas de desenvolvimento, e pipeline de CI não deve ter acesso a chaves que decifrem dados reais. Quando um processo legítimo precisa decifrar em produção, o caminho é uma tarefa com papel temporário e trilha, não uma credencial permanente compartilhada.

Envelope encryption e custo por requisição

O preço do KMS tem duas linhas: valor mensal por chave e valor por requisição de API, com camadas de desconto por volume. Em qualquer workload relevante, a linha de requisição domina a fatura, e o custo cresce exatamente com o throughput de leitura e escrita dos dados protegidos. As alavancas de otimização são o cache de chaves de dados com TTL e limite de uso, a agregação de payloads cifrados por lote em vez de item a item e a escolha consciente de granularidade, com uma chave por domínio de dados e não por microserviço ou por objeto.

O CloudHSM tem lógica inversa: custo fixo por hora, independentemente do uso. Em TPS constante muito alto, o ponto de cruzamento pode tornar o dedicado mais barato que o por requisição, além do argumento regulatório. A análise honesta pede a curva de requisições reais do workload, projetada por doze meses, contra o custo fixo do cluster dedicado com redundância.

Erros comuns

  • Conceder kms:* amplo por wildcard em políticas IAM: a permissão genérica apaga a fronteira entre administrar e usar.
  • Referenciar key id no código em vez do alias: a rotação manual quebra a aplicação, e o alias é justamente o contrato de desacoplamento.
  • Assumir que rotação recifra dados: o material antigo decifra o histórico, e a proteção retroativa vem de chaves de dados de vida curta.
  • Permitir uso de chaves de produção a partir de contas de desenvolvimento: o pipeline vira caminho de extração de dados.
  • Deletar chave sem inventário de dependências: todo dado cifrado por ela se torna permanentemente ilegível.
  • Tratar CloudHSM como KMS drop-in: sem integração nativa e sem rotação automática, o custo operacional aparece no primeiro incidente.

Boas práticas

  • Definir uma CMK por domínio de dados, com alias estável e política mínima de uso por papel, como contrato explícito da arquitetura.
  • Escrever a key policy com administração restrita ao time de segurança e uso delegado ao IAM, aplicando separação de funções no próprio documento.
  • Habilitar rotação automática anual em toda chave simétrica, com alarme para chaves que excedem o prazo sem rotação.
  • Configurar trilha de uso no CloudTrail com detecção de Decrypt em massa, padrão típico de exfiltração de dados.
  • Usar cache de chaves de dados com TTL e limite de uso para controlar custo e latência em alto throughput.
  • Exigir EncryptionContext nas políticas das chaves de domínio, restringindo o uso ao serviço e ao ambiente declarados.
  • Adotar HSM dedicado apenas quando regulador ou arquitetura de root of trust exigir, preferindo custom key store para manter integração com serviços gerenciados.