Cuaderno de Campo

Apuntes, Ideas y Observaciones

Detener ataques con fail2ban

27 de October, 2007

Un ataque de diccionario es un método mediante el cual alguien desde el exterior trata de acceder a nuestra máquina utilizando una larga lista de usuarios-contraseñas que se sabe son muy utilizadas por los usuarios, y los prueba una y otra vez buscando dar con la combinación acertada.

Una correcta configuración del ordenador y el uso de contraseñas correctas, reduce considerablemente el riesgo pero no evita que nuestro ordenador pierda tiempo y recursos en denegar un servicio. En algunos momentos estos ataques son realmente molestos e innevitables, solo nos queda detectarlos y detenerlos, que es precisamente lo que hace Fail2Ban.

En un momento dado, echas un vistazo al log de tu sistema y vés algo como esto:

tail /var/log/messages
Oct 27 18:48:17 linux sshd[17653]: Did not receive identification string from 208.69.114.82
Oct 27 11:52:00 linux sshd[17855]: Invalid user apple from 208.69.114.82
Oct 27 11:52:03 linux sshd[17865]: Invalid user brian from 208.69.114.82
Oct 27 11:52:06 linux sshd[17875]: Invalid user andrew from 208.69.114.82
Oct 27 11:52:09 linux sshd[17885]: Invalid user newsroom from 208.69.114.82
Oct 27 11:52:12 linux sshd[17895]: Invalid user magazine from 208.69.114.82

La lista se extiende interminablemente hasta llegar a la Z. Hay varios programitas para tratar de evitar estos ataques, yo he optado por Fail2Ban que se encuentra disponible en el repositorio de Packman para OpenSuse. Fail2Ban viene configurado para ejecutarse en distribuciones basadas en Debian por lo que requiere algunos ajustes en los archivos de configuración para correr sobre OpenSuse

Instalación

Puedes instalar Fail2Ban añadiendo el repositorio Packman, para esto añade esta URL a la lista de repositorios YAST
http://packman.mirrors.skynet.be/pub/packman/

O bien descargando directamente el RPM apropiado para tu máquina.

Funcionamiento y configuración

El funcionamiento de Fail2Ban es muy sencillo. Un daemon “vigila” el archivo log del sistema (en OpenSuse: /var/log/messages). Si las entradas que se producen en el archivo coinciden y se repiten un número de veces dado con alguno de los patrones de expresión regular indicados en /etc/fail2ban/filter.d ejecutar la acción asignada a dicho patrón y ubicada en /etc/fail2ban/action.d.

Por lo tanto, el primer paso es indicar a Fail2Ban cual es el archivo log que tiene que vigilar y cuantos fallos va a tolerar antes de ejecutar la acción asignada.

En el siguiente ejemplo, vamos a configurar Fail2Ban para vigilar los intentos de conexión via SSH y banear la IP responsable añadiendola al archivo /etc/hosts.deny. Todo esto para OpenSuse 10.2 (en otras distribuciones seguramente cambie la ubicación de algunos archivos).

El archivo /etc/fail2ban/jail.conf contiene algunos parámetros de configuración general del programa y una lista de “cárceles” (jail) y sus configuraciones.

bantime = 600
Indica el tiempo (en segundos) que la IP atacante va a estar baneada. Puesto que mi intención por ahora es que el baneo sea permanente ignoro este valor.

findtime = 600
Se considera un ataque si los fallos tienen lugar en este periodo de tiempo (en segundos). Lo dejamos por defecto.

maxretry = 2
Cuantos fallos vamos a permitir antes de proceder al baneo de la IP responsable. Por defecto indica 3 fallos. Lo he bajado a 2 para conceder un error en mis conexiones SSH. Si eres muy torpe tecleando tu user-pass quizás deberías subirlo a 20 ó 30 ! :)

backend = auto
Ignora este parametro. Dejalo en “auto”.

A continuación se definen una serie de “cárceles” con el siguiente formato:
[ssh2hostdeny]

enabled = true
filter = sshd
action = hostsdeny
logpath = /var/log/messages
maxretry = 2

[ssh2hostdeny] : Nombre de la carcel. No tiene importancia, asignale un nombre que te sea descriptivo he indique que hace dicha “cárcel

