Conceda acesso com escopo restrito a um leitor de relatórios

AWSBeginner
Pratique Agora

Introdução

Um consumidor de relatórios precisa de um relatório privado, não de todo o acesso do operador ao armazenamento. Você concederá acesso com escopo restrito à identidade IAM independente desse consumidor, testará solicitações efetivas e revogará a concessão, preservando os dados do relatório.

Use como base as referências a recursos e a leitura de objetos S3. Você deve compreender Action e Resource do IAM; confiança de funções, perfis de instância e chaves de acesso pessoais não são necessários. As duas identidades da CLI estão preparadas neste novo ambiente.

Relação com certificações

Certificação Tarefa do exame Prática
Cloud Practitioner (CLF-C02) Tarefas 2.3 e 3.1 Gerenciar uma política de identidade de privilégio mínimo por meio de uma configuração de infraestrutura repetível.
Developer – Associate (DVA-C02) Tarefa 3.3, Habilidade 3.3.4 Prática básica de implantação de uma definição de infraestrutura.
DevOps Engineer – Professional (DOP-C02) Tarefa 2.1 Prática básica de gerenciamento de recursos por meio de uma definição de IaC.
Solutions Architect – Associate (SAA-C03) Tarefa 1.1 Prática básica de delimitação do escopo de uma política de leitor IAM e avaliação de acessos permitidos e negados.

Visão conceitual dos recursos efetivamente usados neste laboratório e dos limites de preservação.

Prepare o relatório e observe o leitor

Nesta etapa, você criará o armazenamento de relatórios e observará a ausência inicial de acesso de um leitor independente válido.

A identidade padrão da CLI gerencia a infraestrutura. O perfil reader fornecido pertence ao usuário IAM independente report-reader; seu acesso não é emprestado do operador. Criar armazenamento não autoriza automaticamente esse usuário. A seleção do perfil altera a identidade que assina uma solicitação AWS, não o recurso em si.

Crie um armazenamento de relatórios no diretório raiz preparado:

cd /home/labex/project/reader-access
cat > main.tf <<'EOF'
resource "aws_s3_bucket" "reports" {
  bucket = "terraform-reader-reports"
}
resource "aws_s3_object" "report" {
  bucket       = aws_s3_bucket.reports.id
  key          = "reports/current.csv"
  content      = "orders,12\n"
  content_type = "text/csv"
}
EOF
terraform init
terraform plan

Espere duas adições. Aplique e digite yes:

terraform apply

Tente ler o relatório com o leitor independente. || true permite que este bloco de comandos continue após a falha intencional; isso não transforma a solicitação em uma leitura bem-sucedida.

aws s3api \
  get-object \
  --profile reader \
  --bucket terraform-reader-reports \
  --key reports/current.csv \
  reader-report.csv || true

Espere AccessDenied. A identidade é válida, mas não tem uma permissão correspondente. Mantenha o objeto separado team-reference-reports/keep.txt privado durante todo o laboratório. O AWS View usa a identidade do operador para inspecionar o armazenamento; uma prévia de objeto nessa interface não comprova que o leitor pode acessá-lo. AWS View após a implantação: o armazenamento criado aparece ao lado do relatório de referência preservado.

Conceda apenas a leitura do relatório pretendido

Nesta etapa, você usará referências a recursos para construir uma política de identidade IAM e verificará leituras permitidas e proibidas.

Uma política de identidade inline é anexada diretamente a um usuário e concede ações a esse usuário. s3:GetObject se aplica a um ARN de objeto, não a um ARN de bucket. jsonencode transforma um valor do Terraform em JSON válido, permitindo usar referências normais a recursos HCL em vez de construir manualmente uma string JSON com escapes.

Crie policy.tf. O nome do leitor é um dado fornecido pelo ambiente; o ARN de destino da política combina o ARN do bucket criado com a chave efetiva do objeto.

cat > policy.tf <<'EOF'
resource "aws_iam_user_policy" "reader" {
  name = "ReadReport"
  user = "report-reader"
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Effect   = "Allow"
      Action   = "s3:GetObject"
      Resource = "${aws_s3_bucket.reports.arn}/${aws_s3_object.report.key}"
    }]
  })
}
EOF
terraform plan

O plano adiciona uma política, preservando o bucket e o relatório. Aplique-o e digite yes:

terraform apply

Leia o destino usando o mesmo perfil de leitor:

aws s3api \
  get-object \
  --profile reader \
  --bucket terraform-reader-reports \
  --key reports/current.csv \
  reader-report.csv
cat reader-report.csv

Espere orders,12. Agora use essa mesma identidade para um objeto privado não relacionado:

aws s3api \
  get-object \
  --profile reader \
  --bucket team-reference-reports \
  --key keep.txt \
  unrelated-report.txt || true

Espere AccessDenied, não dados da referência baixados. Esta política concede apenas leituras de relatórios; não deve autorizar gravações nem exclusão de relatórios. Curingas amplos de ações ou recursos podem criar acesso não pretendido, mesmo que a leitura do destino funcione. A verificação lê a semântica nativa da política e realiza leituras efetivas permitidas e proibidas; ela não exige uma organização específica do JSON. Expressões equivalentes com strings/listas e um prefixo exclusivo de relatórios podem satisfazer esta tarefa sem conceder novas ações.

Revogue a concessão sem excluir dados

Nesta etapa, você removerá a política por meio do Terraform e comprovará que o acesso muda enquanto o relatório permanece.

Remover um bloco de recurso propõe a remoção desse recurso gerenciado. Exclua apenas policy.tf, mantendo a configuração do armazenamento inalterada:

rm policy.tf
terraform plan -out=revoke.tfplan
terraform show revoke.tfplan

Espere a destruição de uma política e nenhuma exclusão de bucket ou objeto. Aplique esse artefato salvo:

terraform apply revoke.tfplan

Tente novamente ler o destino como o mesmo leitor:

aws s3api \
  get-object \
  --profile reader \
  --bucket terraform-reader-reports \
  --key reports/current.csv \
  after-revoke.csv || true

Espere AccessDenied. Uma permissão revogada não remove um arquivo local já baixado, e a presença de reader-report.csv não comprova que uma nova solicitação está autorizada. Consulte o relatório armazenado com a identidade padrão do operador:

aws s3api \
  get-object \
  --bucket terraform-reader-reports \
  --key reports/current.csv \
  retained-report.csv
cat retained-report.csv

O relatório ainda contém orders,12. Você alterou o limite de autorização sem alterar os dados. Consulte os elementos de políticas IAM para entender a distinção entre Action e Resource.

Remova o armazenamento de relatórios sob sua responsabilidade

Nesta etapa, você limpará o armazenamento após concluir as verificações de acesso e revogação.

Destrua os recursos restantes deste diretório raiz e digite yes:

terraform destroy

O bucket e o objeto de relatório são removidos; o leitor fornecido e a referência da equipe pertencem ao ambiente preparado e não estão no estado deste diretório raiz. Inspecione o mapeamento final e a referência preservada:

terraform state list
aws s3api \
  list-buckets \
  --query 'Buckets[].Name'
aws s3api \
  head-object \
  --bucket team-reference-reports \
  --key keep.txt \
  --query ContentLength

A lista do estado está vazia, e a referência permanece. Mantenha as duas identidades preparadas da CLI configuradas até a conclusão da verificação final.

Resumo

Você usou jsonencode e referências a recursos para definir uma política de identidade IAM, testou solicitações permitidas e proibidas com um leitor independente, revogou a permissão sem excluir os dados do relatório e removeu apenas o armazenamento sob sua responsabilidade.