Use credenciais temporárias com uma função IAM

AWSBeginner
Pratique Agora

Introdução

Um processador precisa acessar relatórios por uma identidade temporária de tarefa. Você criará uma função, escolherá quem pode usá-la, testará sua permissão de leitura e revogará o acesso antes da limpeza.

Conclua primeiro Conceda privilégio mínimo a um leitor de relatórios para conhecer campos de políticas e limites de solicitações. Esta VM nova prepara os profiles default, worker e outsider. Use /home/labex/project e AWS View; nenhuma configuração de conta pessoal é necessária. Mantenha arquivos de credenciais, caches da CLI e respostas AssumeRole sem filtros privados.

Relação com as certificações

Certificação Tarefa do exame Prática
Cloud Practitioner (CLF-C02) Tarefa 2.3 Confiança de funções IAM, sessões temporárias e acesso a recursos.
Solutions Architect – Associate (SAA-C03) Tarefa 1.1 Confiança de funções IAM, sessões temporárias e acesso a recursos.
Developer – Associate (DVA-C02) Tarefa 2.1 Confiança de funções IAM, sessões temporárias e acesso a recursos.
CloudOps Engineer – Associate (SOA-C03) Tarefa 4.1 Confiança de funções IAM, sessões temporárias e acesso a recursos.
Security – Specialty (SCS-C03) Tarefa 4.1, Tarefa 4.2 Prática dos fundamentos: Confiança de funções IAM, sessões temporárias e acesso a recursos; Políticas IAM, escopo de ações e recursos, e privilégio mínimo.
Data Engineer – Associate (DEA-C01) Tarefa 4.1 Prática dos fundamentos: Confiança de funções IAM, sessões temporárias e acesso a recursos.
DevOps Engineer – Professional (DOP-C02) Tarefa 6.1 Prática dos fundamentos: Confiança de funções IAM, sessões temporárias e acesso a recursos.
Solutions Architect – Professional (SAP-C02) Tarefa 2.3 Prática dos fundamentos: Confiança de funções IAM, sessões temporárias e acesso a recursos.

Visão geral do laboratório

Diagrama conceitual: A confiança do papel determina quem pode obter uma sessão temporária de ReportReader; as permissões do papel limitam essa sessão à leitura do relatório de hoje no S3.

Defina a confiança e a permissão de leitura da função

Nesta etapa, você criará ReportReader com uma política de confiança que indica seu solicitante permitido. Uma política de confiança é uma política de recurso da função: seu Principal identifica quem pode assumir essa função. A política de permissões da função define separadamente o que uma sessão resultante pode fazer.

A tarefa precisa agora de uma sessão temporária de função. Use os campos conhecidos Action e Resource para seu trabalho no S3 e uma política de confiança separada para a entrada na função. Você testará essas duas decisões separadamente antes de revogar o acesso.

Uma função IAM define permissões e quem pode assumi-la. AWS Security Token Service (STS) emite credenciais temporárias para uma sessão de função, uma identidade diferente de quem a solicita.

A confiança controla a entrada na função; as permissões da função controlam o que a sessão resultante pode fazer.

Confirme o ARN do processador para compará-lo com a confiança inicial.

cd /home/labex/project
aws sts get-caller-identity --profile worker --query Arn --output text

Espere arn:aws:iam::123456789012:user/report-worker. Comece com uma confiança que indica apenas o operador. sts:AssumeRole solicita uma sessão de função; Principal é um ARN de identidade, não um nome de profile. O processador intencionalmente ainda não é confiável.

cat > trust.json <<'JSON'
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::123456789012:user/iam03-operator"},"Action":"sts:AssumeRole"}]}
JSON
aws iam create-role \
  --role-name ReportReader \
  --assume-role-policy-document file://trust.json \
  --query Role.Arn \
  --output text

Espere o ARN terminando em role/ReportReader. Criar uma função não lhe dá permissões S3. Adicione uma política inline restrita: a função pode usar GetObject apenas para o relatório de hoje, não gravá-lo nem ler a folha de pagamento.

cat > role-policy.json <<'JSON'
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam03-reports/reports/today.txt"}]}
JSON
aws iam put-role-policy \
  --role-name ReportReader \
  --policy-name ReportRead \
  --policy-document file://role-policy.json
