Criptografe e Descriptografe uma Exportação Privada com KMS

AWSBeginner
Pratique Agora

Introdução

Uma exportação privada precisa de criptografia antes do armazenamento. Você criptografará um pequeno arquivo sintético, permitirá que um leitor recupere seus bytes originais, diagnosticará falhas de descriptografia e agendará a limpeza de sua chave.

Conclua primeiro Get Started with AWS on LabEx, Conceda Privilégios Mínimos a um Leitor de Relatórios e Use Credenciais Temporárias com uma Função IAM. Esta VM nova fornece seu próprio arquivo, sessão da função leitora e chave de referência.

Relação com as certificações

Este laboratório oferece prática nos seguintes tópicos de exame.

Criptografe a Exportação Privada

Nesta etapa, você criará uma chave do AWS Key Management Service (KMS) e transformará a exportação fornecida em texto cifrado. Use o private-export.json sintético fornecido em vez de dados pessoais. O profile export-reader usa uma sessão temporária da função leitora preparada, inicialmente sem permissão KMS. Preserve alias/labex-sec01-reference.

Abra AWS View ao lado do Terminal para comparar o estado da chave, as concessões do leitor e os resultados das solicitações criptográficas. Seus hashes de bytes permitem comparar resultados sem exibir dados privados.

Uma chave simétrica usa o mesmo material de chave protegido para criptografia e descriptografia; o KMS mantém esse material de chave dentro do serviço. Um alias dá um nome legível a uma chave sem substituir seu ARN único.

Comece no diretório de projeto fornecido. cd altera seu diretório atual; a consulta de quem faz a chamada confirma a identidade do operador preparado sem imprimir credenciais.

cd /home/labex/project
aws sts get-caller-identity --query Arn --output text

Espere o ARN do usuário labex-sec01-operator. Crie sua própria chave. --query seleciona um campo da resposta, --output text remove as aspas de JSON e $(...) armazena esse resultado em uma variável do shell para comandos posteriores.

KEY_ARN=$(aws kms create-key --description labex-sec01-owned-export --query KeyMetadata.Arn --output text)
aws kms create-alias --alias-name alias/labex-sec01-private-export --target-key-id "$KEY_ARN"
aws kms describe-key --key-id "$KEY_ARN" --query 'KeyMetadata.[KeyState,KeySpec]' --output text

Espere Enabled e SYMMETRIC_DEFAULT. Não use nem modifique a chave de referência.

Configuração de chave no Console oficial do AWS KMS

Referência do Console oficial: alias, status Enabled e ARN correspondem à identidade e ao estado da chave que você acabou de consultar. Esses são valores de exemplo da AWS; continue usando seu próprio KEY_ARN no Terminal.

Fonte: AWS KMS.

Um contexto de criptografia é um conjunto de rótulos não secretos vinculados ao texto cifrado. A descriptografia deve fornecer os mesmos rótulos. Aqui, Purpose=private-export identifica o uso pretendido desta exportação. Valores de contexto não são um lugar para senhas ou dados pessoais.

KMS Encrypt processa pequenos textos simples; esta exportação preparada está bem abaixo do limite de 4 KiB. fileb:// lê a entrada como bytes binários. A CLI representa o texto cifrado retornado em base64; base64 --decode o converte novamente em um arquivo binário. O pipe envia a saída ao próximo comando, e > grava o resultado no arquivo nomeado.

aws kms encrypt --key-id "$KEY_ARN" --plaintext fileb://private-export.json --encryption-context Purpose=private-export --query CiphertextBlob --output text | base64 --decode > private-export.kms

Compare hashes de bytes com sha256sum. Hashes diferentes mostram que o texto cifrado difere dos dados originais; isso sozinho não é evidência de permissão.

sha256sum private-export.json private-export.kms

Abra o AWS View. Customer key inventory deve mostrar sua chave habilitada, enquanto Cryptographic requests mostra uma solicitação Encrypt permitida do operador cuja entrada corresponde à exportação.

Conceda Acesso a uma Função Leitora

Nesta etapa, você permitirá que o leitor da aplicação descriptografe apenas com sua chave de exportação. Uma permissão de função IAM especifica tanto uma ação quanto o recurso ao qual ela se aplica. kms:Decrypt permite recuperar bytes; não concede criptografia nem administração de chaves.

Limite de descriptografia KMS

O leitor precisa do contexto correto, de uma concessão Decrypt e de uma chave habilitada para recuperar a exportação.

Primeiro, teste o profile do leitor antes de adicionar uma concessão. --profile export-reader seleciona a sessão temporária da função preparada em vez do operador. O comando deve falhar com uma resposta de acesso negado e não deve retornar texto simples.

aws kms decrypt --profile export-reader --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=private-export --query KeyId --output text

Crie um documento de política. O heredoc grava as linhas entre <<EOF e EOF em read-export.json; o shell expande $KEY_ARN para o ARN exato da chave. Esta concessão não usa ação nem recurso com curinga.

cat > read-export.json <<EOF
{
  "Version": "2012-10-17",
  "Statement": [{"Effect": "Allow", "Action": "kms:Decrypt", "Resource": "$KEY_ARN"}]
}
EOF

Anexe essa política inline à função leitora. Uma política inline pertence a esta função IAM e pode ser removida de forma independente durante a limpeza. A chave fornecida usa sua política padrão de chave da mesma conta, que permite que permissões IAM autorizem esta função.

aws iam put-role-policy --role-name labex-sec01-export-reader --policy-name ReadPrivateExport --policy-document file://read-export.json

