1001Ferramentas
☁️Geradores

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

  • Deny explícito sempre vence, mesmo contra um Allow na 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:GetObject nã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