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

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.

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.

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.



