Volver al blog

Síguenos y suscríbete

Datos de seguridad enriquecidos, nuestra plataforma de edge cloud y el penalty box: cómo parar los pies a los Grinch bots

Brooks Cunningham

Senior Security Strategist, Fastly

Enriquecer las peticiones destinadas a tu origen con información proveniente de nuestra plataforma de edge cloud fue un tema que tratamos en una entrada publicada hace unos meses. Tu nube central (u origen) está equipada con muchas funciones y centraliza grandes volúmenes de información, lo que te sirve para mejorar tu visibilidad. Pero hay más posibilidades. ¿Y si te dijéramos que también puedes compartir decisiones sobre seguridad desde el origen hasta el edge de Fastly?

En esta entrada, te voy a explicar cómo añadir a nuestro penalty box las direcciones IP asociadas a usos indebidos, a partir de los datos de cualquier respuesta que te llegue del origen. La seguridad en el edge es una de nuestras señas de identidad, y a continuación vas a ver un ejemplo de lo que te permite conseguir. Vamos a ello.

Esta temporada están de moda los Grinch bots. Se trata de herramientas que verifican inventarios online y compran determinados productos demandados antes de que el consumidor pueda adquirirlos. El consumidor final no es el único perjudicado: tu empresa también podría serlo si recibe de estos bots altos volúmenes de peticiones destinadas a hacer barridos constantes de tu inventario. Estas peticiones suelen ir dirigidas a tu origen, que es donde se centralizan durante largo tiempo los registros del inventario.   

Para mitigar este problema de tráfico que afecta a tu origen, tienes varias opciones: almacenar en caché el inventario en el edge y purgar la caché únicamente cuando tengas que actualizar el inventario. También puedes bloquear este tipo de tráfico: solo tienes que detectar comportamientos no deseados respecto a una dirección IP concreta; devolver un código de respuesta personalizada, como el 406, mediante nuestro WAF de última generación; y dejar que el edge de Fastly bloquee esa IP durante el tiempo que tú definas.

Limitación del volumen en el edge y el penalty box

La limitación del volumen en el edge se encuentra en disponibilidad limitada (LA). Encontrarás documentación sobre los conceptos que vamos a utilizar en el resto del artículo en nuestro Developer Hub.

Funciona así: el edge recibe una respuesta de tipo 406 o 206 —este aspecto es personalizable—, y se añade client.ip al penalty box. A medida que los nodos del edge reciban peticiones posteriores procedentes de esa dirección IP, la IP quedará bloqueada en el edge con una respuesta 429. Habrá un pequeño retardo entre en el momento en que se añade client.ip al penalty box y el inicio de las acciones que los nodos del edge adoptan a medida que reciben peticiones. Para obtener más información relativa a este comportamiento, consulta la documentación que hemos elaborado sobre la limitación del volumen.

Es posible utilizar la funcionalidad nativa de limitación del volumen en el edge para contabilizar peticiones. Sin embargo, en muchas ocasiones conviene tener un recuento más fiable de las peticiones de cliente antes de adoptar cualquier acción (p. ej., el bloqueo). Esta tarea es sencillísima si despliegas nuestro WAF de última generación en tu origen. O bien podrías utilizar lógica de origen existente para realizar el recuento y devolver el código de estado de bloqueo.

Todo gira en torno a las funciones ratelimit.penaltybox_add y ratelimit.penaltybox_has: ratelimit.penaltybox_add permite añadir la dirección IP asociada a usos indebidos al penalty box y ratelimit.penaltybox_has permite verificar las peticiones posteriores para su inclusión en el penalty box. Si un nodo del edge detecta que una petición se añade al penalty box, esta queda bloqueada.

A continuación puedes ver el fragmento de código íntegro. Este fragmento se insertó en la ubicación init. Antes de implementar este fragmento en los servidores de producción, te recomendamos que hagas pruebas para asegurarte de que tu aplicación va a funcionar con normalidad.

# Snippet rate-limiter-v1-origin_waf_response-init-init : 100
# Begin rate-limiter Fastly Edge Rate Limiting
penaltybox rl_origin_waf_response_pb {}
ratecounter rl_origin_waf_response_rc {}


table rl_origin_waf_response_methods {
  "GET": "true",
  "PUT": "true",
  "TRACE": "true",
  "POST": "true",
  "HEAD": "true",
  "DELETE": "true",
  "PATCH": "true",
  "OPTIONS": "true",
}


# Start rate-limiter Fastly Edge Rate Limiting
sub vcl_recv {
    # call rl_origin_waf_response_process;
      if (req.restarts == 0 && fastly.ff.visits_this_service == 0
      && table.contains(rl_origin_waf_response_methods, req.method)
      ) {
        if (ratelimit.penaltybox_has(rl_origin_waf_response_pb, client.ip)) {
            error 829 "Rate limiter: Too many requests for origin_waf_response";
        }
      }
}
# End rate-limiter Fastly Edge Rate Limiting


