Clicky

Bloquear malos robots usando Mod_security de Apache

bloquear robots

En particular, cómo bloquear al buscador ruso Yandex

Ya he escrito anteriormente sobre los accesos indeseados de direcciones IP procedentes de Rusia y Ucrania, y verdaderamente la solución funciona.

Pero en los logs del servidor esos accesos aparecen ahora como "denegados por la configuración del servidor", tal que así:

[Sun Feb 05 15:31:22.576104 2017] [access_compat:error] [pid 3683:tid 139689264584448] [client 141.8.184.104:53515] AH01797: client denied by server configuration: /home/usuario/public_html/

Para evitar estos molestos registros (el anterior pertenece al robot del buscador ruso Yandex) vamos a endurecer aún más los accesos de determinados crawlers de buscadores que están reconocidos como perjudiciales.

Algunos webcrawlers (es decir, Bots) son importantes para el bienestar del sitio web. Algunos de estos incluyen GoogleBot, msnbot, Yahoo! Slurp, etc.. Pero también hay por ahí un montón de robots que no hacen nada para ayudarte, y realmente pueden dañar mediante el uso de valioso ancho de banda.

Este breve tutorial mostrará cómo puede implementarse un mecanismo de bloqueo para todos los dominios del servidor mediante reglas modsec que se orientan a los User-Agents asociados a "Bad Bots". Algunos de los Bad Bots que yo estaba cansado de ver en mis registros incluyen:

- Yandex
- Baidu Spider
- AhrefsBot
- linkdex

Hay tres sencillos pasos para este proceso, como sigue:

1) Crear un archivo badbots.txt que contiene los agentes de usuario que deseamos bloquear
2) Crear una regla modsec
3) Reiniciar Apache

Estas instrucciones son para un sistema CentOS Linux 7.3 (basado en RedHat) y asumimos que ya tienes Apache y mod_security configurados y que tienes acceso root.

¡Hagámoslo!

1) Crea un archivo llamado /etc/httpd/conf.d/badbots.txt e incluye lo siguiente:

AhrefsBot
Anonymizer
Attributor
Baidu
Bork-edition
DataCha0s
Deepnet Explorer
desktopsmiley
DigExt
feedfinder
gamingharbor
heritrix
ia_archiver
Indy Library
Jakarta
Java
juicyaccess
larbin
linkdex
Missigua
MRSPUTNIK
Nutch
panscient
plaNETWORK
Snapbot
Sogou
TinEye
TwengaBot
Twitturly
User-Agent
Viewzi
WebCapture
XX
Yandex
YebolBot

Una vez que hayas guardado el archivo badbots.txt, desearás completar el segundo paso, de la siguiente manera:

2) Crear una regla modsec en /etc/httpd/conf.d/00_mod_security.conf

SecRule REQUEST_HEADERS:User-Agent "@pmFromFile badbots.txt" "id:350001,rev:1,severity:2,log,msg:'BAD BOT - Detected and Blocked. '"

Esta regla filtra cada solicitud del servidor web y comprueba el agente de usuario en la lista de badbots.txt.

3) El paso final es reiniciar el servidor web Apache:

# systemctl restart httpd.service

Una vez completados estos tres pasos, verás las denegaciones en los registros de errores de tu servidor. Cada Bot malo que visite tu sitio (s) será negado con un error 406 [No Aceptable], así se ve el log:

[Sun Feb 05 16:53:12.674531 2017] [:error] [pid 9166:tid 140675639125760] [client 51.255.66.116:28550] [client 51.255.66.116] ModSecurity: [file "/etc/httpd/conf.d/00_mod_security.conf"] [line "25"] [id "350001"] [rev "1"] [msg "BAD BOT - Detected and Blocked. "] [severity "CRITICAL"] Warning. Matched phrase "AhrefsBot" at REQUEST_HEADERS:User-Agent. [hostname "pirman.es"] [uri "/videos/los-hamsters-silvestres-de-francia-se-convierten-en-canibales-enloquecidos-por-la-dieta-de"] [unique_id "WJdKaKv4lN8xp-iH61kAVAAAAQo"]