Agora recupere os bytes criptografados com a sessão do leitor. O comando seleciona o campo de texto simples em base64, o decodifica e grava a exportação restaurada sem exibir seu conteúdo.

aws kms decrypt --profile export-reader --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=private-export --query Plaintext --output text | base64 --decode > restored-export.json

cmp compara os bytes reais dos arquivos. Com &&, a mensagem é impressa apenas quando essa comparação tem sucesso.

cmp private-export.json restored-export.json && echo "Original export bytes recovered"

Espere Original export bytes recovered. O AWS View deve mostrar a política do leitor para a chave exata e um Decrypt permitido da função leitora cujos bytes recuperados correspondem à exportação. Mantenha esta função IAM limitada a Decrypt em sua chave.

Exemplo do AWS View mostrando uma concessão do leitor para a chave exata e a recuperação real dos bytes

Diagnostique Três Falhas de Descriptografia

Nesta etapa, você distinguirá falhas de contexto, permissão e estado da chave. Mantenha o mesmo texto cifrado durante todo o processo para que cada resultado tenha uma causa clara. Os comandos com falha abaixo selecionam intencionalmente apenas um identificador de chave, nunca texto simples.

Primeiro, altere apenas o valor do contexto. Mesmo um leitor autorizado não consegue descriptografar texto cifrado com um contexto incorreto.

aws kms decrypt --profile export-reader --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=wrong-context --query KeyId --output text

Espere InvalidCiphertextException. A chave e a concessão à função IAM ainda existem, mas o contexto não corresponde ao usado em Encrypt.

Em seguida, remova a concessão da função IAM e repita a solicitação com o contexto correto. Remover uma política inline altera a autorização sem modificar a chave nem o texto cifrado.

aws iam delete-role-policy --role-name labex-sec01-export-reader --policy-name ReadPrivateExport
aws kms decrypt --profile export-reader --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=private-export --query KeyId --output text

Espere uma resposta de acesso negado. Restaure a concessão restrita antes do próximo teste.

aws iam put-role-policy --role-name labex-sec01-export-reader --policy-name ReadPrivateExport --policy-document file://read-export.json

Por fim, desabilite a chave. Uma chave desabilitada permanece no inventário, mas não pode realizar operações criptográficas. Use o profile do operador, que tem permissão, para isolar a falha de estado da chave.

aws kms disable-key --key-id "$KEY_ARN"
aws kms decrypt --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=private-export --query KeyId --output text

Espere DisabledException. Habilite a chave e repita a recuperação bem-sucedida pelo leitor para confirmar que o comportamento normal retorna.

aws kms enable-key --key-id "$KEY_ARN"
aws kms decrypt --profile export-reader --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=private-export --query Plaintext --output text | base64 --decode > restored-export.json
cmp private-export.json restored-export.json && echo "Reader access restored"

Inspecione a tabela Cryptographic requests do AWS View. Compare quem fez a chamada, o contexto e o resultado das solicitações negadas. Uma concessão à função IAM não corrige um contexto incompatível nem uma chave desabilitada.

Exemplo do AWS View mostrando solicitações negadas seguidas de acesso restaurado do leitor

Retire a Chave do Laboratório de Uso com Segurança

Nesta etapa, você removerá a concessão do leitor e o alias e agendará a exclusão apenas de sua chave de exportação. A exclusão de uma chave KMS tem um período de espera: PendingDeletion é o estado imediato esperado, não prova de que uma chave já desapareceu. Durante esse período, a chave não consegue descriptografar.

Confirme que o ARN ainda pertence à sua chave de exportação do laboratório antes de agendar a exclusão.

aws kms describe-key --key-id "$KEY_ARN" --query 'KeyMetadata.[Description,KeyState]' --output text

Espere labex-sec01-owned-export e Enabled. Remova apenas a concessão à função IAM que você adicionou e o alias que criou.

aws iam delete-role-policy --role-name labex-sec01-export-reader --policy-name ReadPrivateExport
aws kms delete-alias --alias-name alias/labex-sec01-private-export

Agende a exclusão da chave com o período mínimo de espera de sete dias.

aws kms schedule-key-deletion --key-id "$KEY_ARN" --pending-window-in-days 7 --query DeletionDate --output text

O comando retorna a data agendada de exclusão. Confirme o estado real da chave com uma leitura separada e preserve a chave de referência não relacionada.

aws kms describe-key --key-id "$KEY_ARN" --query KeyMetadata.KeyState --output text
aws kms describe-key --key-id alias/labex-sec01-reference --query KeyMetadata.KeyState --output text

Espere PendingDeletion para sua chave e Enabled para a referência. O AWS View deve mostrar nenhuma concessão do leitor e Reference preserved. Use rm -f para remover apenas os artefatos locais de exportação nomeados; ele tolera um arquivo ausente sem excluir outros arquivos do projeto.

rm -f private-export.json private-export.kms restored-export.json read-export.json

Execute a verificação desta etapa enquanto o profile do operador ainda está disponível. Após ela passar, remova os profiles temporários da CLI desta VM e desfaça a variável da chave. Isso remove credenciais locais de sessão; não cancela a exclusão agendada da chave na nuvem.

rm -f /home/labex/.aws/credentials /home/labex/.aws/config
unset KEY_ARN

Resumo

Você criptografou bytes reais de uma exportação com uma chave KMS do cliente e um contexto não secreto, concedeu a uma função leitora Decrypt na chave exata e recuperou os bytes originais. Um contexto incorreto, uma concessão removida e uma chave desabilitada causaram falhas distintas. Depois, você retirou de uso a chave do laboratório por meio de seu período de espera para exclusão, preservando a referência não relacionada.