martes, 22 de octubre de 2013

Configurar FAIL2BAN Elastix 2.4


Gracias, muy completo tutorial.
fail2ban
Hola amigos, ahora veremos un tema muy importante de seguridad para aminorar un poco el riesgo de hackeo en nuestros conmutadores basados en Elastix con extensiones SIP remotas sin VPN.
La solución se llama fail2ban y funciona muy sencilla pero inteligentemente. Fail2ban revisa los registros de las aplicaciones y si encuentra alguna condición que parezca un ataque de fuerza bruta, adivinar al azar usuario y contraseña, agregará una línea de bloqueo en nuestro iptables para negarle la conexión a la IP que nos intenta hackear. ¡Muy sencillo, pero efectivo!
Dicho lo anterior, tenemos 4 cosas importantes por hacer:
  1. Revisar que iptables esté funcionado
  2. Configurar Asterisk para que guarde logs en un archivo específico
  3. Configurar y ejecutar fail2ban
  4. Probar que funcione

Como root en tu sistema, deberás de revisar que iptables esté funcionado y que esté configurado para arrancar en cada momento.
service iptables status
El cortafuegos está detenido.
Lo anterior quiere decir que el firewall está detenido. Si acabas de instalar tu sistema recomiendo que revises que no existan reglas cargadas y que la política esté en ACCEPT.
iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Si tienes una salida parecida a la anterior, quiere decir que no hay reglas y que estás permitiendo todo el tráfico.
Ahora tendremos que guardar esas reglas y encender el firewall
service iptables save
Guardando las reglas del cortafuegos a /etc/sysconfig/iptab[ OK ]
service iptables start
Expurgar reglas del cortafuegos: [ OK ]
Configuración de cadenas a la política ACCEPT: filter [ OK ]
Descargando módulos iptables: [ OK ]
Aplicando reglas del cortafuegos iptables: [ OK ]
Ahora ya están cargadas las reglas en los archivos del sistema y podemos consultarlas de la siguiente forma:
service iptables status
Tabla: filter
Chain INPUT (policy ACCEPT)
num target prot opt source destination
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Finalmente le decimos al sistema que vuelva a cargar estas reglas tras un posible reinicio.
chkconfig iptables on

Asterisk puede cambiar la forma en la que reporta los eventos, esto se realiza en el archivo/etc/asterisk/logger.conf. Deberás editarlo y agregar las siguientes líneas:
Justo arriba de la sección [logfiles] poner las siguientes dos líneas que cambian el formato de la hora reportada:
[general]
dateformat=%F %T
Al final del archivo, dentro de la sección [logfiles], deberás de colocar la siguiente línea:
fail2ban => notice
Posteriormente guardas y le pides a asterisk que refresque la configuración:
asterisk -rx 'module reload logger'