enabled = true: ¿Está esta carcel activa?. Puedes definir múltiples “cárceles” y activarlas desactivarlas a tu gusto.

filter = sshd: Nombre del archivo .conf ubicado en el subdirectorio ./filter.d. En este caso, indicamos que la cárcel “ssh2hostdeny” utiliza el filtro definido en /etc/fail2ban/filter.d/sshd.conf

action = hostsdeny: Nombre del archivo .conf ubicado en el subdirectorio ./action.d/ y que contiene las acciones que se ván a llevar a cabo si el filter. En este caso, indicamos que la cárcel “ssh2hostdeny” ejectuará las acciones definidas en /etc/fail2ban/filter.d/hostdeny.conf

logpath = /var/log/messages: Archivo log que contiene las lineas que se ván a comparar con el contenido de filter

maxretry = 2: Cambialo si deseas que esta cárcel en concreto sea más o menos restrictiva de lo indicado en las opciones generales.

El fichero continua con la defición de otras reglas, pero para este ejemplo permanecerán todas enabled = false.

A continuación editamos los de filter y action

/etc/fail2ban/filter.d/sshd.conf

[Definition]
failregex = Invalid user .+ from \s*$
Failed [-/\w]+ for .* from (?: port \d*)?(?: ssh\d*)?\s*$
ROOT LOGIN REFUSED.* FROM \s*$
[iI](?:llegal|nvalid) user .* from \s*$
User .+ from not allowed because not listed in AllowUsers\s*$
User .+ from not allowed because none of user’s groups are listed in AllowGroups\s*$
reverse mapping checking getaddrinfo for .+ \[\] failed - POSSIBLE BREAK-IN ATTEMPT!\s$

En failregex indicamos una expresión regular por linea que será comparada con el archivo de logpath. Si alguno de estos patrones se encuentra al compararlo se ejecutará el contenido del correspondiente archivo indicado en action.d
Nota importante: Asegurate de que todas los patrones (lineas) contiene la variable <HOST> de lo contrario fail2ban emitirá un error.
Asegurate de que todos los patrones finalizan con $ (dolar, fin de linea)

/etc/fail2ban/action.d/hostdeny.conf.
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = IP= &&
echo “ALL: $IP” >> <file>
actionunban =

[Init]
file = /etc/hosts.deny

actionstart : Al iniciarse fail2ban se comprueban las “cárceles” que hay activas y se ejecuta la orden aquí indicada de las que estén activas. No queremos hacer nada en concreto.

actionstop: Idem del anterior pero al detener el servicio

actioncheck: Idem del anterior pero al chequear el estado de fail2ban.

actionban: Acción o serie de acciones que se ván a ejecutar. <ip> es la IP del ordenador sospechoso y es un valor suministrado por fail2ban.
En nuestra acción, asignamos a la variable IP el valor del ordenador sospechoso y añadimos al archivo <file>( /etc/hosts.deny ) definido más abajo.

actionunban: Si deseamos “desbanear” una IP pasado el tiempo de baneo indicado en el archivo jail.conf, aqui deberiamos añadir algo como: IP= && sed -i.old /ALL:\ $IP/d <file>En mi caso pretendo dejarlos baneados hasta el fin de los tiempos, así que ignoro esta linea.

file: En la sección [Init] definimos el archivo de destino a utilizar en nuestra acción

Testeo e inicio de fail2ban

Antes de iniciar el servicio fail2ban, es conveniente testear los archivos recien creados para comprobar que no hemos metido la pata con ninguna de las expresiones regulares. Para ello, abrimos una consola y ejecutamos lo siguiente:fail2ban-regex /var/log/messages /etc/fail2ban/filter.d/sshd.conf Esto compara las expresiones regulares de sshd.conf contra el contenido del archivo de logs e imprime el resultado.

Una vez comprobado que fail2ban está correctamente configurado solo falta iniciarlo a mano:fail2ban-client start ó mejor activar el servicio al iniciarse la máquina su
yast2 runlevel

fail2ban

Hacks

