Restricción del acceso a Application Load Balancer - Amazon CloudFront

Restricción del acceso a Application Load Balancer

Para una aplicación web u otro contenido que proporciona un equilibrador de carga de aplicación expuesto a Internet en Elastic Load Balancing, CloudFront puede almacenar en caché objetos y proporcionárselos directamente a los usuarios (espectadores), lo que reduce la carga en el equilibrador de carga de aplicación. Un equilibrador de carga expuesto a Internet tiene un nombre de DNS que se puede resolver públicamente y direcciona las solicitudes de los clientes a través de Internet hasta los destinos.

CloudFront también puede ayudar a reducir la latencia e incluso absorber algunos ataques de denegación de servicio distribuido (DDoS).

Sin embargo, si los usuarios pueden omitir CloudFront y acceder directamente a su balanceador de carga de aplicaciones, no obtendrá estos beneficios. Pero puede configurar Amazon CloudFront y el balanceador de carga de aplicaciones para evitar que los usuarios accedan directamente al balanceador de carga de aplicaciones. Esto permite a los usuarios acceder al balanceador de carga de aplicaciones solo a través de CloudFront, lo que garantiza que obtenga los beneficios de utilizar CloudFront.

Para evitar que los usuarios accedan directamente a un balanceador de carga de aplicaciones y permitir el acceso solo a través de CloudFront, siga estos pasos de alto nivel:

  1. Configure CloudFront para agregar un encabezado HTTP personalizado a las solicitudes que envía al balanceador de carga de aplicaciones.

  2. Configure el balanceador de carga de aplicaciones para que solo reenvíe solicitudes que contengan el encabezado HTTP personalizado.

  3. (Opcional) Requiera HTTPS para mejorar la seguridad de esta solución.

Para obtener más información, consulte los siguientes temas. Después de completar estos pasos, los usuarios solo pueden acceder a su balanceador de carga de aplicaciones a través de CloudFront.

Configuración de CloudFront para agregar un encabezado HTTP personalizado a solicitudes

Puede configurar CloudFront para agregar un encabezado HTTP personalizado a las solicitudes que envía a su origen (en este caso, un balanceador de carga de aplicaciones).

importante

Este caso de uso se basa en mantener el nombre del encabezado personalizado y el valor en secreto. Si el nombre y el valor del encabezado no son secretos, otros clientes HTTP podrían incluirlos en las solicitudes que envían directamente al balanceador de carga de aplicaciones. Esto puede hacer que el balanceador de carga de aplicaciones se comporte como si las solicitudes vinieran de CloudFront cuando no lo hacen. Para evitar esto, mantenga el nombre del encabezado personalizado y el valor en secreto.

Puede configurar CloudFront para agregar un encabezado HTTP personalizado a las solicitudes de origen con la consola de CloudFront, AWS CloudFormation o la API de CloudFront.

Para agregar un encabezado HTTP personalizado (consola de CloudFront)

En la consola de CloudFront, utilice la configuración Origin Custom Headers (Encabezados personalizados de origen) Origin Settings (Configuración de origen). escriba el nombre del encabezado y su valor, como se muestra en el siguiente ejemplo.

nota

El nombre del encabezado y el valor de este ejemplo son solo para demostración. En producción, use valores generados aleatoriamente. Trate el nombre y el valor del encabezado como una credencial segura, como un nombre de usuario y una contraseña.

Campos de Encabezados personalizados de origen en la consola de CloudFront.

Puede editar la configuración Origin Custom Headers (Encabezados personalizados de origen) cuando crea o edita un origen para una distribución existente de CloudFront y crea una distribución nueva. Para obtener más información, consulte Actualizar una distribución y Creación de una distribución.

Para agregar un encabezado HTTP personalizado (AWS CloudFormation)

En una plantilla de AWS CloudFormation, utilice la propiedad OriginCustomHeaders, como se muestra en el siguiente ejemplo.

nota

El nombre del encabezado y el valor de este ejemplo son solo para demostración. En producción, use valores generados aleatoriamente. Trate el nombre y el valor del encabezado como una credencial segura, como un nombre de usuario y una contraseña.

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 obtener más información, consulte las propiedades Origin y OriginCustomHeader en la Guía del usuario de AWS CloudFormation.

Para agregar un encabezado HTTP personalizado (API de CloudFront)

En la API de CloudFront, utilice el CustomHeaders objeto interior Origin. Para obtener más información, consulte CreateDistribution and UpdateDistribution en la Referencia de la API de Amazon CloudFront y la documentación del SDK u otro cliente de API.

