27.5.12

fail2ban - como proteger nuestros servers de intrusos varios...

los dos ultimos fines de semana tuve q sacar intrusos de servidores q administro, nada peligroso ya q los servers estan actualizados y bastante protegidos dentro de lo posible, pero siempre esta el problema de los usuarios y el cuidado q le dan a sus contraseñas... en ambos casos se vieron comprometidas cuentas de los mismos. en la 1era lograron entrar x ssh y correr un script q enviaba spam, en la 2da simplemente un login de correo con el mismo proposito pero enviando una scam tipica, este era el texto:

Please be informed that you have £100,000 British Pounds Lodged in our Western Union to transfer to you as winner of ECOWAS Lottery Jackpot.

Please Contact: milton_daniel17@yahoo.com

al entrar hizo un par de pruebas enviandose a direcciones propias q son las siguientes:

kenblast2003@yahoo.com
kenblastall@hotmail.com
motide7@aol.com

no fue lo suficientemente inteligente para borrar ni siquiera los correos q enviaba, simplemente consiguio la pass del usuario y me puso en cola 10 millones de correos q se estuvieron enviando durante unas horas hasta q me di cuenta. creo q penso q siendo domingo no lo veria hasta el lunes pero x suerte suelo checkear logs bastante seguido.

los spammers/scammers estan en la escala mas baja de la porqueria existente en internet, tanto desde el punto de vista del usuario q recibe montones de correos q no le importan como del administrador q trata de hacer todo lo posible para minimizar el impacto en el buzon del usuario final.

pero el peligro no esta solo en parar la basura sino tambien en proteger nuestros servers ya q son una codiciada presa para ellos, la oportunidad de hacer unos cuantos billetes a costa de nuestro buen nombre... je

asi tambien tenemos los miles de script kiddies q pasan el dia con sus programas de fuerza bruta y sus diccionarios probando combinaciones de user/pass y algun ocasional hacker o aprendiz q puede ocasionar algo mas de trabajo. mas de uno se sorprenderia al ver los logs de un server publico, al final de la entrada voy a pastear algunos para q vean el nivel de los ataques...

para detener este tipo de ataques automatizados existe fail2ban, q es un software q en base a los logs del sistema puede bannear IPs en base a intentos fallidos de logueo. a pesar de tenerlo instalado en la mayoria de los servers tuve q ponerlo en TODOS y ajustar la configuracion para q sea todavia mas agresiva. de paso aprovecho para hacer esta entrada para q vean q no es nada dificil de instalar y configurar y ciertamente hace darse x vencido a la mayoria de los intrusos.


instalacion

a pesar de q son muy parecidas voy a explicar la instalacion tanto para centos/redhat como para debian/ubuntu. para el 1ero tenemos q descargarlo desde:

http://sourceforge.net/projects/fail2ban/

lo extraemos con:

tar xvf fail2ban-x.x.x.tar.bz2

despues...

cd fail2ban-x.x.x
python setup.py install

a continuacion lo agregamos al arranque del sistema copiando el siguiente archivo:

cp /files/redhat-initd /etc/init.d/fail2ban

y despues...

chkconfig --add fail2ban
chkconfig fail2ban on
service fail2ban start

en debian/ubuntu lo podemos bajar de los repositorios con:

apt-get install fail2ban (sudo en ubuntu)

y nos ahorramos todo el proceso anterior.


configuracion


lo siguiente es configurar las "jails" para los servicios q queremos proteger. para eso vamos a /etc/fail2ban y editamos el archivo jail.conf haciendo una copia de seguridad antes por las dudas...

la configuracion puede variar un poco de una version a otra pero las opciones son mas o menos las mismas siempre. en debian x ejemplo, las acciones, tiempos de banneo, etc vienen definidas al principio de manera gral o se pueden personalizar despues en cada jail.

lo primero es setear las redes e IPs seguras, o sea las q queremos q el sistema no blockee nunca, como el rango de nuestra propia lan o direcciones de usuarios del sistema. esto se hace modificando el campo "ignoreip", por ejemplo:

ignoreip = 127.0.0.1 192.168.0.0/24 200.53.23.1 10.0.0.0/25

mas abajo tenemos los tiempos y situaciones del blockeo, q podemos dejar como estan o editarlas como queramos. son las siguientes:

bantime: es la cantidad de segundos q una IP es banneada (default 600).
findtime: un host es banneado si se loguea erroneamente tantas veces como la cantidad en "maxretry" dentro del "findtime" (default 600seg).
maxretry: es el numero de intentos fallidos antes de ser blockeado.

pasamos ahora a configurar las jails (carceles). una de las mas usadas es la de ssh asi q empecemos x esa, vamos hasta "[ssh]" y x default (en debian x lo menos) ya la tenemos activada. sale mas o menos asi:

[ssh]
enabled = true
port    = ssh
filter    = sshd
logpath = /var/log/auth.log
maxretry = 6

y asi para centos:

[ssh-iptables]
enabled    = true
filter    = sshd
action    = iptables[name=SSH, port=ssh, protocol=tcp]
                 sendmail-whois[name=SSH, dest=root, sender=fail2ban@fail2ban]
logpath    = /var/log/secure
maxretry = 6

lo q mas nos interesa es q el enabled este en "true" (activada) y el logpath q es la ruta del log de seguridad del sistema, esta cambia de un sistema a otro como se puede ver. en debian vemos q falta el campo "action", eso es xq viene definido antes en la seccion "actions" con el campo "banaction".

en el action de centos vemos dos acciones, iptables y sendmail whois. la 1era crea una regla de iptables blockeando la IP y la 2da envia un correo con un whois de la misma al destinatario configurado (root en este caso).

vamos a crear alguna jail mas x si no quedo muy claro, postfix en centos:

[postfix-tcpwrapper]
enabled    = true
filter    = postfix
action    = hostsdeny[file=/etc/hosts.deny]    (ruta al archivo hosts.deny)
      sendmail[name=Postfix, dest=root]
logpath    = /var/log/maillog
bantime    = 6000

en debian:

[postfix]
enabled    = true
port    = smtp,ssmtp
filter    = postfix
logpath    = /var/log/mail.log

y asi tenemos todo tipo de jails para ftp, http y todos los servicios y la mayoria de los ataques posibles. seria interminable y no tendria mucho sentido explicarlas una a una, simplemente experimentando un poco se pueden activar bastante facil.


roundcube


roundcube es un cliente de webmail relativamente nuevo (todavia esta en beta) con muchisimas opciones y una interfaz q no tiene nada q envidiarle a ninguna otra. en mi humilde opinion es muy superior al eterno squirrelmail q parece casi prehistorico al darle una mirada a uno y el otro.

los logueos de correo pueden ser blockeados con la jail "postfix" o el MTA q usemos como vimos antes, pero tambien se puede dar el caso (como me paso a mi) de que el webmail corra en un server mientras q el MTA esta en otro. en este caso nos vemos obligados a agregar la IP del 1ero en la lista de ignoradas del fail2ban del 2do para no bannear a todos los usuarios ya q la direccion de origen del logueo es siempre la misma para todos.

para solucionar esto podemos usar un plugin escrito x matt rude, q se puede descargar desde aca:

http://mattrude.com/projects/roundcube-fail2ban-plugin/

hay q copiar el contenido dentro del directorio de plugins de roundcube (roundcube/plugins) y despues editar el contenido del archivo main.inc.php q esta dentro del directorio "config", agregando en la seccion de plugins la siguiente linea:

$rcmail_config['plugins'] = array('fail2ban');

con esto se crea un nuevo archivo llamado userlogins en la carpeta logs conteniendo solo los intentos fallidos q usamos para el fail2ban creando una nueva jail:

[roundcube]
enabled    = true
port    = http,https
filter    = roundcube
logpath    = /pathderouncube/logs/userlogins


