Introdução
Uma aplicação precisa ler uma exportação privada armazenada no S3. Você criptografará novos uploads com uma chave do cliente, concederá acesso ao leitor e testará como a permissão do objeto e a permissão da chave afetam downloads reais.
Conclua primeiro Armazene e Recupere Arquivos no S3, Criptografe e Descriptografe uma Exportação Privada com KMS e seus pré-requisitos de IAM. Esta VM nova fornece uma exportação sintética, uma sessão da função leitora e recursos independentes de referência.
Relação com as certificações
Este laboratório oferece prática nos seguintes tópicos de exame.
- Cloud Practitioner (CLF-C02) · Tarefa 2.2: Criptografia em repouso do S3 e permissões separadas de objetos e chaves.
- Solutions Architect – Associate (SAA-C03) · Tarefa 1.3: Criptografia em repouso do S3 e permissões separadas de objetos e chaves.
- Developer – Associate (DVA-C02) · Tarefa 2.2: Criptografia em repouso do S3 e permissões separadas de objetos e chaves.
- CloudOps Engineer – Associate (SOA-C03) · Tarefa 4.2: Criptografia em repouso do S3 e permissões separadas de objetos e chaves.
- Security – Specialty (SCS-C03) · Tarefa 5.2: Prática dos fundamentos: Criptografia em repouso do S3 e permissões separadas de objetos e chaves.
- Data Engineer – Associate (DEA-C01) · Tarefa 4.3: Prática dos fundamentos: Criptografia em repouso do S3 e permissões separadas de objetos e chaves.
- DevOps Engineer – Professional (DOP-C02) · Tarefa 6.2: Prática dos fundamentos: Criptografia em repouso do S3 e permissões separadas de objetos e chaves.
- Solutions Architect – Professional (SAP-C02) · Tarefa 2.3: Prática dos fundamentos: Criptografia em repouso do S3 e permissões separadas de objetos e chaves.
Prepare o Armazenamento de Objetos Criptografados
Nesta etapa, você criará uma chave KMS do cliente e configurará um novo bucket para usá-la por padrão. Um bucket armazena objetos; cada objeto tem uma chave como exports/private-export.json. A criptografia no servidor com KMS (SSE-KMS) permite que o S3 criptografe objetos armazenados com sua chave escolhida. A criptografia padrão se aplica a novos uploads sem exigir que cada cliente repita as opções de criptografia.
Use o private-export.json sintético fornecido; a sessão da função IAM export-reader começa sem acesso ao objeto nem à chave. Preserve o bucket, o objeto e a chave de referência. Abra AWS View ao lado do Terminal para comparar o estado da chave/bucket, as concessões do leitor e comparações seguras de bytes.
Comece no diretório do projeto e confirme a identidade do operador fornecido. cd muda o diretório; a consulta de quem faz a chamada retorna um ARN de identidade sem expor credenciais.
cd /home/labex/project
aws sts get-caller-identity --query Arn --output text
Espere o usuário labex-sec02-operator. Crie uma chave simétrica do cliente e um alias legível. --query seleciona o ARN, --output text remove as aspas de JSON e $(...) salva o resultado em uma variável do shell.
KEY_ARN=$(aws kms create-key \
--description labex-sec02-owned-export \
--query KeyMetadata.Arn \
--output text)
aws kms create-alias \
--alias-name alias/labex-sec02-private-export \
--target-key-id "$KEY_ARN"
Use um nome temporário de bucket com um sufixo de timestamp para evitar colisões de nomes. O prefixo labex-sec02-owned- distingue seu bucket da referência fornecida. Esta unidade usa us-east-1, portanto a criação do bucket não precisa de uma restrição de localização.
BUCKET="labex-sec02-owned-$(date +%s)"
aws s3api create-bucket \
--bucket "$BUCKET" \
--region us-east-1 \
--query Location \
--output text
Configure SSE-KMS com o ARN exato da chave. Uma S3 Bucket Key pode reduzir solicitações repetidas ao KMS; ela permanece desativada aqui para que cada objeto use seu próprio contexto de criptografia KMS. Grave a regra padrão como um arquivo JSON comum. O heredoc expande $KEY_ARN; file:// carrega a configuração salva.
cat > bucket-encryption.json <<EOF
{
"Rules": [
{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "aws:kms",
"KMSMasterKeyID": "$KEY_ARN"
},
"BucketKeyEnabled": false
}
]
}
EOF
aws s3api put-bucket-encryption --bucket "$BUCKET" \
--server-side-encryption-configuration file://bucket-encryption.json
aws s3api get-bucket-encryption \
--bucket "$BUCKET" \
--query ServerSideEncryptionConfiguration
Espere aws:kms, o ARN da sua chave e BucketKeyEnabled: false. Mantenha KEY_ARN e BUCKET neste Terminal para os comandos seguintes. No AWS View, a chave do laboratório está habilitada, e o bucket ainda não tem objetos.
Dê ao Leitor Ambas as Permissões Necessárias
Nesta etapa, você enviará a exportação e permitirá que uma função IAM recupere seus bytes originais. O upload exige kms:GenerateDataKey na chave escolhida. SSE-KMS usa uma chave de dados para criptografar os bytes do objeto. O KMS protege essa chave de dados; o S3 armazena o objeto criptografado e a chave de dados protegida, depois solicita a descriptografia quando um leitor autorizado baixa o objeto. O material de chave não precisa aparecer na saída da CLI.

