Introdução
Um leitor de relatórios retorna AccessDenied após uma migração de política. Você inspecionará quem faz a chamada, a ação solicitada, o recurso e a instrução de negação, corrigindo uma divergência de cada vez e preservando o escopo limitado do leitor.
Conclua primeiro Conceda privilégio mínimo a um leitor de relatórios para conhecer campos de políticas e Deny explícito. Esta VM nova prepara default para administração e reader para a tarefa. Trabalhe em /home/labex/project e compare a política armazenada com leituras efetivas no AWS View.
Relação com as certificações
| Certificação | Tarefa do exame | Prática |
|---|---|---|
| Solutions Architect – Associate (SAA-C03) | Tarefa 1.1 | Diagnóstico de autorização e verificação dos limites de acesso. |
| Developer – Associate (DVA-C02) | Tarefa 2.1 | Diagnóstico de autorização e verificação dos limites de acesso. |
| CloudOps Engineer – Associate (SOA-C03) | Tarefa 4.1 | Diagnóstico de autorização e verificação dos limites de acesso. |
| Security – Specialty (SCS-C03) | Tarefa 4.2 | Prática dos fundamentos: Diagnóstico de autorização e verificação dos limites de acesso. |
| Data Engineer – Associate (DEA-C01) | Tarefa 4.2 | Prática dos fundamentos: Diagnóstico de autorização e verificação dos limites de acesso. |
Visão geral do laboratório

Confirme o solicitante e corrija a ação solicitada
Nesta etapa, você separará um erro de identidade de uma divergência de política e depois corrigirá a ação Allow. O mesmo comando com credenciais diferentes pode produzir um resultado de autorização diferente.
A política migrada contém várias incompatibilidades. Corrigir um campo pode deixar a solicitação negada por outro campo ou pelo Deny explícito. Após cada mudança, inspecione o documento armazenado e repita a mesma solicitação do leitor; um AccessDenied inalterado não mostra, por si só, se essa correção individual estava certa.

