Conceda privilégio mínimo a um leitor de relatórios

AWSBeginner
Pratique Agora

Introdução

Um leitor de relatórios precisa do relatório de hoje enquanto os outros relatórios e a folha de pagamento permanecem privados. Você concederá essa leitura, restringirá seu escopo, testará o limite da permissão e a revogará antes da limpeza.

Use o que aprendeu sobre identidade de quem faz a chamada e ARNs em AWS Foundations e downloads de objetos no S3. Esta VM nova prepara a CLI e duas identidades: default gerencia o exercício; reader representa a tarefa. Trabalhe em /home/labex/project e compare solicitações com AWS View na parte superior.

Relação com as certificações

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

Visão geral do laboratório

Diagrama conceitual: Uma política de identidade IAM permite ao leitor acessar apenas o relatório de hoje no S3, protegendo os outros relatórios e os dados de salários.

Dê ao leitor acesso aos relatórios

Nesta etapa, você escreverá e associará uma política de identidade que permite ler relatórios. Uma política de identidade é associada a um usuário, grupo ou função. Ela descreve ações permitidas ou negadas; não contém chaves de acesso.

No S3, você já baixou o conteúdo de objetos. Aqui, a tarefa de relatórios precisa fazer o mesmo download com sua própria identidade restrita: o operador altera as permissões e o leitor testa o resultado. Os dados estão preparados para que você se concentre na autorização.

AWS Identity and Access Management (IAM) controla qual identidade pode executar uma ação sobre um recurso. Privilégio mínimo concede apenas o que uma tarefa precisa.

Um profile da AWS CLI seleciona credenciais e configurações; ele não concede permissões. Aqui, default é o operador do exercício, enquanto reader seleciona report-reader. Primeiro, confirme ambas as identidades. --profile reader seleciona a tarefa para um comando. get-caller-identity informa a identidade de quem faz a chamada sem exibir credenciais.

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

O ARN padrão termina com user/iam01-operator. Use esse profile de operador para administrar políticas; use o profile do leitor ao testar a tarefa. Este operador do laboratório está preparado para administração. Uma aplicação de relatórios em produção usaria uma função restrita, que você praticará depois.

aws sts get-caller-identity --profile reader --query Arn --output text

O ARN do leitor termina com user/report-reader. Um ARN, ou Amazon Resource Name, identifica um recurso. Para um objeto S3, ele inclui o bucket e a chave completa do objeto; apenas o ARN de um bucket não identifica um objeto dentro dele.

O leitor inicialmente não tem política. Teste uma leitura antes de conceder qualquer permissão:

aws s3api get-object --profile reader --bucket labex-iam01-reports --key reports/today.txt before.txt || true

Espere AccessDenied, não um download do relatório. || true permite que este comando intencionalmente malsucedido termine sem interromper uma sequência de comandos colada. Leia o erro: um erro de conexão não comprova uma negação do IAM.

Uma política JSON usa três campos essenciais: Effect é Allow ou Deny; Action nomeia uma operação de serviço; Resource limita qual ARN essa operação pode afetar. s3:GetObject permite ler bytes de objetos. O * abaixo corresponde a chaves de objetos no prefixo reports/, incluindo hoje e ontem. Ele não corresponde a private/ nem a outro bucket. Version seleciona a linguagem da política, não a versão do relatório.

O here-document seguinte grava as linhas entre os marcadores JSON em report-policy.json. > substitui esse arquivo local, e o marcador entre aspas impede o shell de expandir seu conteúdo.

