Límite de frecuencia con Cloud Armor

1. Introducción

El balanceo de cargas HTTP(S) de Google Cloud se implementa en el perímetro de la red de Google, en los puntos de presencia (POP) de todo el mundo. El tráfico de usuario dirigido a un balanceador de cargas HTTP(S) ingresa al POP que se encuentra más cerca del usuario. Luego, su carga se balancea a través de la red global de Google al backend más cercano que cuente con capacidad disponible suficiente.

Cloud Armor es el sistema de detección de denegación de servicio distribuido y firewall de aplicación web (WAF) de Google. Cloud Armor tiene acoplamiento alto con el balanceador de cargas HTTP de Google Cloud y te permite interrogar el tráfico entrante para detectar solicitudes no deseadas. La función de límite de frecuencia de este servicio te permite restringir el tráfico a los recursos de backend según el volumen de solicitudes y evita que el tráfico no deseado consuma recursos de tu red de nube privada virtual (VPC).

En este lab, configurarás un balanceador de cargas HTTP con backends globales, como se muestra en el siguiente diagrama. Luego, lo someterás a una prueba de esfuerzo y agregarás una política de límite de frecuencia de Cloud Armor para limitar el tráfico que llega a tus recursos de backend.

2e1b99d22f4f32a.png

Qué aprenderás

  • Cómo configurar un balanceador de cargas HTTP con verificaciones de estado adecuadas.
  • Cómo crear una política de límite de frecuencia de Cloud Armor.
  • Cómo validar que la política de límite de frecuencia bloquea el tráfico cuando se ejecuta una prueba de esfuerzo desde una VM.

Requisitos

  • Herramientas de redes básicas y conocimiento de HTTP
  • Conocimiento básico de la línea de comandos de Unix/Linux

2. Configuración y requisitos

Configuración del entorno de autoaprendizaje

  1. Accede a Google Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una string de caracteres que no se utiliza en las API de Google y se puede actualizar en cualquier momento.
  • El ID del proyecto debe ser único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). Cloud Console genera automáticamente una string única, que, por lo general, no importa cuál sea. En la mayoría de los codelabs, debes hacer referencia al ID del proyecto (suele ser PROJECT_ID). Por lo tanto, si no te gusta, genera otro aleatorio o prueba con uno propio y comprueba si está disponible. Después de crear el proyecto, este ID se “congela” y no se puede cambiar.
  • Además, hay un tercer valor, el Número de proyecto, que usan algunas API. Obtén más información sobre estos tres valores en la documentación.
  1. A continuación, deberás habilitar la facturación en Cloud Console para usar las API o los recursos de Cloud. Ejecutar este codelab no debería costar mucho, tal vez nada. Si quieres cerrar los recursos para no se te facture más allá de este instructivo, sigue las instrucciones de “limpieza” que se encuentran al final del codelab. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de USD 300.

Inicia Cloud Shell

Si bien Google Cloud y Spanner se pueden operar de manera remota desde tu laptop, en este codelab usarás Google Cloud Shell, un entorno de línea de comandos que se ejecuta en la nube.

En GCP Console, haga clic en el ícono de Cloud Shell en la barra de herramientas superior derecha:

bce75f34b2c53987.png

El aprovisionamiento y la conexión al entorno deberían tomar solo unos minutos. Cuando termine el proceso, debería ver algo como lo siguiente:

f6ef2b5f13479f3a.png

Esta máquina virtual está cargada con todas las herramientas de desarrollo que necesitarás. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que permite mejorar considerablemente el rendimiento de la red y la autenticación. Puedes realizar todo tu trabajo en este lab usando simplemente un navegador.

Antes de comenzar

En Cloud Shell, asegúrate de que el ID del proyecto esté configurado

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
PROJECT_ID=[YOUR-PROJECT-NAME]
echo $PROJECT_ID

Habilita las APIs

Habilita todos los servicios necesarios

gcloud services enable compute.googleapis.com
gcloud services enable logging.googleapis.com
gcloud services enable monitoring.googleapis.com

3. Configura reglas de firewall para permitir el tráfico HTTP a los backends