Una vez que estés contento con la forma en que las cosas están funcionando, puedes cambiar de "log" a "nolog" en tu regla modsec para que no sean escritos los registros en los logs del servidor/es virtuales.

BONUS

1) Además podemos bloquear determinados webcrawlers directamente desde nuestra configuración de Apache usando <LocationMatch> en el archivo /etc/httpd/conf/httpd.conf, como en el ejemplo siguiente:

# Deshacerse de los robots que son demasiado estúpidos para respetar robots.txt
<LocationMatch "/[^/]+/(browser|changeset|log)">
BrowserMatchNoCase googlebot ImBot
BrowserMatchNoCase Yandex ImBot
BrowserMatchNoCase bingbot ImBot
Order allow,deny
Allow from all
Deny from env=ImBot
</LocationMatch>

2) Intentarlo de la manera clásica con el archivo robots.txt

User-agent: Yandex
User-agent: AhrefsBot
User-agent: Baidu
User-agent: linkdex
Disallow: /

3) Podemos también bloquearlos con el archivo .htaccess

RewriteCond %{HTTP_USER_AGENT} ^Baiduspider [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^linkdex
RewriteRule ^.*$ "“ [F]

Explicación:

Los diversos Agentes de Usuario (User Agents) a los que se debe bloquear el acceso se enumeran uno por línea.
Las condiciones de Reescritura están conectadas a través de "OR".
"NC": "no case" - ejecución no sensible a mayúsculas y minúsculas.
El carácter "^" del cursor especifica que el Agente de Usuario debe comenzar con la cadena listada (por ejemplo, "Baiduspider").
"[F]" sirve al webcrawler una instrucción "Forbidden (Prohibido)".

Por lo tanto, si deseas bloquear al bot de Yandex, por ejemplo, puedes utilizar el código siguiente:

RewriteCond %{HTTP_USER_AGENT} Yandex

En este caso particular, el bloqueo se efectuará siempre que la cadena "Yandex" ocurra en el identificador del agente de usuario.

También puedes pedir a Yandex que te eliminen la URL del buscador en esta dirección: https://webmaster.yandex.ru/tools/del-url/

Recibirás un amable correo electrónico en ruso como este:

*** Это письмо сформировано автоматически, отвечать на него не нужно ***

Ваша заявка «IP spammer» получена.

Дата: 05.02.2017 16:56.

Ей присвоен номер 2017020521049062. Просьба при ответах не изменять тему письма и присвоенный заявке номер.

Мы с вами обязательно свяжемся.

Спасибо.

4) Lo podemos hacer también con IPtables sabiendo el rango de IPs del webcrawler, por ejemplo para Baidu escribiríamos:

iptables -A INPUT -s 119.63.193.0/24 -j DROP
iptables -A INPUT -s 180.76.0.0/20 -j DROP
iptables -A INPUT -s 180.76.2.0/24 -j DROP
iptables -A INPUT -s 180.76.3.0/24 -j DROP
iptables -A INPUT -s 180.76.5.0/24 -j DROP
iptables -A INPUT -s 180.76.6.0/24 -j DROP
iptables -A INPUT -s 180.76.8.0/24 -j DROP
iptables -A INPUT -s 180.76.9.0/24 -j DROP
iptables -A INPUT -s 180.76.11.0/24 -j DROP
iptables -A INPUT -s 180.76.12.0/24 -j DROP
iptables -A INPUT -s 185.10.104.0/24 -j DROP
iptables -A INPUT -s 185.10.105.0/24 -j DROP
iptables -A INPUT -s 203.90.238.0/24 -j DROP

Ahora deberías entender cómo impedir el acceso a tu sitio web usando múltiples formas.

Jesus_Caceres