Proteja um bucket com uma política de recurso

AWSBeginner
Pratique Agora

Introdução

O proprietário de um bucket quer conceder acesso a uma função de relatórios e proteger dados privados. Você associará uma política de bucket, a comparará com a própria política da função e testará como um Deny correspondente afeta o acesso.

Conclua primeiro Use credenciais temporárias com uma função IAM e Conceda privilégio mínimo a um leitor de relatórios. Esta VM nova fornece default, report-role e other-role; os profiles de função já obtêm sessões temporárias. Use /home/labex/project e AWS View. Mantenha credenciais e caches privados.

Relação com as certificações

Certificação Tarefa do exame Prática
Cloud Practitioner (CLF-C02) Tarefa 2.3 Políticas de recursos e precedência da negação explícita.
Solutions Architect – Associate (SAA-C03) Tarefa 1.1 Políticas de recursos e precedência da negação explícita.
Developer – Associate (DVA-C02) Tarefa 2.1 Políticas de recursos e precedência da negação explícita.
CloudOps Engineer – Associate (SOA-C03) Tarefa 4.1 Políticas de recursos e precedência da negação explícita.
Security – Specialty (SCS-C03) Tarefa 4.2 Prática dos fundamentos: Políticas de recursos e precedência da negação explícita.
Data Engineer – Associate (DEA-C01) Tarefa 4.2 Prática dos fundamentos: Políticas de recursos e precedência da negação explícita.
DevOps Engineer – Professional (DOP-C02) Tarefa 6.1 Prática dos fundamentos: Políticas de recursos e precedência da negação explícita.
Solutions Architect – Professional (SAP-C02) Tarefa 2.3 Prática dos fundamentos: Políticas de recursos e precedência da negação explícita.

Visão geral do laboratório

Diagrama conceitual: Compare a política de identidade de um papel com a política de bucket S3 para solicitações de relatórios na mesma conta; um Deny explícito correspondente prevalece sobre um Allow.

Conceda a uma função acesso pelo bucket

Nesta etapa, você associará uma política de recurso que concede a ReportReader acesso ao prefixo de relatórios. Diferentemente de uma política de identidade, a política de bucket deve especificar Principal. Use o ARN da função IAM, que identifica a função; o ARN da sessão assumed-role identifica um uso dela.

Você concedeu acesso pela identidade; agora o proprietário do bucket o concederá pelo recurso. Os dois profiles de função estão preparados: mantenha sua confiança e concentre-se em como a política do bucket e a política de permissões da função afetam as mesmas solicitações.

Uma política de recurso é armazenada no recurso. Uma política de bucket S3 é um exemplo: seu Principal identifica de quem são as solicitações abrangidas pela instrução. Compare isso com uma política de identidade armazenada em um usuário ou função.

Confirme as duas identidades de sessão ativas e a lista inicialmente vazia de políticas de permissão da função de relatórios.

cd /home/labex/project
aws sts get-caller-identity --profile report-role --query Arn --output text
aws sts get-caller-identity --profile other-role --query Arn --output text
aws iam list-role-policies --role-name ReportReader

Espere assumed-role/ReportReader/report-run e assumed-role/OtherReader/other-run, e uma lista PolicyNames vazia. Autenticar-se como uma função não autoriza, por si só, o acesso ao S3. Teste a leitura atual:

aws s3api get-object --profile report-role --bucket labex-iam04-reports --key reports/today.txt before.txt || true

Espere AccessDenied. || true impede que uma falha esperada interrompa uma sequência colada. Falhas de conexão não comprovam negação.

Escreva a política de bucket. GetObject concede leituras de objetos; Resource a limita a reports/ neste único bucket. O Principal da função exclui OtherReader e não concede acesso público.

cat > bucket-policy.json <<'JSON'
{
  "Version":"2012-10-17",
  "Statement":[
    {"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::123456789012:role/ReportReader"},"Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam04-reports/reports/*"}
  ]
}
JSON
aws s3api put-bucket-policy \
  --bucket labex-iam04-reports \
  --policy file://bucket-policy.json
aws s3api get-bucket-policy --bucket labex-iam04-reports --query Policy --output text

A política de bucket agora está armazenada no bucket, não associada à função. Na mesma conta, esse Allow de recurso aplicável pode conceder acesso à função sem um Allow de identidade separado para a função, desde que nenhum Deny relevante o bloqueie.

