Restringir o acesso aos Application Load Balancers - Amazon CloudFront

Restringir o acesso aos Application Load Balancers

Para uma aplicação web ou outro conteúdo fornecido por um Application Load Balancer voltado à internet no Elastic Load Balancing, o CloudFront pode armazenar objetos em cache e disponibilizá-los diretamente aos usuários (visualizadores), reduzindo a carga no Application Load Balancer. Um balanceador de carga voltado para a internet tem um nome de DNS que pode ser resolvido publicamente e roteia solicitações de clientes até destinos na internet.

O CloudFront também pode ajudar a reduzir a latência e até mesmo absorver alguns ataques de negação distribuída de serviço (DDoS).

No entanto, se os usuários puderem ignorar o CloudFront e acessar seu Application Load Balancer diretamente, você não obterá esses benefícios. Mas você pode configurar o Amazon CloudFront e seu Application Load Balancer para impedir que os usuários acessem diretamente o Application Load Balancer. Assim os usuários podem acessar o Application Load Balancer somente por meio do CloudFront, assegurando que você obtenha os benefícios de usá-lo.

Para impedir que os usuários acessem diretamente um Application Load Balancer e permitir acesso somente por meio do CloudFront, execute estas etapas de alto nível:

  1. Configure o CloudFront para adicionar um cabeçalho HTTP personalizado às solicitações enviadas ao Application Load Balancer.

  2. Configure o Application Load Balancer para encaminhar apenas solicitações que contenham o cabeçalho HTTP personalizado.

  3. (Opcional) Exija HTTPS para melhorar a segurança dessa solução.

Para obter mais informações, consulte os tópicos a seguir. Depois de concluir essas etapas, os usuários só podem acessar seu Application Load Balancer por meio do CloudFront.

Configurar o CloudFront para adicionar um cabeçalho HTTP personalizado às solicitações

Você pode configurar o CloudFront para adicionar um cabeçalho HTTP personalizado às solicitações enviadas para sua origem (neste caso, um Application Load Balancer).

Importante

Esse caso de uso depende de manter em segredo o nome e o valor do cabeçalho personalizado. Se o nome e o valor do cabeçalho não forem secretos, outros clientes HTTP poderão incluí-los em solicitações enviadas diretamente para o Application Load Balancer. Isso pode fazer com que o Application Load Balancer se comporte como se as solicitações viessem do CloudFront quando não o fizessem. Para evitar isso, mantenha o nome e o valor do cabeçalho personalizado em segredo.

Você pode configurar o CloudFront para adicionar um cabeçalho HTTP personalizado às solicitações de origem com o console do CloudFront, o AWS CloudFormation ou a API do CloudFront.

Para adicionar um cabeçalho HTTP personalizado (console do CloudFront)

No console do CloudFront, use a configuração Origin Custom Headers (Cabeçalhos personalizados de origem) em Origin Settings (Configurações de origem). Insira o nome do cabeçalho e o respectivo valor.

nota

Na produção, use valores e nomes de cabeçalho gerados aleatoriamente. Trate os nomes e os valores do cabeçalho como credenciais seguras; por exemplo, nomes de usuário e senhas.

Você pode editar a configuração Origin Custom Headers (Cabeçalhos personalizados de origem) ao criar ou editar uma origem para uma distribuição existente do CloudFront e ao criar uma nova distribuição. Para ter mais informações, consulte Atualizar uma distribuição e Criar uma distribuição.

Para adicionar um cabeçalho HTTP personalizado (AWS CloudFormation)

Em um modelo do AWS CloudFormation, use a propriedade OriginCustomHeaders, como mostrado no exemplo a seguir.

nota

O nome e o valor do cabeçalho neste exemplo são apenas para demonstração. Na produção, use valores gerados aleatoriamente. Trate o nome e o valor do cabeçalho como uma credencial segura, como um nome do usuário e senha.