Ler este objeto SSE-KMS exige tanto acesso ao objeto quanto permissão de descriptografia da chave.
Envie o arquivo fornecido com s3api put-object. O padrão do bucket fornece as configurações de criptografia; --body private-export.json lê o arquivo local nomeado como bytes do objeto. Use esta API de parte única para a pequena exportação.
aws s3api put-object \
--bucket "$BUCKET" \
--key exports/private-export.json \
--body private-export.json \
--query '{Encryption:ServerSideEncryption,Key:SSEKMSKeyId,BucketKey:BucketKeyEnabled}'
aws s3api head-object \
--bucket "$BUCKET" \
--key exports/private-export.json \
--query '{Encryption:ServerSideEncryption,Key:SSEKMSKeyId,Bytes:ContentLength}'
Espere aws:kms, o ARN da chave do laboratório e o tamanho original do arquivo. Metadados sozinhos não mostram se um leitor consegue descriptografar. Primeiro, conceda apenas acesso ao objeto. Um ARN de objeto inclui o bucket e a chave do objeto; ele é diferente de um ARN de bucket. O heredoc seguinte grava um arquivo de política e expande $BUCKET dentro dele.
cat > read-object.json <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::$BUCKET/exports/private-export.json"
}
]
}
EOF
aws iam put-role-policy \
--role-name labex-sec02-export-reader \
--policy-name ReadExportObject \
--policy-document file://read-object.json
Selecione a sessão preparada do leitor com --profile export-reader. Esta tentativa deve falhar com AccessDenied: a função IAM pode ler este objeto, mas ainda não tem uma concessão de descriptografia KMS.
aws \
--profile export-reader s3api get-object \
--bucket "$BUCKET" \
--key exports/private-export.json reader-export.json
Conceda a essa função IAM apenas kms:Decrypt na chave exata. Ela não precisa de gerenciamento de chaves nem de kms:GenerateDataKey para baixar o objeto.
cat > decrypt-key.json <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "kms:Decrypt",
"Resource": "$KEY_ARN"
}
]
}
EOF
aws iam put-role-policy \
--role-name labex-sec02-export-reader \
--policy-name DecryptExportKey \
--policy-document file://decrypt-key.json
aws \
--profile export-reader s3api get-object \
--bucket "$BUCKET" \
--key exports/private-export.json reader-export.json \
--query '{Encryption:ServerSideEncryption,Key:SSEKMSKeyId}'
chmod 600 reader-export.json
cmp private-export.json reader-export.json
cmp não imprime nada e retorna sucesso quando os conteúdos em bytes correspondem. O AWS View agora deve mostrar texto cifrado armazenado e um GetObject do leitor cujos bytes retornados correspondem à exportação fornecida. Essas são observações separadas: o armazenamento criptografado protege bytes em repouso, enquanto permissões de escopo restrito controlam a recuperação.

