Object Storage: bucket público ou privado, links pré-assinados e política de acesso

João Guilherme

João Guilherme

Última atualização em Sep 29, 2026

Privado (padrão)

Só quem tem Access/Secret Key acessa. É o certo para backups, dados de clientes e qualquer coisa que não seja para download aberto.

Público (leitura anônima)

Para servir imagens de site, downloads, arquivos estáticos. Qualquer pessoa com a URL baixa o arquivo:

https://ENDPOINT-DA-API/NOME-DO-BUCKET/caminho/arquivo.jpg

Como tornar público:

  • Pelo painel: Buckets → seu bucket → Acesso/Política → Público (somente leitura).
  • Por linha de comando (política anônima de leitura):
aws s3api put-bucket-policy --bucket midia-site --policy '{
  "Version": "2012-10-17",
  "Statement": [{"Effect": "Allow","Principal": "*","Action": ["s3:GetObject"],"Resource": ["arn:aws:s3:::midia-site/*"]}]
}'

Nunca deixe público um bucket de backup. Escrita anônima, jamais.

Link pré-assinado (compartilhar um arquivo privado por tempo limitado)

O bucket continua privado; você gera uma URL que vale por X minutos:

# AWS CLI (1 hora)
aws s3 presign s3://backups-vps/relatorio.pdf --expires-in 3600

# rclone (24 horas)
rclone link lura:backups-vps/relatorio.pdf --expire 24h

Em código a maioria dos SDKs tem getSignedUrl / generate_presigned_url, exemplos em Como usar o Object Storage em código.

Uma chave por aplicação, com o mínimo de acesso

Não use a chave principal em todo lugar. Crie uma chave para cada uso (site, backup da VPS 1, backup da VPS 2) e restrinja ao bucket necessário. Se uma vazar, você revoga só ela.

Exemplo de política que permite ler e escrever apenas em backups-vps:

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": ["s3:ListBucket","s3:GetObject","s3:PutObject","s3:DeleteObject"],
    "Resource": ["arn:aws:s3:::backups-vps","arn:aws:s3:::backups-vps/*"]
  }]
}

CORS (quando o navegador vai acessar direto)

Upload/download feito pelo JavaScript do seu site precisa de CORS no bucket:

aws s3api put-bucket-cors --bucket midia-site --cors-configuration '{"CORSRules":[{"AllowedOrigins":["https://seusite.com"],"AllowedMethods":["GET","PUT"],"AllowedHeaders":["*"]}]}'