cat > report-policy.json <<'JSON'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::labex-iam01-reports/reports/*"
    }
  ]
}
JSON

Apenas escrever um arquivo não autoriza o leitor. put-user-policy associa uma política inline, uma política armazenada diretamente neste usuário. --policy-name identifica essa política; usar o mesmo nome depois a atualiza. file:// indica à CLI que leia o documento do arquivo local.

aws iam put-user-policy \
  --user-name report-reader \
  --policy-name ReportRead \
  --policy-document file://report-policy.json

Uma atualização bem-sucedida normalmente não exibe saída. Agora solicite os relatórios usando as credenciais do leitor. O último argumento é o arquivo de destino local.

aws s3api get-object \
  --profile reader \
  --bucket labex-iam01-reports \
  --key reports/today.txt today.txt
cat today.txt

Espere Daily orders: 145. Campos da resposta S3, como ETag, identificam o objeto baixado; o próprio arquivo contém os bytes do relatório.

aws s3api get-object \
  --profile reader \
  --bucket labex-iam01-reports \
  --key reports/yesterday.txt yesterday.txt

Ontem também é bem-sucedido porque a política cobre todo o prefixo de relatórios. O negócio precisa apenas do relatório de hoje, portanto você reduzirá esse escopo agora.

Restrinja o recurso ao relatório de hoje

Nesta etapa, você substituirá uma concessão por prefixo por um ARN de objeto e comprovará que os outros recursos continuam inacessíveis. Uma negação implícita significa que nenhuma política aplicável permite a solicitação. Você não precisa de um Deny separado para cada objeto não relacionado.

Após restringir a política, o leitor pode baixar o relatório de hoje, mas não pode ler os outros objetos nem enviar alterações.

Substitua a política local. A única mudança é Resource: a chave exata reports/today.txt substitui reports/*.

cat > report-policy.json <<'JSON'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::labex-iam01-reports/reports/today.txt"
    }
  ]
}
JSON

Atualize a mesma política inline no mesmo leitor. Editar o arquivo não atualiza IAM até você enviar este comando.

aws iam put-user-policy \
  --user-name report-reader \
  --policy-name ReportRead \
  --policy-document file://report-policy.json

Leia a política armazenada. --query PolicyDocument seleciona o documento da resposta; não altera as permissões.

aws iam get-user-policy \
  --user-name report-reader \
  --policy-name ReportRead \
  --query PolicyDocument

Confira que Resource termina em reports/today.txt. Depois, teste o leitor novamente.

aws s3api get-object \
  --profile reader \
  --bucket labex-iam01-reports \
  --key reports/today.txt today.txt

O relatório necessário ainda é baixado. Cada solicitação seguinte deve falhar com AccessDenied porque seu ARN de objeto não corresponde à concessão.

aws s3api get-object --profile reader --bucket labex-iam01-reports --key reports/yesterday.txt yesterday-denied.txt || true
aws s3api get-object --profile reader --bucket labex-iam01-reports --key private/payroll.txt payroll-denied.txt || true
aws s3api get-object --profile reader --bucket labex-iam01-reference --key reference.txt reference-denied.txt || true

Esses objetos existem; o operador pode lê-los. Uma resposta NoSuchKey diagnosticaria um objeto ausente, enquanto estes erros de permissão demonstram o limite de recursos do leitor. No AWS View, hoje está Readable e os outros três objetos estão Denied. Esta visualização envia solicitações efetivas de leitura como o mesmo leitor.

Leitor limitado a um relatório. Exemplo: apenas hoje é legível; os outros objetos existentes são negados. O documento à esquerda é a política IAM armazenada.

Distinga uma negação explícita de um Allow ausente

Nesta etapa, você protegerá explicitamente o prefixo privado e testará o limite de ações. Uma negação explícita é uma instrução Deny correspondente. Ela tem precedência sobre um Allow de outra política de identidade aplicável. A ordem das instruções não faz um Allow prevalecer sobre ela.

Adicione uma segunda instrução mantendo a concessão exata de leitura. s3:* corresponde a todas as ações S3, mas este Deny está limitado a objetos sob o prefixo private/ deste bucket. Ele não nega acesso ao relatório de hoje.

cat > report-policy.json <<'JSON'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::labex-iam01-reports/reports/today.txt"
    },
    {
      "Effect": "Deny",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::labex-iam01-reports/private/*"
    }
  ]
}
JSON
aws iam put-user-policy \
  --user-name report-reader \
  --policy-name ReportRead \
  --policy-document file://report-policy.json

O Deny reforça o limite privado. Para observar sua precedência, associe temporariamente uma segunda concessão de leitura a este bucket. Este é um teste controlado; remova-a imediatamente depois.

cat > temporary-read.json <<'JSON'
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam01-reports/*"}]}
JSON
aws iam put-user-policy \
  --user-name report-reader \
  --policy-name TemporaryRead \
  --policy-document file://temporary-read.json
aws s3api get-object --profile reader --bucket labex-iam01-reports --key private/payroll.txt payroll-denied.txt || true

Espere AccessDenied mesmo que TemporaryRead permita esta chave. A negação explícita correspondente prevalece. Remova a concessão temporária para restaurar o privilégio mínimo.

aws iam delete-user-policy --user-name report-reader --policy-name TemporaryRead

Uma concessão de leitura não permite gravações. upload.txt é uma substituição não aprovada fornecida. put-object tenta armazenar seus bytes na chave de hoje, e o leitor deve ser recusado.

aws s3api put-object --profile reader --bucket labex-iam01-reports --key reports/today.txt --body upload.txt || true

Espere AccessDenied para PutObject; não trate arquivos ausentes ou falhas do serviço como esse resultado. Leia hoje novamente para confirmar que a gravação malsucedida não o alterou.

aws s3api get-object \
  --profile reader \
  --bucket labex-iam01-reports \
  --key reports/today.txt today.txt
cat today.txt

Ele ainda deve conter Daily orders: 145. Leia a política final e confirme o Allow restrito e o Deny privado.

aws iam get-user-policy \
  --user-name report-reader \
  --policy-name ReportRead \
  --query PolicyDocument

Revogue o acesso e limpe os recursos do exercício

Nesta etapa, você retirará a política do leitor e removerá apenas o bucket de relatórios deste exercício. Limpeza de políticas IAM e limpeza de dados são separadas: excluir uma política não exclui objetos, e excluir objetos não revoga credenciais.

Use o operador padrão para remover ReportRead. delete-user-policy remove uma política inline pelo nome.

aws iam delete-user-policy --user-name report-reader --policy-name ReportRead
aws iam list-user-policies --user-name report-reader

Espere que PolicyNames esteja vazio. Enquanto o relatório ainda existe, teste que o leitor perdeu o acesso.

aws s3api get-object --profile reader --bucket labex-iam01-reports --key reports/today.txt revoked.txt || true

Espere AccessDenied. Agora remova as três chaves exatas do exercício como operador. O bucket de referência pertence ao recurso preparado da plataforma e deve permanecer intacto.

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

Confira que KeyCount é 0 e que nenhum objeto aparece em Contents. Esta resposta autenticada bem-sucedida mostra que o bucket do exercício está vazio antes da exclusão.

aws s3api delete-bucket --bucket labex-iam01-reports
aws s3api list-buckets --query 'Buckets[].Name'

Resta apenas labex-iam01-reference. Confirme seus bytes originais:

aws s3api get-object --bucket labex-iam01-reference --key reference.txt reference.txt
cat reference.txt

Espere Platform reference: keep. AWS View agora mostra No inline policy e Reports bucket removed. Uma indisponibilidade do serviço seria mostrada como indisponível, não como uma limpeza bem-sucedida. As identidades descartáveis preparadas são recuperadas quando seu ambiente de laboratório termina; você removeu as permissões criadas pelo aluno e os dados do exercício preservando o recurso fornecido não relacionado.

Resumo

Você associou e revisou uma política de identidade IAM, usou Action e Resource para restringir uma tarefa de relatórios, comparou negações implícitas e explícitas e comprovou que permissão de leitura não autoriza uma gravação. Você revogou a política e removeu apenas os dados do exercício. Teste tanto o sucesso pretendido quanto as operações proibidas sempre que revisar acesso; apenas uma política armazenada não comprova que uma aplicação está corretamente autorizada.

Para aprofundar o tema, consulte a documentação da AWS: Tipos de políticas e declarações de permissões IAM.