O blog da AWS

Acessando endpoint Serverless privados do Amazon API Gateway por meio de distribuição personalizada do Amazon CloudFront usando VPC Origins

Por Napoleone Capasso, arquiteto de operações em nuvem na Amazon Web Services e Usama Ali Khan, gerente de contas técnico na Amazon Web Services.

As organizações podem usar o Amazon CloudFront Virtual Private Cloud (VPC) Origins para entregar conteúdo de aplicativos hospedados em sub-redes privadas dentro do Amazon VPC. O tráfego de rede flui entre o Amazon CloudFront e as instâncias de Application Load Balancers (ALBs), Network Load Balancers (NLBs) ou Amazon Elastic Compute Cloud (Amazon EC2) implantadas em sub-redes privadas. Isso significa que o Amazon CloudFront pode acessar recursos públicos e privados da Amazon Web Services (AWS) sem problemas.

Esta publicação demonstra como você pode conectar o CloudFront a uma API REST privada no Amazon REST API Gateway usando uma origem de VPC.

Visão geral

As organizações que buscam aprimorar a segurança e o desempenho de seus aplicativos podem encontrar vários benefícios importantes nessa arquitetura. Você pode usá-lo para manter suas APIs privadas e acessá-las por meio do CloudFront, implementando mais camadas de segurança, como AWS Shield Advanced, geoblocking e suporte a TLSv1.3, além de pacotes de criptografia personalizados. Você pode usar essa abordagem para engajar a rede global de entrega de conteúdo do CloudFront e, ao mesmo tempo, manter mais controle sobre a distribuição.

Além disso, você pode aprimorar os controles de segurança por meio dos recursos integrados do CloudFront, como integração com o AWS WAF, certificados SSL personalizados e criptografia em nível de campo. O recurso VPC Origins elimina a necessidade de expor seus recursos internos à Internet pública, o que reduz a superfície de ataque potencial do seu aplicativo.

As empresas que precisam manter requisitos rígidos de conformidade e, ao mesmo tempo, fornecer conteúdo globalmente podem achar essa solução particularmente valiosa. Contenha todo o tráfego na rede privada da AWS para melhor atender aos seus objetivos de segurança e conformidade e, ao mesmo tempo, fornecer acesso rápido e confiável aos seus aplicativos.

Visão geral da solução

Você pode configurar o CloudFront como a porta de entrada do seu aplicativo e usar o VPC Origins integrado a um ALB interno para rotear o tráfego para a API Private Rest por meio de um endpoint VPC de execução de API. Todo o tráfego entre o CloudFront e a API REST privada permanece dentro da rede privada da AWS.

A figura a seguir fornece uma visão geral da solução.

Este diagrama mostra três serviços em execução em uma conta da AWS. A distribuição do CloudFront serve como o principal ponto de entrada para o aplicativo. Essa distribuição se conecta a um ALB interno usando o VPC Origins. A interface VPC endpoint execute-api é definida como destino para o ALB interno rotear solicitações para o gateway privado do Amazon API Gatway.

Implantação da solução

Para implantar essa solução, siga as instruções no repositório do GitHub e clone o repositório.

A solução pode ser implantada em qualquer região da AWS. Certifique-se de ter um certificado SSL válido no AWS Certificate Manager (ACM) na região us-east-1 para a distribuição do CloudFront. Todos os outros recursos devem estar na mesma região.

Pré-requisitos

Para esse passo a passo, são necessários os seguintes recursos:

  • Uma Amazon VPC com pelo menos duas sub-redes privadas.
  • Uma zona pública hospedada no Amazon Route 53.
  • Um certificado SSL público válido no ACM na região us-east-1 para o CloudFront e outro certificado na mesma região de um ALB.
  • Um nome de domínio personalizado, coberto pelo certificado ACM para distribuição do CloudFront.

Esses são os parâmetros de entrada para a implantação da solução.

Passo a passo

O template do AWS Serverless Application Model (AWS SAM) do repositório de exemplo do GitHub cria uma arquitetura de rede segura e privada que fornece acesso controlado a um API Gateway por meio do CloudFront. Ele provisiona um API Gateway privado com um endpoint VPC, um ALB interno e uma distribuição do CloudFront. O modelo estabelece canais de comunicação seguros implementando componentes de rede privada, configurando certificados SSL e configurando o roteamento DNS Route53. Ele usa recursos personalizados do AWS Lambda para gerenciar dinamicamente interfaces de rede e configurações de grupos de segurança, fornecendo uma infraestrutura robusta e flexível para acesso privado à API, conforme mostrado na figura a seguir.

