Avançado Cloud
IAM e least privilege na cloud — policies, roles, SCPs e erros comuns
Identity and Access Management (IAM) é o controle de acesso central da cloud. Configurado de forma permissiva — seja por pressa, desconhecimento ou conveniência — vira a principal porta de entrada para ataques. O princípio do menor privilégio (least privilege) exige que cada identidade tenha acesso apenas ao que precisa, quando precisa.
Conceitos fundamentais — AWS IAM como referência
Principal → quem solicita acesso (usuário, role, serviço, conta)
Policy → documento JSON que define Allow/Deny em Actions e Resources
Role → identidade assumível sem senha — usada por serviços e workloads
SCP → Service Control Policy — limite máximo de permissões em orgs/OUs
Permission Boundary → limite máximo que uma policy pode conceder a uma role
Policy bem escrita vs policy perigosa
// RUIM — acesso total ao S3 para qualquer recurso
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
// BOM — acesso de leitura somente ao bucket específico e prefixo
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::financeiro-prod",
"arn:aws:s3:::financeiro-prod/relatorios/*"
],
"Condition": {
"StringEquals": {
"aws:RequestedRegion": "us-east-1"
}
}
}
Roles para workloads — nunca use access keys hardcoded
# Ruim: chave de acesso no código ou variável de ambiente
export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
# Certo: EC2 assume uma Instance Profile (role)
# Lambda usa uma Execution Role
# EKS usa IRSA (IAM Roles for Service Accounts)
# Nenhuma chave persistente — credenciais são temporárias e rotacionadas automaticamente
Exemplo de trust policy para uma role usada por Lambda:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": { "Service": "lambda.amazonaws.com" },
"Action": "sts:AssumeRole"
}]
}
SCPs — guardrails organizacionais
SCPs não concedem permissão — elas limitam o teto. Mesmo que uma role tenha s3:*, se a SCP bloquear s3:DeleteBucket, a ação é negada.
// SCP: impede deleção de buckets S3 em toda a OU de produção
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "DenyS3BucketDelete",
"Effect": "Deny",
"Action": [
"s3:DeleteBucket",
"s3:DeleteBucketPolicy"
],
"Resource": "*"
}]
}
// SCP: restringe regiões permitidas
{
"Effect": "Deny",
"NotAction": [
"iam:*", "sts:*", "cloudfront:*", "route53:*"
],
"Resource": "*",
"Condition": {
"StringNotEquals": {
"aws:RequestedRegion": ["us-east-1", "sa-east-1"]
}
}
}
Erros comuns e como evitar
1. AdministratorAccess em roles de aplicação
Fix: use Access Analyzer para gerar policy com least privilege baseada em logs reais
2. Usuários IAM com access keys para automação
Fix: roles + STS AssumeRole ou OIDC federation
3. Policies inline em usuários
Fix: policies gerenciadas, reutilizáveis, versionadas
4. Sem condições de contexto (IP, MFA, horário)
Fix: adicione Condition blocks para acesso sensível
5. Roles com trust policy aberta ("Principal": "*")
Fix: sempre especifique o principal exato
Auditoria de IAM
# Gerar credential report (quem tem o quê)
aws iam generate-credential-report
aws iam get-credential-report --query 'Content' --output text | base64 -d
# IAM Access Analyzer — detecta acesso externo indevido
aws accessanalyzer list-findings --analyzer-arn arn:aws:access-analyzer:us-east-1:123456789:analyzer/meu-analyzer
# Simular permissões de uma role
aws iam simulate-principal-policy \
--policy-source-arn arn:aws:iam::123456789:role/minha-role \
--action-names s3:DeleteBucket \
--resource-arns arn:aws:s3:::financeiro-prod