AWSTemplateFormatVersion: '2010-09-09' Resources: TestDistribution: Type: 'AWS::CloudFront::Distribution' Properties: DistributionConfig: Origins: - DomainName: app-load-balancer.example.com Id: Example-ALB CustomOriginConfig: OriginProtocolPolicy: https-only OriginSSLProtocols: - TLSv1.2 OriginCustomHeaders: - HeaderName: X-Custom-Header HeaderValue: random-value-1234567890 Enabled: 'true' DefaultCacheBehavior: TargetOriginId: Example-ALB ViewerProtocolPolicy: allow-all CachePolicyId: 658327ea-f89d-4fab-a63d-7e88639e58f6 PriceClass: PriceClass_All ViewerCertificate: CloudFrontDefaultCertificate: 'true'

Para obter mais informações, consulte as propriedades Origin e OriginCustomHeader no Guia do usuário do AWS CloudFormation.

Para adicionar um cabeçalho HTTP personalizado (API do CloudFront)

Na API do CloudFront, use o objeto CustomHeaders dentro de Origin. Para obter mais informações, consulte CreateDistribution e UpdateDistribution na Referência da API do Amazon CloudFront e a documentação do seu SDK ou outro cliente de API.

Há alguns nomes de cabeçalho que não é possível especificar como cabeçalhos personalizados de origem. Para ter mais informações, consulte Cabeçalhos personalizados que o CloudFront não pode adicionar às solicitações da origem.

Configurar um Application Load Balancer para encaminhar apenas solicitações que contenham um cabeçalho específico

Depois de configurar o CloudFront para adicionar um cabeçalho HTTP personalizado às solicitações enviadas ao Application Load Balancer (consulte a seção anterior), é possível configurar o balanceador de carga para encaminhar apenas solicitações que contenham esse cabeçalho personalizado. Para isso, adicione uma nova regra e modifique a regra padrão no listener de seu balanceador de carga.

Pré-requisitos

Para usar os procedimentos a seguir, você precisa de um Application Load Balancer com pelo menos um listener. Se você ainda não criou um, consulte Criar um Application Load Balancer no Guia do usuário de Application Load Balancers.

Os procedimentos a seguir modificam um listener HTTPS. Você pode usar o mesmo processo para modificar um listener HTTP.

Para atualizar as regras em um listener do Application Load Balancer
  1. Adicione uma nova regra. Use as instruções de Adicionar uma regra com as seguintes modificações:

    • Adicione a regra ao balanceador de carga que é a origem da distribuição do CloudFront.

    • Em Adicionar condição, escolha o Cabeçalho HTTP. Especifique o nome e o valor do cabeçalho HTTP que você adicionou como um cabeçalho personalizado de origem no CloudFront.

    • Em Adicionar ação, escolha Encaminhar para. Escolha o grupo de destino para o qual deseja encaminhar as solicitações.

  2. Edite a regra padrão no receptor do balanceador de carga. Use as instruções de Editar uma regra com as seguintes modificações:

    • Edite a regra padrão do balanceador de carga que é a origem da distribuição do CloudFront.

    • Exclua a ação padrão e, em Adicionar ação, escolha Retornar resposta fixa.

    • Para Response code (Código de resposta), insira 403.

    • Para Response body (Corpo de resposta), insira Access denied.

Ao concluir essas etapas, o receptor do balanceador de carga terá duas regras. Uma regra encaminha solicitações que contêm o cabeçalho HTTP (solicitações que vêm do CloudFront). A outra regra envia uma resposta fixa a todas as outras solicitações (solicitações que não vêm do CloudFront).

Você pode verificar se a solução funciona enviando uma solicitação para a distribuição do CloudFront e outra para o Application Load Balancer. A solicitação ao CloudFront retorna sua aplicação ou conteúdo da Web e a enviada diretamente ao Application Load Balancer retorna uma resposta 403 com a mensagem de texto simples Access denied.

(Opcional) Melhorar a segurança dessa solução

Para melhorar a segurança dessa solução, configure sua distribuição do CloudFront para usar sempre HTTPS ao enviar solicitações ao Application Load Balancer. Lembre-se, essa solução só funciona se você mantiver o nome e o valor do cabeçalho personalizado em segredo. Usar HTTPS pode ajudar a impedir que um bisbilhoteiro descubra o nome e o valor do cabeçalho. Também recomendamos alternar o nome e o valor do cabeçalho periodicamente.

