Prohibir IPs que muestren signos maliciosos
Cabe destacar que:
- Antes de usar cualquier tipo de programa para gestionar el “Firewall” de un Servidor, hay que hacer el amor con iptables.
- Al hacer pruebas, es divertido bloquearte a ti mismo.
- Las IPs son fáciles de suplantar, generar y hasta son compartidas, por lo tanto, es posible que se llegue a bloquear tráfico legítimo.
- Los falsos positivos existen, por esta razón es necesario estar al pendiente de las pruebas y también de la medición y comparación de los resultados que rechazan IPs probablemente maliciosas.
- En el contexto de seguridad de la red, un ataque “spoofing” es una situación en la que una persona o un programa se pone una mascara con éxito, falsificando datos que le permiten obtener ventajas ilegítimas.
-
- REJECT, el cliente consigue un mensaje de conexión rechazada.
- DROP, no hay mensaje de error para el cliente, responde como una especie de “black hole”.
- (D)DoS Deflate y DenyHosts parecen interesantes.
Análisis y bloqueo
En servidores Linux, Fail2Ban analiza los archivos de registro (log) y prohibe las IPs que muestren signos maliciosos. Por ejemplo, para prohibir IPs con demasiados fracasos al introducir una contraseña o con muchas peticiones que busquen vulnerabilidades (exploits), etc.
En general Fail2Ban se utiliza para actualizar las reglas del “Firewall”, con las reglas necesarias para rechazar direcciones IP por un periodo de tiempo específico. Fail2Ban también se puede configurar con cualquier otra acción arbitraria (por ejemplo, desde el envío de un correo electrónico de alerta hasta por ejemplo, abrir la bandeja del CD-ROM). Además el producto Fail2Ban, viene con varios filtros para diversos servicios como: apache, ssh, mysql, entre otros más.
Características principales de Fail2Ban
- Arquitectura Cliente/Servidor.
- Multi-hilos.
- Altamente configurable.
- Soporta FAM/Gamin/pyinotify.
- Analiza los archivos de registro log y busca patrones específicos.
- Ejecuta comandos cuando se detecta un patrón en una misma dirección IP durante más de X veces. X se puede cambiar a la medida.
- Después de un cierto período de tiempo, se ejecuta otro comando con el fin de eliminar la prohibición sobre la dirección IP.
- Por defecto utiliza Netfilter/Iptables, pero también puede utilizar TCP Wrapper (/etc/hosts.deny) y muchos otras “firewalls/actions”.
- Gestiona la rotación de los archivos de log.
- Puede manejar múltiples servicios (sshd, apache, vsftpd, etc).
- Resuelve el nombre de host DNS a una dirección IP (utilizar con precaución, se desactiva con usedns = no).
Instalación
apt-get install fail2ban dpkg-query -L fail2ban
Archivo de configuración a la medida (Jails)
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local vi /etc/fail2ban/jail.local
Filtros
Si desea modificar o añadir nuevos filtros, se puede hacer desde:
ls -la /etc/fail2ban/filter.d
Archivo log
tail -f /var/log/fail2ban.log cat /var/log/fail2ban.log | grep WARNING
Por favor consulte: http://www.the-art-of-web.com/system/fail2ban-log/
man fail2ban-client
Para habilitar una IP que haya sido prohibida:
fail2ban-client get {JAIL} actionunban {IP} iptables -D fail2ban-{JAIL} -s {IP} -j DROP
Use el comando iptables -L -n para encontrar el nombre de la regla, por lo tanto, para obtener el nombre de las celdas debe usar:
fail2ban-client status
Por favor consulte: http://www.fail2ban.org/wiki/index.php/Commands
Probemos ¿Sí funciona?
Para probar fail2ban, hay que observar el comportamiento de las reglas iptables en el Servidor que se encuentra protegido con su respectivo “Firewall” y Fail2Ban:
Desde una computadora de la red (192.168.0.22), fuera de ignoreip en jail.local:
ab -n 1000 -c 5 http://192.168.0.1/
Desde el servidor (192.168.0.1):
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n iptables -L | egrep -i 'fail2ban|DROP|REJECT'
La prueba anterior requiere que exista una celda (jail) simple para prevenir cierto tipo de ataque del tipo “Denial of Service” contra Apache:
[http-get-dos] enabled = true port = http,https filter = http-get-dos logpath = /var/log/apache*/*access.log maxretry = 120 findtime = 120
Entonces: vi /etc/fail2ban/filter.d/http-get-dos.conf
# Fail2Ban configuration file # # Author: http://www.go2linux.org # [Definition] # Option: failregex # Note: This regex will match any GET entry in your logs, so basically all valid and not valid entries are a match. # You should set up in the jail.conf file, the maxretry and findtime carefully in order to avoid false positives. failregex = ^ -.*\"(GET|POST).* # Option: ignoreregex # Notes.: regex to ignore. If this regex matches, the line is ignored. # Values: TEXT # # ignoreregex = ignoreregex = ^ -.*\"(GET|POST).*Googlebot
Iniciar, parar y re-iniciar
/etc/init.d/fail2ban start /etc/init.d/fail2ban stop /etc/init.d/fail2ban restart
Más pruebas
[ssh] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 6
Probemos con 6 peticiones de ingreso mediante SSH, usando un usuario que no existe:
ssh usuariofalso@192.168.0.1