Blog de Amazon Web Services (AWS)

Introducción a Bot Control para protección de tráfico de Bots Maliciosos con AWS Web Application Firewall (WAF).

Por Mayerli Romero, Arquitecta de soluciones y
Marco Saenz, Arquitecto de soluciones

Introducción:

De acuerdo con el reporte: Bad Bot Report 2021, de Imperva (líder en ciberseguridad y partner de AWS), los bots maliciosos representaron el 25,6% de todo el tráfico web en 2020. Así mismo, aquellos con una categorizacion media o avanzada, y conocidos como ABP (Advanced Persistent Bots), representaron el 57,1% del trafico en 2020. Este tipo de bots usualemente realizan tareas cómo: recorrer IP’s aleatorias, ingresar a traves de proxies anónimos y redes peer-to-peer con la posibilidad de cambiar sus agentes de usuario y evadir la detección mientras mantienen una persistencia en el destino.

Puede hacer uso de grupos de reglas administradas de Bot Control para bloquear o limitar el trafico de bots maliciosos sobre su página web. Este blog presenta una guía general paso a paso sobre cómo realizar la configuración y prueba de las características de Bot Control.

Descripción de la funcionalidad de WAF (Bot Control)

Tutorial

Requisitos previos

Para esto paso a paso, debe tener los siguientes requisitos previos:

  1. Una cuenta de AWS.
  2. Rol o usuario que tenga acceso para la creación de los recursos de AWS: AWS WAF, Amazon EC2 (Amazon Elastic Compute Cloud), AWS AutoScaling, AWS StepFunctions, AWS Lambda, Application Load Balancer (ALB). Sugerimos revisar y seguir las prácticas recomendadas de seguridad en IAM (Identity Access Management).
  3. Conocimiento en el servicio AWS WAF.
  4. Uso de ACLs (Access Control Lists), reglas y grupos de reglas de AWS WAF.

Importante: Las plantillas de AWS CloudFormation que consideraremos para este blog deben ser utilizadas en la región de Oregon (us-west-2).

A) Creación del ambiente

A continuación desplegaremos la siguiente plantilla que creará los recursos base con los que trabajaremos. Aunque esta plantilla cuenta con unos recursos base, el AWS WAF puede ayudarte a proteger otros recursos como: distribuciones de Amazon Cloudfront, Application Load Balancers, APIs administradas por el Amazon API Gateway o AWS Appsync.

  1. Haz clic en el botón de despliegue:

Esto te llevará automáticamente a la consola web de AWS para que ejecutes la plantilla de AWS CloudFormation, como se muestra en la siguiente imagen, deja los valores por defecto y haz clic en siguiente.

  1. Coloca un nombre por el cual puedas identificar la plantilla que desplegarás. Como parámetros se te mostrarán los siguientes: CountryCodeForRateRule, CreateWAFRules y LatestAMIId. En caso de no querer seguir el paso a paso manualmente para la configuración en el AWS WAF, puedes elegir Yes como valor del parametro CreateWAFRules. Si lo haces, por favor salta a la sección D (Simulación de Peticiones) ya que la configuración del bot control se hará automáticamente, en caso contrario, selecciona No. A continuación se detalla a qué hace referencia cada parámetro:
    • CreateWAFRules: Parámetro que indica si el usuario desea o no crear las reglas de manera automática.
    • CountryCodeForRule: Parámetro que indica el país, mediante country code (ver opciones de country code), que se considerará para la creación de una regla asociada a peticiones Curl. El propósito de esta regla será permitir estas solicitudes mientras que no se supere el limite indicado en la regla rate-block-non-browser-user-agent (la cual será descrita mas adelante). Este parámetro solo será necesario si para el parámetro CreateWAFRules  elegimos como valor Si.
    • LatestAMIId: Parámetro precargado del AMI (Amazon Machine Image) a usar, dejar el valor que aparece por defecto.

  1. En la sección: configuración de opciones del stack, deja los valores por defecto y haz clic en Next, y después en el resumen de creación, en la parte inferior se mostrará una nota con una casilla de verificación: I acknowledge that AWS CloudFormation might create IAM resources, se debe seleccionar y luego hacer clic en Create Stack. (Esta casilla también se debe marcar al momento de desplegar la segunda plantilla).