el eterno punto debil


obviamente esto no nos deja 100% a salvo pero ayuda bastante, de todas formas nunca es bueno confiarnos demasiado y mantener siempre los sistemas actualizados, los permisos bien configurados y los usuarios con las passwords mas complejas posibles... aunque siempre seran usuarios y siempre cabe la posibilidad de q hagan click donde no deben entregando sus datos ante cualquier loteria de turquia o una herencia del principe de liechtenstein...

... ese es el verdadero punto debil.


apendix


como habia prometido copio unas horas del log de fail2ban en un servidor de correo publico (no muy grande) para q vean la cantidad de conexiones blockeadas. la mayoria son de postfix pero hay alguna de ssh.

2012-05-24 04:02:41,098 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 190.49.25.205
2012-05-24 04:14:01,114 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 190.224.163.183
2012-05-24 04:52:59,128 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 186.105.151.68
2012-05-24 05:01:16,142 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 90.170.212.117
2012-05-24 05:01:32,156 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 190.172.162.35
2012-05-24 05:31:24,170 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 188.138.115.237
2012-05-24 05:54:26,188 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 181.1.142.88
2012-05-24 05:56:43,202 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 190.139.154.117
2012-05-24 06:04:14,217 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 181.14.149.157
2012-05-24 06:42:19,230 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 190.16.233.253
2012-05-24 06:47:21,242 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 189.45.204.138
2012-05-24 06:54:42,259 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 41.79.176.10
2012-05-24 07:13:24,273 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 181.14.133.18
2012-05-24 07:14:32,287 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 168.226.249.18
2012-05-24 07:18:01,301 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 168.226.165.193
2012-05-24 07:19:59,315 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 181.14.130.174
2012-05-24 07:28:02,330 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 182.71.75.106
2012-05-24 07:58:49,604 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 190.31.98.41
2012-05-24 08:02:34,618 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 181.14.150.101
2012-05-24 08:03:04,633 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 190.139.223.41
2012-05-24 08:16:23,647 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 122.163.39.30
2012-05-24 08:28:23,675 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 190.139.221.178
2012-05-24 08:37:23,690 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 200.45.10.100
2012-05-24 08:50:45,706 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 190.220.206.251
2012-05-24 09:13:29,721 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 190.166.153.58
2012-05-24 09:14:36,738 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 113.161.75.97
2012-05-24 09:29:53,760 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 168.226.165.155
2012-05-24 10:03:37,798 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 181.14.140.243
2012-05-24 10:06:49,816 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 58.186.2.73
2012-05-24 10:11:35,835 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 123.26.160.109
2012-05-24 10:12:47,849 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 186.134.140.73
2012-05-24 10:14:29,866 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 123.180.71.142
2012-05-24 10:14:51,880 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 181.14.127.147
2012-05-24 10:37:40,897 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 200.45.10.239
2012-05-24 10:44:08,913 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 190.172.97.222
2012-05-24 10:54:20,928 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 181.14.180.85
2012-05-24 11:02:05,942 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 168.226.165.130
2012-05-24 11:11:21,956 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 200.74.100.150
2012-05-24 11:27:45,974 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 84.15.191.254
2012-05-24 11:30:49,993 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 122.163.197.52
2012-05-24 11:37:58,014 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 181.14.186.253
2012-05-24 11:51:08,040 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 115.84.93.94
2012-05-24 12:18:00,057 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 123.180.84.251
2012-05-24 12:31:09,010 fail2ban.actions: WARNING [ssh-iptables] Ban 66.85.142.166
2012-05-24 12:33:16,075 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 82.114.94.6
2012-05-24 12:36:31,090 fail2ban.actions: WARNING [postfix-tcpwrapper] Ban 101.99.12.1

7 comentarios:

Campi dijo...

Buen trabajo.

