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":["*"]}]}'