Detener ataques con fail2ban
sábado, 27 de octubre de 2007Un 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=
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)
Miguel
#1/ 27 de October/2007 a 18:42:50
Otros comentarios de «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.
heze54
#2/ 22 de February/2008 a 00:33:42
Otros comentarios de «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
Trebol-A
#3/ 22 de February/2008 a 01:01:34
Otros comentarios de «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... :)
heze54
#4/ 22 de February/2008 a 15:13:29
Otros comentarios de «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?
heze54
#5/ 22 de February/2008 a 15:26:49
Otros comentarios de «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
heze54
#6/ 22 de February/2008 a 15:27:52
Otros comentarios de «heze54»
Perdon por copiarlo 2 veces, dio un error de mysql y no sabia si habia subido de forma correcta.
Trebol-A
#7/ 22 de February/2008 a 16:50:51
Otros comentarios de «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).
heze54
#8/ 22 de February/2008 a 17:15:36
Otros comentarios de «heze54»
Hechos los cambios, mismo error
heze54
#9/ 22 de February/2008 a 17:18:49
Otros comentarios de «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
Trebol-A
#10/ 23 de February/2008 a 13:25:24
Otros comentarios de «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.
Maxi
#11/ 22 de August/2008 a 00:15:59
Otros comentarios de «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.
Catty
#12/ 10 de November/2008 a 01:03:29
Otros comentarios de «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
18 de December, 2024 @ 16:45