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.
Bucket Policy do S3: JSON resource-based, principals, conditions e os padrões que importam
Uma bucket policy do S3 é um documento JSON anexado diretamente ao bucket — uma policy resource-based, distinta da IAM policy identity-based, que mora no user/role. A sintaxe é quase idêntica à IAM (Version, Statement, Effect, Action, Resource, Condition) com um acréscimo crítico: Principal é obrigatório, identificando a quem o statement se aplica.
Os dois tipos são avaliados juntos. Para acesso cross-account você precisa das duas: bucket policy (concedendo do lado do recurso) e IAM policy do chamador (concedendo do lado da identidade). Dentro da mesma conta, qualquer uma basta, mas a bucket policy costuma ser mais clara porque o próprio bucket documenta quem pode ler.
Principal: a quem a policy se aplica
"Principal": "*"— anônimo público (use só para hospedagem de site estático e leitura).{"AWS": "arn:aws:iam::123456789012:user/Alice"}— um IAM user específico.{"AWS": "arn:aws:iam::123456789012:role/AppRole"}— uma IAM role específica (preferível a user).{"AWS": "123456789012"}— qualquer identidade daquela conta (ainda precisa de permissão do lado da identidade).{"Service": "cloudfront.amazonaws.com"}— service principal AWS, ex: CloudFront OAC.{"Federated": "cognito-identity.amazonaws.com"}— provedores de identidade federada.
Padrões comuns
Leitura pública para hospedagem de site estático:
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::meu-site/*"
}
Restringir por faixa de IP de origem: "Condition": { "IpAddress": { "aws:SourceIp": ["10.0.0.0/24", "203.0.113.0/24"] } }.
Exigir HTTPS (negar HTTP puro):
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": ["arn:aws:s3:::bucket", "arn:aws:s3:::bucket/*"],
"Condition": { "Bool": { "aws:SecureTransport": "false" } }
}
CloudFront OAC (Origin Access Control) — substituto moderno do OAI legado: só a distribution especificada pode ler; combine com bucket com Block Public Access.
Block Public Access, MFA Delete e versioning
Block Public Access (BPA) é um switch de nível conta e bucket que sobrescreve qualquer Allow da bucket policy. Mesmo uma policy public-read perfeitamente correta retorna 403 se o BPA estiver ligado. Sempre confira o BPA primeiro quando estiver depurando "AccessDenied" em bucket público.
MFA Delete em bucket versionado força token MFA em todo DeleteObjectVersion — exigido em buckets de compliance. Versioning introduz actions separadas como s3:GetObjectVersion e s3:DeleteObjectVersion; conceder só s3:GetObject não deixa ler versões antigas.
Object Lock impõe retenção WORM (Write Once Read Many) para GDPR/SOX/LGPD. Uma vez travado em modo compliance, nem o root da conta consegue deletar o objeto até a retenção expirar.
Pegadinhas
Denyexplícito sempre vence, mesmo contra umAllowna mesma policy ou em IAM em outro lugar.- A bucket policy aplica ao bucket todo. Para restringir por path, codifique o prefixo no ARN do
Resource:arn:aws:s3:::bucket/users/${aws:username}/*. - Chaves KMS de criptografia têm sua própria key policy — conceder
s3:GetObjectnão basta se os objetos estiverem criptografados com chave customer-managed. - Cross-account: a bucket policy é só metade. O principal remoto ainda precisa de permissão IAM na conta dele.
- Policies public-read em buckets com prefixos sensíveis são risco de exfiltração — use BPA mais IAM com menor privilégio, não
Principal: *.
FAQ
Bucket policy vs ACL? Bucket policies são JSON, granulares e a forma moderna. ACLs são XML, legado, e a AWS hoje recomenda desabilitar via Object Ownership (BucketOwnerEnforced).
Posso delegar acesso a outra conta AWS? Sim — coloque a conta remota ou o principal IAM no campo Principal, e peça para anexarem uma IAM policy compatível do lado deles. As duas metades são necessárias.
CORS vs bucket policy — preciso de qual? Das duas. CORS governa o acesso pelo browser a partir de uma página web (response headers); bucket policy governa o acesso pela API (autenticação e autorização). Um bucket pode ter os dois.
Por que minha policy ainda nega acesso? Confira nesta ordem: configuração de Block Public Access, Deny explícito em alguma policy ou SCP, key policy do KMS se estiver criptografado, e se você endereçou a diferença bucket-level vs object-level no ARN (bucket vs bucket/*).
Qual o tamanho máximo de uma bucket policy? 20 KB (20.480 bytes) de JSON. Estourou? Consolide statements usando arrays de resources, ou mova lógica para IAM identity policies dos principals acessantes.
Ferramentas Relacionadas
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.
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 resposta paginada JSON
Gere uma resposta JSON paginada fictícia (com page, pageSize, total e items) para mockar uma API REST. Acelere o desenvolvimento e os testes de front-end.