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 <HOST>\s*$
Failed [-/\w]+ for .* from <HOST>(?: port \d*)?(?: ssh\d*)?\s*$
ROOT LOGIN REFUSED.* FROM <HOST>\s*$
[iI](?:llegal|nvalid) user .* from <HOST>\s*$
User .+ from <HOST> not allowed because not listed in AllowUsers\s*$
User .+ from <HOST> not allowed because none of user's groups are listed in AllowGroups\s*$
reverse mapping checking getaddrinfo for .+ \[<HOST>\] 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=<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

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)