aws s3api get-object \
  --profile report-role \
  --bucket labex-iam04-reports \
  --key reports/today.txt today.txt
cat today.txt
aws s3api get-object --profile other-role --bucket labex-iam04-reports --key reports/today.txt other-denied.txt || true
aws s3api get-object --profile report-role --bucket labex-iam04-reports --key private/payroll.txt private-denied.txt || true
aws s3api get-object --profile report-role --bucket labex-iam04-reference --key reference.txt reference-denied.txt || true

ReportReader recebe Daily orders: 145; as outras três solicitações recebem AccessDenied. A concessão do bucket não abrange outra função, outro prefixo nem outro bucket. AWS View envia as mesmas leituras efetivas de função.

Proteja dados privados contra um Allow adicional de identidade

Nesta etapa, você observará como uma concessão de identidade de função se combina com uma concessão de bucket e depois usará um Deny de bucket para proteger dados privados. Para estas solicitações na mesma conta, os Allows aplicáveis se combinam; as duas fontes de políticas não são automaticamente intersectadas. Um Deny explícito em qualquer fonte de política aplicável prevalece sobre um Allow.

As duas fontes de políticas usadas nas solicitações deste laboratório na mesma conta: um Deny explícito correspondente prevalece sobre um Allow.

Amplie temporariamente o escopo de leitura da identidade de ReportReader para objetos neste bucket do exercício. Esta comparação controlada abrange dados sintéticos e não concede acesso a outros buckets.