Configurar reglas de firewall para permitir el tráfico HTTP a los backends desde las verificaciones de estado de Google Cloud y el balanceador de cargas.

Usaremos la red de VPC predeterminada que se creó en tu proyecto. Crea una regla de firewall para permitir el tráfico HTTP a los backends. Las verificaciones de estado determinan qué instancias de un balanceador de cargas pueden recibir conexiones nuevas. En el balanceo de cargas HTTP, los sondeos de verificación de estado de tus instancias de balanceo de cargas provienen de las direcciones dentro de los rangos 130.211.0.0/22 y 35.191.0.0/16. Tus reglas de firewall de VPC deben permitir estas conexiones. Además, los balanceadores de cargas se comunican con el backend en el mismo rango de IP.

  1. En la consola de Cloud, navega al menú de navegación ( mainmenu.png) > Red de VPC > Firewall.

dbdf491e6d7863f3.png

  1. Observa las reglas de firewall existentes de ICMP, internas, RDP y SSH.Cada proyecto de Google Cloud comienza con la red predeterminada y estas reglas de firewall.
  2. Haz clic en Crear regla de firewall.
  3. Establece los siguientes valores y deja el resto con la configuración predeterminada:

Propiedad

Valor (escribe el valor o selecciona la opción como se especifica)

Nombre

default-allow-health-check

Red

default

Destinos

Etiquetas de destino especificadas

Etiquetas de destino

http-server

Filtro de fuente

Rangos de IP

Rangos de IP de origen

130.211.0.0/22, 35.191.0.0/16

Protocolos y puertos

Protocolos y puertos especificados; marca tcp

  1. Haz clic en Crear.

De manera alternativa, si usas la línea de comandos de gcloud. A continuación, se muestra el siguiente comando:

gcloud compute firewall-rules create default-allow-health-check --direction=INGRESS --priority=1000 --network=default --action=ALLOW --rules=tcp --source-ranges=130.211.0.0/22,35.191.0.0/16 --target-tags=http-server

4. Configura plantillas de instancias y crea grupos de instancias administrados

Un grupo de instancias administrado usa una plantilla de instancias para crear un grupo de instancias idénticas. Úsalas para crear los backends del balanceador de cargas HTTP.

Configure las plantillas de instancias

Una plantilla de instancias es un recurso de API que puedes usar para crear instancias de VM y grupos de instancias administrados. Las plantillas de instancias definen el tipo de máquina, la imagen de disco de arranque, la subred, las etiquetas y otras propiedades de las instancias. Cree una plantilla de instancias para us-east1 y una para europe-west1.

  1. En la consola de Cloud, navega al menú de navegación ( mainmenu.png) > Compute Engine > Plantillas de instancias y, luego, haz clic en Crear plantilla de instancias.
  2. En Nombre, escriba us-east1-template.
  3. En Serie, selecciona N1.
  4. Haz clic en Herramientas de redes, discos, seguridad, administración , usuario único.

b60e2a44c3e4d50e.png

  1. Ve a la sección Administración.

ee57f20ce55298fd.png

  1. En Metadatos, haz clic en Agregar elemento y especifica lo siguiente:

Clave

Valor

startup-script-url

gs://cloud-training/gcpnet/httplb/startup.sh

  1. Haz clic en Herramientas de redes.
  2. Establece los siguientes valores y deja el resto con la configuración predeterminada:

Propiedad

Valor (escribe el valor o selecciona la opción como se especifica)

Red (en Interfaces de red)

predeterminado

Subred (en Interfaces de red)

default (us-east1)

Etiquetas de red

http-server

  1. Haz clic en Crear.
  2. Espere a que se cree la plantilla de instancias.

Ahora cree otra plantilla de instancias para subnet-b. Para ello, copie us-east1-template:

  1. Haz clic en us-east1-template y, luego, en la opción Copiar en la parte superior.
  2. En Nombre, escriba europe-west1-template.
  3. Haz clic en Herramientas de redes, discos, seguridad, administración , usuario único.
  4. Haz clic en Herramientas de redes.
  5. En Interfaces de red,edita la interfaz predeterminada. En Subred, selecciona default (europe-west1).
  6. Haz clic en Crear.

