AWS S3
Tags: cloud, aws, devops, security
Published: 2023-05-19 14:02:26

**Anotações sobre o AWS S3 para ajudar na preparação das certificações AWS.**

Até o momento as anotações são para as certificações abaixo:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/se0sqtegn424nami6rz8.png)

- [Link oficial](https://aws.amazon.com/pt/s3/)
- [FAQ](https://aws.amazon.com/pt/s3/faqs/?nc=sn&loc=7)

##**Anotações gerais**

- S3 Notification pode enviar para Lambda, SQS e SNS
- Habilitar versionamento NÃO melhora a segurança do Bucket.
- Se perder a KMS Key que criptografou o o objetivo você perde acesso ao objeto. 
- Amazon S3-Managed Keys (SSE-S3) usa a criptografia AES-256


---
##**Police a nível de Bucket e Objeto**

- Bucket Level - `arn:aws:s3:::demo`
- Object Level - `arn:aws:s3:::demo/*`
- Bucket e Object Level - `arn:aws:s3:::demo*` - **Não recomendado**

**Exemplo de Policy a nível de Bucket**

```
{
  "Version": "2012-10-17",
  "Statement":
    {
      "Effect": "Allow",
      "Action": ["s3:*"],
      "Resource": ["arn:aws:s3:::nomedobucket"]
    }
}
```
**Exemplo de Policy a nível de Objeto*

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:*"],
      "Resource": ["arn:aws:s3:::nomedobucket"]
    },
    {
      "Effect": "Allow",
      "Action": ["s3:*"],
      "Resource": ["arn:aws:s3:::nomedobucket/*"]
    }
  ]
}
```
**Exemplo de Policy a nível de Bucket e Objeto -- Não recomendado*

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:*"],
      "Resource": ["arn:aws:s3:::nomedobucket*"]
    }
  ]
}
```

---
##**Logging requests using server access logging**
[Documentação oficial](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerLogs.html)

- **Habilitar server access log no bucket**

---
##**Controlling access from VPC endpoints with bucket policies**
[Documentação oficial](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies-vpc-endpoint.html)

- Libere o acesso no bucket policy

