Identifique chaves AWS KMS não utilizadas e evite exclusões acidentais

Gerenciar chaves KMS em escala é um desafio real

Conforme o uso da Amazon Web Services (AWS) cresce dentro de uma organização, o gerenciamento de chaves criptográficas se torna cada vez mais complexo. Seja com um punhado de chaves ou com milhares distribuídas por múltiplas contas e regiões, existe sempre a necessidade de auditar o uso dessas chaves — seja para atender requisitos de conformidade, avaliar riscos ou reduzir custos operacionais.

O problema é que descobrir quais chaves estão ativas e quais ficaram paradas sem uso costumava ser um processo trabalhoso. Para resolver isso, o Serviço de Gerenciamento de Chaves da AWS (AWS KMS) lançou a API GetKeyLastUsage, uma nova funcionalidade que permite identificar rapidamente quando cada chave foi usada pela última vez em uma operação criptográfica. Para saber mais, consulte a documentação Determine past usage of a KMS key.

Como era feita a auditoria antes

Antes desse lançamento, a principal forma de auditar o uso de chaves era por meio dos logs do AWS CloudTrail. O CloudTrail registra todas as operações criptográficas por padrão, então os dados estavam disponíveis — o problema era transformar esse volume de dados em informação acionável.

Para os últimos 90 dias, o histórico de eventos do CloudTrail tornava o processo viável. Para períodos mais longos, era necessário criar uma trilha dedicada, entregar os logs para o Amazon Simple Storage Service (Amazon S3) para retenção de longo prazo e, em seguida, consultar esses logs com ferramentas como o Amazon Athena. Um fluxo complexo para uma pergunta relativamente simples: “quando essa chave foi usada pela última vez?”

O que a API GetKeyLastUsage oferece

O AWS KMS agora disponibiliza uma forma direta de consultar quando uma chave foi utilizada pela última vez em operações criptográficas. Essa informação também pode ser visualizada pelo console de gerenciamento da AWS e pela Interface de Linha de Comando da AWS (AWS CLI).

A API GetKeyLastUsage retorna a data e hora da operação criptográfica mais recente realizada com uma chave KMS — sem precisar vasculhar logs do CloudTrail. Os dados retornados incluem:

  • Data e hora da última operação com a chave
  • Tipo de operação realizada
  • ID do evento no CloudTrail
  • ID da requisição no KMS

Essa informação está disponível para todas as chaves gerenciadas pelo cliente e chaves gerenciadas pela AWS, independentemente do tipo de chave, origem, armazenamento ou tipo de uso.

Além disso, é possível restringir a desativação ou o agendamento de exclusão de uma chave que foi usada recentemente, incorporando essas informações de uso como condição na política da chave KMS.

Entendendo o período de rastreamento

Antes de depender das informações de último uso de uma chave, é fundamental compreender o conceito de período de rastreamento. Esse é o ponto de partida a partir do qual o AWS KMS passou a registrar a atividade criptográfica de cada chave. Para a maioria das regiões da AWS, o rastreamento teve início em 23 de abril de 2026.

Isso é crítico: a ausência de informações de uso pode significar que a chave nunca foi usada ou que ela simplesmente não foi usada desde o início do rastreamento. Por exemplo, uma chave criada em 1º de janeiro de 2026 pode ter sido amplamente utilizada entre janeiro e 22 de abril — mas essas operações não estarão refletidas nos dados da API. Portanto, não é possível concluir que uma chave está em desuso apenas porque não há registros de uso após o início do rastreamento.

Como visualizar as informações de uso

Não é necessário habilitar nada nem fazer configurações adicionais para acessar as informações de último uso das chaves KMS. Basta acessar o console do KMS, selecionar uma chave em Customer-managed keys e verificar o campo Last used nas configurações gerais. Ao clicar no link exibido nesse campo, é possível ver detalhes adicionais como o timestamp, o tipo de operação e o ID do evento no CloudTrail.

A coluna Last used também é exibida ao tentar agendar a exclusão de uma chave, permitindo tomar decisões mais informadas antes de confirmar a ação.

Casos de uso práticos

Caso de uso 1: Otimização de custos com limpeza de chaves não utilizadas