Yo acabo de configurar el plugin de Roundcube pero no acaba de funcionar. Es decir, acaba añadiendo al iptables la regla "DROP all -- x.x.x.x anywhere" dentro de "Chain fail2ban-roundcube" pero me permite seguir logándome sin problema.

¿Lo has probado? Tengo la configuración estandar tal cual indicas tu o el creador del plugin de 'fail2ban' para Roundcube.

Un saludo.

|_ocutus dijo...

hola campi. lo tengo corriendo en este momento exactamente asi como esta explicado en dos servers corporativos.

basicamente es copiar el plugin, agregar la linea en el main.inc.php y crear la jail. checkea antes q nada q fail2ban este funcionando con el ssh o alguna jail mas facil. fijate tambien en los logs del roundcube q te sale.

para mas detalles el roundcube lo tengo corriendo con esa conf del fail2ban en debian pero en centos/redhat calculo q tiene q funcionar igual.

sino pasteame una copia de la jail q pusiste y algo de los logs a ver si me doy cuenta.

gracias por comentar.


saludos!

Campi dijo...

Mi configuración en "jail.conf":
[roundcube]
enable = true
port = http,https
filter = roundcube
action = iptables-multiport[name=roundcube, port="http,https"]
logpath =

Posteriormente dentro de "filter.d" tengo un archivo "roundcube.conf" con las siguientes líneas:
[Definition]
failregex = FAILED login for .*. from
ignoreregex =

Dentro de iptables, como te puse, se agregan las IPs desde las cuales realizo los reintentos pero aún así me deja seguir intentando y logarme sin problemas.

Un saludo.

Campi dijo...

Se me olvidó comentar, en el log 'userlogins' la estructura es:
[30-Nov-2012 09:32:44 +0100]: FAILED login for from

y de hecho funciona bien, en iptables agrega bien la regla y esa dirección IP cuando pruebo equivocarme más de 3 veces (que es el reintento por defecto).

Aún así no bloquea esa IP a nivel de Roundcube. ¿A ti te la bloquea? ¿Te da error de conexión el Roundcube directamente? Dime como te bloquea el acceso.

|_ocutus dijo...

la jail la tengo igual salvo que el action lo defino arriba en los grales y en vez de "action" sale como "banaction" pero eso creo q es tema de la version xq en los centos me sale como "action"... en todo caso el valor es el mismo.

el failregex del filter.d lo tengo asi:

failregex = FAILED login for .*. from HOST

(host va entre <>, no lo pongo xq sino blogger lo toma como tag y no lo imprime)

me acuerdo q tuve q probar un par de cosas ahi hasta q funcione ok.

en iptables la regla me aparece asi:

DROP all -- xx.xx.xx.xx anywhere

y el log es igual. te podes fijar tambien en el q esta en /var/log a ver si te sale el "ban" y "unban" de la ip pero la verdad q me parece mas un problema de iptables q del fail2ban. si la regla se crea y los logs estan bien "deberia" funcionar...

cuando se ejecuta el ban la ip directamente no puede cargar la pagina, no te sale un msg de error de roundcube sino q directamente no carga.

el msg de roundcube te sale si pones el ban en el server de correo, en ese caso puede conectar al cliente pero no al server (siempre hablando de q corran en 2 maquinas separadas sino el ban obvio q es el mismo)


saludos!

Campi dijo...

Ya he visto cual era mi problema. El problema estaba en que estaba baneando Roundcube sobre HTTP i HTTPS (80 y 443) y estoy sirviendolo a través de otro puerto.

Ha sido agregar el puerto a la regla en los dos lugares donde pone "HTTP, HTTPS" he puesto detrás el puerto, es decir, "HTTP, HTTPS, 9999" y ahora funciona correctamente.

Gracias y saludos!! ;)

|_ocutus dijo...

me alegro que lo hayas solucionado. ahora q esta funcionando vas a dormir mas tranquilo... te lo digo por experiencia ;)

gracias x poner la solucion a tu problema, seguramente le va a servir a alguien mas.


saludos!