O blog da AWS
Como usar Amazon S3 com AWS Site-to-Site VPN ou AWS Direct Connect
Por: Leonardo Azize Martins, Cloud Infrastructure Architect, Professional Services
Neste post, vou demonstrar como utilizar o Amazon Simple Storage Service (Amazon S3) com AWS Site-to-Site VPN ou AWS Direct Connect, que você já tem configurado na sua empresa. Este é um cenário comum devido a razões de compliance ou mesmo quando o tráfego pela internet não é permitido devido a razões de segurança.
Muitas empresas, dentro e fora do setor público, são regulamentadas e precisam seguir as diretrizes destas certificações, desde FedRAMP até HIPAA, e todas que possam existir entre elas. Estas certificações de conformidade ajudam as aplicações a garantir que elas seguem o padrão relevante com os dados que armazenam e coletam.
Recentemente foi lançado o VPC Endpoint para Amazon S3 utilizando AWS PrivateLink. Estes endpoints visam a facilidade de configuração, contam com alta disponibilidade e permitem um acesso privado ao Amazon S3 sem a necessidade de usar Internet Gateway, gateway endpoint ou NAT. Quando utilizamos Internet Gateway, gateway endpoint ou NAT estamos usando o endpoint público do Amazon S3.
Este post mostra como utilizar um VPC Endpoint do tipo Interface para o Amazon S3 com tráfego originando do ambiente da empresa (on-premise) e como utilizar política do IAM no bucket para garantir que o mesmo só possa ser usado através deste interface endpoint.
Cenário inicial
Inicialmente vamos entender como é a forma tradicional de usar o Amazon S3 por aplicações on-premise. Neste cenário não é necessário nenhum tipo de configuração de DNS no ambiente on-premise e nem alterações na aplicação. A empresa já tem uma solução de conectivade privada com Direct Connect usando Private VIF ou Site-to-Site VPN.
Veja abaixo o passo a passo da solução, note que mesmo com a conectividade privada o acesso desta solução ao Amazon S3 é através do endpoint público.
- A aplicação resolve o endereço de IP do endpoint público do Amazon S3 via o servidor de DNS on-premise
- O servidor de DNS encaminha para o servidor DNS Authoritative do Amazon S3
- A aplicação comunica com o endereço de IP do endpoint público do Amazon S3
Solução usando VPC Endpoint
Com a utilização do Amazon VPC Endpoint interface, a comunicação com o Amazon S3 passa a utilizar o canal dedicado via Site-to-Site VPN ou Direct Connect usando Private VIF.
Nesta solução não utilizamos o endpoint público do Amazon S3, passamos a utilizar o interface endpoint criado no Amazon VPC, conforme o passo a passo abaixo:
- A aplicação resolve o endereço de IP do interface endpoint do Amazon VPC via o servidor de DNS on-premise
- O servidor de DNS encaminha para o servidor DNS Authoritative do Amazon S3
- A aplicação comunica com o endereço de IP do interface endpoint do Amazon VPC
- O interface endpoint encaminha para o Amazon S3
VPC Endpoint
VPC Endpoint nos fornece nomes de DNS que devemos utilizar para comunicar com o Amazon S3.
O interface endpoint criado no Amazon VPC é um registro de DNS público que resolve para um IP interno do Amazon VPC, portanto não é necessário adicionar nenhuma configuração de DNS no ambiente on-premise para esta solução.
O DNS do VPC Endpoint interface é um DNS do tipo wildcard, portanto podemos utilizar este interface endpoint para acessar buckets, S3 access points e S3-control APIs, mais detalhes na documentação.
$ nslookup vpce-0bdc6a23a3db6a5ab-rfcn3iky.s3.sa-east-1.vpce.amazonaws.com
Server: 192.168.86.1
Address: 192.168.86.1#53
Non-authoritative answer:
Name: vpce-0bdc6a23a3db6a5ab-rfcn3iky.s3.sa-east-1.vpce.amazonaws.com
Address: 172.31.22.55
Name: vpce-0bdc6a23a3db6a5ab-rfcn3iky.s3.sa-east-1.vpce.amazonaws.com
Address: 172.31.15.197
Name: vpce-0bdc6a23a3db6a5ab-rfcn3iky.s3.sa-east-1.vpce.amazonaws.com
Address: 172.31.37.247
Utilizando dentro do ambiente on-premise
Dentro do ambiente on-premise você precisa utilizar o interface endpoint específico do Amazon VPC, veja como fazer isso utilizando AWS CLI e SDK em Python.
AWS CLI
aws --endpoint-url https://bucket.vpce-0bdc6a23a3db6a5ab-rfcn3iky.s3.sa-east-1.vpce.amazonaws.com s3 ls s3://test-vpc-endpoint
SDK for Python (Boto3)
import boto3
client = boto3.client(service_name='s3', endpoint_url='https://bucket. vpce-0bdc6a23a3db6a5ab-rfcn3iky.s3.sa-east-1.vpce.amazonaws.com', region_name='sa-east-1')
response = client.list_objects_v2(Bucket='test-vpc-endpoint')
print(response)
Política do bucket
Podemos utilizar política do IAM no bucket para garantir que o bucket só possa ser acessado através do VPC Endpoint interface. É bastante comum existir uma conta AWS de network onde ficam os recursos relacionados a conectividade entre a AWS e on-premise. Desta forma podemos exigir que o acesso aos buckets em todas as contas da nossa organização passem por um único VPC Endpoint interface, onde podemos utilizar Security Groups, Network ACLs e controle de acesso via IAM.
No exemplo a seguir estamos negando o acesso com uma política do IAM quando não utilizamos o VPC Endpoint interface.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Access-from-specific-VPCE",
"Principal": "*",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:ListBucket"
],
"Effect": "Deny",
"Resource": "arn:aws:s3:::test-vpc-endpoint/*",
"Condition": {
"StringNotEquals": {
"aws:sourceVpce": " vpce-0bdc6a23a3db6a5ab"
}
}
}
]
}
Atenção
Você pode perder o acesso ao seu bucket se aplicar uma política do IAM incorreta. Para informações sobre como resolver este problema veja My bucket policy has the wrong VPC or VPC endpoint ID. How can I fix the policy so that I can access the bucket? no AWS Support Knowledge Center
Política do VPC Endpoint
Usando uma estratégia de segurança em camadas e profundidade, quando todas as contas da empresa fazem parte de uma organização através do AWS Organizations, podemos utilizar uma política do IAM no VPC Endpoint interface que só permite utilizar o endpoint se a credencial pertencer a uma das contas dentro desta organização.
{
"Statement": [
{
"Action": "*",
"Effect": "Allow",
"Resource": "*",
"Principal": "*",
"Condition": {
"StringEquals": {
"aws:PrincipalOrgID": "o-abcde12345"</p>
}
}
}
]
}
Multi-Região
Amazon S3 é um serviço global, quando criamos um bucket informamos em qual região esse bucket deve ser criado. Portanto o acesso a este bucket deve ser feito usando um endpoint da região onde o bucket foi criado. Veja abaixo o que acontece quando acessamos um bucket que pertence a outra região:
2021-03-15 12:55:37,519 - MainThread - botocore.utils - DEBUG - S3 client configured for region us-east-1 but the bucket test-vpc-endpoint is in region sa-east-1; Please configure
the proper region to avoid multiple unnecessary redirects and signing attempts.
2021-03-15 12:55:37,519 - MainThread - botocore.utils - DEBUG - Updating URI from https://s3.us-east-1.amazonaws.com/test-vpc-endpoint?list-type=2&prefix=&delimiter=%2F&encoding-
type=url to https://s3.sa-east-1.amazonaws.com/test-vpc-endpoint?list-type=2&prefix=&delimiter=%2F&encoding-type=url
O SDK já trata essa situação e faz o redirecionamento para a região correta. A mesma situação também é vá lida quando usamos VPC Endpoint interface, pois o endpoint é criado por região.
Para endereçar uma solução multi-região, utilizamos o AWS Transit Gateway. Transit Gateway é um serviço regional que também suporta peering entre outras regiões, desta forma todas as regiões com peering configurado passam a ter um ambiente de rede único. Então basta configurar a aplicação com o interface endpoint da região correta.
Região São Paulo (sa-east-1)
aws --endpoint-url https://bucket.vpce-0bdc6a23a3db6a5ab-rfcn3iky.s3.sa-east-1.vpce.amazonaws.com s3 ls s3://test-vpc-endpoint
Região North Virginia (us-east-1)
aws --endpoint-url https://bucket.vpce-7ddc8b67a9dd9a1aa-agwt6gwp.s3.us-east-1.vpce.amazonaws.com s3 ls s3://us-test-vpc-endpoint
Conclusão
Neste post eu mostrei como utilizar VPC Endpoint para acessar os buckets do Amazon S3 utilizando Site-to-Site VPN ou Direct Connect. Como será usado um endpoint da sua conta, você tem diversas formas de controlar o acesso a este recurso.
Links de referência:
- Amazon Simple Storage Service (Amazon S3)
- AWS Site-to-Site VPN
- AWS Direct Connect
- AWS Transit Gateway
- Amazon Virtual Private Cloud (Amazon VPC)
_____________________________________________________________________
Sobre o autor
Leonardo Azize Martins é Arquiteto de Infraestrutura Cloud em Professional Services para o Setor Público. Tendo trabalhado com desenvolvimento e infraestrutura de aplicações web em multinacionais. Quando não está trabalhando, Leonardo gosta de passar o tempo com a família, ler conteúdo técnico, assistir filmes e series, e brincar com a filha
Revisores
Luis Felipe Silveira da Silva é gerente de contas técnico (TAM) senior na AWS da Irlanda.
Maria Ane Dias é arquiteta de soluções senior na AWS Brasil
Michelle Bittencourt Perez é arquiteta de soluções na AWS Brasil
Robert da Costa é arquiteto de soluções Enterprise na AWS Brasil