Hay algunos nombres de encabezados que no se pueden especificar como encabezados personalizados de origen. Para obtener más información, consulte Encabezados personalizados que CloudFront no puede agregar a solicitudes de origen.

Configuración de un equilibrador de carga de aplicaciones para que solo reenvíe solicitudes que contengan un encabezado específico

Después de configurar CloudFront para agregar un encabezado HTTP personalizado a las solicitudes que envía al balanceador de carga de aplicaciones (consulte la sección anterior), puede configurar el balanceador de carga para que solo reenvíe solicitudes que contengan este encabezado personalizado. Para ello, agregue una nueva regla y modifique la regla predeterminada en el agente de escucha del balanceador de carga.

Requisitos previos

Para utilizar los siguientes procedimientos, necesita un balanceador de carga de aplicaciones con al menos un agente de escucha. Si aún no ha creado uno, consulte Crear un balanceador de carga de aplicaciones en la Guía del usuario de balanceadores de carga de aplicaciones.

Los siguientes procedimientos modifican un agente de escucha HTTPS. Puede utilizar el mismo proceso para modificar un agente de escucha HTTP.

Para actualizar las reglas en un agente de escucha del balanceador de carga de aplicaciones
  1. Abra la página de Load Balancers (Balanceadores de carga) en la consola de Amazon EC2.

  2. Elija el balanceador de carga que es el origen de su distribución de CloudFront y, a continuación, elija la pestaña Listeners (Agentes de escucha).

  3. Elija View/edit rules (Ver/Editar reglas) para el agente de escucha que está modificando.

    Enlace de Ver/editar las reglas para un equilibrador de carga en la consola de Amazon EC2.
  4. Elija el icono para agregar reglas.

    Agregue reglas a un balanceador de carga en la consola de Amazon EC2.
  5. Elija Insert Rule.

    Inserte la regla en un balanceador de carga en la consola de Amazon EC2.
  6. Para la nueva regla, haga lo siguiente:

    1. Elija Add condition (Agregar condición) y, a continuación, elija Http header (Encabezado Http). Especifique el nombre del encabezado HTTP y el valor que agregó como encabezado personalizado de origen en CloudFront.

    2. Elija Add action (Agregar acción) y, a continuación, seleccione Forward to (Reenviar a). Elija el grupo de destino al que desea reenviar las solicitudes.

    3. Seleccione Save (Guardar) para crear la regla nueva.

    Regla nueva en el balanceador de carga en la consola de Amazon EC2.
  7. Elija el icono para editar las reglas.

    Edite las reglas del balanceador de carga en la consola de Amazon EC2.
  8. Elija el icono de edición de la regla predeterminada.

    Edite la regla predeterminada para el balanceador de carga en la consola de Amazon EC2.
  9. Para la regla predeterminada, haga lo siguiente:

    1. Elimine la acción predeterminada.

      Elimine la regla predeterminada del balanceador de carga en la consola de Amazon EC2.
    2. Elija Add action (Agregar acción) y, a continuación, elija Return fixed response (Devolver respuesta fija).

    3. En Response code (Código de respuesta), escriba 403.

    4. En Response body (Cuerpo de respuesta), escriba Access denied.

    5. Elija Update (Actualizar) para actualizar la regla predeterminada.

    Actualice la regla predeterminada para el balanceador de carga en la consola de Amazon EC2.

Después de completar estos pasos, el agente de escucha del balanceador de carga tiene dos reglas, como se muestra en la imagen siguiente. La primera regla reenvía las solicitudes que contienen el encabezado HTTP (solicitudes que provienen de CloudFront). La segunda regla envía una respuesta fija a todas las demás solicitudes (solicitudes que no provienen de CloudFront).

Reglas actualizadas para el balanceador de carga en la consola de Amazon EC2.

Puede verificar que la solución funcione si envía una solicitud a su distribución de CloudFront y una a su balanceador de carga de aplicaciones. La solicitud a CloudFront devuelve su aplicación web o contenido y la que se envía directamente al balanceador de carga de aplicaciones devuelve una respuesta 403 con el mensaje de texto sin formato Access denied.

(Opcional) Mejore la seguridad de esta solución