Organizações que gerenciam milhares de chaves KMS distribuídas por múltiplas contas frequentemente acumulam chaves que nunca foram usadas ou que caíram em desuso. A limpeza dessas chaves reduz custos operacionais e diminui a superfície de segurança exposta. A API GetKeyLastUsage facilita esse processo ao indicar quais chaves não realizaram operações criptográficas recentemente.

No entanto, é importante ter cautela: o fato de uma chave não ter sido usada recentemente não significa que ela pode ser excluída com segurança. Uma chave pode ficar meses sem atividade e ainda ser necessária para descriptografar arquivos em cenários de conformidade ou recuperação de desastres.

Um exemplo claro disso são os volumes do Amazon Elastic Block Store (Amazon EBS). Esses volumes interagem com chaves KMS apenas em eventos específicos do ciclo de vida, como criação, anexação e desanexação. Após um volume ser anexado a uma instância do Amazon Elastic Compute Cloud (Amazon EC2), a chave de criptografia de dados em texto simples fica armazenada em cache no hardware do Nitro Card — e todas as operações subsequentes de leitura e gravação usam essa chave em cache, sem nenhuma chamada adicional à API do KMS.

Isso significa que um volume de produção rodando continuamente por meses ou anos pode não mostrar nenhuma atividade KMS durante todo esse período — mas ainda depende completamente da chave para qualquer operação futura, como reinicializações de instância, reanexação de volume ou recuperação de desastres. Se a chave for excluída, a chave de criptografia de dados armazenada com o volume nunca poderá ser descriptografada novamente, tornando os dados do volume permanentemente inacessíveis.

A recomendação é: ao identificar uma chave potencialmente não utilizada, primeiro desative-a usando o comando DisableKey e monitore suas aplicações e serviços em busca de falhas de criptografia ou descriptografia. Antes de excluir qualquer chave KMS, verifique se não há volumes EBS ou snapshots associados a ela, independentemente de quando ocorreu a última chamada à API do KMS.

A AWS também disponibiliza um mecanismo para criar um alarme no CloudWatch que notifica quando uma chave com exclusão pendente está sendo acessada, dando a oportunidade de cancelar a exclusão antes que os dados se tornem inacessíveis.

Script para identificar chaves não utilizadas

A seguir, um exemplo de script que percorre todas as chaves gerenciadas pelo cliente em uma conta e recupera a data de último uso de cada uma via API GetKeyLastUsage. O script aceita dois parâmetros opcionais: um limite em dias e uma região da AWS. Ele filtra e exibe apenas as chaves que não foram usadas dentro do período especificado, apresentando os resultados em uma tabela com o nome da chave, ID da conta, região e data de último uso.

Exemplo para verificar todas as chaves não usadas nos últimos 180 dias na região us-east-1:

./script.sh 180 us-east-1
#!/bin/bash
DAYS=${1:-90}
REGION=${2:-$(aws configure get region)}
CUTOFF=$(date -v-${DAYS}d +%s 2>/dev/null || date -d "-${DAYS} days" +%s)
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)

printf "Showing keys not used in the last %s days (Region: %s)\n\n" "$DAYS" "$REGION"
printf "%-50s %-15s %-20s %-15s\n" "Key Name" "Account ID" "Region" "Last Usage Date"
printf "%.0s-" {1..100}
printf "\n"

for key_id in $(aws kms list-keys --region $REGION --query 'Keys[*].KeyId' --output text); do
    key_manager=$(aws kms describe-key --region $REGION --key-id $key_id --query 'KeyMetadata.KeyManager' --output text)
    if [ "$key_manager" = "CUSTOMER" ]; then
        last_usage=$(aws kms get-key-last-usage --region $REGION --key-id $key_id)
        timestamp=$(echo $last_usage | jq -r '.KeyLastUsage.TimeStamp // empty')
        if [ -z "$timestamp" ]; then
            last_epoch=0
        else
            last_epoch=$(date -jf "%Y-%m-%dT%H:%M:%S" "$(echo $timestamp | cut -d. -f1)" +%s 2>/dev/null || date -d "$timestamp" +%s)
        fi
        if [ "$last_epoch" -lt "$CUTOFF" ]; then
            key_alias=$(aws kms list-aliases --region $REGION --key-id $key_id --query 'Aliases[0].AliasName' --output text)
            key_name=${key_alias:-$key_id}
            [ "$key_name" = "None" ] && key_name=$key_id
            if [ -z "$timestamp" ]; then
                tracking_date=$(echo $last_usage | jq -r '.TrackingStartDate' | cut -d'T' -f1)
                last_used="${tracking_date}*"
            else
                last_used=$(echo $timestamp | cut -d'T' -f1)
            fi
            printf "%-50s %-15s %-20s %-15s\n" "$key_name" "$ACCOUNT_ID" "$REGION" "$last_used"
        fi
    fi
