Proteja Objetos do S3 com uma Chave KMS

AWSBeginner
Pratique Agora

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.

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.

Permissões do objeto S3 e da chave

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.

Exemplo do AWS View após a concessão para a chave exata: texto cifrado armazenado e bytes originais recuperados pelo leitor.

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. Exemplo do AWS View mostrando falhas por permissão revogada e chave desabilitada seguidas de uma leitura bem-sucedida.

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.