Volver al Blog

¿Cómo comprobar rápidamente si tu sitio web está protegido contra ataques DoS?

2022-02-195 min de lectura

El objetivo de este rápido tutorial es explicar cómo realizar una prueba de estrés en tu sitio y ver cómo se comporta bajo una carga extrema. La herramienta de código abierto que estamos utilizando para esta prueba es la herramienta de benchmarking HTTP wrk.

¿Qué es un ataque (DoS) de Denegación de Servicio?:

Una Denegación de Servicio (DoS) es un tipo de ataque en el que el atacante impide que los usuarios autorizados accedan a un servicio. El método más común de DoS consiste en inundar el servicio con tanto tráfico o solicitudes de datos que el servicio no pueda responder a los usuarios legítimos hasta que se haya detenido el flujo malicioso. Utilizaremos la herramienta de benchmarking HTTP, wrk, para emular este tipo de ataque.

En informática, ¿qué es un benchmark?:

Según wikipedia, un benchmark es:

En informática, un benchmark es el acto de ejecutar un programa informático, un conjunto de programas u otras operaciones, para evaluar el rendimiento relativo de un objeto, normalmente ejecutando una serie de pruebas y ensayos estándar contra él. El término benchmark también se utiliza comúnmente para los programas de benchmarking diseñados de forma elaborada.

Dos características clave de un benchmark son:

  1. Debe ser repetible.
  2. Debe ser cuantificable.

¿Qué es wrk?:

Para ejecutar la prueba de carga en nuestro sitio web, estamos utilizando wrk, según su documentación oficial:

wrk es una herramienta moderna de benchmarking HTTP capaz de generar una carga significativa cuando se ejecuta en una única CPU multinúcleo. Combina un diseño multihilo con sistemas escalables de notificación de eventos como epoll y kqueue.

wrk es de código abierto, pero antes de usarlo, echa un vistazo al aviso de criptografía en https://github.com/wg/wrk#cryptography-notice

Cómo instalar wrk

Bien, finalmente comenzaremos las pruebas. Asegúrate de que te sientes cómodo ejecutando comandos en la terminal, ya que no hay una GUI para ejecutar wrk en este momento.

  • Cómo instalar wrk en Mac

    • Instala homebrew, ejecuta el siguiente comando en una terminal:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    • Para instalar wrk, ejecuta el siguiente comando en una terminal:
brew install wrk

  • Cómo instalar wrk en la distribución Linux Ubuntu

sudo apt-get update
sudo apt-get install wrk

  • Cómo instalar wrk en Windows

Los usuarios de Windows necesitarán instalar Ubuntu primero a través de este enlace y luego ejecutar los dos comandos anteriores.

Cómo hacer una prueba de estrés a tu sitio

El uso básico de wrk se ve así:

wrk -t12 -c400 -d30s http://127.0.0.1:8080/index.html

Las opciones de línea de comandos válidas son:

-c, --connections: número total de conexiones HTTP a mantener abiertas con
                   cada hilo manejando N = conexiones/hilos

-d, --duration:    duración de la prueba, p. ej., 2s, 2m, 2h

-t, --threads:     número total de hilos a utilizar

-s, --script:      script LuaJIT, ver SCRIPTING

-H, --header:      encabezado HTTP a añadir a la solicitud, p. ej., "User-Agent: wrk"

    --latency:     imprimir estadísticas detalladas de latencia

    --timeout:     registrar un tiempo de espera si no se recibe una respuesta dentro de
                   este período de tiempo.

Ejecutaré un benchmark durante 90 segundos, utilizando 10 hilos y manteniendo abiertas 100000 conexiones HTTP.

wrk -t10 -c100000 -d90s https://davidloor.com --timeout 3s --latency -H 'Client: wrk terminal'

Explicación rápida sobre lo que estoy haciendo con las opciones pasadas:

-t10: Usar diez hilos separados
-c100000: Abrir 100000 conexiones
-d90s: Ejecutar la prueba durante noventa segundos
https://davidloor.com El sitio web objetivo
--timeout 3s: Definir un tiempo de espera de tres segundos
--latency: imprimir estadísticas detalladas de latencia
-H 'Client: wrk terminal': Pasar un encabezado Client

Por lo tanto, podemos decir que la prueba de estrés intenta emular a 100000 usuarios abriendo la página de inicio del sitio web varias veces durante 90 segundos.

Importante: Mientras ejecutas la prueba de estrés, abre el sitio web y también intenta iniciar sesión (si el sitio web tiene esta capacidad); si el sitio carga rápidamente como de costumbre, puedes asumir que está protegido contra ataques DoS simples y que el servidor puede manejar una carga significativa. Si el sitio tarda en cargar o muestra un error, tienes un problema con el sitio web y deberías contactar a tu proveedor de hosting al respecto. En algunos casos, el sitio no podrá recuperarse por sí solo y puede que necesite reiniciar algunos servicios.

Analizar la salida

Después de ejecutar el comando, obtengo esto:

Running 2m test @ https://davidloor.com
  10 threads and 100000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   528.12ms  527.33ms   2.99s    87.92%
    Req/Sec    20.30     16.93   116.00     74.75%
  Latency Distribution
     50%  356.27ms
     75%  638.27ms
     90%    1.20s 
     99%    2.62s 
  11662 requests in 1.50m, 735.63MB read
  Socket errors: connect 97681, read 117, write 0, timeout 1581
Requests/sec:    129.43
Transfer/sec:      8.16MB

Proporciona un resumen rápido de cuánto tiempo se ejecutó la prueba y el sitio web (https://davidloor.com) que se probó. También muestra los parámetros de distribución normal para la latencia y Req/Sec. Muestra que en 1.5 minutos, wrk realizó 11662 solicitudes y transfirió 735.63 MB de datos.

¿Son buenos los valores Avg. de Latencia y Req/Sec? Depende de cada situación individual. Siempre debemos intentar mantener la Latencia baja y Req/Sec alta, y debes tener en cuenta que cuanto mayor sea el número de conexiones, menores serán estos 2 valores.

Conclusiones

  1. Puedes hacer una prueba de estrés a tu sitio rápidamente con wrk. https://github.com/wg/wrk
  2. El comando para ejecutar una prueba de estrés, después de instalar wrk, es: `wrk -t10 -c100000 -d90s https://davidloor.com –timeout 3s –latency -H ‘Client: wrk terminal’`
  3. Ejecuta el comando wrk y, al mismo tiempo, intenta cargar el sitio en tu navegador y comprueba si experimentas alguna lentitud.
  4. Existen recursos gratuitos para mejorar el rendimiento de tu sitio web sin añadir más recursos a los servidores, como el uso de una CDN gratuita, como cloudflare.
  5. Si tienes una CDN, asegúrate de estar aprovechando al máximo sus beneficios.

Descargo de responsabilidad: La información disponible en esta publicación de blog es solo para fines educativos. No soy responsable de cómo utilices la información aquí presente.