aws iam get-role --role-name ReportReader --query Role.AssumeRolePolicyDocument
aws iam get-role-policy \
  --role-name ReportReader \
  --policy-name ReportRead \
  --query PolicyDocument

Leia ambos os documentos. A confiança controla a entrada; as permissões da função controlam as operações da sessão. O processador ainda não é confiável. Teste essa barreira, selecionando apenas o campo seguro ARN retornado.

aws sts assume-role --profile worker --role-arn arn:aws:iam::123456789012:role/ReportReader --role-session-name report-run --query AssumedRoleUser.Arn --output text || true

Espere AccessDenied. Não remova o filtro de consulta: uma resposta bem-sucedida sem filtro inclui segredos.

Autorize o solicitante e use um profile de função

Nesta etapa, você permitirá que o processador solicite ReportReader, atualizará a confiança da função e usará um profile de função. Ambos os usuários de teste receberão a mesma permissão de solicitante; apenas o processador confiável deve obter a sessão de função.

Escreva uma política de solicitante cujo Resource seja o ARN exato da função e associe-a ao processador.

cat > assume-policy.json <<'JSON'
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"sts:AssumeRole","Resource":"arn:aws:iam::123456789012:role/ReportReader"}]}
JSON
aws iam put-user-policy \
  --user-name report-worker \
  --policy-name AssumeReportReader \
  --policy-document file://assume-policy.json

Para isolar a verificação de confiança, dê ao usuário externo a mesma permissão restrita de solicitante. Este usuário descartável de comparação não está no documento de confiança.

aws iam put-user-policy \
  --user-name outsider \
  --policy-name AssumeReportReader \
  --policy-document file://assume-policy.json
aws sts assume-role --profile worker --role-arn arn:aws:iam::123456789012:role/ReportReader --role-session-name before-trust --query AssumedRoleUser.Arn --output text || true

Espere AccessDenied: o Allow de sua identidade não prevalece sobre a confiança existente que indica apenas o operador. Substitua essa confiança pelo processador pretendido e atualize a função.

cat > trust.json <<'JSON'
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::123456789012:user/report-worker"},"Action":"sts:AssumeRole"}]}
JSON
aws iam update-assume-role-policy \
  --role-name ReportReader \
  --policy-document file://trust.json
aws sts assume-role --profile outsider --role-arn arn:aws:iam::123456789012:role/ReportReader --role-session-name outsider-test --query AssumedRoleUser.Arn --output text || true

Espere AccessDenied mesmo que a política de identidade do usuário externo permita AssumeRole. Seu ARN não é confiável. Repita como processador:

aws sts assume-role \
  --profile worker \
  --role-arn arn:aws:iam::123456789012:role/ReportReader \
  --role-session-name report-run \
  --query AssumedRoleUser.Arn \
  --output text

A confiança da função decidiu qual solicitante poderia entrar. Um Allow de identidade não pode contorná-la. Para confiança na mesma conta que indica diretamente um usuário, essa confiança pode conceder entrada sem um Allow de identidade separado; as concessões iguais aos solicitantes aqui ajudam a isolar a comparação de confiança.

Espere um ARN terminando em assumed-role/ReportReader/report-run. Um nome de sessão ajuda a distinguir usos da função nos registros de atividade. Credenciais de função expiram; o profile de função da CLI abaixo obtém credenciais temporárias para você.

Configure o profile report-role preparado para solicitar essas credenciais temporárias automaticamente. source_profile seleciona o solicitante, e role_arn seleciona a função de destino. Essas configurações não contêm valores secretos. A CLI armazena seu cache temporário com segurança; não o exiba.

aws configure set role_arn arn:aws:iam::123456789012:role/ReportReader --profile report-role
aws configure set source_profile worker --profile report-role
aws configure set role_session_name report-run --profile report-role
aws sts get-caller-identity --profile report-role --query Arn --output text

Espere novamente o ARN assumed-role. A CLI realiza a autenticação STS internamente para este profile. A própria identidade do processador tem permissão AssumeRole, não a permissão S3 da função.

aws s3api get-object --profile worker --bucket labex-iam03-reports --key reports/today.txt direct-worker.txt || true

Espere AccessDenied. Assumir uma função não associa suas permissões de volta ao usuário de origem.

Teste os limites de recursos e ações da sessão de função

Nesta etapa, você usará o profile de função para a tarefa de relatórios e confirmará que ele não pode realizar trabalho não relacionado. Uma solicitação AssumeRole bem-sucedida comprova apenas a entrada na função; solicitações efetivas ao S3 comprovam seu acesso efetivo.