Normalmente estoy siempre probando las últimas versiones de compiz-fusion. Entre los efectos colaterales de compiz-fusión está el cuelgue-irremediable-de-escritorio-teclado-y-raton, lo que me obliga a reiniciar el ordenador a lo bruto (pulsando boton de encendido).
Entre los efectos colaterales de esto último, está el que al iniciarse el sistema el servicio de fail2ban no se activa puesto que encuentra un archivo (/tmp/fail2ban.sock) que le indica erroneamente que ya está ejecutandose una instancia del programa. Ante esto tienes dos opciones, la incomoda sudo rm /tmp/fail2ban.sock
fail2ban-client start

y la cómoda, edita /etc/init.d/fail2ban y donde dice:echo -n "Starting Fail2Ban "
/sbin/startproc $FAIL2BAN_BIN start &>/dev/null

que diga
echo -n "Starting Fail2Ban "
/sbin/startproc $FAIL2BAN_BIN -x start &>/dev/null

La opcíón -x fuerza el borrado de /tmp/fail2ban.sock y el inicio del servicio.

Fin

En adelante, en tu archivo log aparecerán muchos del tipo:Oct 27 16:18:18 linux sshd[7766]: User root from 123.232.111.151 not allowed because not listed in AllowUsers
Oct 27 16:18:26 linux sshd[7771]: User root from 123.232.111.151 not allowed because not listed in AllowUsers
Oct 27 16:18:27 linux sshd[7778]: refused connect from 123.232.111.151 (123.232.111.151)

  1. Miguel

    Si eres muy torpe tecleando tu user-pass quizás deberías subirlo a 20 ó 30 ! :)

    Ejem. Eso por quién lo dices…

    Algún día me dirás de dónde te sacas todos estos trucos y chorradicas varias pa’l ordenata.

  2. heze54

    mi server de mail genera logs de este tipo:

    [19/Feb/2008 01:42:36] SMTP Spam attack detected from 201.22.161.251, client closed connection before SMTP greeting

    Cuando alguien intenta un ataque de spam.

    Queria usar fail2ban para banear dichas ips pero no encuentro como configurar el failregex para hacerlo.

    ¿ que me recomiendas?

    Un saludo y gracias

  3. Trebol-A

    Hola heze54,
    pues apuntando fail2ban al fichero log y diciendole que detecte algo como:

    SMTP Spam attack detected from \s*$

    y lo mande /etc/hosts.deny , o lo haces tu directamenteañadiendo en /etc/hosts.deny

    SMTP: ALL EXCEPT localhost

    Este último directamente impedirá cualquier conexión a SMTP que no sea de localhost. Si tu servidor de SMTP lo usan varias máquinas. Pues
    SMTP: ALL EXCEPT localhost, 192.168. , 84.123.456.78

    y si el ataque procede siempre de un mismo rango de IPs pues quizás sea más cómodo poner

    SMTP: 201.22.

    Y tan frescos… :)

  4. heze54

    Buenas,

    Gracias por la rapida respuesta.

    Lo que he hecho hasta ahora ha sido lo siguiente.

    Dentro de jail.conf he creado:

    [kerio]

    enabled = false
    port = smtp,pop3
    filter = kerio
    logpath = /mail/kerioS/mailserver/store/logs/security.log
    maxretry = 6

    Y luego dentro de filter.d un fichero llamado kerio.conf con esta configuracion:

    # Fail2Ban configuration file
    #
    # Author: Cyril Jaquier
    #
    # $Revision: 510 $
    #

    [Definition]

    # Option: failregex
    # Notes.: regex to match the password failures messages in the logfile. The
    # host must be matched by a group named “host”. The tag “” can
    # be used for standard IP/hostname matching and is only an alias for
    # (?:::f{4,6}:)?(?P\S+)
    # Values: TEXT
    #
    failregex = SMTP Spam attack detected from \s*$

    # Option: ignoreregex
    # Notes.: regex to ignore. If this regex matches, the line is ignored.
    # Values: TEXT
    #
    ignoreregex =

    Con el valor que tu me comentabas.

    He probado esto:
    fail2ban-regex /mail/kerioS/mailserver/store/logs/security.log
    /etc/fail2ban/filter.d/kerio.conf

    Con este resultado:

    No ‘host’ group in ‘SMTP Spam attack detected from \s*$’
    Cannot remove regular expression. Index 0 is not valid

    Que hago mal?

  5. heze54

    Buenas,

    Gracias por la rapida respuesta.

    Lo que he hecho hasta ahora ha sido lo siguiente.

    Dentro de jail.conf he creado:

    [kerio]

    enabled = false
    port = smtp,pop3
    filter = kerio
    logpath = /mail/kerioS/mailserver/store/logs/security.log
    maxretry = 6

    Y luego dentro de filter.d un fichero llamado kerio.conf con esta configuracion:

    # Fail2Ban configuration file
    #
    # Author: Cyril Jaquier
    #
    # $Revision: 510 $
    #

    [Definition]

    # Option: failregex
    # Notes.: regex to match the password failures messages in the logfile. The
    # host must be matched by a group named “host”. The tag “” can
    # be used for standard IP/hostname matching and is only an alias for
    # (?:::f{4,6}:)?(?P\S+)
    # Values: TEXT
    #
    failregex = SMTP Spam attack detected from \s*$

    # Option: ignoreregex
    # Notes.: regex to ignore. If this regex matches, the line is ignored.
    # Values: TEXT
    #
    ignoreregex =

    Con el valor que tu me comentabas.

    He probado esto:
    fail2ban-regex /mail/kerioS/mailserver/store/logs/security.log
    /etc/fail2ban/filter.d/kerio.conf

    Con este resultado:

    No ‘host’ group in ‘SMTP Spam attack detected from \s*$’
    Cannot remove regular expression. Index 0 is not valid

    Que hago mal?

    Un saludo

  6. heze54

    Perdon por copiarlo 2 veces, dio un error de mysql y no sabia si habia subido de forma correcta.

  7. Trebol-A

    Hola Heze54,
    desde que actualicé a openSuse 10.3 dejé de usar fail2ban, asi es que hablo de memoria…
    Parece que el error te lo dá por que no puede encontrar el patron de la IP en la expresión regular, posiblemente porque necesite dos patrones para extraer la ip (error de INDEX 0), al menos uno de los patrones debe coincidir con la IP que vá a banear. Amplialo un poco a algo como

    SMTP Spam attack detected from .*, client closed \s$

    (pone: punto-asterisco-coma seguido y sin espacios).

  8. heze54

    Hechos los cambios, mismo error

  9. heze54

    Asi es la linea completa:

    [22/Feb/2008 15:35:37] SMTP Spam attack detected from 212.40.231.227, client closed connection before SMTP greeting

  10. Trebol-A

    Así sin probarlo no puedo ayudarte más. Te aconsejo hacer lo más sencillo, cogerte alguna de las expresiones regulares que usa el programa en los ejemplo y copiarla cambiando el contexto y respetando el patrón. He incluso dejando alguno lo de los ejemplos activados e incluir en el archivo log un supuesto registro que deba coincidir con el ejemplo para asegurarte que error está en la definición de la regla y no te viene de fuera.

  11. Maxi

    Gracias, era justo lo que estaba buscando. Para opensuse 11 la configuración es muy sencilla, del repositorio packman la versión que acabo de instalar viene casi lista para usar.

  12. Catty

    Hola, mil disculpas por entrar en su discusión. Quisiera comunicarme con HEZE 54, asumiendo que sea la misma persona que administra el grupo de la Orden Templaria en los mns grupos, ya que van a cerrarlos y únicamente él tiene los permisos para migrar la información del grupo, al ser administrador. El mail del grupo es OrdenTemplaria@groups.msn.com
    Mi correo es cheesemoon13@yahoo.com Si alguien puede contactarlo, lo agradeceremos todos.

    Muchas gracias,

    Catty

Deja aquí tu comentario

« Buitres sobre Cartagena

Montaje de video »


Cuaderno de campo es un blog mantenido por Trebol-a y en el que escriben Trebol-a, Miguel y Mónica
Si quieres saber algo más sobre los autores acude a la página acerca-de, si quieres contactar con alguno de nosotros hazlo a través de contactar

Creative Commons: Todo el contenido de la web (imágenes, textos, vídeos, a excepción de aquellas obras de otros autores enlazados por Cuaderno de Campo) se acoge a los términos expresados en la licencia Creative Commons