Usar HTTPS para solicitações de origem

Para configurar o CloudFront para usar HTTPS em solicitações de origem, defina a configuração de Origin Protocol Policy (Política de protocolo de origem) como HTTPS Only (Somente HTTPS). Essa configuração está disponível no console do CloudFront, no AWS CloudFormation e na API do CloudFront. Para ter mais informações, consulte Protocolo (somente origens personalizadas).

O seguinte também se aplica ao configurar o CloudFront para usar HTTPS em solicitações de origem:

  • Você deve configurar o CloudFront para encaminhar o cabeçalho Host para a origem com a política de solicitação de origem. É possível usar a política de solicitação de origem gerenciada do AllViewer.

  • Certifique-se de que o Application Load Balancer tem um receptor HTTPS (conforme mostrado na seção anterior). Para obter mais informações, consulte Criar um listener HTTPS no Guia do usuário de Application Load Balancers. Usar um receptor HTTPS requer que você tenha um certificado SSL/TLS que corresponda ao nome de domínio que é roteado para o Application Load Balancer.

  • Os certificados SSL/TLS para o CloudFront só podem ser solicitados (ou importados) na Região da AWS us-east-1 no AWS Certificate Manager (ACM). Como o CloudFront é um serviço global, ele distribui automaticamente o certificado da região us-east-1 para todas as regiões associadas à sua distribuição do CloudFront.

    • Por exemplo, se você tiver um Application Load Balancer (ALB) na região ap-southeast-2, deverá configurar certificados SSL/TLS na região ap-southeast-2 (para usar HTTPS entre o CloudFront e a origem do ALB) e na região us-east-1 (para usar HTTPS entre os visualizadores e o CloudFront). Ambos os certificados devem corresponder ao nome de domínio que é encaminhado para o Application Load Balancer. Para ter mais informações, consulte Região da AWS para AWS Certificate Manager.

  • Se os usuários finais (também conhecidos como visualizadoresou clientes) da sua aplicação Web puderem usar HTTPS, você também poderá configurar o CloudFront para preferir (ou até mesmo exigir) conexões HTTPS dos usuários finais. Para fazer isso, use a configuração Viewer Protocol Policy (Política de protocolo do visualizador). Você pode ajustá-la para redirecionar usuários finais de HTTP para HTTPS, ou para rejeitar solicitações que usam HTTP. Essa configuração está disponível no console do CloudFront, no AWS CloudFormation e na API do CloudFront. Para ter mais informações, consulte Política de protocolo do visualizador.

Alternar o nome e o valor do cabeçalho

Além de usar HTTPS, também recomendamos alternar o nome e o valor do cabeçalho periodicamente. As etapas de alto nível para fazer isso são as seguintes:

  1. Configure o CloudFront para adicionar um cabeçalho HTTP personalizado adicional às solicitações enviadas ao Application Load Balancer.

  2. Atualize a regra do listener do Application Load Balancer para encaminhar solicitações que contenham esse cabeçalho HTTP personalizado adicional.

  3. Configure o CloudFront para parar de adicionar o cabeçalho HTTP personalizado original às solicitações enviadas ao Application Load Balancer.

  4. Atualize a regra do listener do Application Load Balancer para interromper o encaminhamento de solicitações que contenham o cabeçalho HTTP personalizado original.

Para obter mais informações sobre como realizar essas etapas, consulte as seções anteriores.

(Opcional) Limite o acesso à origem usando a lista de prefixos gerenciada pela AWS para o CloudFront

Para restringir ainda mais o acesso ao seu Application Load Balancer, é possível configurar o grupo de segurança associado ao Application Load Balancer para que ele só aceite tráfego do CloudFront quando o serviço estiver usando uma lista de prefixos gerenciada pela AWS. Isso evita que o tráfego que não se origina do CloudFront chegue ao seu Application Load Balancer na camada de rede (camada 3) ou na camada de transporte (camada 4).

Para ter mais informações, consulte a postagem do blog Limitar o acesso às suas origens usando a lista de prefixos gerenciada pela AWS do Amazon CloudFront.