# Start check backend response status code
sub vcl_fetch {
    # perform check based on the origin response. 206 status makes for easier testing and reporting
    if (beresp.status == 406 || beresp.status == 206) {
        log "406 or 206 response";
        ratelimit.penaltybox_add(rl_origin_waf_response_pb, client.ip, 10m);
    }
}
# End check backend response status code


# Start useful troubleshooting based on the response
sub vcl_deliver {
  if (req.http.fastly-debug == "1"){
    set resp.http.X-ERL-PenaltyBox-has = ratelimit.penaltybox_has(rl_origin_waf_response_pb, client.ip);
  }
}
# End useful troubleshooting based on the response


sub vcl_error {
    # Snippet rate-limiter-v1-origin_waf_response-error-error : 100
    # Begin rate-limiter Fastly Edge Rate Limiting - default edge rate limiting error - origin_waf_response
  if (obj.status == 829 && obj.response == "Rate limiter: Too many requests for origin_waf_response") {
    set obj.status = 429;
    set obj.response = "Too Many Requests";
    set obj.http.Content-Type = "text/html";
    synthetic.base64 "PGh0bWw+Cgk8aGVhZD4KCQk8dGl0bGU+VG9vIE1hbnkgUmVxdWVzdHM8L3RpdGxlPgoJPC9oZWFkPgoJPGJvZHk+CgkJPHA+VG9vIE1hbnkgUmVxdWVzdHMgdG8gdGhlIHNpdGUgLSBGYXN0bHkgRWRnZSBSYXRlIExpbWl0aW5nPC9wPgoJPC9ib2R5Pgo8L2h0bWw+Cg==";
    return(deliver);
  }
    # End rate-limiter Fastly Edge Rate Limiting - default edge rate limiting error - origin_waf_response
}

¿Hay una demo?

Una de mis herramientas de generación de cargas favoritas es siege. La he utilizado en el siguiente ejemplo, que incluye un comando que permite devolver una respuesta 206 al edge de Fastly. Una vez que se haya implementado la funcionalidad, el comando añade mi dirección IP al penalty box. Tendrás que actualizar el comando especificando tu dominio y habilitar la función de limitación de volumen en el edge en tu cuenta. Como ya he dicho, es normal que varias peticiones consigan llegar al origen a medida que los nodos empiezan a verificar el contenido del penalty box.

! siege https://[yourdomain.foo.bar]/206 -t 15s
** SIEGE 4.1.1
** Preparing 25 concurrent users for battle.
The server is now under siege...
HTTP/1.1 206     0.17 secs:      19 bytes ==> GET  /206
HTTP/1.1 206     0.17 secs:      19 bytes ==> GET  /206
HTTP/1.1 206     0.17 secs:      19 bytes ==> GET  /206


#### Removed for brevity ####


HTTP/1.1 429     0.09 secs:     151 bytes ==> GET  /206
HTTP/1.1 429     0.08 secs:     151 bytes ==> GET  /206
HTTP/1.1 429     0.09 secs:     151 bytes ==> GET  /206
HTTP/1.1 429     0.08 secs:     151 bytes ==> GET  /206


Lifting the server siege...
Transactions:		        3797 hits
Availability:		      100.00 %
Elapsed time:		       14.58 secs
Data transferred:	        0.50 MB
Response time:		        0.09 secs
Transaction rate:	      260.43 trans/sec
Throughput:		        0.03 MB/sec
Concurrency:		       22.65
Successful transactions:         386
Failed transactions:	           0
Longest transaction:	        0.54
Shortest transaction:	        0.06

Pruébalo ya

Los Grinch bots no son más que un caso de uso. El penalty box permite acceder a cualquier tipo de identificador arbitrario, con lo que esta solución también puede aplicarse en situaciones como las siguientes:

  • Un alto volumen de peticiones que proceden de números de sistema autónomo (ASN) sospechosos y que no generan ingresos.

  • El uso de un elevado número de credenciales no seguras en puntos de conexión de inicio de sesión.

  • Códigos de respuesta de tipo 400 o 500 provocados por un alto volumen de peticiones.

Y esto es solo una pequeña muestra de las posibilidades que tienes a tu alcance si combinas las peticiones enriquecidas con Fastly. ¿Se te ocurren más ejemplos? ¡Cuéntanoslo en Tweeter! Y mantente al tanto de otros ejemplos de las increíbles posibilidades que ofrecen las funciones de seguridad en el edge.