Cree los grupos de instancias administradas

Cree un grupo de instancias administradas en us-east1 y uno en europe-west1.

  1. En Compute Engine, haz clic en Grupos de instancias, en el menú de la izquierda.

72319de055de3942.png

  1. Haz clic en Crear grupo de instancias. Selecciona Nuevo grupo de instancias administrado (sin estado).
  2. Establece los siguientes valores y deja el resto con la configuración predeterminada:

Propiedad

Valor (escribe el valor o selecciona la opción como se especifica)

Nombre

us-east1-mig

Ubicación

Varias zonas

Región

us-east1

Plantilla de instancias

us-east1-template

Ajuste de escala automático > Política de ajuste de escala automático > Haz clic en el ícono de lápiz >. Tipo de métrica

Uso de CPU

Uso de CPU objetivo

80, haz clic en Listo.

Período de inactividad

45

Número mínimo de instancias

1

Número máximo de instancias

5

  1. Haz clic en Crear.

Ahora repite el mismo procedimiento para crear un segundo grupo de instancias para europe-west1-mig en europe-west1:

  1. Haz clic en Crear grupo de instancias.
  2. Establece los siguientes valores y deja el resto con la configuración predeterminada:

Propiedad

Valor (escribe el valor o selecciona la opción como se especifica)

Nombre

europe-west1-mig

Ubicación

Varias zonas

Región

europe-west1

Plantilla de instancias

europe-west1-template

Ajuste de escala automático > Política de ajuste de escala automático > Haz clic en el ícono de lápiz >. Tipo de métrica

Uso de CPU

Uso de CPU objetivo

80, haz clic en Listo.

Período de inactividad

45

Número mínimo de instancias

1

Número máximo de instancias

5

  1. Haz clic en Crear.

5. Configura el balanceador de cargas HTTP

Configura el balanceador de cargas HTTP para equilibrar el tráfico entre los dos backends (us-east1-mig en us-east1 y europe-west1-mig en europe-west1), como se ilustra en este diagrama de red:

2e1b99d22f4f32a.png

Inicie la configuración

  1. En la consola de Cloud, haz clic en el menú de navegación ( mainmenu.png) > Haz clic en Servicios de red > Balanceo de cargas y, luego, haz clic en Crear balanceador de cargas.
  2. En Balanceo de cargas HTTP(S), haz clic en Iniciar configuración.

8197d8f041e8eafd.png

  1. Selecciona De Internet a mis VMs, Balanceador de cargas de HTTP(S) clásico y haz clic en Continuar.
  2. Establece el Nombre en http-lb.

Configure el backend

Los servicios de backend dirigen el tráfico entrante a uno o más backends adjuntos. Cada backend está compuesto por un grupo de instancias y metadatos con capacidad de entrega adicional.

  1. Haz clic en Configuración de backend.
  2. En Servicios y buckets de backend, haz clic en Crear un servicio de backend.
  3. Establece los siguientes valores y deja el resto con la configuración predeterminada:

Propiedad

Valor (selecciona la opción como se especifica)

Nombre

http-backend

Grupo de instancias

us-east1-mig

Números de puerto

80

Modo de balanceo

Tasa

Máximo de RPS

50 (por instancia)

Capacidad

100

  1. Haz clic en Listo.
  2. Haz clic en Agregar backend.
  3. Establece los siguientes valores y deja el resto con la configuración predeterminada:

Propiedad

Valor (selecciona la opción como se especifica)

Grupo de instancias

europe-west1-mig

Números de puerto

80

Modo de balanceo

Utilización

Utilización máxima del backend

80

Capacidad

100

  1. Haz clic en Listo.
  2. En Verificación de estado, selecciona Crear una verificación de estado.

199239806577ceac.png

  1. Establece los siguientes valores y deja el resto con la configuración predeterminada:

Propiedad

Valor (selecciona la opción como se especifica)

Nombre

http-health-check

Protocolo

TCP

Puerto

80

20f7af9fce140475.png

  1. Haz clic en Guardar.
  2. Marca la casilla Habilitar registro.
  3. Configura la Tasa de muestreo en 1:

dab4b15c13917786.png

  1. Haz clic en Crear para crear el servicio de backend.

2db64614f855f239.png

Configura el frontend

Las reglas de host y ruta de acceso determinan cómo se dirigirá tu tráfico. Por ejemplo, puedes dirigir el tráfico de video a un backend y el tráfico estático a otro. Sin embargo, no configuraremos dichas reglas en este lab.

  1. Haz clic en Configuración de frontend.
  2. Especifica los siguientes valores y deja el resto con la configuración predeterminada:

Propiedad

Valor (escribe el valor o selecciona la opción como se especifica)

Protocolo

HTTP

Versión de IP

IPv4

Dirección IP

Efímera

Puerto

80

  1. Haz clic en Listo.
  2. Haz clic en Agregar IP y puerto de frontend.
  3. Especifica los siguientes valores y deja el resto con la configuración predeterminada:

Propiedad

Valor (escribe el valor o selecciona la opción como se especifica)

Protocolo

HTTP

Versión de IP

IPv6

Dirección IP

Efímera

Puerto

80

  1. Haz clic en Listo.

Revise y cree el balanceador de cargas HTTP

  1. Haz clic en Revisar y finalizar.

2c88715aa5f22800.png

  1. Revisa los Servicios de backend y el Frontend.

b2fffef90be309f0.png

  1. Haz clic en Crear.
  2. Espera a que se cree el balanceador de cargas.
  3. Haz clic en el nombre del balanceador de cargas (http-lb).
  4. Toma nota de las direcciones IPv4 e IPv6 del balanceador de cargas para la siguiente tarea. Se llamarán [LB_IP_v4] y [LB_IP_v6], respectivamente.

6. Prueba el balanceador de cargas HTTP

Ahora que creaste el balanceador de cargas HTTP para tus backends, verifica que el tráfico se desvíe al servicio de backend.

Acceda al balanceador de cargas HTTP

Para probar el acceso de IPv4 al balanceador de cargas HTTP, abre una nueva pestaña en tu navegador y navega a http://[LB_IP_v4]. Asegúrate de reemplazar [LB_IP_v4] por la dirección IPv4 del balanceador de cargas.

Si tienes una dirección IPv6 local, prueba la dirección IPv6 del balanceador de cargas HTTP. Para ello, navega a http://[LB_IP_v6]. Asegúrate de reemplazar [LB_IP_v6] por la dirección IPv6 del balanceador de cargas.

812d1fc75d9dfb3c.png

Somete el balanceador de cargas HTTP a una prueba de esfuerzo

Crear una VM nueva para simular una carga en el balanceador de cargas HTTP con siege Luego, determine si el tráfico se balancea entre ambos backends cuando la carga es alta.

  1. En la consola, ve al menú de navegación ( mainmenu.png) > Compute Engine > Instancias de VM.
  2. Haz clic en Crear instancia.
  3. Establece los siguientes valores y deja el resto con la configuración predeterminada:

Propiedad

Valor (escribe el valor o selecciona la opción como se especifica)

Nombre

siege-vm

Región

us-west1

Zona

us-west1-c

Serie

N1

  1. Haga clic en Crear.
  2. Espera a que se cree la instancia siege-vm.
  3. En siege-vm, haz clic en SSH para iniciar una terminal y conectarse.
  4. Ejecuta el siguiente comando para instalar siege:
sudo apt-get -y install siege
  1. Para almacenar la dirección IPv4 del balanceador de cargas HTTP en una variable de entorno, ejecuta el siguiente comando y reemplaza [LB_IP_v4] por la dirección IPv4:
export LB_IP=[LB_IP_v4]
  1. Para simular una carga, ejecute el siguiente comando:
siege -c 250 http://$LB_IP

El resultado debería ser similar a este (no lo copie; este es un ejemplo):