cat > role-read.json <<'JSON'
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam04-reports/*"}]}
JSON
aws iam put-role-policy \
  --role-name ReportReader \
  --policy-name ReadAllOwned \
  --policy-document file://role-read.json
aws s3api get-object \
  --profile report-role \
  --bucket labex-iam04-reports \
  --key private/payroll.txt private-before-deny.txt
cat private-before-deny.txt

Espere Synthetic payroll: restricted. O Allow de identidade se aplica mesmo que o Allow do bucket abranja apenas reports/. Adicione um Deny de bucket limitado a esta função e ao prefixo privado, mantendo o Allow de relatórios.

cat > bucket-policy.json <<'JSON'
{
  "Version":"2012-10-17",
  "Statement":[
    {"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::123456789012:role/ReportReader"},"Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam04-reports/reports/*"},
    {"Effect":"Deny","Principal":{"AWS":"arn:aws:iam::123456789012:role/ReportReader"},"Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam04-reports/private/*"}
  ]
}
JSON
aws s3api put-bucket-policy \
  --bucket labex-iam04-reports \
  --policy file://bucket-policy.json
aws s3api get-object --profile report-role --bucket labex-iam04-reports --key private/payroll.txt private-denied.txt || true
aws s3api get-object \
  --profile report-role \
  --bucket labex-iam04-reports \
  --key reports/today.txt today.txt
cat today.txt

O objeto privado agora retorna AccessDenied apesar do Allow de identidade; o relatório ainda retorna 145. O Deny indica ReportReader, portanto o operador ainda pode inspecionar e preservar o recurso fornecido. A ordem das instruções não faz um Allow prevalecer sobre um Deny correspondente.

Confirme que um Deny de identidade prevalece sobre um Allow de bucket

Nesta etapa, você testará a direção oposta: um Deny de identidade da função prevalece sobre um Allow de bucket. Mantenha a concessão atual de leitura e adicione um Deny para gravações no prefixo de relatórios.

cat > role-read.json <<'JSON'
{"Version":"2012-10-17","Statement":[
  {"Effect":"Allow","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam04-reports/*"},
  {"Effect":"Deny","Action":"s3:PutObject","Resource":"arn:aws:s3:::labex-iam04-reports/reports/*"}
]}
JSON
aws iam put-role-policy \
  --role-name ReportReader \
  --policy-name ReadAllOwned \
  --policy-document file://role-read.json

Para um teste controlado de precedência, adicione temporariamente um Allow de bucket para a mesma função e prefixo de escrita. Aplique o Deny de identidade primeiro para que o relatório permaneça protegido.

cat > bucket-write-test.json <<'JSON'
{
  "Version":"2012-10-17",
  "Statement":[
    {"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::123456789012:role/ReportReader"},"Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam04-reports/reports/*"},
    {"Effect":"Deny","Principal":{"AWS":"arn:aws:iam::123456789012:role/ReportReader"},"Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam04-reports/private/*"},
    {"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::123456789012:role/ReportReader"},"Action":"s3:PutObject","Resource":"arn:aws:s3:::labex-iam04-reports/reports/*"}
  ]
}
JSON
aws s3api put-bucket-policy \
  --bucket labex-iam04-reports \
  --policy file://bucket-write-test.json
aws s3api put-object --profile report-role --bucket labex-iam04-reports --key reports/today.txt --body upload.txt || true

Espere PutObject AccessDenied mesmo que o bucket o permita. O Deny de identidade prevalece. Remova imediatamente o Allow temporário de escrita restaurando a política de duas instruções salva na etapa anterior.

aws s3api put-bucket-policy \
  --bucket labex-iam04-reports \
  --policy file://bucket-policy.json
aws s3api get-object \
  --profile report-role \
  --bucket labex-iam04-reports \
  --key reports/today.txt today.txt
cat today.txt
aws s3api get-object --profile other-role --bucket labex-iam04-reports --key reports/today.txt other-denied.txt || true

O relatório deve continuar com Daily orders: 145, e OtherReader continua sendo negado. A concessão temporária de escrita foi removida. AWS View mostra a política de bucket e a política de identidade da função ao lado dos resultados efetivos de leitura.

Políticas de bucket e identidade protegem o relatório. Exemplo: ReportReader pode ler o relatório enquanto ambas as funções são negadas nos objetos privados e de referência. As políticas armazenadas mostram as fontes separadas de concessão e as negações explícitas; o relatório expandido contém os bytes efetivamente retornados.

Remova ambas as fontes de concessão e faça a limpeza

Nesta etapa, você retirará ambas as fontes de políticas antes de excluir os dados do exercício. Remover um Allow não basta quando outra política ainda concede a mesma ação.

Exclua a política de bucket e repita a leitura do relatório. ReadAllOwned ainda concede essa leitura pela política de identidade da função.

aws s3api delete-bucket-policy --bucket labex-iam04-reports
aws s3api get-object \
  --profile report-role \
  --bucket labex-iam04-reports \
  --key reports/today.txt remaining-grant.txt
cat remaining-grant.txt

Espere Daily orders: 145. Agora exclua ReadAllOwned e teste novamente enquanto o relatório ainda existe.

aws iam delete-role-policy --role-name ReportReader --policy-name ReadAllOwned
aws s3api get-object --profile report-role --bucket labex-iam04-reports --key reports/today.txt revoked.txt || true
aws iam list-role-policies --role-name ReportReader

Espere AccessDenied e uma lista vazia de políticas. As funções preparadas e sua confiança nos solicitantes permanecem intactas; você está removendo as concessões S3 criadas durante este exercício.

aws s3api delete-object --bucket labex-iam04-reports --key reports/today.txt
aws s3api delete-object --bucket labex-iam04-reports --key private/payroll.txt
aws s3api list-objects-v2 --bucket labex-iam04-reports

Confira KeyCount: 0 nesta resposta bem-sucedida; depois, exclua o bucket vazio de relatórios e confirme os bytes da referência.

aws s3api delete-bucket --bucket labex-iam04-reports
aws s3api list-buckets --query 'Buckets[].Name'
aws s3api get-object --bucket labex-iam04-reference --key reference.txt reference.txt
cat reference.txt

Resta apenas o bucket de referência com Platform reference: keep. Erros de rede não são evidência de exclusão. AWS View agora mostra que não há política de bucket nem política de permissões da função e mostra Reports bucket removed. Identidades preparadas, recursos fornecidos e caches temporários locais são recuperados quando o ambiente descartável termina.

Resumo

Você usou Principal para conceder acesso a uma função por uma política de bucket, observou como Allows de identidade e recurso se combinam e testou a precedência de Deny explícito nas duas direções. A gravação proibida não alterou os bytes do relatório. Você retirou ambas as fontes de concessão antes da limpeza delimitada e preservou as identidades preparadas e os dados não relacionados. Inspecione todas as fontes de políticas aplicáveis quando uma solicitação permanecer autorizada ou for inesperadamente negada.

Para aprofundar o tema, consulte a documentação da AWS: Avaliação de políticas de identidade e de recursos.