Ésta es la parte más interesante. Fail2ban ya se encuentra instalado en un sistema Elastix 2.4, y si no está lo puedes instalar vía yum. Lo primero que tenemos que hacer es configurar el archivo/etc/fail2ban/filter.d/asterisk.conf
Éste es el contenido:
# /etc/fail2ban/filter.d/asterisk.conf
# Fail2Ban configuration file
#
#
# $Revision: 250 $
#
[INCLUDES]
# Read common prefixes. If any customizations available — read them from
# common.local
#before = common.conf
[Definition]
#_daemon = asterisk
# 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 = NOTICE.* .*: Registration from ‘.*’ failed for ” – Wrong password
NOTICE.* .*: Registration from ‘.*’ failed for ‘:.*’ – No matching peer found
NOTICE.* .*: Registration from ‘.*’ failed for ” – No matching peer found
NOTICE.* .*: Registration from ‘.*’ failed for ” – Username/auth name mismatch
NOTICE.* .*: Registration from ‘.*’ failed for ” – Device does not match ACL
NOTICE.* .*: Registration from ‘.*’ failed for ” – Peer is not supposed to register
NOTICE.* .*: Registration from ‘.*’ failed for ” – ACL error (permit/deny)
NOTICE.* .*: Registration from ‘.*’ failed for ” – Device does not match ACL
NOTICE.* failed to authenticate as ‘.*’$
NOTICE.* .*: No registration for peer ‘.*’ \(from \)
NOTICE.* .*: Host failed MD5 authentication for ‘.*’ (.*)
NOTICE.* .*: Failed to authenticate user .*@.*
NOTICE.* .*: Sending fake auth rejection for device .*\;tag=.*
# In Asterisk 1.8 use the same as above, but after add :.* before the single quote. This is because in Asterisk 1.8, the log file includes a port number which 1.4 did not.
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =
Si gustas puedes descargar el archivo completo desde aquí:
Ahora podemos configurar el archivo /etc/fail2ban/jail.conf para que active la inspección de la regla de asterisk. Busca el final de la sección [Default] y el inicio de la sección [ssh-iptables]. Deberás copiar y pegar este bloque de justo en ese lugar:
.
.
.
backend = auto
[asterisk-iptables]
enabled = true
filter = asterisk
action = iptables-allports[name=ASTERISK, protocol=all]
sendmail-whois[name=ASTERISK, dest=root, sender=fail2ban@localhost]
logpath = /var/log/asterisk/fail2ban
# This jail corresponds to the standard configuration in Fail2ban 0.6.
# The mail-whois action send a notification e-mail with a whois request
# in the body.
[ssh-iptables]
.
.
.
Si no te gustar estar editando, descarga el archivo ya completo:
Ahora iniciemos fail2ban y validemos que no existan errores de configuración:
service fail2ban start
Starting fail2ban: [ OK ]
Configura su arranque tras un reinicio:
chkconfig fail2ban on
Para saber si está corriendo fail2ban, podemos mostrar las reglas iptables y veremos secciones nuevas con la leyenda fail2ban:
service iptables status
Tabla: filter
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 fail2ban-SSH tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 fail2ban-ASTERISK all -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Chain fail2ban-ASTERISK (1 references)
num target prot opt source destination
1 RETURN all — 0.0.0.0/0 0.0.0.0/0
Chain fail2ban-SSH (1 references)
num target prot opt source destination
1 RETURN all — 0.0.0.0/0 0.0.0.0/0

Ahora sí, ¿cómo saber que todo lo que hicimos tuvo un propósito? Bien, pues tendremos que probarlo. Descarga un softphone a una computadora cualquiera para realizar una prueba. Por lo general yo uso Zoiper, puedes usar la versión gratuita o bien adquirir la versión con el codec g.729.
Te recomiendo que lo instales en otra máquina diferente a la que estás usando en este momento porque, si todo funciona, perderás conexión con el servidor Elastix.
En el servidor Elastix puedes ejecutar el siguiente codiguito que te mostrará en pantalla cada 2 segundos las reglas iptables. De esta forma nos daremos cuenta cuando nos hayan bloqueado.
while [ true ] ; do clear ; service iptables status ; sleep 2 ; done
Ahora si, desde el equipo de pruebas, da click en la configuración de una cuenta SIP y escribe la ip de tu servidor. El usuario y password llénalos con teclazos al azar y listo, dale varias veces click en el botón de register.
Después de realizar el tercer intento de registro, ya no podrás alcanzar el servidor desde ese equipo, aun cuando le tires un ping.
Puedes ver cómo fail2ban agregó una línea bloqueando la ip de la máquina que usaste como atacante:
service iptables status
Tabla: filter
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 fail2ban-ASTERISK all -- 0.0.0.0/0 0.0.0.0/0
2 fail2ban-SSH tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Chain fail2ban-ASTERISK (1 references)
num target prot opt source destination
1 DROP all — 192.168.2.52 0.0.0.0/0
2 RETURN all — 0.0.0.0/0 0.0.0.0/0
Chain fail2ban-SSH (1 references)
num target prot opt source destination
1 RETURN all — 0.0.0.0/0 0.0.0.0/0


Lindo, ¿no? Espero que les haya gustado esta guía, y sobre todo, ¡que les sea de mucha utilidad!