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».

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

Deja un comentario