cd /home/labex/project
aws sts get-caller-identity --query Arn --output text
aws sts get-caller-identity --profile reader --query Arn --output text
Espere user/iam05-operator e user/report-reader. A tarefa de relatórios usa o leitor, não o operador. Confirme que o objeto existe usando o operador e depois reproduza a falha da tarefa como leitor.
aws s3api get-object \
--bucket labex-iam05-reports \
--key reports/today.txt operator-report.txt
cat operator-report.txt
aws s3api get-object --profile reader --bucket labex-iam05-reports --key reports/today.txt reader-before.txt || true
O operador recebe Daily orders: 145; o leitor recebe AccessDenied. Uma chave ausente ou erro de conexão exigiria outra investigação. || true permite que esta solicitação com falha esperada termine em uma sequência colada.
Liste as políticas do leitor e leia o documento armazenado. Essas são consultas do operador sobre a identidade da tarefa, não tentativas de emprestar o acesso do operador à tarefa.
aws iam list-user-policies --user-name report-reader
aws iam get-user-policy \
--user-name report-reader \
--policy-name LabReport \
--query PolicyDocument
O Allow indica s3:ListBucket, enquanto o erro indica GetObject. ListBucket lista nomes de objetos e usa um ARN de bucket; não baixa bytes de objetos. Altere apenas a Action do Allow para GetObject, mantendo o Resource e o Deny atuais para diagnosticar a próxima divergência separadamente.
cat > repair-policy.json <<'JSON'
{"Version":"2012-10-17","Statement":[
{"Effect":"Allow","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam05-reports"},
{"Effect":"Deny","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam05-reports/reports/*"}
]}
JSON
aws iam put-user-policy \
--user-name report-reader \
--policy-name LabReport \
--policy-document file://repair-policy.json
aws iam get-user-policy \
--user-name report-reader \
--policy-name LabReport \
--query PolicyDocument
aws s3api get-object --profile reader --bucket labex-iam05-reports --key reports/today.txt reader-action-fix.txt || true
Ele ainda retorna AccessDenied. A Action agora está correta, mas corrigir um campo não garante que todas as verificações aplicáveis passem.
Faça corresponder o ARN completo do objeto
Nesta etapa, você corrigirá Resource preservando a instrução de negação. GetObject se aplica a um ARN de objeto, que inclui sua chave. O ARN de bucket arn:aws:s3:::labex-iam05-reports não corresponde a arn:aws:s3:::labex-iam05-reports/reports/today.txt.
Substitua o Resource do Allow pelo ARN exato do objeto de hoje. Não use * abrangendo buckets ou chaves; a tarefa tem uma entrada necessária.
cat > repair-policy.json <<'JSON'
{"Version":"2012-10-17","Statement":[
{"Effect":"Allow","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam05-reports/reports/today.txt"},
{"Effect":"Deny","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam05-reports/reports/*"}
]}
JSON
aws iam put-user-policy \
--user-name report-reader \
--policy-name LabReport \
--policy-document file://repair-policy.json
aws iam get-user-policy \
--user-name report-reader \
--policy-name LabReport \
--query PolicyDocument
aws s3api get-object --profile reader --bucket labex-iam05-reports --key reports/today.txt reader-resource-fix.txt || true
Espere AccessDenied novamente. Agora o Allow corresponde a Action e Resource, portanto inspecione a instrução restante. Seu Deny também corresponde a GetObject em reports/*, incluindo hoje. Um Deny explícito correspondente tem precedência sobre o Allow; mover o Allow para depois no documento não pode fazê-lo prevalecer.
Corrija o Deny sem ampliar o acesso
Nesta etapa, você corrigirá o escopo do Deny migrado e confirmará a correção mínima. A proteção pretendida protege dados privados; ela não deve negar a entrada da tarefa de relatórios. Mantenha o Allow exato de leitura e restrinja o Deny a private/* em vez de remover proteção ou adicionar concessões mais amplas.
cat > repair-policy.json <<'JSON'
{"Version":"2012-10-17","Statement":[
{"Effect":"Allow","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam05-reports/reports/today.txt"},
{"Effect":"Deny","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam05-reports/private/*"}
]}
JSON
aws iam put-user-policy \
--user-name report-reader \
--policy-name LabReport \
--policy-document file://repair-policy.json
aws s3api get-object \
--profile reader \
--bucket labex-iam05-reports \
--key reports/today.txt today.txt
cat today.txt
Espere Daily orders: 145. Teste os recursos próximos como o mesmo leitor; a correção concluída não deve expandir seu escopo.
aws s3api get-object --profile reader --bucket labex-iam05-reports --key reports/yesterday.txt yesterday-denied.txt || true
aws s3api get-object --profile reader --bucket labex-iam05-reports --key private/payroll.txt payroll-denied.txt || true
aws s3api get-object --profile reader --bucket labex-iam05-reference --key reference.txt reference-denied.txt || true
As três devem retornar AccessDenied. Uma concessão de leitura necessária também não deve autorizar gravações. Tente a substituição fornecida e verifique que os bytes originais do relatório permanecem inalterados.
aws s3api put-object --profile reader --bucket labex-iam05-reports --key reports/today.txt --body upload.txt || true
aws s3api get-object \
--profile reader \
--bucket labex-iam05-reports \
--key reports/today.txt today.txt
cat today.txt
aws iam get-user-policy \
--user-name report-reader \
--policy-name LabReport \
--query PolicyDocument
Espere PutObject AccessDenied e Daily orders: 145 inalterado. AWS View agora mostra hoje Readable e os outros recursos Denied. A inspeção da política explica a correção; solicitações efetivas demonstram seu efeito.

Revogue a correção e limpe os dados do exercício
Nesta etapa, você removerá LabReport e comprovará que o acesso foi retirado enquanto o relatório ainda existe. Depois, exclua apenas o bucket de relatórios do exercício e suas três chaves.
aws iam delete-user-policy --user-name report-reader --policy-name LabReport
aws iam list-user-policies --user-name report-reader
aws s3api get-object --profile reader --bucket labex-iam05-reports --key reports/today.txt revoked.txt || true
Espere uma lista vazia de políticas e AccessDenied. Revogação de política e exclusão de dados são verificações separadas. Mantenha o bucket de referência inalterado.
aws s3api delete-object --bucket labex-iam05-reports --key reports/today.txt
aws s3api delete-object --bucket labex-iam05-reports --key reports/yesterday.txt
aws s3api delete-object --bucket labex-iam05-reports --key private/payroll.txt
aws s3api list-objects-v2 --bucket labex-iam05-reports
Confira KeyCount: 0 em uma resposta autenticada bem-sucedida, sem entradas de objetos restantes em Contents.
aws s3api delete-bucket --bucket labex-iam05-reports
aws s3api list-buckets --query 'Buckets[].Name'
aws s3api get-object --bucket labex-iam05-reference --key reference.txt reference.txt
cat reference.txt
Resta apenas o bucket de referência com Platform reference: keep. Falhas de serviço não comprovam exclusão. As identidades preparadas são recuperadas quando o ambiente termina; a política da tarefa e os dados pertencentes ao exercício foram removidos.
Resumo
Você confirmou quem faz a chamada, comparou a operação malsucedida com a Action do Allow, fez corresponder o ARN completo do objeto e corrigiu um Deny explícito sobreposto. Falhas intermediárias ajudaram a identificar os impedimentos restantes. O leitor final podia ler apenas seu relatório necessário e não podia gravá-lo nem ler dados não relacionados. Você revogou a concessão corrigida e concluiu a limpeza delimitada. Use a mesma identidade e teste solicitações bem-sucedidas e proibidas ao diagnosticar acesso.
Para aprofundar o tema, consulte a documentação da AWS: Diagnóstico de erros de acesso negado IAM.



