Mejores prácticas para la limitación de velocidad
Las siguientes secciones tratan sobre las configuraciones típicas de limitación de velocidad para casos de uso comunes. Puede combinar las reglas de ejemplo proporcionadas y ajustarlas a su propio escenario.
Los principales casos de uso de la limitación de velocidad son los siguientes:
- Aplique un control de acceso granular a los recursos, que incluye el control de acceso basado en criterios como el agente de usuario, la dirección IP, el referente, el host, el país y la región del mundo.
- Protegerse contra los ataques de relleno de credenciales y apropiación de cuentas.
- Limitar el número de operaciones realizadas por clientes individuales. Incluye la prevención del rastreo por parte de bots, el acceso a datos confidenciales, la creación masiva de nuevas cuentas y la compra programática en plataformas de comercio electrónico.
- Proteja las API REST contra el agotamiento de recursos (ataques DDoS dirigidos) y los recursos contra el abuso en general.
- Proteja GraphQL las API evitando la sobrecarga del servidor y limitando el número de operaciones.
Aplicación de un control de acceso granular
Puede utilizar la limitación de velocidad para controlar cómo los usuarios y las aplicaciones acceden a sus recursos. La limitación de velocidad ayuda a proteger su aplicación contra el uso indebido al restringir el tráfico en función de atributos como el agente de usuario, la dirección IP, el referente o el host.
Cada uno de los siguientes ejemplos muestra cómo configurar una regla de limitación de velocidad para un escenario de control de acceso específico.
Limitación de solicitudes por agente de usuario
Puede restringir el número de solicitudes permitidas para un agente de usuario específico. El siguiente ejemplo de regla permite a los usuarios de aplicaciones móviles realizar hasta 100 solicitudes cada 10 minutos. También puede crear una regla independiente que limite la velocidad para los navegadores de escritorio.
| Valor | Valor |
|---|---|
| Criterio de coincidencia | El agente de usuario es igual a MobileApp |
| Expresión | http.user_agent eq "MobileApp" |
| Características de recuento | IP |
| Tasa (solicitudes/período) | 100 solicitudes / 10 minutos |
| Acción | Reto gestionado |
Permitir direcciones IP específicas o ASN
Controle el acceso incluyendo o excluyendo determinadas direcciones IP o números de sistema autónomo (ASN) de una regla de limitación de velocidad.
El siguiente ejemplo de regla de limitación de velocidad permite hasta 10 solicitudes por minuto desde la misma dirección IP y realizar una GET solicitud a la /status ruta, siempre que la dirección IP no esté incluida
en la lista de IP titulada partner_ips.
| Valor | Valor |
|---|---|
| Criterio de coincidencia | La ruta URI es igual a /status y el método de solicitud es igual a GET y la dirección IP de origen no está en la lista. partner_ips |
| Expresión | http.request.uri.path eq "/status" and http.request.method eq "GET" and not ip.src in $partner_ips |
| Características de recuento | IP |
| Tasa (solicitudes/período) | 10 solicitudes / 1 minuto |
| Acción | Reto gestionado |
Limitar las solicitudes por referenciador
Puede limitar las solicitudes que se originan en páginas de referencia, como anuncios de terceros o sitios web externos. Este caso de uso ayuda a reducir el riesgo de ataques indirectos de denegación de servicio ( DDoS ) y le ayuda a gestionar las cuotas de solicitudes.
| Valor | Valor |
|---|---|
| Criterio de coincidencia | La ruta URI es igual a /status y el método de solicitud es igual a GET |
| Expresión | http.request.uri.path eq "/status" and http.request.method eq "GET" |
| Características de recuento | Encabezado (Referrer). El nombre HTTP del encabezado utiliza una grafía incorrecta de referrer. |
| Tasa (solicitudes/período) | 100 solicitudes / 10 minutos |
| Acción | Bloquear |
Esta regla de ejemplo requiere la limitación de velocidad avanzada.
Protección contra el relleno de credenciales
Puede utilizar la limitación de tasa para proteger los puntos finales de inicio de sesión frente a ataques de credential stuffing. El relleno de credenciales se produce cuando los atacantes utilizan scripts automatizados para probar múltiples combinaciones de nombre de usuario y contraseña en un formulario de inicio de sesión. La limitación de velocidad ayuda a mitigar estos ataques al restringir los intentos repetidos de inicio de sesión fallidos desde la misma dirección IP.
Los siguientes ejemplos muestran tres reglas de limitación de velocidad que aumentan las restricciones y las sanciones en función del número de intentos fallidos de inicio de sesión.
Regla 1: Umbral de protección inicial
La regla 1 permite hasta cuatro intentos fallidos de inicio de sesión por minuto. Cuando se supera el límite, el sistema activa un desafío gestionado. Esta configuración ayuda a los usuarios legítimos a recuperarse de errores ocasionales de inicio de sesión, al tiempo que desalienta a los bots automatizados.
| Valor | Valor |
|---|---|
| Criterio de coincidencia | El nombre de host es igual a example.com y la ruta URI es igual a /login y el método de solicitud es igual a POST |
| Expresión | http.host eq "example.com" and http.request.uri.path eq "/login" and http.request.method eq "POST" |
| Características de recuento | IP |
| Incrementar contador cuando | La ruta URI es igual a /login y el método es igual a POST y el código de respuesta está entre (401, 403) |
| Expresión de recuento | http.request.uri.path eq "/login" and http.request.method eq "POST" and http.response.code in {401 403} |
| Tasa (solicitudes/período) | 4 solicitudes / 1 minuto |
| Acción | Reto gestionado |
Regla 2: Umbral de protección intermedio
Si los usuarios legítimos superan el desafío al alcanzar el límite de la regla 1, la regla 2 aplica una protección adicional para los clientes que continúan realizando intentos fallidos de inicio de sesión. Permite hasta 10 intentos fallidos en 10 minutos antes de activar otro desafío gestionado.
| Valor | Valor |
|---|---|
| Criterio de coincidencia | El nombre de host es igual a example.com y la ruta URI es igual a /login y el método de solicitud es igual a POST |
| Expresión | http.host eq "example.com" and http.request.uri.path eq "/login" and http.request.method eq "POST" |
| Características de recuento | IP |
| Incrementar contador cuando | La ruta URI es igual a /login y el método de solicitud es igual a POST y el código de estado de la respuesta está entre (401, 403) |
| Expresión de recuento | http.request.uri.path eq "/login" and http.request.method eq "POST" and http.response.code in {401 403} |
| Tasa (solicitudes/período) | 10 solicitudes / 10 minutos |
| Acción | Reto gestionado |
Regla 3: Umbral de protección estricto
La regla 3 impone una sanción más severa a los clientes que superan el umbral de la regla 2, bloqueando una dirección IP durante un día tras 20 intentos fallidos de inicio de sesión en una hora. Esta regla proporciona una defensa definitiva contra los intentos de ataque persistentes.
| Valor | Valor |
|---|---|
| Criterio de coincidencia | El anfitrión es igual a example.com |
| Expresión | http.host eq "example.com" |
| Características de recuento | IP |
| Incrementar contador cuando | La ruta URI es igual a /login y el método de solicitud es igual a POST y el código de estado de la respuesta está entre (401, 403) |
| Expresión de recuento | http.request.uri.path eq "/login" and http.request.method eq "POST" and http.response.code in {401 403} |
| Tasa (solicitudes/período) | 20 solicitudes / 1 hora |
| Acción | Bloqueo durante 1 día |
Todas estas reglas de ejemplo requieren un plan Business o superior.
Estas tres reglas tienen una expresión de recuento separada de la expresión de la regla (también conocida como expresión de mitigación). Cuando se configura una expresión de recuento independiente, los criterios de coincidencia se utilizan cuando se activa una acción. En la expresión de recuento, puede incluir condiciones basadas en el código de HTTP estado de la respuesta y los HTTP encabezados de la respuesta para integrar la limitación de velocidad con su lógica de backend.
También puede optar por utilizar dos expresiones diferentes: una expresión de recuento y una expresión de regla/mitigación, para definir:
- Las solicitudes utilizadas para calcular la tasa.
- Las solicitudes que realmente se llevaron a cabo.
Por ejemplo, el ejemplo de la regla 3 calcula la tasa teniendo en cuenta POST las solicitudes que /login devolvieron un código de 401 estado 403HTTP o. Sin embargo, cuando se supera el límite
de velocidad, CIS bloquea todas las solicitudes al example.com host generadas por la misma IP.
Limitar el número de operaciones
Puede utilizar la limitación de velocidad para controlar cuántas operaciones realiza un cliente en un período de tiempo específico. Las reglas que configure dependerán del comportamiento y el perfil de riesgo de su aplicación.
Los siguientes ejemplos muestran cómo evitar el rastreo de contenido y las actividades automatizadas que pueden sobrecargar su sistema o hacer un uso indebido de sus datos. Algunos ejemplos son limitar las solicitudes por cadena de consulta, parámetros del cuerpo JSON o características del bot.
Prevención del scraping de contenido mediante el uso de cadenas de consulta
En este ejemplo, los clientes realizan operaciones (como consultar precios o añadir artículos a una cesta) en un sitio web de comercio electrónico a través de parámetros de cadena de consulta. Por ejemplo, una solicitud típica enviada por un cliente podría ser similar a la siguiente:
GET https://store.com/merchant?action=lookup_price&product_id=215
Cookie: session_id=12345
Tu equipo de seguridad podría considerar establecer un límite en el número de veces que un cliente puede consultar los precios para evitar que los bots —que podrían haber eludido la gestión CIS de bots— recopilen todo el catálogo de la tienda.
| Valor | Valor |
|---|---|
| Criterio de coincidencia | La ruta URI es igual a /merchant y la cadena de consulta URI contiene action=lookup_price |
| Expresión | http.request.uri.path eq "/merchant" and http.request.uri.query contains "action=lookup_price" |
| Características de recuento | IP |
| Tasa (solicitudes/período) | 10 solicitudes / 2 minutos |
| Acción | Reto gestionado |
| Valor | Valor |
|---|---|
| Criterio de coincidencia | La ruta URI es igual a /merchant y la cadena de consulta URI contiene action=lookup_price |
| Expresión | http.request.uri.path eq "/merchant" and http.request.uri.query contains "action=lookup_price" |
| Características de recuento | IP |
| Tasa (solicitudes/período) | 20 solicitudes / 5 minutos |
| Acción | Bloquear |
Estas dos reglas de limitación de frecuencia coinciden con las solicitudes que realizan una acción seleccionada (en este ejemplo, consultar el precio) y utilizan IP como característica de recuento. De manera similar al ejemplo de /login, las dos reglas ayudan a reducir los falsos positivos en el caso de visitantes persistentes (pero legítimos).
Puede limitar la búsqueda de un elemento específico product_id utilizando un parámetro de cadena de consulta. Al añadir un parámetro de consulta como característica de recuento, la tasa se calcula para todas las solicitudes, independientemente
del cliente.
El siguiente ejemplo limita el número de búsquedas para cada product_id a 50 solicitudes en 10 segundos.
| Valor | Valor |
|---|---|
| Criterio de coincidencia | La ruta URI es igual a /merchant |
| Expresión | http.request.uri.path eq "/merchant" |
| Características de recuento | Consulta (product_id) |
| Tasa (solicitudes/período) | 20 solicitudes / 10 segundos |
| Acción | Bloquear |
Esta regla de ejemplo requiere la limitación de velocidad avanzada.
Puede seguir el mismo patrón de reglas de limitación de velocidad para proteger las aplicaciones que gestionan reservas y contrataciones.
Prevención del scraping de contenido mediante el uso del cuerpo de la solicitud
Considera una aplicación que gestiona la operación y sus parámetros a través del cuerpo de la solicitud en formato JSON. Por ejemplo, la operación lookup_price podría ser similar a la siguiente:
POST https://api.store.com/merchant
Cookie: session_id=12345
Body:
{
"action": "lookup_price",
"product_id": 215
}
En este escenario, puede crear la siguiente regla para limitar el número de acciones de sesiones individuales:
| Valor | Valor |
|---|---|
| Criterio de coincidencia | La ruta URI es igual a /merchant y la cadena JSON es action igual a lookup_price |
| Expresión | http.request.uri.path eq "/merchant" and lookup_json_string(http.request.body.raw, "action") eq "lookup_price" |
| Características de recuento | Cookie (session_id) |
| Tasa (solicitudes/período) | 10 solicitudes / 2 minutos |
| Acción | Reto gestionado |
Esta regla de ejemplo requiere limitación de velocidad avanzada e inspección de carga útil.
También puede limitar el número de búsquedas de cada product_id uno, independientemente del cliente que realice las solicitudes, aplicando una regla como la siguiente:
| Valor | Valor |
|---|---|
| Criterio de coincidencia | La ruta URI es igual a /merchant y el campo JSON es action igual a lookup_price |
| Expresión | http.request.uri.path eq "/merchant" and lookup_json_string(http.request.body.raw, "action") eq "lookup_price" |
| Características de recuento | Campo JSON (product_id) |
| Tasa (solicitudes/período) | 50 solicitudes / 10 segundos |
| Acción | Bloquear |
Esta regla de ejemplo requiere limitación de velocidad avanzada e inspección de carga útil.
Si el cuerpo de la solicitud no está en formato JSON, puede utilizar el http.request.body.raw campo y expresiones regulares (junto con el operador de coincidencias ) para lograr el mismo objetivo.
Limitar las solicitudes de los bots
Puedes utilizar la limitación de velocidad para controlar el tráfico automatizado de los bots. Un enfoque común consiste en supervisar las solicitudes que devuelven un número elevado de códigos de 403 estado de 404 respuesta o, que a menudo indican una actividad de scraping automatizada.
En esta situación, puede configurar una regla similar a la siguiente:
| Valor | Valor |
|---|---|
| Criterio de coincidencia | El nombre de host es igual a example.com |
| Expresión | http.host eq "example.com" |
| Características de recuento | IP |
| Incrementar contador cuando | El código de estado de respuesta es (401, 403) |
| Expresión de recuento | http.response.code in {401 403} |
| Tasa (solicitudes/período) | 5 solicitudes / 3 minutos |
| Acción | Reto gestionado |
Esta regla de ejemplo requiere un plan Business o superior.
Para controlar la frecuencia de las acciones realizadas por fuentes automatizadas, considere la posibilidad de utilizar reglas de limitación de uso junto con la gestión de bots.
Con Bot Management, puede utilizar la puntuación del bot como parte de los criterios de coincidencia para aplicar la regla solo al tráfico automatizado o que probablemente
sea automatizado. Por ejemplo, puede utilizar una puntuación máxima (o umbral) de 30 para el tráfico probablemente automatizado y 10 para el tráfico automatizado.
Puede mejorar la protección combinando la limitación de velocidad con la gestión de bots. Con Bot Management, puede utilizar la puntuación del bot como parte de los criterios de coincidencia para aplicar la regla solo al tráfico automatizado o que probablemente sea automatizado.
Por ejemplo:
- Una puntuación de bot inferior a
30representa probablemente tráfico automatizado. - Una puntuación de bot inferior a
10representa tráfico automatizado confirmado.
Limitar las solicitudes por sesión
Si su aplicación utiliza cookies de sesión, utilice la cookie como característica de recuento. Este método agrupa las solicitudes procedentes de diferentes direcciones IP dentro de la misma sesión, lo que resulta útil para detectar ataques distribuidos de bots.
Regla 1
| Valor | Valor |
|---|---|
| Criterio de coincidencia | Puntuación del bot inferior a 30 y la cadena de consulta URI contiene action=delete |
| Expresión | cis.bot_management.score lt 30 and http.request.uri.query contains "action=delete" |
| Características de recuento | Cookie (session_id) |
| Tasa (solicitudes/período) | 10 solicitudes / 1 minuto |
| Acción | Reto gestionado |
Regla 2
| Valor | Valor |
|---|---|
| Criterio de coincidencia | Puntuación del bot inferior a 10 y la cadena de consulta URI contiene action=delete |
| Expresión | cis.bot_management.score lt 10 and http.request.uri.query contains "action=delete" |
| Características de recuento | Cookie (session_id) |
| Tasa (solicitudes/período) | 20 solicitudes / 5 minutos |
| Acción | Bloquear |
Estas reglas de ejemplo requieren la limitación de velocidad avanzada y la gestión de bots.
Uso de JA3 huellas dactilares
Si la aplicación no utiliza una cookie de sesión, puede utilizar JA3 huellas digitales para identificar a los clientes individuales. Una JA3 huella digital es un identificador único, disponible para los clientes con Bot Management, que permite CIS identificar las solicitudes procedentes del mismo cliente. Todos los clientes tienen una huella digital asociada, sean automatizados o no.
| Valor | Valor |
|---|---|
| Criterio de coincidencia | La ruta URI es igual a /merchant y la puntuación del bot es inferior a 10 |
| Expresión | http.request.uri.path eq "/merchant" and cf.bot_management.score lt 10 |
| Características de recuento | JA3 Huella digital |
| Tasa (solicitudes/período) | 10 solicitudes / 1 minuto |
| Acción | Reto gestionado |
Esta regla de ejemplo requiere la limitación de velocidad avanzada y la gestión de bots.
Protección de las API REST
Las API REST pueden generar una gran carga en los sistemas backend, ya que las solicitudes de API suelen requerir un procesamiento intensivo o búsquedas de datos de gran tamaño. El acceso no controlado a la API puede provocar una disminución del rendimiento o incluso tiempo de inactividad. Utilice la limitación de velocidad avanzada para evitar abusos, mitigar ataques volumétricos y proteger recursos críticos.
Protección de recursos
Incluso GET las solicitudes pueden sobrecargar la aplicación o consumir ancho de banda cuando se utilizan para descargas de datos de gran tamaño, como archivos o imágenes.
Por ejemplo, consideremos el siguiente punto final:
GET https://api.store.com/files/<FILE_ID>
Header: x-api-key=9375
Para evitar abusos y permitir al mismo tiempo las descargas legítimas, puede definir una regla que limite las solicitudes de archivos sin necesidad de escribir reglas separadas para cada archivo.
| Valor | Valor |
|---|---|
| Criterio de coincidencia | El nombre de host es igual a api.example.com y el método de solicitud es igual a GET |
| Expresión | http.host eq "api.example.com" and http.request.method eq "GET" |
| Características de recuento | Vía de acceso |
| Tasa (solicitudes/período) | Según lo sugerido por API Discovery o evaluado mediante el análisis del tráfico anterior. |
| Acción | Bloquear |
Esta regla de ejemplo requiere la limitación de velocidad avanzada.
Esta regla limita las descargas a 10 solicitudes por cada 10 minutos por archivo en https://api.store.com/files/*. Al utilizar Path como característica de recuento, se evita tener que crear nuevas reglas para cada nuevo <FILE_ID>.
La tarifa se calcula por archivo, independientemente de la IP del cliente o del ID de sesión.
Puede reforzar aún más la protección combinándolo Path con un identificador de cliente como x-api-key o IP. Este enfoque le permite restringir el número de descargas que un cliente específico puede realizar
para un archivo determinado.
| Valor | Valor |
|---|---|
| Criterio de coincidencia | El nombre de host es igual a api.store.com y el método de solicitud es igual a GET |
| Expresión | http.host eq "api.example.com" and http.request.method eq "GET" |
| Características de recuento | Ruta y encabezado (x-api-key) |
| Tasa (solicitudes/período) | Según lo sugerido por API Discovery o evaluado mediante el análisis del tráfico anterior. |
| Acción | Bloquear |
Esta regla de ejemplo requiere la limitación de velocidad avanzada.
Protección de GraphQL API
Prevenir la sobrecarga del servidor para GraphQL las API puede ser diferente a prevenir la sobrecarga para las API RESTful. Uno de los mayores retos que plantean las aplicaciones creadas en GraphQL es que una única ruta gestiona todas las consultas
al servidor, y cada solicitud suele ser una POST operación. Esto evita crear diferentes límites de velocidad para diferentes API en función del HTTP método y la ruta URI.
Sin embargo, en lugar de utilizar el método y la ruta como una API RESTful, el propósito de la solicitud suele estar integrado en el cuerpo, que contiene información sobre los datos que el cliente desea recuperar o mutar (según GraphQL's la terminología para la modificación de datos del lado del servidor), junto con cualquier dato adicional que sea necesario para llevar a cabo la acción.
Para evitar la sobrecarga del servidor, considere los siguientes enfoques:
- Limita el número de veces que un usuario concreto puede llamar al mismo nombre GraphQL de operación.
- Limitar la complejidad total de las consultas que cualquier usuario puede solicitar.
- Limite la complejidad de las consultas de cualquier solicitud individual.
Los siguientes ejemplos se basan en una aplicación que acepta reseñas de películas.
POST https://moviereviews.example.com/graphql
Cookie: session_id=12345
Body:
{
"data": {
"createReview": {
"stars": 5,
"commentary": "This is a great movie!"
}
}
}
Limitar el número de operaciones
Para limitar la frecuencia de las acciones, cree la siguiente regla:
| Valor | Valor |
|---|---|
| Criterio de coincidencia | La ruta URI es igual a /graphql y el cuerpo contiene createReview |
| Expresión | http.request.uri.path eq "/graphql" and http.request.body.raw contains "createReview" |
| Características de recuento | Cookie (session_id) |
| Tasa (solicitudes/período) | 5 solicitudes / 1 hora |
| Acción | Bloquear |
Esta regla de ejemplo requiere limitación de velocidad avanzada e inspección de carga útil.
Limitar la complejidad total de las consultas
La complejidad de gestionar una GraphQL solicitud puede variar significativamente. Dado que la API utiliza un único punto final, puede resultar difícil determinar la complejidad de cada solicitud antes de que se procese.
Para evitar el agotamiento de los recursos en el servidor de origen, limite la complejidad total de las solicitudes por cliente a lo largo del tiempo, en lugar de limitar el número de solicitudes. CIS La limitación de velocidad le permite crear reglas que realizan un seguimiento de la complejidad a lo largo del tiempo y bloquean las solicitudes que superan un presupuesto de complejidad definido.
Este método requiere que el servidor de origen asigne una puntuación de complejidad a cada solicitud e incluya dicha puntuación en el HTTP encabezado de respuesta. El mecanismo de limitación de velocidad utiliza entonces la información de puntuación para actualizar el presupuesto de complejidad para ese cliente específico.
El siguiente ejemplo define un presupuesto total de complejidad de 1000 por hora:
| Valor | Valor |
|---|---|
| Criterio de coincidencia | La ruta URI contiene /graphql |
| Expresión | http.request.uri.path eq "/graphql" |
| Características de recuento | Cookie (session_id) |
| Puntuación por periodo | 1.000 |
| Punto | 1 hora |
| Nombre del encabezado de respuesta | score |
| Acción | Bloquear |
Esta regla de ejemplo requiere limitación de velocidad avanzada e inspección de carga útil.
Cuando el servidor de origen procesa una solicitud, añade un scoreHTTP encabezado a la respuesta con un valor que indica cuánto trabajo ha realizado el origen para gestionarla. Por ejemplo, 100. En la siguiente hora,
el mismo cliente puede realizar solicitudes hasta un presupuesto adicional de 900. Tan pronto como se supere este presupuesto, las solicitudes posteriores se bloquearán hasta que expire el tiempo de espera.
Limitar la complejidad de cualquier consulta individual
Los clientes de API Shield pueden utilizar la protección contra GraphQL consultas maliciosas para proteger sus GraphQL API. Esta función analiza el GraphQL tráfico entrante en busca de consultas que puedan sobrecargar el servidor de origen y provocar una condición de denegación de servicio.
Puede crear reglas para limitar la profundidad y el tamaño de las GraphQL consultas entrantes. Estas reglas ayudan a bloquear consultas sospechosas o excesivamente complejas antes de que afecten al rendimiento.