---
##**Amazon S3 Event Notifications**
[Documentação oficial](https://docs.aws.amazon.com/AmazonS3/latest/userguide/NotificationHowTo.html)

- Não vem habilitado por padrão
- Você pode usar o recurso Notificações de eventos do Amazon S3 para receber notificações quando determinados eventos ocorrerem em seu bucket do S3. 
- Para habilitar notificações, adicione uma configuração de notificação que identifique os eventos que você deseja que o Amazon S3 publique.


**Destination**

- Amazon Simple Notification Service (Amazon SNS) topics
- Amazon Simple Queue Service (Amazon SQS) queues
- AWS Lambda
- Amazon EventBridge

**Visão geral das notificações de eventos do Amazon S3**

- New object created events
- Object removal events
- Restore object events
- Reduced Redundancy Storage (RRS) object lost events
- Replication events
- S3 Lifecycle expiration events
- S3 Lifecycle transition events
- S3 Intelligent-Tiering automatic archival events
- Object tagging events
- Object ACL PUT events

---
##**Problema de acesso a objetos após upload entre contas**
- No comando `aws s3api put-object`, inserir `--acl "bucket-owner-full-control` para conceder permissões aos objetos

---
##**Como usar um ID externo ao conceder acesso aos seus recursos da AWS a terceiros**
[Documentação oficial](https://docs.aws.amazon.com/pt_br/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html)

- o ID externo permite que o usuário que está assumindo a função assegure as circunstâncias nas quais elas operam.
- **IAM Role + ExternalID + ARN -> Acesso cross-account**

---
##**Concessão da permissão s3:PutObject com uma condição que exige que o proprietário do bucket obtenha controle total**
[Documentação oficial](https://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/amazon-s3-policy-keys.html#grant-putobject-conditionally-1)

- Você pode exigir o cabeçalho x-amz-full-control na solicitação com permissão de controle total do proprietário do bucket. 
- A policy de bucket a seguir concede ao usuário Dave a permissão **s3:PutObject** com uma condição de uso da chave de condição **s3:x-amz-grant-full-control**, que exige que a solicitação inclua o cabeçalho **x-amz-full-control**.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t163mh1sb0n7gw0u2zg7.png)

---

##**Cross Account S3 Access**
[Documentação oficial](https://aws.amazon.com/pt/premiumsupport/knowledge-center/cross-account-access-s3/)

- **IAM Role + External-ID + Fornecer ARN da Role para conta destino -> Acesso Cross-Account**
- Cria o Bucket Policy na conta principal liberando acesso das contas de destino
- Na Bucket Policy coloca no `Principal `a conta de destino
- Na conta de destino deve-se criar uma Policy/Role que permite acessar o bucket na conta principal
- Utiliza ACL para permissões a nível de Objeto

**Exemplo bucket policy conta principal**

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                **"AWS": "arn:aws:iam::ACCOUNT-B-NUMBER:root"**
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::mykplabs-central/*"
            ]
        }
    ]
}
```

**Exemplo Policy Conta destino**

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::mykplabs-central/*"
 
        }
    ]
}
```

**Referências**

- [Como posso oferecer acesso entre contas a objetos que estão em buckets do Amazon S3?](https://youtu.be/sfQ8tBuxfRY)
- [Permissões do AWS S3](https://jayendrapatil.com/aws-s3-permisions/)
- [Como usar um ID externo ao conceder acesso aos seus recursos da AWS a terceiros](https://docs.aws.amazon.com/pt_br/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html)

---
##**S3 ACL**
[Documentação oficial](https://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/acl-overview.html)

_As ACLs são usadas para conceder permissões básicas de leitura/gravação em recursos para outras contas da AWS._

- ACL suporta conjunto de permissões limitadas e
- não pode conceder permissões condicionais, nem pode negar permissões explicitamente
- não pode ser usado para conceder permissões para sub-recursos de bucket
- Utilizando com Cross-Account
- Aplicado a nível de arquivos (objetos)
- Specified in the request using _**x-amz-acl**_
- **Não veem habilitado por padrão, tem que habilitar manualmente**
- Permissão `s3getobject `deve estar na policy

**Permissões**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vbqym7gdbm9febqds816.png)



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4joex7po15ueyq2vt2nh.png)

**Commands**
Command to verify the ACL information of a specific object:
`aws s3api get-object-acl --bucket bucket --key file.txt`

Command to upload object with specific ACL
`aws s3 cp file.txt s3://bucket/ --acl bucket-owner-full-control`

**Referências**

- [Visão geral da lista de controle de acesso (ACL)](https://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/acl-overview.html)
- [Bucket owner granting permissions to objects it does not own](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-walkthroughs-managing-access-example3.html)
- - [Como posso oferecer acesso entre contas a objetos que estão em buckets do Amazon S3?](https://youtu.be/sfQ8tBuxfRY)


---
##**MFA**
[Documentação oficial](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_aws_mfa-dates.html)

- **A AIM Policy precisa ter a Condition abaixo:
`"Bool": {"aws:MultiFactorAuthPresent": true}`**

Este exemplo mostra como você pode criar uma política baseada em identidade que usa várias condições, que são avaliadas usando um arquivo AND. Ele permite acesso total ao serviço chamado SERVICE-NAME-1, e acesso às ações ACTION-NAME-A e ACTION-NAME-Bno serviço chamado SERVICE-NAME-2. Essas ações são permitidas somente quando o usuário é autenticado usando a autenticação multifator (MFA) .

```
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": [
            "service-prefix-1:*",
            "service-prefix-2:action-name-a",
            "service-prefix-2:action-name-b"
        ],
        "Resource": "*",
        "Condition": {
           ** "Bool": {"aws:MultiFactorAuthPresent": true},**
            "DateGreaterThan": {"aws:CurrentTime": "2017-07-01T00:00:00Z"},
            "DateLessThan": {"aws:CurrentTime": "2017-12-31T23:59:59Z"}
        }
    }
}
```
**MFA CLI**
[Documentação oficial](https://docs.aws.amazon.com/cli/latest/reference/sts/get-session-token.html)

- aws ec2 describe-instances --profile mfa
- aws ec2 stop-instances --instance-ids _instance-id_ --profile mfa --region _region_
- aws sts get-session-token --serial-number arn:aws:iam::_accountid:mfa_/_user _--token-code _code_


---
##**S3 Versioning**
[Documentação oficial](https://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/Versioning.html)

- Você habilita e suspende o versionamento no nível do bucket. 
- Depois que um bucket é habilitado para versionamento, ele nunca pode voltar a um estado sem versionamento. 
- Mas você pode suspender o versionamento nesse bucket

**Os buckets podem estar em um dos três estados:**

- Não versionado (Padrão)
- Habilitado para versão
- Com versionamento suspenso



**Referências**

- [Como funciona o Versionamento do S3](https://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/versioning-workflows.html)
- [Habilitar o versionamento em buckets](https://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/manage-versioning-examples.html)
- [AWS S3 Object Versioning](https://jayendrapatil.com/aws-s3-object-versioning/)


---

---
##**Pre-signed URL´s**
[Documentação oficial](https://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html)

_Por padrão, todos os objetos do S3 são privados. Somente o proprietário do objeto tem permissão para acessá-lo. Contudo, o proprietário do objeto pode compartilhar objetos com os outros criando um pre-signed URL, usando suas próprias credenciais de segurança para conceder permissão de prazo limitado para download de objetos._

- Todos os buckets e objetos são privados por padrão.
- Os pre-signed URL permitem que o usuário faça download ou upload de um objeto específico sem exigir credenciais ou permissões de segurança da AWS.
- A pre-signed URL permite que qualquer pessoa acesse o objeto identificado na URL, desde que o criador da URL tenha permissão para acessar esse objeto.
- A criação de pre-signed URL exige que o criador forneça credenciais de segurança, um nome de bucket, uma chave de objeto, um método HTTP (GET para objeto de download e PUT para objetos de upload) e data e hora de expiração
- Os pre-signed URL são válidos apenas até a data e hora de expiração.
- `--expires-in (integer)` Number of seconds until the pre-signed URL expires. 
- **Default is 3600 seconds. Maximum is 604800 seconds.**

**Comandos**
Ex: `aws s3 presign s3://DOC-EXAMPLE-BUCKET/test2.txt \
 - expires-in 604800`
Após executar o comando é gerado a URL pré assinada
 

**Referências**
[Pre-Signed URLs](https://jayendrapatil.com/aws-simple-storage-service-s3-overview/#Pre-Signed_URLs)

---
##**Cross Region Replication**
[Documentação oficial](https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication-what-is-isnot-replicated.html)

_O Amazon S3 replica somente itens específicos nos buckets que estão configurados para replicação._

- Por default usa SSL
- Replica em uma direção
- Uma vez replicado o objeto não é replicado novamante
- Usa Amazon S3 managed keys (SSE-S3) ou AWS KMS managed keys (SSE-KMS), **mas não é habilitado por padrão**
- `aws:SecureTransport` é default no CRR
- Delete markers é replicado, **mas não é habilitado por padrão**
- Versões deletadas dos arquivos não
- **Versionamento deve estar habilitado**
- **Ambas as contas devem ter o IAM Role configurado**

**Quando usar a replicação entre regiões**

- A replicação entre regiões (CRR) do S3 é usada para copiar objetos entre buckets do Amazon S3 em Regiões da AWS diferentes.
- As tags podem ajudar a fazer o seguinte:
- **Atender aos requisitos de conformidade:** embora o Amazon S3, por padrão, armazene seus dados em diversas zonas de disponibilidade geograficamente distantes, requisitos de conformidade podem exigir que você armazene os dados a distâncias ainda maiores. 
- **Para atender a esses requisitos,** use a Cross-Region Replication para replicar dados entre Regiões da AWS distantes.
- **Minimizar a latência: **se seus clientes estiverem em duas localizações geográficas diferentes, é possível minimizar a latência no acesso a objetos mantendo cópias dos objetos nas Regiões da AWS geograficamente mais próximas dos usuários.
- **Aumentar a eficiência operacional:** se tiver clusters de computação em duas Regiões da AWS diferentes que analisam o mesmo conjunto de objetos, talvez você prefira manter cópias dos objetos nessas regiões.

**Quando usar Replicação na mesma região**

- A replicação para a mesma região (SRR) é usada para copiar objetos entre buckets do Amazon S3 na mesma Região da AWS. A SRR pode ajudar a fazer o seguinte:
- **Agregar logs em um único bucket:** se você armazenar os logs em vários buckets ou em várias contas, será possível replicar facilmente os logs em um único bucket na região. 
- Isso permite processar os logs em um único local, o que é mais simples.
- Configurar replicação em tempo real entre contas de produção e teste: se você ou seus clientes tiverem contas de produção e de teste que usam os mesmos dados, será possível replicar objetos entre essas várias contas, mantendo os metadados dos objetos.
- **Cumprir as leis de soberania de dados:** pode ser necessário armazenar várias cópias dos dados em Contas da AWS separadas em uma determinada região. 
- A replicação na mesma região pode ajudar a replicar automaticamente dados vitais quando os regulamentos de conformidade não permitirem que os dados saiam do país.

**Referências**

- [Replicação de objetos](https://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/replication.html)
- [Amazon S3 Replication Adds Support for Multiple Destination Buckets](https://aws.amazon.com/pt/blogs/aws/new-amazon-s3-replication-adds-support-for-multiple-destination-buckets/)
- [O Amazon S3 apresenta o recurso Same-Region Replication](https://aws.amazon.com/pt/about-aws/whats-new/2019/09/amazon-s3-introduces-same-region-replication/)



---
##**Lockout Bucket S3**

- Conecta com root user, para deletar/alterar a bucket policy

**Referências**
[What can I do if I am locked out of my bucket?](https://www.youtube.com/watch?v=Izwa42ptLps)