Gerador de AWS IAM Policy
Gera uma política IAM da AWS (versão 2012-10-17) a partir de Effect, Actions e Resources informados em texto.
Policies IAM da AWS a fundo: estrutura, conditions e padrões de menor privilégio
Uma policy IAM é um documento JSON que diz para a AWS quem pode (ou não) fazer o quê, em quais recursos, sob quais condições. Toda chamada de API contra a AWS — de s3:GetObject a ec2:RunInstances — é autorizada pelo motor IAM, que avalia a união de todas as policies anexadas ao principal chamador mais qualquer policy de recurso no alvo.
O modelo mental: tudo é negado por default. Um Allow concede permissão; um Deny explícito sempre ganha, mesmo contra um Allow em outro lugar. Isso torna o Deny poderoso para guardrails (ex: "ninguém fora dos IPs corporativos pode desligar o CloudTrail") mas também complica troubleshooting — uma permissão faltando e um deny explícito parecem iguais do lado cliente.
Anatomia de uma policy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "LeituraS3",
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:ListBucket"],
"Resource": [
"arn:aws:s3:::meu-bucket",
"arn:aws:s3:::meu-bucket/*"
],
"Condition": {
"IpAddress": { "aws:SourceIp": "203.0.113.0/24" },
"Bool": { "aws:MultiFactorAuthPresent": "true" }
}
}
]
}
Version sempre "2012-10-17" (data em que a lógica de avaliação atual entrou — não existe versão mais nova). Sid é rótulo humano opcional. Effect é Allow ou Deny. Action, Resource e Condition descrevem o quê, em quê e quando.
Actions e ARNs de recurso
Actions seguem o formato service:Operation (case-sensitive). Wildcards são suportados: s3:* significa toda action do S3, s3:Get* significa toda leitura. Cuidado — iam:* em uma policy é, na prática, root.
ARNs de recurso seguem arn:aws:service:region:account-id:resource-type/resource-id. Alguns serviços omitem region e account (ex: S3: arn:aws:s3:::nome-bucket/*). Wildcards funcionam nos ARNs também — arn:aws:s3:::meu-bucket/* casa com todo objeto do bucket mas não com o bucket em si, motivo pelo qual actions de nível bucket como s3:ListBucket precisam de um ARN separado sem o /* final.
Conditions: o poder real
- Operadores: StringEquals / StringLike (wildcard), NumericLessThan, DateGreaterThan, IpAddress, ArnLike, Bool — cada um tem variante
...IfExistspara condições opcionais. - Chaves globais:
aws:SourceIp,aws:CurrentTime,aws:PrincipalOrgID,aws:MultiFactorAuthPresent,aws:MultiFactorAuthAge,aws:RequestTag/Env,aws:ResourceTag/Owner. - Chaves de serviço:
s3:prefix,ec2:InstanceType,kms:ViaService, etc. — veja a página IAM de cada serviço.
Padrão favorito: "aws:MultiFactorAuthPresent": "true" para exigir MFA em operações sensíveis; "aws:PrincipalOrgID": "o-abcd1234" para limitar uma policy de recurso só à sua AWS Organization.
Tipos de policy — saiba qual usar
- Identity-based: anexada a user, group ou role. O tipo mais comum.
- Resource-based: anexada diretamente a buckets S3, filas SQS, tópicos SNS, funções Lambda, chaves KMS. Inclui um campo
Principalque policies identity-based não têm. - Permissions Boundary: teto sobre o que uma policy identity-based pode conceder. A permissão efetiva é a interseção.
- SCP (Service Control Policy): aplicada no nível AWS Organizations. Deny-list puro — não concede, só restringe, mesmo para o root da conta.
- Session policy: passada para
sts:AssumeRolepara apertar ainda mais uma sessão temporária. Usada por ferramentas como aws-vault e federação de CI.
Pegadinhas comuns
NotActioneNotResourcesignificam "tudo menos". Raramente é o que você quer — fácil conceder demais por acidente.Denyexplícito sempre sobrescreveAllow. Use em SCPs e policies de recurso como guardrail, não no controle de acesso normal.StringLikeé case-sensitive —"s3:prefix": "Pictures/*"não casa compictures/foo.jpg.- Actions de nível bucket vs nível objeto precisam de ARNs diferentes (com e sem
/*no final). - Wildcards dentro do account-id ou resource-id do ARN funcionam; no segmento de partition ou service, não.
Boas práticas e ferramentas
- Comece com managed policies da AWS para padrões comuns (
AmazonS3ReadOnlyAccess,AWSLambdaBasicExecutionRole) — são mantidas pela própria AWS. - Rode o IAM Access Analyzer para detectar permissões não usadas e acessos externos não intencionais.
- Use o Policy Simulator para validar "esse principal pode fazer essa action?" antes de deployar.
- Auditoria open-source: Cloudsplaining, Parliament, iamlive para capturar as permissões realmente usadas.
- Acesso cross-account: prefira
sts:AssumeRolea IAM users com chaves de longa duração. No EKS, use IRSA (IAM Roles for Service Accounts). - Force MFA em actions perigosas via
aws:MultiFactorAuthAge < 3600.
FAQ
Policy identity-based vs resource-based? A diferença é onde mora. Identity-based pendura no user/role/group ("Alice pode ler esse bucket"). Resource-based pendura no recurso ("Esse bucket permite a Alice ler") e tem um campo Principal. As duas são avaliadas juntas em acesso cross-account.
Deny explícito sempre vence Allow? Sim, em todos os contextos. Esse é o motivo de existirem SCPs e permissions boundaries — não concedem, só barram.
Quantas policies um user pode ter? 10 managed policies (anexadas por ARN) mais 10 inline policies por default. O tamanho combinado é limitado a 10.240 caracteres para users/roles. Estourou? Consolide, ou mova lógica para uma resource policy.
Qual o jeito mais seguro de começar a escrever uma policy nova? Comece com o conjunto mínimo de actions que sabe que precisa, deploye com Access Analyzer ligado e deixe ele te dizer o que está sobrando. A ferramenta iamlive também intercepta chamadas SDK durante um teste e emite a policy exata que satisfez tudo.
Posso usar wildcard no campo Principal? Sim, "Principal": "*" torna o recurso público — extremamente perigoso em buckets S3. Combine com "Condition": {"StringEquals": {"aws:PrincipalOrgID": "o-..."}} para restringir à sua org.
Ferramentas Relacionadas
Gerador de IAM Policy AWS S3
Gera um documento JSON de policy IAM para AWS S3: read-only, write, full access ou customizado por bucket. Pronto para colar no IAM.
Gerador de AWS IAM Trust Policy
Gera o JSON de uma Trust Policy AWS IAM para Lambda, EC2, ECS e outros serviços. Define quem pode assumir a role criada.
Gerador de Formulário HTML a partir de JSON
Lê um schema JSON com campos (label, name, type, required) e gera um formulário HTML completo com inputs estilizados e atributo de validação.