aws s3api get-object \
  --profile report-role \
  --bucket labex-iam03-reports \
  --key reports/today.txt today.txt
cat today.txt

Espere Daily orders: 145. Tente os dois recursos existentes fora do ARN exato de objeto da função.

aws s3api get-object --profile report-role --bucket labex-iam03-reports --key private/payroll.txt private-denied.txt || true
aws s3api get-object --profile report-role --bucket labex-iam03-reference --key reference.txt reference-denied.txt || true

Ambos devem retornar AccessDenied. Depois, tente sobrescrever o relatório de hoje com a substituição não aprovada fornecida. GetObject não autoriza PutObject.

aws s3api put-object --profile report-role --bucket labex-iam03-reports --key reports/today.txt --body upload.txt || true
aws s3api get-object \
  --profile report-role \
  --bucket labex-iam03-reports \
  --key reports/today.txt today.txt
cat today.txt

Espere PutObject AccessDenied e Daily orders: 145 inalterado. Um arquivo local ausente, erro de credencial expirada ou serviço indisponível é outro diagnóstico e não comprova um limite de permissão. AWS View mostra a confiança armazenada, a política da função e as leituras efetivas da sessão de função; expanda o relatório de hoje para inspecionar seus bytes.

A sessão de função lê apenas o relatório. Exemplo: a confiança indica report-worker, quem faz a chamada é uma sessão assumed-role e apenas o relatório é legível. O objeto expandido mostra os bytes efetivamente retornados.

Revogue o acesso à função e faça a limpeza

Nesta etapa, você removerá a concessão de relatório da função antes de excluir seus dados. Remover uma permissão de função e impedir novas solicitações para assumi-la são ações separadas; limpar apenas um cache local não revoga permissões no servidor.

Remova ReportRead enquanto a função e o relatório ainda existem e repita a leitura pelo profile de função.

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

Espere AccessDenied. Remova ambas as concessões de solicitante e substitua a confiança direta no processador por confiança apenas no operador. Remover apenas um Allow de identidade não revoga uma concessão direta de confiança na mesma conta. Depois, teste que o processador não consegue obter uma sessão nova.

aws iam delete-user-policy --user-name report-worker --policy-name AssumeReportReader
aws iam delete-user-policy --user-name outsider --policy-name AssumeReportReader
cat > trust.json <<'JSON'
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::123456789012:user/iam03-operator"},"Action":"sts:AssumeRole"}]}
JSON
aws iam update-assume-role-policy \
  --role-name ReportReader \
  --policy-document file://trust.json
aws sts assume-role --profile worker --role-arn arn:aws:iam::123456789012:role/ReportReader --role-session-name after-revocation --query AssumedRoleUser.Arn --output text || true

Espere AccessDenied enquanto a função ainda existe. Exclua a função apenas após essas verificações funcionais de revogação.

aws iam delete-role --role-name ReportReader
aws iam list-roles --query 'Roles[].RoleName'
aws s3api delete-object --bucket labex-iam03-reports --key reports/today.txt
aws s3api delete-object --bucket labex-iam03-reports --key private/payroll.txt
aws s3api list-objects-v2 --bucket labex-iam03-reports

Espere uma lista vazia de funções e KeyCount: 0 na resposta de objetos. Exclua o bucket vazio do exercício e confirme que a referência ainda existe com seus bytes originais.

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

Resta apenas o bucket de referência com Platform reference: keep. Essas consultas bem-sucedidas comprovam exclusão e preservação. O ambiente descartável recupera as identidades preparadas e os arquivos de credenciais temporárias quando termina. Você removeu a função e as concessões de solicitante criadas para este exercício.

Resumo

Você separou a confiança da função de sua política de permissões, comprovou que uma concessão de solicitante sozinha não pode contornar a confiança e usou STS por um profile de função da CLI. A sessão de função podia ler apenas seu relatório e não podia gravar nem ler dados não relacionados. Você removeu as concessões de função e solicitante antes da limpeza delimitada. Prefira funções temporárias a chaves permanentes de cargas de trabalho e inspecione a identidade efetiva e solicitações permitidas e negadas ao diagnosticar acesso.

Para aprofundar o tema, consulte a documentação da AWS: Funções IAM, confiança e credenciais temporárias.