Objetivo:
Encriptar arquivos no lado cliente utilizando AWS APIs e Encryption SDK.
Introdução
O KMS tem a limitação de encriptar dados com tamanho de até 4 KB, entretanto, no mundo real, é comum termos dados de tamanhos maiores que queremos encriptar.
Este post mostra como utilizar o AWS Encryption SDK (CLI )para encriptar um arquivo de qualquer tamanho, inclusive maiores que 4 KB do lado do cliente usando CLI. A AWS também disponibiliza SDKs de envelopamento para Python, JavaScript, entre outras linguagens.
Recomendo a leitura destes outros dois posts que falam sobre princípios de criptografia e funcionamento do KMS.
https://arquitetocloud.com.br/aws-kma-principios-de-criptografia/
CLI – Encrypt e Decrypt
O diagrama abaixo mostra o fluxo para encriptação de dados que utiliza a API GenerateDataKey para gerar uma chave simétrica que será usada para encriptar um arquivo de 10 MB no lado cliente.
- Temos um arquivo de 10 MB que queremos encriptar com o KMS.
- Usamos a API GenerateDataKey do KMS, especificando a CMK que será usada para criptografar o arquivo.
- O KMS checa as permissões IAM para garantir que podemos utilizar a chave indicada.
- O KMS gera uma Data Key.
- A partir da chave gerada no passo anterior, duas Data Keys são enviadas de volta para o cliente, a Data Encryption Key (DEK) no formato Plaintext (texto) juntamente com a uma DEK encriptada.
- A DEK encriptada é usada para encriptar o arquivo de 10 MB e gerar um arquivo encriptado no lado cliente. Este arquivo contém a DEK encriptada e o arquivo de 10 MB encriptado. Os dois arquivos são “envelopados” (encapsulados) juntos dentro de um único arquivo final.
LAB
A sequência a seguir mostra como realizar a encriptação de um arquivo texto de 10 MB (file10mb.txt) usando a API GenerateDataKey chamado através do AWS CLI.
O SDK usa Python no lado cliente para fazer a encriptação, assim, os pacotes Python já devem estar instalados corretamente.
Foram usadas as seguintes referências:
https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/crypto-cli-install.html
https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/crypto-cli-examples.html
https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html
https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/introduction.html
A tela abaixo mostra a instalação do pacote de encriptação baseado em Python.
python -V
pip install aws-encryption-sdk-cli
aws-encryption-cli --version
A seguir estão os comandos executados durante a encriptação e desencriptação de um arquivo de 10 MB. O arquivo original tem 10 MB e está localizado no diretório c:\temp. O arquivo gerado pela encriptação fica em c:\temp\encrypt e o arquivo gerado pela desencriptação fica em c:\temp\decrypt.
dir
Get-Content c:\temp\file10mb.txt -Tail 5
aws-encryption-cli --encrypt --input file10mb.txt --wrapping-keys key=arn:aws:kms:sa-east-1:530960511476:key/651b6437-923d-4607-a334-400f2f269fc9 --metadata-output c:\temp\encrypt\Metadata_encrypt.txt --output c:\temp\encrypt\file10mb_encrypted
dir .\encrypt\
Get-Content c:\temp\encrypt\file10mb_encrypted -Tail 5
aws-encryption-cli --decrypt --input c:\temp\encrypt\file10mb_encrypted --wrapping-keys key=arn:aws:kms:sa-east-1:530960511476:key/651b6437-923d-4607-a334-400f2f269fc9 --metadata-output c:\temp\decrypt\Metadata.txt --output c:\temp\decrypt\file10mb
dir .\decrypt\
Get-Content c:\temp\decrypt\file10mb -Tail 5
A tela abaixo mostra a execução dos comandos.
Neste post foi possível mostrar o funcionamento do Envelope Encryption de forma simplificada. O procedimento ocorre do lado cliente e tem o objetivo de utilizar a API GenerateDataKey e o AWS Encryption SDK para executar o processo de encriptação de dados.
It’s done!