Etapa 1: criar a distribuição do CloudFront e as origens da VPC

A solução cria uma distribuição do CloudFront que habilita uma ampla variedade de clientes HTTP oferecendo suporte a HTTP2 e HTTP3, aprimora a segurança da solução ao impor tráfego somente HTTPS e usa um domínio personalizado com o certificado SSL fornecido pelo usuário. O ALB interno é configurado como a origem da distribuição do CloudFront e é criado usando o recurso VPC Origins.

########### Cloudfront Distribution ###############
  CloudFrontDistribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        HttpVersion: http2and3
        Comment: CloudFront Distribution with VPC Origin Integration
        Aliases: 
        - !Ref CloudFrontDomainName
        ViewerCertificate:
          AcmCertificateArn: !Ref CloudFrontCertificateARN
          MinimumProtocolVersion: TLSv1.2_2021
          SslSupportMethod: sni-only
        Origins:
        - Id: AlbOrigin
          DomainName: !GetAtt ApplicationLoadBalancer.DNSName
          VpcOriginConfig:
            OriginKeepaliveTimeout: 60
            OriginReadTimeout: 60
            VpcOriginId: !GetAtt CloudFrontVpcOrigin.Id
        Enabled: true
        DefaultCacheBehavior:
          TargetOriginId: AlbOrigin
          CachePolicyId: 83da9c7e-98b4-4e11-a168-04f0df8e2c65
          OriginRequestPolicyId: 216adef6-5c7f-47e4-b989-5492eafa07d3
          ViewerProtocolPolicy: https-only
YAML

O VPC Origins faz referência ao ALB interno e só oferece suporte ao protocolo HTTPS.

  ########### Cloudfront VPC Origin ###############
  CloudFrontVpcOrigin:
    Type: AWS::CloudFront::VpcOrigin
    Properties:
      VpcOriginEndpointConfig:
          Arn: !Ref ApplicationLoadBalancer
          Name: !Sub vpc-origin-${AWS::StackName}
          OriginProtocolPolicy: https-only
          OriginSSLProtocols: 
          - TLSv1.2
YAML

Quando o VPC Origins é criado, a função Lambda do recurso personalizado adiciona uma regra de entrada ao grupo de segurança do CloudFront VPC Origin para permitir o tráfego somente da lista de prefixos do CloudFront na região escolhida.

        ec2_client.authorize_security_group_ingress(
            GroupId=cloudfront_sg_id,
            IpPermissions=[
                {
                    'IpProtocol': 'tcp',  
                    'FromPort': 443,      
                    'ToPort': 443,        
                    'PrefixListIds': [{'PrefixListId': cloudfront_prefix_id}]
                }
            ]
        )
Python

Etapa 2: Criar o ALB

O ALB interno é configurado com um ouvinte HTTPS usando o certificado SSL fornecido pelo usuário. Isso mantém a criptografia do tráfego entre o CloudFront e o ALB.

########### ALB Listener ########### 
  ALBListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          TargetGroupArn: !Ref ALBTargetGroup
      LoadBalancerArn: !Ref ApplicationLoadBalancer
      Port: '443'
      Protocol: HTTPS
      SslPolicy: ELBSecurityPolicy-TLS-1-2-2017-01
      Certificates:
        - CertificateArn: !Ref ALBCertificateARN
YAML

O grupo-alvo do ALB aponta para os endereços IP do endpoint VPC da API de execução. Esses endereços IP são buscados usando uma função Lambda de recursos personalizados.

  ########### ALB Target Group ###########
  ALBTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      Port: 443
      Name: !Sub TargetGroup-${AWS::StackName}
      Protocol: HTTPS
      VpcId: !Ref VPCId
      Targets:
        - Id: !GetAtt GetPrivateIPs.IP0
          Port: 443
        - Id: !GetAtt GetPrivateIPs.IP1
          Port: 443
      TargetType: ip
      Matcher:
        HttpCode: '200,403'
YAML

A função Lambda de recursos personalizados busca IPs privados para determinados IDs de interface de rede usando o cliente EC2 e retorna um dicionário com valores de chaves IP0 e IP1 como IPs privados.

