Fail2ban es una herramienta de seguridad versátil. Aunque se usa principalmente para prevenir ataques de fuerza bruta contra SSH, también se puede usar para proteger otros servicios.
Hay bots que escanean Internet y envían miles de solicitudes a los servidores web con la esperanza de encontrar vulnerabilidades. Esta publicación trata sobre cómo bloquear dichos bots con Fail2ban.
Suponemos que está utilizando Apache como su servidor web. Sin embargo, estas instrucciones se pueden personalizar fácilmente para nginx o cualquier otro servidor web.
Sin embargo, debe tener en cuenta que Fail2ban no es un firewall de aplicaciones web (WAF) y no puede bloquear solicitudes maliciosas si pasan. Esto se debe a que fail2ban toma medidas al monitorear los registros; Por lo tanto, se debe registrar al menos un intento malicioso antes de que Fail2ban pueda tomar alguna medida.
¿Qué es un bot malo de todos modos?
En esta publicación, nos centraremos en bloquear bots que hagan cualquiera de las siguientes cosas:
- Busca en el sitio web un proxy abierto
- Envía una solicitud GET con parámetros que. contienen cargas útiles de inyección SQL
- Envía una solicitud GET con parámetros que. contienen cargas útiles de neurosis
Por supuesto, también puedes bloquear otros tipos de ataques. Sin embargo, nos limitamos a los tres casos mencionados anteriormente para este artículo.
Instalar Fail2ban
Fail2ban está disponible en el repositorio de la mayoría de las distribuciones.
Para instalarlo en Debian/Ubuntu ejecute:
sudo apt-get update sudo apt-get install fail2ban
En CentOS, primero debe usar el repositorio EPEL; Entonces deberías activarlo e iniciarlo.
sudo yum -y install epel-release sudo yum -y install fail2ban sudo systemctl enable fail2ban sudo systemctl start fail2ban
Conceptos básicos de Fail2ban
En el corazón del mecanismo de trabajo de Fail2ban se encuentran varias prisiones. En pocas palabras, una cárcel le indica a Fail2ban que mire una cantidad de registros y les aplique un filtro cada vez que cambie el registro. Si el número de coincidencias del filtro es igual al número máximo de coincidencias permitidas por la cárcel, se realiza una acción especificada en la cárcel.
Entonces necesitas definir dos cosas:un filtro y una cárcel. La cárcel está configurada para mirar los registros de Apache en busca de solicitudes maliciosas.
Definir filtros
Un filtro es simplemente una colección de expresiones regulares de Python que se comparan con un registro. Aquí tendríamos que definir filtros para los criterios descritos anteriormente.
Pero primero veamos una entrada en los registros de Apache:
66.249.79.189 - - [17/Jan/2017:14:10:41 +0000] "GET /robots.txt HTTP/1.1" 200 3494 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +https: //www.google.com/bot.html)"
Observe que el encabezado de la solicitud GET /robots.txt HTTP/1.1
está entre comillas dobles. Si diseña tales reglas usted mismo, debe tener el cuidado suficiente para asegurarse de que solo coincida el encabezado de la solicitud. De lo contrario, corre el riesgo de bloquear a usuarios legítimos.
Las cargas útiles de inyección de SQL generalmente contienen cadenas de la forma union select(...)
o select concat (...)
. Así que puedes intentar hacer coincidir este patrón con la siguiente expresión regular:
(?i)^<HOST> -.*"[^"]+(?:union[^"]+select[^"]*|select[^"]+concat[^"]*)(?:%%2[8C]|[,(])
el <HOST>
La parte define la posición de la dirección IP en la entrada de registro y el (?i)
indica que la expresión regular no distingue entre mayúsculas y minúsculas.
el [^"]
en la expresión regular garantiza que el texto coincidente esté entre comillas dobles. Esto garantiza que la expresión regular solo coincida con el encabezado de la solicitud y nada más. el (?:%%2[8C]|[,(])
indica que el union select
o select concat
una coma sigue en consecuencia (,
) o un corchete ((
), ya sea directamente o en su forma codificada por porcentaje.
A menudo, los bots que buscan proxies abiertos envían solicitudes en forma de:
101.33.59.9 - - [17/Jan/2017:14:10:41 +0000] "GET https://google.com/ HTTP/1.1" 400 3494 "-" "Mozilla" 101.33.59.9 - - [17/Jan/2017:14:10:44 +0000] "CONNECT yahoo.com:80" 400 3499 "-" "Mozilla"
Una expresión regular como la siguiente puede coincidir fácilmente con estas:
(?i)^<HOST> -.*"(?:(?:GET|POST|HEAD) https?:|CONNECT [a-z0-9.-]+:[0-9]+)
La expresión regular (?:(?:GET|POST|HEAD) https?:
coincide con los requisitos del primer tipo, mientras que la expresión regular CONNECT [a-z0-9.-]+:[0-9]+
cumple con los requisitos del segundo tipo.
Los bots que buscan Shellshock a menudo envían solicitudes como:
10.11.12.13 - - [17/Jan/2016:16:00:00 +0000] "GET /cgi-bin/printenv.cgi HTTP/1.0" 200 1 "-" "() { test;};echo "Content-type: text/plain"; echo; echo; /bin/rm -rf /var/www/"
Una expresión regular como esta coincide con el patrón de Shellshock:
<HOST> -.*"()s*{[^;"]+[^}"]+}s*;
Aquí los revisamos () { <command>; }
Patrón y el s
tiene en cuenta los espacios que pueden incluirse en la solicitud maliciosa.
Si los combinamos ahora podemos escribir nuestro filtro:
[Definition] failregex = <HOST> -.*"()s*{[^;"]+[^}"]+}s*; (?i)^<HOST> -.*"[^"]+(?:union[^"]+select[^"]*|select[^"]+concat[^"]*)(?:%%2[8C]|[,(]) (?i)^<HOST> -.*"(?:(?:GET|POST|HEAD) https?:|CONNECT [a-z0-9.-]+:[0-9]+) ignoreregex =
el ignoreregex
le permite incluir elementos en la lista blanca. Puede agregar expresiones regulares ignoradas tal como se hizo para failregex.
Guarde el filtro anterior en /etc/fail2ban/filter.d/badbot.local
Definir la prisión
Ahora que ha definido el filtro, es hora de definir la cárcel. Aquí bloqueamos la dirección IP durante seis minutos si envía tres solicitudes de este tipo en seis minutos.
Añade esto al tuyo /etc/fail2ban/jail.local
Archivo:
[badbot] enabled = true port = http,https filter = badbot logpath = /var/log/apache*/*access.log maxretry = 3 banaction = iptables-multiport findtime = 360 bantime = 360
Una vez que haya configurado la cárcel, debe reiniciar fail2ban para que estos cambios surtan efecto. Dependiendo de su distribución, se requerirá uno de estos comandos para reiniciarlo:
sudo systemctl restart fail2ban sudo service fail2ban restart
fail2ban ahora bloquea todos los intentos de bots malos que intentan atacar su servidor web. Puede extender estas reglas a su otro servidor web o cualquier otro tipo de ataque que pueda ver.