Nota: luego de creado el stack valida en la seccion de Outputs y toma nota de la URL del balanceador de carga (LoadBalancerUrl), valor resaltado en la siguiente imagen.

 

B) Configuración inicial Bot Control

A continuación se presentan los pasos para el uso de Bot Control.

  1. Ingresar en la consola de AWS WAF, a la sección de Web ACLs, seleccionar la región donde se creará la ACL, Oregon en nuestro caso, y hacer clic Create Web ACL:

2. Crear un Access List asignando un nombre representativo, la descripción es opcional. Selecciona el tipo de recurso, recurso en la región: Application Load Balancer (ALB). En la sección de recursos asociados, haz clic en Add AWS resources y agrega el ALB creado por la plantilla de AWS CloudFormation previamente desplegada, luego de esto, haz clic en Next:

3. En la sección agregar reglas y grupos de reglas, agrega un grupo de reglas administrado (manage rule groups), haciendo click en Add rules y luego en Add managed rule groups. Dentro de este grupo de reglas administrado podrás ver reglas administradas ofrecidas por diferentes proveedores, entre ellos AWS.

4. En la sección de Paid rule groups dentro de AWS managed rule groups, habilita Bot Control (en la sección de acción donde indica add to web ACL). Luego, hacer clic en Edit y habilitar Set all rule actions to count, luego hacer clic en Save rule y presionar el botón Add to web ACL. Recuerda que estos grupos de reglas como su nombre lo indica, tienen un costo adicional. Ver costos AWS WAF.

En un ambiente productivo se recomienda contar las peticiones antes de bloquear para evaluar el correcto funcionamiento de nuestras reglas (ver AWS WAF rule action y configuración de Bot Control).

Con esta configuración se obtendrán métricas sobre las peticiones de bots que elegimos analizar, sin embargo no se realizará el bloqueo automáticamente. Para bloquear se deberán configurar reglas en la Web ACL que coincidan con las etiquetas de las categorías de bots que identificará Bot Control en el tráfico.

5. Después de agregar esta regla, debes hacer clic en Next y luego en los siguientes pasos (set rule priority, Configure metrics y Review and create web ACL) dejar las configuraciones por defecto y hacer clic en Create web ACL.

C) Configuración reglas en el WAF

  1. En la pestaña rules, crea una nueva regla haciendo clic en el botón Add rules y luego Add my own rules and rule groups.

  1. En la sección de Rule Type seleccionamos Rule Builder. Por defecto se encuentra el editor visual, pero en caso de necesitarse se puede usar el editor de JSON (por ejemplo, para agregar una política que hayamos escrito manualmente).

 

  1. En la sección if a request tenemos la opción de realizar declaraciones (statements) que:

a. Correspondan con un solo statement.

b. Correspondan con todos los statements (AND).

c. Correspondan con alguno de los statements (OR).

d. No correspondan con un statement.

En caso de necesitar varios statements existe el botón de Add another statement para agregar los necesarios (en este caso usaríamos las opciones b o c). Si necesitas editar la regla de manera manual, puedes agregar los statements que consideres requeridos utilizando el editor de JSON.

Para tener en cuenta los descubrimientos de los bots, usaremos en Inspect la propiedad Has a label, que nos permite reconocer el bot de acuerdo a la categorización de etiquetas predeterminadas del Bot Control.

  1. A continuación crearemos cuatro reglas de AWS WAF (se recomienda usar los mismos nombres descritos abajo) para probar el bloqueo o permisos de tráfico asociado a posibles bots:
  1. rate-block-non-browser-user-agent: Bloquear el tráfico desde una IP cuando se hayan alcanzado el numero de peticiones correspondientes (100), considerando que estas peticiones no provienen de un navegador (ver Rate-based rule statement)
  2. count-python-requests: Contar la cantidad de peticiones provenientes de una aplicación que use Python (específicamente la librería de Python Requests).
  3. allow-country-curl-requests: Permitir las peticiones curl provenientes de un país específico (el seleccionado en los parámetros de la plantilla o configurado manualmente, en este ejemplo: Colombia).
  4. block-known-data-centers-bot-and-non-browser-agent: Bloquear peticiones que no provengan de un browser o un datacenter conocido.

 