def fetch_interface_ips(network_interface_ids):
    """ Fetch private IPs for given network interface IDs using ec2 client Returns a dictionary with keys IP0, IP1, etc. and values as the private IPs """
    responseData = {}
    
    # Use describe_network_interfaces instead of the resource approach
    response = ec2_client.describe_network_interfaces(
        NetworkInterfaceIds=network_interface_ids
    )
    
    for index, interface in enumerate(response['NetworkInterfaces']):
        responseData[f'IP{index}'] = interface['PrivateIpAddress']
    
    return responseData
Python

Além disso, a função Lambda adiciona uma regra de entrada ao grupo de segurança interno do ALB para permitir o tráfego do grupo de segurança VPC Origin.

ec2_client.authorize_security_group_ingress(
            GroupId=security_group_id,
            IpPermissions=[
                {
                    'IpProtocol': 'tcp',  
                    'FromPort': 443,     
                    'ToPort': 443,  
                    'UserIdGroupPairs': [{'GroupId': cloudfront_sg_id}]
                }
            ]
        )
Python

Etapa 3: criar o VPC endpoint para o Private API Gateway

O execute-api VPC Endpoint está configurado para rotear o tráfego do ALB interno para o Private API Gateway. Somente os VPC endpoints podem resolver endpoints privados e rotear o tráfego com segurança.

  ########### execute-api VPC Endpoint ###########
  ExecuteApiVpcEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.execute-api"
      VpcId: !Ref VPCId
      SubnetIds: !Ref PrivateSubnets
      VpcEndpointType: Interface
      PrivateDnsEnabled: true
      SecurityGroupIds:
        - !Ref VpcEndpointSG 
YAML

Etapa 4: criar a política de recursos do Private API Gateway

A política de recursos configurada no Private API Gateway só permite o tráfego do VPC endpoint colocado dentro da VPC definida pelo usuário.

        x-amazon-apigateway-policy:
          Version: "2012-10-17"
          Statement:
          - Effect: "Allow"
            Principal: "*"
            Action: "execute-api:Invoke"
            Resource: "execute-api:/*"
            Condition:
              StringEquals:
                aws:sourceVpce: 
                - !Ref ExecuteApiVpcEndpoint
YAML

Testando

Obtenha a URL do CloudFront na seção Saídas da pilha implantada e teste-a usando o comando curl ou seu navegador da web.

curl https://{your custom domain name} 
{"message": "Hello from API GW"}
Bash

Conclusão

Esta publicação demonstra como você pode estabelecer uma arquitetura segura para acessar um gateway de API REST privado por meio de um ALB privado, usando o Amazon CloudFront como ponto de entrada para seu aplicativo. A solução usa o recurso CloudFront VPC Origins, um recurso poderoso que você pode usar para integrar diretamente o CloudFront aos recursos que você hospeda em seu Amazon VPC. Você pode implementar essa arquitetura para aprimorar significativamente a postura de segurança do seu aplicativo à medida que restringe o acesso aos seus serviços de backend e minimiza a possível superfície de ataque. Essa abordagem fornece um método robusto e confiável para proteger seus aplicativos contra acesso não autorizado e, ao mesmo tempo, manter a alta disponibilidade e o desempenho por meio da rede global de entrega de conteúdo do CloudFront.

Este conteúdo foi traduzido da postagem original do blog, que pode ser encontrada aqui.

Autores

Napoleone Capasso é um arquiteto de operações em nuvem na Amazon Web Services.
Usama Ali Khan é um gerente de contas técnico na Amazon Web Services.

Tradutores

Daniel Abib é Arquiteto de Soluções Sênior e Especialista em Amazon Bedrock na AWS, com mais de 25 anos trabalhando com gerenciamento de projetos, arquiteturas de soluções escaláveis, desenvolvimento de sistemas e CI/CD, microsserviços, arquitetura Serverless & Containers e especialização em Machine Learning. Ele trabalha apoiando Startups, ajudando-os em sua jornada para a nuvem.

https://www.linkedin.com/in/danielabib/

Nicolas Tarzia é Senior Technical Account Manager na AWS, com mais de 13 anos de experiencia, com ampla experiencia em arquitetura cloud, engenharia e design de software. Atualmente está habilitando empresas do ramo de ISV (Independent Software Vendors) simplificando a operação na nuvem e otimizando os custos em cloud. Sua area de interesse são tecnologias serverless.

https://www.linkedin.com/in/nicolastarzia