Introdução
Sua aplicação EC2 precisa ler um relatório do S3. Você atribuirá um papel IAM à aplicação por meio de um perfil de instância, verificará a leitura real do relatório e observará o que acontece ao revogar sua permissão.
Você deve conhecer o lançamento de EC2, User Data e políticas IAM básicas. Este ambiente novo fornece uma imagem de aplicação, rede, par de chaves e um bucket S3 com dados sintéticos. Você criará a instância da aplicação e seus recursos de autorização.
Relação com a certificação
Este laboratório pratica o menor privilégio e papéis de cargas de trabalho, apoiando a tarefa 2.3 dos objetivos de segurança do AWS Certified Cloud Practitioner e a tarefa 3.3 de seus objetivos de computação.
Inicie uma aplicação sem papel
Nesta etapa, você iniciará o servidor de relatórios e observará que sua aplicação ainda não consegue ler o S3.
Comece em seu espaço de trabalho e carregue os IDs fornecidos da imagem, rede e bucket de relatórios:
cd /home/labex/project
source launch.env
Inspecione o script de inicialização fornecido. Ele configura o bucket S3 e a chave do objeto da aplicação, mas não fornece credenciais:
cat role-user-data.sh
Inicie um servidor chamado role-server com esta configuração:
aws ec2 \
run-instances \
--image-id "$AMI_ID" \
--instance-type t3.micro \
--subnet-id "$SUBNET_ID" \
--security-group-ids "$SECURITY_GROUP_ID" \
--key-name report-key \
--count 1 \
--user-data file://role-user-data.sh \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=role-server}]'
Guarde seu ID:
INSTANCE_ID=$(aws ec2 \
describe-instances \
--filters Name=tag:Name,Values=role-server \
--query 'Reservations[0].Instances[0].InstanceId' \
--output text)
aws ec2 \
wait instance-running \
--instance-ids "$INSTANCE_ID"
Abra AWS View, clique em Refresh resources, selecione role-server e clique em Check application. Confirme HTTP 200 e Role report server. Agora clique em Read S3 report. Espere HTTP 503 e Application storage unavailable: a aplicação em execução ainda não tem credenciais de papel.
Uma aplicação em EC2 pode obter credenciais temporárias para um papel atribuído por meio dos metadados da instância. Seu SDK da AWS usa essas credenciais para assinar solicitações à API. O guia oficial de papéis EC2 explica esse fluxo. Você configurará o papel em vez de copiar suas credenciais do terminal para a aplicação.
Conceda acesso por meio de um perfil de instância
Nesta etapa, você criará as políticas de confiança e permissão do papel, adicionará o papel a um perfil de instância e associará o perfil ao servidor.
Uma política de confiança define quem pode assumir um papel. Crie uma política JSON que confie no serviço EC2. O here-document com delimitador entre aspas preserva o JSON literalmente:
cat > ec2-trust.json <<'JSON'
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"Service": "ec2.amazonaws.com"},
"Action": "sts:AssumeRole"
}]
}
JSON
Crie o papel report-reader usando essa política de confiança:
aws iam \
create-role \
--role-name report-reader \
--assume-role-policy-document file://ec2-trust.json
Uma política de permissões define o que o papel assumido pode fazer. Esta aplicação precisa apenas de s3:GetObject para report.csv. O ARN de um objeto inclui o bucket e a chave. Diferentemente do here-document anterior entre aspas, o marcador JSON sem aspas abaixo expande $REPORT_BUCKET para o nome do bucket fornecido:
cat > read-report.json <<JSON
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::$REPORT_BUCKET/report.csv"
}]
}
JSON
Inspecione o ARN do recurso resolvido:
cat read-report.json
Adicione esta política inline ao seu papel:
aws iam \
put-role-policy \
--role-name report-reader \
--policy-name ReadReport \
--policy-document file://read-report.json
Um perfil de instância leva um papel IAM ao EC2. Ao usar a CLI, você cria o papel e o perfil separadamente. Crie um perfil com o mesmo nome para facilitar a identificação:
aws iam \
create-instance-profile \
--instance-profile-name report-reader
Adicione o papel ao perfil:
aws iam \
add-role-to-instance-profile \
--instance-profile-name report-reader \
--role-name report-reader
Associe o perfil à instância existente e guarde o ID da associação para a limpeza:
ASSOCIATION_ID=$(aws ec2 \
associate-iam-instance-profile \
--instance-id "$INSTANCE_ID" \
--iam-instance-profile Name=report-reader \
--query 'IamInstanceProfileAssociation.AssociationId' \
--output text)
Inspecione a associação:
aws ec2 \
describe-iam-instance-profile-associations \
--association-ids "$ASSOCIATION_ID" \
--query 'IamInstanceProfileAssociations[].{Instance:InstanceId,State:State,Profile:IamInstanceProfile.Arn}'
Confirme associated e o perfil report-reader. Atualize AWS View e clique em Read S3 report. Espere HTTP 200 com period,total e Q1,320. A aplicação usa as credenciais de papel de seu SDK para recuperar o objeto S3 real. Se a associação ainda estiver se propagando, espere brevemente e repita a solicitação.
O papel permite ler um único objeto, em vez de dar acesso ao bucket inteiro ou acesso de administrador. O guia de perfis de instância explica como os perfis levam papéis e por que alterações de associação podem demorar a se propagar.
Observe a revogação da permissão
Nesta etapa, você removerá a permissão do papel para o relatório e distinguirá uma falha de autorização de uma falha da aplicação.
Remova somente a política inline que você criou:
aws iam \
delete-role-policy \
--role-name report-reader \
--policy-name ReadReport
Liste as políticas inline restantes do papel:
aws iam \
list-role-policies \
--role-name report-reader
Espere uma lista PolicyNames vazia. O perfil de instância continua associado, mas seu papel não permite mais ler o relatório.
Em AWS View, clique em Check application e confirme HTTP 200: o servidor continua em execução. Depois clique em Read S3 report. Espere HTTP 403 e Access denied. Se as alterações de permissão ainda não se propagaram, espere brevemente e repita a solicitação. Uma resposta de saúde normal junto com uma negação do S3 aponta para autorização, não para uma instância parada ou aplicação ausente.
Um SDK pode armazenar credenciais temporárias em cache. Remover uma permissão do papel muda o que essas credenciais podem fazer; remover um perfil de instância não revoga imediatamente credenciais já emitidas.
Limpe a instância e o papel
Nesta etapa, você removerá sua associação, servidor, perfil e papel.
Desassocie o perfil usando o ID da associação salvo:
aws ec2 \
disassociate-iam-instance-profile \
--association-id "$ASSOCIATION_ID"
Encerre a instância da aplicação:
aws ec2 \
terminate-instances \
--instance-ids "$INSTANCE_ID"
aws ec2 \
wait instance-terminated \
--instance-ids "$INSTANCE_ID"
Remova o papel de seu perfil de instância, que não está mais em uso:
aws iam \
remove-role-from-instance-profile \
--instance-profile-name report-reader \
--role-name report-reader
Exclua o perfil vazio:
aws iam \
delete-instance-profile \
--instance-profile-name report-reader
A política inline já foi removida durante a revogação. Exclua seu papel:
aws iam \
delete-role \
--role-name report-reader
Confirme que a instância foi encerrada:
aws ec2 \
describe-instances \
--instance-ids "$INSTANCE_ID" \
--query 'Reservations[].Instances[].{Instance:InstanceId,State:State.Name}'
Verifique se o papel e o perfil com esses nomes estão ausentes:
aws iam \
list-roles \
--query "Roles[?RoleName=='report-reader'].RoleName"
aws iam \
list-instance-profiles \
--query "InstanceProfiles[?InstanceProfileName=='report-reader'].InstanceProfileName"
As duas listas devem ser []. Atualize AWS View e confirme que o servidor não é mais um destino em execução. Mantenha os dados S3, a rede e o par de chaves preparados.
Resumo
Você criou confiança EC2 e permissão de leitura de um único objeto S3 para um papel IAM, levou esse papel por um perfil de instância e verificou a leitura real do relatório pela aplicação. Depois revogou a permissão e distinguiu uma negação do S3 de uma aplicação saudável. Por fim, removeu a instância, o perfil e o papel.