El siguiente video ilustra la configuración de las reglas mencionadas anteriormente.

 

Creación y configuración de reglas WAF

 

Para ilustrar, mostramos cómo sería la configuración de cada una de las reglas mencionadas anteriormente. Una vez hayas configurado cada regla, haz clic en Save rule y luego en Set rule priority (donde puedes definir el orden de las reglas en el filtrado) haz clic en Save.

Luego de la creación de estas reglas, tendremos lo siguiente:

Las reglas deben seguir el orden descrito previamente, en caso de no cumplir con el orden, podemos editar dicho orden mediante la edición de la regla, posteriormente dando clic en Save rule y luego cambiando la prioridad de la regla.

A continuación, se muestra el proceso de filtrado del tráfico basado en las reglas configuradas y su orden:

Nota: también se puede colocar la opción de CAPTCHA considerando otros casos de uso, en los cuales se requiera incluir un acertijo a resolver en caso de cumplirse la regla. A continuación un ejemplo de la configuración de la regla y cómo se vería el CAPTCHA:

Una vez realizada la configuración de las reglas de AWS WAF, nuestra arquitectura se vería de la siguiente manera:

A continuación, y a partir de recursos que crearemos por medio de otra plantilla de AWS CloudFormation, se hará una simulación de un ataque a nuestro ambiente por parte de un bot.

D) Simulación de peticiones

A continuación las instrucciones para despliegue de los recursos:

1. Haz clic en el botón de despliegue:

1.1. Esto te llevará automáticamente a la consola web de AWS para que ejecutes la plantilla de AWS CloudFormation, similar a como se realizo anteriormente, haz clic en next.

2. Debes colocar un nombre por el cual puedas identificar la plantilla que desplegarás. Se pueden configurar peticiones Python, Curl o ambas, se debe seleccionar por lo menos una opción, es decir, parámetro PythonRequest o CurlRequest en Yes y asignar valores a los parámetros de la petición. Cada tipo de petición se compone de lo siguiente:

  • Peticiones (Requests): número de peticiones a ejecutar.
  • LambdaInvoke: número de ejecuciones de la función AWS Lambda encargada de realizar las peticiones. Ej: podemos tener 20 peticiones por invocación e invocaremos la función Lambda 3 veces, lo que significarían 60 peticiones.
  • TimeBetweenRequests: Periodo de tiempo entre las peticiones.

Advertencia: Tener presente que si se seleccionan valores altos para estos 3 parámetros, el tiempo de ejecución y generación de solicitudes se incrementará considerablemente, esto puede incurrir en costos imprevistos.

  1. Coloca la URL del Application Load Balancer que obtuviste como salida (Output) del AWS CloudFormation previamente desplegado en el parámetro LoadBalancerURL y no modifiques el valor del LayerARN. Haz clic en Next.

A continuación una vista previa de la plantilla (puedes cambiar los valores numéricos de los parámetros Curl y Python):

  1. En la sección: configuración de opciones del stack, haz clic en Next y en el resumen de creación, clic en Create stack. De acuerdo al número de peticiones a realizar por la maquina de estados (AWS StepFunctions), el tiempo de ejecución puede variar.

Los recursos para simular el ataque comprenden una máquina de estados y funciones AWS Lambda que se representan de la siguiente manera:

Vista general de la arquitectura:

En este caso, la arquitectura desplegada a partir de la primera plantilla, recibirá peticiones provenientes de los recursos creados por la segunda (funciones AWS Lambda orquestadas por la maquina de estados), simulando un bot intentando realizar scraping de nuestro sitio web.