New configuration template added to /home/student/.siege
Run siege -C to view the current settings in that file
** SIEGE 4.0.4
** Preparing 250 concurrent users for battle.
The server is now under siege...
  1. En la consola de Cloud, haz clic en el menú de navegación ( mainmenu.png) y, luego, en Servicios de red > Balanceo de cargas.
  2. Haz clic en http-lb.
  3. Haz clic en la pestaña Monitoring. Supervisar el tráfico entre Norteamérica y los dos backends durante 2 o 3 minutos.

Primero, el tráfico se dirige solo a us-east1-mig. Sin embargo, a medida que aumentan las RPS, también se dirige a europe-west1-mig.

ead1e6d5c1f4cc4b.png

Esto demuestra que, de forma predeterminada, se desvía el tráfico al backend más cercano, pero se puede distribuir entre los backends si la carga es muy alta.

e5c6a657706c832c.png

  1. Regresa a la terminal SSH de siege-vm.
  2. Presione CTRL+C para detener siege.

7. Crear política de límite de frecuencia de Cloud Armor

En esta sección, usarás Cloud Armor para denegar a siege-vm el acceso al balanceador de cargas HTTP mediante la configuración de una política de límite de frecuencia.

  1. En Cloud Shell(consulta "Cómo iniciar Cloud Shell" en "Configuración y requisitos" para obtener instrucciones sobre cómo usar Cloud Shell), crea una política de seguridad con gcloud:
gcloud compute security-policies create rate-limit-siege \
    --description "policy for rate limiting"
  1. A continuación, agrega una regla de límite de frecuencia:
gcloud beta compute security-policies rules create 100 \
    --security-policy=rate-limit-siege     \
    --expression="true" \
    --action=rate-based-ban                   \
    --rate-limit-threshold-count=50           \
    --rate-limit-threshold-interval-sec=120   \
    --ban-duration-sec=300           \
    --conform-action=allow           \
    --exceed-action=deny-404         \
    --enforce-on-key=IP
  1. Adjunta la política de seguridad al servicio de backend http-backend:
gcloud compute backend-services update http-backend \
    --security-policy rate-limit-siege –-global
  1. En la consola, ve al menú de navegación > Seguridad de red > Cloud Armor.
  2. Clics rate-limit-siege. Tu política debería verse de la siguiente manera:

8be87aa31c2ed74e.png

Verifica la política de seguridad

  1. Regresa a la terminal SSH de siege-vm.
  2. Ejecuta un comando curl en relación con la IP del balanceador de cargas para verificar que aún puedes conectarte a ella. Deberías recibir una respuesta 200.
curl http://$LB_IP
  1. En la terminal SSH de siege-vm, ejecuta el siguiente comando para simular una carga:
siege -c 250 http://$LB_IP

El resultado debería ser similar a este (no lo copies, ya que es un ejemplo):

** SIEGE 4.0.4
** Preparing 250 concurrent users for battle.
The server is now under siege...
  1. Explora los registros de la política de seguridad para determinar si también se bloquea este tráfico.
  2. En la consola, navega a Menú de navegación > Seguridad de red > Cloud Armor.
  3. Haz clic en rate-limit-siege.
  4. Haz clic en Registros.

f8be7c01c3d7c8f5.png

  1. Haz clic en Ver registros de políticas.
  2. En la página Logging, asegúrate de borrar todo el texto en la vista previa de Consulta.
  3. Selecciona el recurso como Balanceador de cargas HTTP de Cloud > http-lb-forwarding-rule > http-lb y, luego, haz clic en Agregar. Como alternativa, a continuación se muestra la consulta de MQL(lenguaje de consulta de supervisión), puedes copiarla y pegarla en el editor de consultas:
resource.type="http_load_balancer" resource.labels.forwarding_rule_name="http-lb-forwarding-rule" resource.labels.url_map_name="http-lb"
  1. Haz clic en Ejecutar consulta.
  2. Expande una entrada de registro en Resultados de la consulta.
  3. Expande httpRequest. La solicitud debería ser de la dirección IP de siege-vm. Si no es así, expande otra entrada de registro.
  4. Expande jsonPayload.
  5. Expandir applySecurityPolicy.

151f575ba7b3bde9.png