Para mejorar la seguridad de esta solución, puede configurar su distribución de CloudFront para que utilice siempre HTTPS cuando envíe solicitudes a su balanceador de carga de aplicaciones. Recuerde, esta solución solo funciona si mantiene el nombre del encabezado personalizado y el valor en secreto. El uso de HTTPS puede ayudar a evitar que un espía descubra el nombre y el valor del encabezado. También recomendamos cambiar periódicamente el nombre y el valor del encabezado.

Usar HTTPS para solicitudes de origen

Para configurar CloudFront a fin de que utilice HTTPS para solicitudes de origen, establezca la configuración Origin Protocol Policy (Política de protocolo de origen) en HTTPS Only (Solo HTTPS). Esta configuración está disponible en la consola de CloudFront, AWS CloudFormation y la API de CloudFront. Para obtener más información, consulte Protocolo (solo orígenes personalizados).

Lo siguiente también se aplica al configurar CloudFront con el fin de que utilice HTTPS para solicitudes de origen:

  • Debe configurar CloudFront para que reenvíe el encabezado Host al origen con la política de solicitud de origen. Puede utilizar la política de solicitud de origen administrada por AllViewer.

  • Asegúrese de que el Equilibrador de carga de aplicación dispone de un oyente HTTPS (como se muestra en la sección anterior). Para obtener más información, consulte Crear un agente de escucha HTTPS en la Guía del usuario de balanceadores de carga de aplicaciones. Utilizar un oyente HTTPS requiere disponer de un certificado SSL/TLS que coincida con el nombre de dominio enrutado al Equilibrador de carga de aplicación.

  • Los certificados SSL/TLS para CloudFront solo se pueden solicitar (o importar) en la Región de AWS de us-east-1 en AWS Certificate Manager (ACM). Como CloudFront es un servicio global, distribuye automáticamente el certificado de la región de us-east-1 a todas las regiones asociadas a la distribución de CloudFront.

    • Por ejemplo, si tiene un Equilibrador de carga de aplicación (ALB) en la región de ap-southeast-2, debe configurar certificados SSL/TLS tanto en la región de ap-southeast-2 (para utilizar HTTPS entre CloudFront y el origen de ALB) como en la región de us-east-1 (para utilizar HTTPS entre los lectores y CloudFront). Ambos certificados deben coincidir con el nombre de dominio que se enruta al Equilibrador de carga de aplicación. Para obtener más información, consulte Región de AWS para AWS Certificate Manager.

  • Si los usuarios finales (también conocidos como lectoreso clientes) de su aplicación web pueden usar HTTPS, también puede configurar CloudFront para que prefiera (o incluso requiera) conexiones HTTPS de los usuarios finales. Para ello, utilice la configuración Viewer Protocol Policy (Política de protocolo del lector). Puede configurarla para redirigir a los usuarios finales de HTTP a HTTPS o rechazar las solicitudes que utilizan HTTP. Esta configuración está disponible en la consola de CloudFront, AWS CloudFormation y la API de CloudFront. Para obtener más información, consulte Política de protocolo para lectores.

Cambiar el nombre y el valor del encabezado

Además de usar HTTPS, también recomendamos cambiar el nombre y el valor del encabezado periódicamente. Los pasos de alto nivel para hacerlo son los siguientes:

  1. Configure CloudFront para agregar un encabezado HTTP personalizado adicional a las solicitudes que envía al balanceador de carga de aplicaciones.

  2. Actualice la regla del agente de escucha del balanceador de carga de aplicaciones para reenviar solicitudes que contengan este encabezado HTTP personalizado adicional.

  3. Configure CloudFront para dejar de agregar el encabezado HTTP personalizado original a las solicitudes que envía al balanceador de carga de aplicaciones.

  4. Actualice la regla del agente de escucha del balanceador de carga de aplicaciones para detener el reenvío de solicitudes que contengan el encabezado HTTP personalizado original.

Para obtener más información sobre cómo realizar estos pasos, consulte las secciones anteriores.

(Opcional) Limitación del acceso al origen mediante la lista de prefijos administrados por AWS para CloudFront

Para restringir aún más el acceso al Equilibrador de carga de aplicación, puede configurar el grupo de seguridad asociado a él para que solo acepte tráfico de CloudFront cuando el servicio utilice una lista de prefijos administrados por AWS. Esto evita que el tráfico que no se origina en CloudFront llegue al Equilibrador de carga de aplicación en la capa de red (capa 3) o en la capa de transporte (capa 4).

Para obtener más información, consulte la entrada de blog Limit access to your origins using the AWS-managed prefix list for Amazon CloudFront.