Diagnostique Falhas de Permissão e Estado da Chave
Nesta etapa, você distinguirá uma concessão de descriptografia ausente de uma chave desabilitada. Mantenha a permissão do objeto para que apenas uma condição mude por vez.
Remova a concessão de chave do leitor e repita o mesmo download do objeto. A função IAM ainda tem s3:GetObject, mas a solicitação deve falhar com AccessDenied.
aws iam delete-role-policy \
--role-name labex-sec02-export-reader \
--policy-name DecryptExportKey
aws \
--profile export-reader s3api get-object \
--bucket "$BUCKET" \
--key exports/private-export.json reader-export.json
Inspecione a política restante do objeto. Ela ainda deve nomear apenas este objeto de exportação.
aws iam get-role-policy \
--role-name labex-sec02-export-reader \
--policy-name ReadExportObject \
--query PolicyDocument
Restaure a concessão para a chave exata e desabilite sua chave. Uma chave desabilitada ainda existe, mas não pode realizar operações criptográficas. Não altere a chave de referência não relacionada.
aws iam put-role-policy \
--role-name labex-sec02-export-reader \
--policy-name DecryptExportKey \
--policy-document file://decrypt-key.json
aws kms disable-key --key-id "$KEY_ARN"
aws \
--profile export-reader s3api get-object \
--bucket "$BUCKET" \
--key exports/private-export.json reader-export.json
Espere uma falha de chave desabilitada. Ter uma permissão IAM não torna uma chave desabilitada utilizável. Confirme seu estado nativo, habilite-a e busque o objeto novamente.
aws kms describe-key --key-id "$KEY_ARN" --query KeyMetadata.KeyState --output text
aws kms enable-key --key-id "$KEY_ARN"
aws \
--profile export-reader s3api get-object \
--bucket "$BUCKET" \
--key exports/private-export.json reader-export.json \
--query ServerSideEncryption \
--output text
chmod 600 reader-export.json
cmp private-export.json reader-export.json
Espere aws:kms e uma comparação bem-sucedida. O AWS View mantém juntas as solicitações com falha e a recuperação bem-sucedida, enquanto o bucket e a chave de referência permanecem utilizáveis. 
Um download com falha pode deixar um arquivo local mais antigo, portanto sua presença sozinha não comprova que a solicitação teve sucesso; a leitura assinada e a comparação comprovam a recuperação.
Remova os Recursos do Laboratório e Agende a Exclusão da Chave
Nesta etapa, você limpará os recursos exatos da exportação. Conclua primeiro as verificações funcionais anteriores. Um bucket S3 deve estar vazio antes da exclusão; uma chave KMS do cliente usa um período de espera para exclusão em vez de desaparecer imediatamente.
Exclua apenas sua exportação nomeada e, depois, seu bucket. Liste o inventário com sucesso e confirme que seu $BUCKET está ausente, enquanto labex-sec02-reference permanece.
aws s3api delete-object --bucket "$BUCKET" --key exports/private-export.json
aws s3api delete-bucket --bucket "$BUCKET"
aws s3api list-buckets --query 'Buckets[].Name'
Remova as duas permissões que você adicionou e o alias do laboratório. A função leitora fornecida é um recurso de sessão preparado; não a exclua nem exclua os recursos de referência não relacionados.
aws iam delete-role-policy \
--role-name labex-sec02-export-reader \
--policy-name ReadExportObject
aws iam delete-role-policy \
--role-name labex-sec02-export-reader \
--policy-name DecryptExportKey
aws iam list-role-policies --role-name labex-sec02-export-reader --query PolicyNames
aws kms delete-alias --alias-name alias/labex-sec02-private-export
Agende a exclusão de sua chave com o período mínimo de sete dias e leia seu estado nativo. O agendamento a torna inutilizável imediatamente, mas não comprova que ela já foi excluída.
aws kms schedule-key-deletion \
--key-id "$KEY_ARN" \
--pending-window-in-days 7 \
--query DeletionDate \
--output text
aws kms describe-key --key-id "$KEY_ARN" --query KeyMetadata.KeyState --output text
aws kms describe-key \
--key-id alias/labex-sec02-reference \
--query KeyMetadata.KeyState \
--output text
Espere PendingDeletion para sua chave e Enabled para a referência. Remova os arquivos locais nomeados; esses comandos deixam os arquivos não relacionados do projeto intactos.
rm -f private-export.json reader-export.json read-object.json decrypt-key.json bucket-encryption.json
Execute a verificação desta etapa antes de remover os profiles temporários da CLI. Consultas bem-sucedidas aos inventários nativos, não erros de autenticação, comprovam a limpeza.
rm -f /home/labex/.aws/credentials /home/labex/.aws/config
unset KEY_ARN BUCKET
Resumo
Você configurou SSE-KMS como padrão de um bucket, enviou uma exportação criptografada e recuperou os bytes originais com uma função IAM restrita a um objeto e uma chave. Revogar kms:Decrypt e desabilitar a chave impediram, cada um, a leitura sem alterar a concessão do objeto. Você restaurou o acesso, excluiu apenas os recursos S3 do laboratório e agendou a exclusão da chave KMS do laboratório, preservando o bucket e a chave de referência.