Observa que configureAction se establece en RATE_BASED_BAN con el nombre rate-limit-siege.

  1. Como verificación adicional, ve al menú de navegación ( mainmenu.png), haz clic en Servicios de red > Balanceo de cargas. Haz clic en http-lb. Haz clic en la pestaña Monitoring.

ab9a8a66573a5ebd.png

Puedes ver el tráfico de asedio en los gráficos. También notarás que el tráfico con frecuencia limitada no llega al backend y está bloqueado por la política de Cloud Armor.

¡Felicitaciones! Completaste este lab sobre el límite de frecuencia con Cloud Armor.

©2020 Google LLC. Todos los derechos reservados. Google y el logotipo de Google son marcas de Google LLC. El resto de los nombres de productos y empresas pueden ser marcas de las respectivas empresas a las que están asociados.

8. Limpieza del lab

  1. Navega a Seguridad de red >> Cloud Armor >> %POLICY NAME% y selecciona Eliminar -

eeafa7cafa11c4c7.png

  1. Navega a Herramientas de redes >> Servicios de red >> Balanceo de cargas. Selecciona el balanceador de cargas que creaste y haz clic en Borrar.

3886458f25cfbd36.png

Selecciona el servicio de backend y la verificación de estado como recursos adicionales que se borrarán:

a0193e91b2f4cb6f.png

  1. Ve al menú de navegación ( mainmenu.png) > Compute Engine > Grupos de instancias. Selecciona los grupos de instancias administrados y haz clic en Borrar.

5027d56977997f70.png

Escribe “delete” para confirmar la eliminación en el cuadro de texto.

Espera a que se borren los grupos de instancias administrados. Esta acción también borra las instancias del grupo. Solo puedes borrar las plantillas después de borrar el grupo de instancias.

  1. Navega a Plantillas de instancias desde el panel lateral izquierdo**.** Selecciona las plantillas de instancias y haz clic en Borrar.

8d88abacd32c11ce.png

  1. Navega a Instancias de VM desde el panel lateral izquierdo**.** Selecciona los puntos suspensivos junto a la instancia de siege-vm y haz clic en Borrar.

2b58ab43695836e9.png

  1. Ve al menú de navegación ( mainmenu.png) > Red de VPC > Firewall. Selecciona default-allow-health-check y haz clic en Borrar:

561d5e771d36d85.png

9. ¡Felicitaciones!

Implementaste correctamente el límite de frecuencia con Cloud Armor. Configuraste un balanceador de cargas HTTP con backends en us-east1 y europe-west1. Luego, realizaste una prueba de esfuerzo del balanceador de cargas con una VM y agregaste la dirección IP a la lista de bloqueo a través del límite de frecuencia con Cloud Armor. Pudo explorar los registros de políticas de seguridad para identificar por qué se bloqueaba el tráfico.

Temas abordados

  • Cómo configurar plantillas de instancias y crear grupos de instancias administrados
  • Cómo configurar un balanceador de cargas HTTP
  • Cómo crear una política de límite de frecuencia de Cloud Armor.
  • Cómo validar que la Política de Límite de Frecuencia funcione según lo previsto

Próximos pasos

  • Intenta configurar una política de límite de frecuencia basada en un rango de IP de origen. Este es un comando de muestra:
gcloud alpha compute security-policies rules create 105 \
    --security-policy sec-policy     \
    --src-ip-ranges "1.2.3.0/24"     \
    --action throttle                \
    --rate-limit-threshold-count 100 \
    --rate-limit-threshold-interval-sec 60 \
    --conform-action allow           \
    --exceed-action deny-429         \
    --enforce-on-key IP
  • Intenta configurar una política de límite de frecuencia basada en el código de región. Este es un comando de muestra:
gcloud alpha compute security-policies rules create 101 \
    --security-policy sec-policy     \
    --expression "origin.region_code == 'US'" \
    --action rate-based-ban                 \
    --rate-limit-threshold-count 10         \
    --rate-limit-threshold-interval-sec 60  \
    --ban-duration-sec 300           \
    --ban-threshold-count 1000       \
    --ban-threshold-interval-sec 600 \
    --conform-action allow           \
    --exceed-action deny-403         \
    --enforce-on-key IP