Amazon S3 — Security Revisão SAA-C03 · Domínio 1 (Segurança) & Domínio 1.3 (Controles de dados)
1. Criptografia de objetos no S3 — Visão Geral
Você pode criptografar objetos armazenados em buckets S3 usando um de 4 métodos. É essencial entender qual método se aplica a qual situação — este é um ponto muito cobrado no exame.
| Método | Quem gerencia a chave | Onde é criptografado |
|---|---|---|
| SSE-S3 (Server-Side Encryption) | AWS (chave gerenciada e de propriedade da AWS) | Server-side |
| SSE-KMS (Server-Side Encryption) | AWS KMS (Key Management Service) — chaves gerenciadas com controle do usuário | Server-side |
| SSE-C (Server-Side Encryption) | Cliente fornece e gerencia a própria chave | Server-side |
| Client-Side Encryption | Cliente | Client-side (antes do upload) |
💡 Dica de exame
SSE-S3 é habilitado por padrão ("Enabled by Default") em novos buckets e novos objetos.
2. Amazon S3 Encryption — SSE-S3
- Criptografia usando chaves manuseadas, gerenciadas e de propriedade da AWS.
- O objeto é criptografado server-side (no lado do servidor).
- Tipo de criptografia: AES-256.
- É necessário definir o header:
"x-amz-server-side-encryption": "AES256"
- Habilitado por padrão para novos buckets e novos objetos.
🔄 Fluxo (SSE-S3)
User --[HTTP(S) + Header]--> Amazon S3
|
|-- Objeto + S3 Owned Key --> Criptografia --> S3 Bucket
3. Amazon S3 Encryption — SSE-KMS
- Criptografia usando chaves manuseadas e gerenciadas pelo AWS KMS (Key Management Service).
- Vantagens do KMS: controle do usuário + auditoria do uso das chaves via CloudTrail.
- O objeto é criptografado no lado do servidor (server-side).
- É necessário definir o header:
"x-amz-server-side-encryption": "aws:kms"
🔄 Fluxo (SSE-KMS)
User --[HTTP(S) + Header]--> Amazon S3
|
|-- Objeto --> Criptografia (usa AWS KMS Key) --> S3 Bucket
SSE-KMS Limitation (Limitações)
⚠️ Atenção — Limites de API do KMS
- Se você usa SSE-KMS, pode ser impactado pelos limites (quotas) do KMS.
- Quando você faz upload, o S3 chama a API GenerateDataKey do KMS.
- Quando você faz download, o S3 chama a API Decrypt do KMS.
- Essas chamadas contam para a quota do KMS por segundo (5.500 / 10.000 / 30.000 req/s, dependendo da região).
- Você pode solicitar aumento de quota através do Service Quotas Console.
🔄 Fluxo (Limitação SSE-KMS)
Users --[API call]--> S3 Bucket <--> KMS Key
(upload/download via SSE-KMS)
4. Amazon S3 Encryption — SSE-C
- Server-Side Encryption usando chaves totalmente gerenciadas pelo cliente, fora da AWS.
- O Amazon S3 NÃO armazena a chave de criptografia que você fornece.
- HTTPS deve ser usado obrigatoriamente (mandatory).
- A chave de criptografia deve ser fornecida nos headers HTTP, em cada requisição HTTP feita.
🔄 Fluxo (SSE-C)
User --[HTTPS SOMENTE + Chave no Header]--> Amazon S3
|
Objeto + Chave fornecida pelo cliente --> Criptografia --> S3 Bucket
5. Amazon S3 Encryption — Client-Side Encryption
- Utiliza bibliotecas client-side, como a Amazon S3 Client-Side Encryption Library.
- Os clientes devem criptografar os dados eles mesmos antes de enviar ao Amazon S3.
- Os clientes devem descriptografar os dados eles mesmos ao recuperar do Amazon S3.
- O cliente gerencia totalmente as chaves e o ciclo de criptografia.
🔄 Fluxo (Client-Side Encryption)
Arquivo + Chave do Cliente --> Criptografia (no cliente)
--> Arquivo (já criptografado) --[upload HTTP(S)]--> S3 Bucket
6. Amazon S3 — Encryption in Transit (SSL/TLS)
- Criptografia em trânsito também é chamada de SSL/TLS.
- Amazon S3 expõe dois endpoints:
- HTTP Endpoint — não criptografado.
- HTTPS Endpoint — criptografado em trânsito.
- HTTPS é recomendado.
- HTTPS é obrigatório para SSE-C.
- A maioria dos clientes usa o endpoint HTTPS por padrão.
7. Amazon S3 — Force Encryption in Transit (aws:SecureTransport)
É possível forçar a criptografia em trânsito usando uma Bucket Policy que nega (Deny) qualquer chamada de API que não use HTTPS.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*",
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
}
]
}
🔄 Fluxo
User A --[https]--> ✅ Account B / S3 Bucket (my-bucket)
User B --[http]--> ❌ (bloqueado pela Bucket Policy)
8. Amazon S3 — Default Encryption vs. Bucket Policies
- A criptografia SSE-S3 é aplicada automaticamente a novos objetos armazenados em um bucket S3.
- Opcionalmente, você pode "forçar" a criptografia usando uma bucket policy e recusar qualquer chamada de API para fazer PUT de um objeto S3 sem os headers de criptografia (SSE-KMS ou SSE-C).
📌 Nota importante do exame
Bucket Policies são avaliadas ANTES da "Default Encryption".
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::my-bucket/*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption": "aws:kms"
}
}
}
]
}
/* ...ou, alternativamente, exigindo SSE-C: */
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::my-bucket/*",
"Condition": {
"Null": {
"s3:x-amz-server-side-encryption-customer-algorithm": "true"
}
}
}
]
}
9. What is CORS? (Cross-Origin Resource Sharing)
- CORS = Cross-Origin Resource Sharing.
- Origin = scheme (protocolo) + host (domínio) + porta.
- Exemplo: https://www.example.com (porta implícita 443 para HTTPS, 80 para HTTP).
- CORS é um mecanismo baseado no navegador (Web Browser) para permitir requisições a outras origens enquanto se está visitando a origem principal.
- Same origin (mesma origem): http://example.com/app1 & http://example.com/app2
- Different origins (origens diferentes): http://www.example.com & http://other.example.com
- As requisições não serão atendidas a menos que a outra origem permita as requisições, usando os CORS Headers (exemplo: Access-Control-Allow-Origin).
🔄 Fluxo — Preflight Request/Response
Web Browser --[OPTIONS / Host: www.other.com / Origin: https://www.example.com]--> Web Server (Origin, cross-origin)
Web Server --[Preflight Response: Access-Control-Allow-Origin / Access-Control-Allow-Methods: GET, PUT, DELETE]--> Web Browser
Web Browser --[GET / Host: www.other.com / Origin: https://www.example.com]--> Web Server (Cross-Origin)
(CORS Headers já recebidos pela Origem: o Web Browser pode fazer as requisições)
Amazon S3 — CORS (aplicado a buckets)
- Se um cliente faz uma requisição cross-origin no nosso bucket S3, precisamos habilitar os headers CORS corretos.
- É uma pergunta popular no exame.
- Você pode permitir uma origem específica ou usar * (todas as origens).
🔄 Exemplo — Site estático hospedado em S3 consumindo assets de outro bucket S3
GET /index.html
Host: my-bucket-html.s3-website-us-west-2.amazonaws.com
--> S3 Bucket "my-bucket-html" (Static Website Enabled)
devolve index.html
GET /images/coffee.jpg
Host: my-bucket-assets.s3-website-us-west-2.amazonaws.com
Origin: http://my-bucket-html.s3-website-us-west-2.amazonaws.com
--> S3 Bucket "my-bucket-assets" (Static Website Enabled)
Access-Control-Allow-Origin: http://my-bucket-html.s3-website-us-west-2.amazonaws.com
10. Amazon S3 — MFA Delete
- MFA (Multi-Factor Authentication) — força os usuários a gerar um código em um dispositivo (geralmente um celular ou hardware) antes de realizar operações importantes no S3.
MFA será exigido para:
- Excluir permanentemente uma versão de objeto.
- Suspender o versionamento no bucket.
MFA NÃO será exigido para:
- Habilitar o versionamento.
- Listar versões excluídas.
📌 Regras importantes
- Para usar MFA Delete, o versionamento deve estar habilitado no bucket.
- Apenas o proprietário do bucket (conta root) pode habilitar/desabilitar o MFA Delete.
Dispositivos suportados (ilustrados no material): Google Authenticator, dispositivo hardware MFA.
11. S3 Access Logs
- Para fins de auditoria, você pode querer registrar (log) todo o acesso aos buckets S3.
- Qualquer requisição feita ao S3, de qualquer conta, autorizada ou negada, será registrada em outro bucket S3.
- Esses dados podem ser analisados usando ferramentas de análise de dados.
- O bucket de destino do log (logging bucket) deve estar na mesma região AWS que o bucket monitorado.
- O formato do log está disponível em: https://docs.aws.amazon.com/AmazonS3/latest/dev/LogFormat.html
🔄 Fluxo
User --[requests]--> My-bucket --[log all requests]--> Logging Bucket
S3 Access Logs: Warning (Aviso importante)
⚠️ Nunca faça isso!
- Não configure o bucket de logging para ser o próprio bucket monitorado.
- Isso criará um loop de logging (logging loop), e seu bucket crescerá exponencialmente.
User --[PutObject]--> App Bucket & Logging Bucket (o mesmo bucket)
--> gera um novo log --> que gera outro log --> LOOP infinito 🔁
"Do not try this at home 😅"
12. Amazon S3 — Pre-Signed URLs
- Você pode gerar URLs pré-assinadas (pre-signed) usando o S3 Console, AWS CLI ou SDK.
Expiração da URL
- S3 Console: mínimo de 1 até 720 minutos (12 horas).
- AWS CLI: configure a expiração com o parâmetro --expires-in em segundos (padrão 3.600s, máximo 604.800s ≈ 168 horas).
- Usuários que recebem a URL pré-assinada herdam as permissões do usuário que gerou a URL, para operações de GET ou PUT.
Exemplos de uso
- Permitir que apenas usuários logados façam download de um vídeo premium do seu bucket S3.
- Permitir uma lista de usuários (que muda constantemente) fazer download de arquivos, gerando URLs dinamicamente.
- Permitir que um usuário faça upload temporário de um arquivo para um local específico do seu bucket S3.
🔄 Fluxo
Owner --[gera a URL pré-assinada]--> S3 Bucket (Private)
User --[usa a URL, herdando as permissões do Owner]--> GET / PUT
13. S3 Glacier Vault Lock
- Adota um modelo WORM (Write Once Read Many).
- Você cria uma Vault Lock Policy.
- A política é travada (lock) para edições futuras (não pode mais ser alterada ou excluída).
- Útil para conformidade (compliance) e retenção de dados.
14. S3 Object Lock (o versionamento deve estar habilitado)
- Adota um modelo WORM (Write Once Read Many).
- Bloqueia a exclusão de uma versão de objeto por um período de tempo especificado.
Retention Mode — Compliance
- As versões dos objetos não podem ser sobrescritas ou excluídas por nenhum usuário, incluindo o usuário root.
- Os modos de retenção do objeto não podem ser alterados, e os períodos de retenção não podem ser reduzidos.
Retention Mode — Governance
- A maioria dos usuários não pode sobrescrever ou excluir uma versão de objeto ou alterar suas configurações de lock.
- Alguns usuários podem ter permissões especiais para alterar a retenção ou excluir o objeto.
Retention Period
Protege o objeto por um período fixo; esse período pode ser estendido.
Legal Hold
- Protege o objeto indefinidamente, independentemente do período de retenção.
- Pode ser livremente aplicado e removido usando a permissão IAM s3:PutObjectLegalHold.
15. S3 — Access Points
- Access Points simplificam o gerenciamento de segurança para buckets S3.
Cada Access Point possui:
- Seu próprio nome de DNS (Origem na Internet ou Origem VPC).
- Uma política de access point (semelhante a uma bucket policy) — para gerenciar segurança em escala.
🔄 Exemplo de arquitetura
Users (Finance) --[Policy R/W /finance]--> Finance Access Point -->\
Users (Sales) --[Policy R/W /sales]--> Sales Access Point --> S3 Bucket (Simple Bucket Policy)
Users (Analytics)--[Policy Grant R/entire bucket]--> Analytics Access Point --/
("/finance/..." e "/sales/..." como prefixos dentro do bucket)
S3 — Access Points — VPC Origin
- Podemos definir o Access Point para ser acessível somente a partir de dentro da VPC.
- Você deve criar um VPC Endpoint (Gateway ou Interface Endpoint) para acessar o Access Point.
- A política do VPC Endpoint deve permitir acesso ao bucket de destino e ao Access Point.
🔄 Fluxo
EC2 Instance --> VPC Endpoint --> Access Point (VPC Origin) --> S3 Bucket
(dentro de uma VPC)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*",
"Condition": {
"StringEquals": {
"aws:SourceVpce": "vpce-xxxxxxxx"
}
}
}
]
}
16. S3 Object Lambda
- Usa funções AWS Lambda para alterar o objeto antes que ele seja retornado à aplicação que o solicitou (caller application).
- Apenas um bucket S3 é necessário, sobre o qual são criados o S3 Access Point e o S3 Object Lambda Access Point.
Casos de uso:
- Redigir informações de identificação pessoal (PII) ou não produtivas.
- Converter entre diferentes formatos de dados, como converter XML para JSON.
- Redimensionar e aplicar marca d'água (watermark) em imagens dinamicamente, usando detalhes específicos do usuário que solicitou o objeto.
🔄 Fluxo (S3 Object Lambda)
E-commerce Application --> S3 Object Lambda Access Point --> Redacting Lambda Function --> Original Object (S3 Bucket) --> Redacted Object
Marketing Application --> S3 Object Lambda Access Point --> Enriching Lambda Function --> Supporting S3 Access Point + Customer Loyalty Database --> Enriched Object
📌 Resumo mental — S3 Object Lambda
S3 Object Lambda = S3 Access Point normal (para o objeto original) + Lambda Function (para transformar) exposto por um S3 Object Lambda Access Point — tudo isso em cima de um único bucket físico.