O blog da AWS
Automatize a criptografia padrão de seus buckets Amazon S3 usando AWS KMS e AWS Config
Por Dario Goldfarb, Arquiteto de Soluções de Segurança na AWS LATAM
Neste blog, você aprenderá a criar uma automação para que todos os seus Buckets usem criptografia padrão com chaves privadas que você gerencia através do AWS Key Management Service (KMS).
Introdução e benefícios do AWS Key Management Service (KMS)
O AWS Key Management Service (KMS) é um serviço para armazenar chaves de criptografia, que usa módulos de segurança de hardware (HSMS) para fornecer um alto grau de segurança. O uso deste serviço oferece muitas vantagens:
- Permite que o usuário gerencie a chave como por exemplo: rotacioná-la periodicamente, desativá-la ou excluí-la
- Atualmente ele está integrado a todos os outros serviços da AWS que fornecem criptografia no lado do servidor (SSE)
- É resistente à manipulação física (resistente a adulterações)
- É um serviço gerenciado, portanto o cliente não precisa gerenciar um cluster HSMS ou sua replicação
- Uma API de extração de chave inexiste: ou seja, mesmo um administrador da AWS não tem uma maneira de extrair uma chave do KMS
- Suporta vários mecanismos de criptografia simétricos e assimétricos, tanto para criptografia quanto assinatura digital
- Diminui a latência de seus aplicativos de nuvem já que ele também reside na nuvem
- Se o HSM for necessário para ser dedicado, o KMS tem integração com o AWS CloudHSM para armazenar suas chaves em um HSM dedicado (locatário único)
- Permite que você aplique o controle de acesso à chave (incluindo todos os dados criptografados usando ela). Por exemplo:
- <esses usuários e funções> Só pode ser usado para criptografia e descriptografia pelo <essas contas>
- Ele pode ser usado pelo aplicativo A para criptografar e usado apenas pelo aplicativo B para descriptografar
- Só pode ser gerenciado por esse conjunto de usuários do IAM administradores ou funções do IAM
- Pode ser usado por, <estas contas externas>, mas apenas para criptografia/descriptografia, não para tarefas administrativas
Mais detalhes sobre os recursos do KMS podem ser encontrados no whitepaper Detalhes Criptográficos do KMS.
O Amazon Simple Storage Service (S3) é um serviço de armazenamento de objetos que oferece excelente escalabilidade, desempenho, segurança, disponibilidade e durabilidade de dados. Com o Amazon S3, você pode escolher entre três tipos de configurações de criptografia do lado do servidor para seus arquivos:
- SSE-S3 — usa chaves de criptografia gerenciadas pelo Amazon S3
- SSE-KMS — usa chaves de criptografia específicas do cliente (chaves mestres do cliente — CMKs) armazenadas no AWS Key Management Service (KMS)
- SSE-C — usa chaves de criptografia fornecidas pelo cliente para cada pedido PUT, GET, HEAD, POST ou upload de arquivos (multipart upload)
Essas opções permitem que você escolha o método de criptografia correto para cada caso, mas algumas organizações exigem o uso de chaves de criptografia individuais (dedicadas) para cada cliente em todos os seus buckets, por exemplo, para organizações que devam estar em conformidade com o PCI-DSS e que usam serviços da AWS para processar números de conta primários (PAN), há um requisito de que quaisquer dados PAN sejam armazenados para que sejam ilegíveis para terceiros.
Então, surge a questão: Como fazer para que todos os dados que armazeno nos buckets do Amazon S3 assumam como padrão a criptografia de chave privada (CMKs) gerenciada pelo AWS KMS?
Opção 1: Negar operações não criptografadas:
Uma opção poderia ser usar políticas do IAM para negar operações S3:PutObject onde a criptografia necessária não está em uso:
{ "Version":"2012-10-17", "Id":"PutObjectPolicy", "Statement":[{ "Sid":"DenyUnEncryptedObjectUploads", "Effect":"Deny", "Principal":"*", "Action":"s3:PutObject", "Resource":"arn:aws:s3:::awsexamplebucket1/*", "Condition":{ "StringNotEquals":{ "s3:x-amz-server-side-encryption":"aws:kms" } } } ] }
Portanto, qualquer operação de upload de arquivo que não use SSE-S3, seria rejeitada (assim como uma que não especifica criptografia):
PUT /example-object HTTP/1.1 Host: myBucket.s3.amazonaws.com Date: Wed, 8 Jun 2016 17:50:00 GMT Authorization: authorization string Content-Type: text/plain Content-Length: 11434 x-amz-meta-author: Janet Expect: 100-continue x-amz-server-side-encryption: AES256 [11434 bytes of object data]
Mas essa opção pode causar interrupções nos aplicativos atuais. Portanto precisamos analisar outras opções.
Opção 2: Automatizando a Criptografia de Objetos em um Bucket
O Amazon S3 fornece um parâmetro de configuração para especificar uma criptografia padrão:
Assim, se carregarmos um novo arquivo sem indicar o tipo de criptografia, o mesmo será criptografado automaticamente com a chave especificada.
A chave pode estar em outra conta, por exemplo, a conta de segurança da organização. O que é resolvido especificando o ARN KMS personalizado e especificando o ARN completo:
Automatizando a criptografia em vários buckets
Agora, talvez na sua organização existam centenas de Buckets…
- Como você pode detectar buckets que não são criptografados com o KMS?
- Como você pode configurar todos os buckets para criptografar com chaves KMS?
- Como você pode ter certeza de que, se alguém erroneamente ou com má intenção remover a criptografia padrão, ela será automaticamente reaplicada?
A. Como você pode detectar buckets que não são criptografados com o KMS?
Para detecção de buckets não criptografados com o KMS, você pode usar o AWS Config, que tem uma verificação nativa chamada s3-default-encryption-kms que recebe como parâmetro o ARN ou o ID da chave de criptografia que deseja verificar se os buckets estão usando ou não.
B. Como você pode configurar todos os buckets para criptografar com chaves KMS?
Para fazer com que todos os buckets que o AWS Config detecta como não compatível tenham a configuração desejada, configuraremos uma ação de correção.
As ações de correção executadas pelo AWS Config são documentos de automação do AWS Systems Manager. A arquitetura da solução é a seguinte:
Primeiro de tudo, você precisa criar uma função com uma política que permita que o AWS Systems Manager altere a configuração do Amazon S3 permitindo que a operação S3:PutEncryptionConfiguration em todos os buckets, bem como uma relação de confiança com o serviço AWS System Manager execute a correção.
Relacionamentos de confiança (JSON):
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal": { "Service": "ssm.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
Política do IAM:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "s3:PutEncryptionConfiguration", "Resource": "arn:aws:s3:::*" } ] }
No momento da escrita deste blog, não há nenhuma ação de correção nativa no serviço que permita configurar a criptografia padrão usando o KMS (há apenas o AWS-Enables3BucketEncryption para criptografar com o SSE-S3). Portanto, criaremos um novo documento de automação personalizado: Ativa 3BucketEncryptionWithKMS.
Nós especificamos automação usando JSON:
E usamos o seguinte texto para o documento de automação:
description: Enables Encryption on S3 Bucket using KMS CMK schemaVersion: '0.3' assumeRole: '{{ AutomationAssumeRole }}' parameters: BucketName: type: String description: (Required) The name of the S3 Bucket whose content will be encrypted. KMSMasterKeyID: type: String description: (Required) KMS CMK to use for Server-side encryption for the encryption. AutomationAssumeRole: type: String description: (Optional) The ARN of the role that allows actions on your behalf. default: '' mainSteps: - name: PutBucketEncryption action: 'aws:executeAwsApi' inputs: Service: s3 Api: PutBucketEncryption Bucket: '{{BucketName}}' ServerSideEncryptionConfiguration: Rules: - ApplyServerSideEncryptionByDefault: SSEAlgorithm: 'aws:kms' KMSMasterKeyID: '{{KMSMasterKeyID}}' isEnd: true
Finalmente, especificamos no AWS Config a ação de remediação:
Selecionamos a ação de correção que acabamos de criar no AWS Systems Manager Enables3BucketEncryptionWithKMS com correção automática, enviando como parâmetros:
- BucketName: No AWS Config, que nos informará o nome do bucket que você encontrou não compatível com a política que requer criptografia padrão para uma chave KMS específica.
- KMSMasterKeyID: ARN ou ID da chave KMS a ser usada (o mesmo que configurado para detecção no AWS Config). Em cenários de várias contas, é necessário especificar RNA.
- AutomationAssumeRole: O ARN da função que criamos para permitir que o AWS Systems Manager modifique as configurações do Amazon S3.
Após estas ações, todos os buckets serão criptografados com a chave KMS especificada no KMSMasterKeyID e todos os novos arquivos carregados. Quando nenhuma criptografia for especificada na chamada de API, serão criptografados automaticamente por padrão (com a chave KMS).
Opcionalmente, eles podem usar o Amazon Macie para fornecer uma visão geral do status de segurança de seus Buckets, para verificar se todos os Buckets estão efetivamente criptografando com o SSE-KMS por padrão. Como mostrado nas imagens a seguir, a ativação do serviço é muito simples e tem um período de 30 dias:
C. Como você pode ter certeza de que, se alguém erroneamente ou com má intenção remover a criptografia padrão, ela será automaticamente reaplicada?
O AWS Config faz verificações contínuas, sempre que você alterar a configuração do Bucket, a regra será avaliada e, se for encontrada não compatível, ela será corrigida automaticamente, portanto, nenhuma ação adicional é necessária para que quando a configuração do Amazon S3 tem uma deflexão, o mesmo é corrigido automaticamente.
Como vemos na figura acima, se um usuário com permissões suficientes alterar a configuração de um Bucket removendo a criptografia padrão, em minutos o AWS Config reverterá a configuração de criptografia para o valor desejado.
Criptografia retroativa
Os dados anteriores que são criptografados com chaves diferentes podem ser criptografados novamente manualmente (sobre cada dado) ou podem consultar o seguinte blog da AWS sobre como fazê-lo para vários objetos em vários buckets.
Conclusões
O AWS KMS é um serviço que permite criptografar facilmente dados diferentes com suas próprias chaves, com muitos benefícios de segurança e facilidade de implantação. O Amazon S3 oferece diferentes opções para criptografar, incluindo o uso do AWS KMS para gerenciamento de chaves, permitindo criptografia por padrão.
Usando o AWS Config, podemos detectar buckets configurados para salvar dados sem criptografia por padrão, ou usando outro tipo de criptografia, e podemos corrigir automaticamente esses buckets para usar uma chave do AWS KMS seguindo as etapas deste blog.
Recomendações:
Se você precisar que os dados sejam armazenados no Amazon S3 sejam criptografados, seguindo as etapas deste blog, você pode alterar rapidamente as configurações de criptografia padrão e verificar periodicamente se as configurações persistem ao longo do tempo.
Este artigo foi traduzido do Blog da AWS em Espanhol.
Sobre o autor
Dario Goldfarb, Arquiteto de Soluções de Segurança, LATAM.
Estou dedicado a ajudar os clientes no caminho de maturidade em segurança de carga na nuvem. Gosto de criar materiais didáticos e webinars e participar de eventos. Tenho mais de 15 anos de experiência em segurança cibernética e obtive várias certificações, como CISSP, AWS Security Specialty, The Open Group Master IT Architect. Gosto de estudar textos bíblicos em sua língua original (aramaico), andar de bicicleta e mergulhar.
Sobre os revisores
Omner Barajas, Arquiteto de Soluções Especialista em Segurança, México.
Julio Carvalho, Arquiteto Principal de Segurança de Serviços Financeiros, LATAM.