done

printf "\n* = No operations performed since tracking started\n"

Caso de uso 2: Prevenção de exclusões acidentais com controles de política

Exclusões acidentais de chaves KMS são um risco real nas organizações. Uma chave pode ser excluída porque alguém acredita que ela não está mais em uso — e só depois se descobre que aplicações ou workloads críticos dependiam dela. O resultado são falhas de acesso a dados, indisponibilidade de aplicações e procedimentos de recuperação de emergência.

Para evitar esse cenário, é possível usar a chave de condição kms:TrailingDaysWithoutKeyUsage nas políticas de chave KMS, bloqueando automaticamente a exclusão ou desativação de chaves usadas recentemente. Veja como configurar isso no console do AWS KMS:

  1. Acesse o console do AWS KMS e selecione Customer managed keys no painel de navegação.
  2. Selecione a chave que deseja proteger.
  3. Na aba Key policy, clique em Edit.
  4. No editor de política, adicione o seguinte bloco:
{
  "Sid": "PreventDeletionOfRecentlyUsedKeys",
  "Effect": "Deny",
  "Principal": "*",
  "Action": [
    "kms:ScheduleKeyDeletion",
    "kms:DisableKey"
  ],
  "Resource": "*",
  "Condition": {
    "NumericLessThanEquals": {
      "kms:TrailingDaysWithoutKeyUsage": "365"
    }
  }
}

Essa política bloqueia a exclusão ou desativação de qualquer chave que tenha sido usada nos últimos 365 dias. O limite pode ser ajustado conforme as necessidades da organização. Para mais informações sobre essa chave de condição, consulte a documentação de kms:TrailingDaysWithoutKeyUsage.

Considerações importantes antes de excluir uma chave

Ao revisar chaves para possível exclusão, é essencial ter em mente os seguintes pontos:

  • A exclusão de uma chave é irreversível e torna os dados criptografados com ela irrecuperáveis.
  • A AWS impõe um período de espera de 7 a 30 dias antes da exclusão ser efetivada. Durante esse tempo, monitore tentativas de uso e cancele a exclusão se necessário.
  • Exclua uma chave somente se tiver certeza de que nenhum dado foi ou será criptografado com ela.
  • Considere desativar a chave primeiro para testar o impacto da sua indisponibilidade antes de partir para a exclusão definitiva.
  • O CloudTrail continua sendo a fonte autoritativa de auditoria, pois fornece o histórico completo de quem fez cada requisição e com quais parâmetros. A GetKeyLastUsage informa rapidamente quando e qual operação ocorreu, mas o CloudTrail mostra o contexto completo. Saiba mais sobre registro de chamadas à API do KMS com o CloudTrail.

Conclusão

A API GetKeyLastUsage representa um avanço significativo nas capacidades de gerenciamento do ciclo de vida de chaves KMS. Ela oferece acesso imediato a dados de uso que antes só estavam disponíveis mediante consultas complexas ao CloudTrail. Para equipes que gerenciam grandes volumes de chaves, isso simplifica auditorias, reduz riscos de exclusões acidentais e facilita a otimização de custos.

O ponto de partida é simples: acesse o console do AWS KMS e verifique o campo Last used nas chaves gerenciadas pelo cliente e nas chaves gerenciadas pela AWS. Para auditorias mais amplas, integre a API aos scripts de automação existentes usando os exemplos de AWS CLI apresentados aqui.

Fonte

Identify unused AWS KMS keys and prevent accidental key deletions (https://aws.amazon.com/blogs/security/identify-unused-aws-kms-keys-and-prevent-accidental-key-deletions/)

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *