Restringir acceso a los bots (IA, scrappers, maliciosos) a tus webs

Enviado por christian el

Hace unos meses ya os había comentado aquí la forma de bloquear directamente los bots en vuestros sitios web si usáis Nginx

Qué ocurre? que en algunos casos pues lo de bloquear no siempre es la mejor idea.. En qué casos es mala idea?

  • Si bloqueamos algunos bots de Google, nuestro sitio no podrá ser indexado
  • Si bloqueamos bots de Meta y tenemos campañas publicitarias asociadas al dominio, las campañas no funcionarán correctamente
  • Incluso si bloqueamos algún bot sospechoso que realmente no es maligno.. pues estaremos perdiendo tráfico

 

Qué podemos hacer entonces?

Pues en vez de bloquear directamente, mitigar/reducir su accesos a nuestras webs. Con esto conseguimos evitar que los bots nos rompan los sitios pero al mismo tiempo le dejamos continuar con su trabajo

 

Cómo?

 Pues en nuestro caso, como estamos usando Nginx, con las directivas Rate-limits de requests. La configuración es bastante sencilla. Básicamente:

  1. Define las reglas de rate_limits (request por segundo, memoria, etc..)
  2. Asigna esas reglas a las urls que quieras (o a todo claro)

 

Ejemplo completo

Vamos a configurar un par de rate limits para un sitio en Nginx.

Primero creamos los rate limits dentro del fichero rate_limits.conf para que sea una config global de Nginx

# ARCHIVO: /etc/nginx/conf.d/rate_limits.conf 

# MAPEO PARA (POR EJEMPLO) FILTRAR URLS QUE SEAN DE BUSCAR
map $query_string $is_filter_url {
    default         ""; # Nada ¿? valor por de
    ~*"buscar"        $binary_remote_addr;  # buscar....
}


# DEFINIMOS LOS RATE_LIMITS
# COMANDO VARIABLE NOMBRE:MEMORIA RATE

# Limite global para todos con un máximo de 300 request por minuto y una memoria de IPs de 10m 
limit_req_zone $binary_remote_addr zone=global:10m rate=300r/m;
# Limite buscar para todos con un máximo de 100 request por minuto y una memoria de IPs de 10m 
limit_req_zone $is_filter_url zone=buscar:10m rate=100r/m;


# EXTRA: definimos los errores como warnign y devolvemos un 429
limit_req_log_level warn;
limit_req_status 429;

 

Segundo, en nuestro site-config, aplicamos los rate_limits:

server {
	.
	.
	.
	.
	
	# PARA TODAS LAS RUTAS
    location / {
        .
        .
        .

		# Activamos el global con un margen de 50 requests extra y las nuevas, se rechazan (nodelay)
		limit_req zone=global burst=50 nodelay;

		# Además activamos el buscar con el mismo margen y rechazo
		limit_req zone=filters burst=50 nodelay;

		.
		.
		.
    }

	.
	.
	.
	
}

 

 

Listo!!! Con esto ya estaría. De esta forma estamos mitigando posibles ataques o bots que se vuelven locos...

Dinahosting: dominios y alojamiento web
My investor

Regístrate en MyInvestory tendrás un extra de 20€ ! :D

 

Menciona que vienes de mi parte y te llevas un regalo en tu primera inversión :)

Usa el código U048395 y te llevas un regalo en tu primera inversión :)

 

Usa el código 22c80f y te llevas un regalo en tu primera inversión :)