Algunos minutos luego de ejecutar nuestra segunda plantilla, podrás empezar a visualizar métricas de la simulación de ataque (tanto en la pestaña Overview como en la pestaña Bot Control). A continuación algunos ejemplos:

En esta imagen podemos observar la comparación de peticiones provenientes de bots identificados por la funcionalidad de Bot Control (99.4%) y de trafico legítimo (0.61%). También podemos observar el número de bots bloqueados y permitidos (según la configuración realizada)

En este apartado podemos observar en la parte superior, las categorías de bots identificadas a lo largo del tiempo. En la parte inferior, se puede seleccionar un tipo de actividad asociada a bots y visualizar dicha actividad en particular a lo largo del tiempo (en este caso Curl).

En esta sección (Sampled requests en Overview) podemos observar una muestra de las peticiones que cumplieron las condiciones de la regla llamada: block-known-data-centers-bot-and-non-browser-agent. En este caso también se muestra el país origen y la IP de la cual provienen las peticiones, así como la ruta a la que se dirigía dicha petición.

Borrado de recursos

Para evitar cargos futuros, recuerda borrar las plantillas de los recursos creados:

  1. Simulación de peticiones – plantilla 2 (stack 2)
  2. Creación de ambiente – plantilla 1 (stack 1)

Próximos pasos

Luego de haber realizado la configuración anterior, puedes experimentar haciendo uso de las características Bot Control para tener una visibilidad detallada en tiempo real de las categorías de bot, identidades y otros detalles del tráfico asociado a tus aplicativos; además de tener la posibilidad de bloquear el tráfico riesgoso o indeseado a partir de reglas administradas o personalizadas del AWS WAF.

Para una completa exploración de cada una de las reglas configuradas, sugerimos probar haciendo accesos a la aplicación de manera legitima (desde el navegador), Curl Requests (considerando el país que colocaste en los parámetros de la plantilla), Python Requests y realizar diferente número de peticiones, para observar en el dashboard el bloqueo por límite (rate limit) y las diferentes métricas del AWS WAF.

Adicionalmente, te invitamos a revisar el siguiente blog: Fine-tune and optimize AWS WAF Bot Control mitigation capability el cual presenta recomendaciones para afinar el uso de Bot Control en nuestro ambiente.

Conclusión

Una vez realizada la simulación, podemos observar que el trafico de bots es bloqueado de manera adecuada (para nuestro ejemplo). Si quisieras experimentar con los parámetros de los recursos creados con las plantillas de AWS CloudFormation, puedes acceder a cada servicio (AWS StepFunctions, AWS Lambda, etc.) para ajustar de acuerdo a tu necesidad y realizar otro tipo de pruebas.

Aunque este blog correspondió a un ejercicio de muestra y puede que en las métricas se evidencie un resultado limitado a nuestras peticiones (las cuales están siendo bloqueadas o permitidas), es de resaltar que en contextos de negocio reales se tendrán niveles de tráfico mayor en los cuales podríamos ver a más detalle cómo se estaría realizando el manejo de peticiones a partir de las reglas de AWS WAF y el Bot Control. También cabe mencionar, que si no elimina los recursos desplegados por las plantillas de AWS CloudFormation, estos generarán costos; sin embargo durante este periodo de tiempo, podrá visualizar distintas peticiones provenientes de trafico de internet.


Sobre el autor

Mayerli Romero es una Arquitecta de soluciones en AWS Colombia. Se enfoca en las verticales de Retail y CPG, con especial interés en temas de experiencia del cliente, específicamente Amazon Connect y Machine Learning. Apasionada por la natación y las tortugas. Previamente, ha trabajado en la industria bancaria, hidrocarburos y educación.

Marco Sáenz es arquitecto de soluciones en AWS Colombia. En su rol actual, ayuda a clientes del segmento de pequeñas y medianas industrias en su camino en la nube. Es un apasionado por la seguridad y el mundo gaming. Anteriormente, trabajó como desarrollador de software.