1. FAIL2BAN:
INSTALACION y CONFIGURACION
Índice de contenido
INTRODUCCIÓN................................................................................................................................2
INSTALACION Y CONFIGURACION FAIL2BAN..........................................................................2
1.- INSTALACIÓN..........................................................................................................................2
2.- CONFIGURACIÓN DE LAS OPCIONES GENERALES.......................................................3
3.- CONFIGURACIÓN DE LOS SERVICIOS CONCRETOS......................................................4
3.1 – Servicio FTP......................................................................................................................4
4.- ARRANQUE Y ROTACIÓN DEL SERVICIO.........................................................................6
4.1 – Configuración de determinadas acciones en el arranque ..................................................6
4.2 – Arranque del servicio fail2ban..........................................................................................7
4.3 – Rotación del servicio fail2ban............................................................................................7
BIBLIOGRAFíA..................................................................................................................................7
Fecha: Septiembre 2012
1
2. INTRODUCCIÓN
Un intento frecuente de conseguir acceso a un servidor suele ser mediante ataques por
fuerza fruta (brute-force attack) a los servicios que tiene el servidor. A priori, con una buena
política de seguridad en las contraseñas, este tipo de ataques no es efectivo, pero es cierto
que tiene un elevado consumo de ancho de banda y también de carga para la CPU del servidor
que administras.
Para evitar estos ataques en tu servidor Linux, y de paso el consumo de ancho de banda y
CPU, existen diversas opciones, que aportan un mayor nivel de seguridad a los servidores,
entre ellas fail2ban.
Fail2Ban es una aplicación Python que trabaja sobre los archivos de registro (logs) que
generan los servicios del servidor, los analiza regularmente y busca intentos de acceso fallidos.
Cuando los encuentra, atendiendo al número de intentos de acceso en un determinado periodo
de tiempo, toma ciertas medidas que van desde una simple notificación por correo electrónico
al administrador, hasta un baneo (temporal o indefinido) que puede ser parcial (a un servicio
del servidor que administramos) o total (a todos los servicios que ofrece nuestro servidor).
El funcionamiento es muy sencillo: para cada servicio de nuestro servidor que deseemos
proteger con fail2ban debemos indicar:
• el archivo de registro (logfile) del servicio
• el patrón (filter) que se buscará en el logfile del servicio (directorio /etc/fail2ban/filter.d)
• las acciones que se llevarán a cabo (actions) (directorio /etc/fail2ban/action.d)
• y el número de intentos fallidos que se permiten en cada periodo de tiempo
De esta forma, el demonio que ejecuta fail2ban en nuestro servidor tiene los parámetros
suficientes para poder actuar ante un posible ataque por fuerza bruta a alguno de los servicios
que corren nuestros servidores.
Observaciones: Nuestra instalación y configuración va a ser en una Fedora17.
INSTALACION Y CONFIGURACION FAIL2BAN
1.- INSTALACIÓN
El fail2ban se encuentra empaquetado en los repositorios oficiales de la mayoría de
distribuciones Linux (también se puede descargar fail2ban desde su pagina oficial).
Ejecutamos el siguiente comando para instalarlo:
yum install fail2ban
La instalación de fail2ban crea la siguiente estructura en la carpeta /etc/fail2ban:
/etc/fail2ban
|-- action.d
| |-- hostsdeny.conf
| |-- iptables-allports.conf
| |-- ...
|-- fail2ban.conf
|-- filter.d
| |-- apache-auth.conf
| |-- postfix.conf
| |-- …
|-- jail.conf
2
3. El archivo fail2ban.conf es el archivo de configuración del demonio que ejecuta fail2ban
analizando los logs del sistema y en el vamos a poder definir diferentes opciones como son el
archivo de registro del propio fail2ban, el detalle de este archivo, etc…
Jail.conf es el archivo donde se definen que servicios van a analizarse y con qué criterios.
Para cada servicio se define un jail que consta como mínimo de una expresión regular (filter),
una acción (action), y el fichero de registro del servicio en cuestión (logpath).
El directorio action.d contiene los scripts de las distintas acciones que pueden asociarse a un
determinado jail. Y el directorio filter.d contiene distintos archivos con las exprexiones
regulares para cada servicio. La instalación incluye los archivos para las acciones más comunes
(envio de correo, whois, baneo con iptables, host.deny,…) y las expresiones regulares (filters)
de multiples servicios (ftp, ssh, correo, apache, …).
Todos los archivos finalizados en .conf son editables, aunque es recomendable no
modificarlos, y utilizar un archivo con el mismo nombre pero acabado en .local en lugar de
.conf para escribir nuestra configuracion. La configuración escrita en los archivos .local
siempre tendrán preferencia ante las .conf. De esta forma se asegura que no se pierda
nuestra configuración al actualizar a otra versión (no es necesario duplicar todas las directivas,
realmente solo con poner aquellas que deseemos modificar será suficiente).
2.- CONFIGURACIÓN DE LAS OPCIONES GENERALES
Copiamos el archivo fail2ban.conf con el nombre fail2ban.local y lo editamos según
nuestras preferencias:
cd /etc/fail2ban/
cp -pr fail2ban.conf fail2ban.local
vi fail2ban.local
- loglevel:nivel de detalle del log de fail2ban. Posibles valores 1=error,2=warn,3=info
y 4=debug. Dejamos el valor por defecto 3
loglevel = 3
- logtarget: sirve para indicar dónde se mostrara o almacenara el log del propio
fail2ban. Es posible redirigirlo a la salida standar (STDOUT), salida de errores standar
(STDERR) o a un archivo (SYSLOG). Vamos a optar por almacenar el registro en un
archivo en el directorio /var/log
logtarget = /var/log/fail2ban.log
- socket: se utiliza para indicar el archivo del socket de fail2ban. Dejamos el valor
que aparece.
socket = /var/run/fail2ban/fail2ban.sock
Una vez guardados los cambios, nos centramos en el archivo jail.conf. Como en el caso
anterior lo copiamos con el nombre de jail.local y editamos su contenido:
cd /etc/fail2ban/
cp -pr jail.conf jail.local
vi jail.local
* Sección [DEFAULT]: contiene los valores de los parámetros que se aplicarán por
defecto a todos los servicios (jails) que se definan, aunque estos valores pueden ser
modificados dentro de cada jail:
3
4. - ignoreip: sirve para indicar IPs (separadas por espacios) o redes que no queremos
que sean baneadas. Por ejemplo, la IP de loopback del propio servidor.
ignoreip = 127.0.0.1
- bantime: periodo de tiempo (en segundos) durante el cual se mantendrá el bloqueo
del atacante. El valor -1 indicaría que se bloquea para siempre.
bantime = 600
- findtime: el número de fallos se ha de producir en un determinado intervalo de
tiempo. Esta variable es la que indica el intervalo de tiempo en segundos.
findtime = 600
- maxretry: número máximo de intentos fallidos que se permitirán en el intervalo de
tiempo establecido (findtime).
maxretry = 5
- backend: método que se utilizará para comprobar la modificación en los logs de los
servicios.
backend = gamin
Las opciones son:
inotify: Mediante pyinotify lee los cambios en los ficheros.
gamin: Mediante Gamin controla los cambios en los ficheros
polling: Comprueba periódicamente los cambios en los ficheros, en este
caso no es necesario tener librerías complementarias.
auto: Escoge por defecto inotify, sino puede elige gamin y si no puede
usarlo pasa a polling.
* BUG: Hay un problema con el pyInotify y la rotación del log del fail2ban. Si se pone
backend=inotify o backend=auto al rotar el log deja de banear. Ponemos backend=gamin.
3.- CONFIGURACIÓN DE LOS SERVICIOS CONCRETOS
3.1 – Servicio FTP
Ahora sólo nos queda activar el jail del servicio que queremos proteger, en nuestro caso, el
servidor ftp proftpd. El archivo jail.conf ya incluye numerosos jails para los servicios más
conocidos, entre ellos el servidor ftp proftpd.
Por defecto, la configuración que trae fail2ban para proteger el servidor ftp proftpd es la
siguiente:
[proftpd-iptables]
enabled = false
filter = proftpd
action = iptables[name=ProFTPD, port=ftp, protocol=tcp]
sendmail-whois[name=ProFTPD, dest=you@example.com]
logpath = /var/log/proftpd/proftpd.log
maxretry = 6
Vamos a ver detalladamente cada opción:
enabled: sirve para activar o desactivar el jail.
logpath: archivo log que genera el servidor proftpd y en donde se buscan los patrones.
filter: nombre del archivo de la carpeta filter.d que contiene el filtro para proftpd.
action: la acción(o acciones) que se efectuará si se detecta un ataque.
4
5. Modificamos la configuración del proftpd en el jail.local:
vi jail.local
[proftpd-iptables]
enabled = true
filter = proftpd
action = iptables[name=ProFTPD, port=ftp, protocol=tcp]
sendmail-whois[name=ProFTPD,
dest=direccion@correo]
logpath = /var/log/proftpd/proftpd.auth_log
#bantime = -1 # -1 es indefinido
bantime = 3600
findtime = 30
maxretry = 4
Hemos modificado la ubicación del archivo de registro del servidor proftpd, y hemos añadido
la dirección de email dónde enviará un correo con un whois del atacante.
Comprobación del formato fecha en los logs del protfpd:
El formato del log del proftpd está en fecha española (ejemplo: 08/ago/2012), el fail2ban no
es capaz de analizarlo y no banea. Tenemos que cambiar el formato del log del proftpd:
vi /etc/proftpd.conf
Modificamos esta lína:
LogFormat auth "%v [%P] %h %t "%r" %s"
Por esta otra:
LogFormat auth "%v [%P] %h %{[%m/%d/%Y:%H:%M:%S]}t "%r" %s"
Comprobación del funcionamiento del filtro sobre el contenido del fichero log del proftpd:
Ahora tenemos que comprobar que el contenido del fichero de log, cumple alguno de los
filtros que vienen definidos por defecto, si no es así, hay que hacer uno específico para nuestro
caso. Los filtros definidos son (fichero /etc/fail2ban/filter.d/proftpd.conf):
(S+[<HOST>])[: -]+ USER S+: no such user found from S+ [S+] to S+:S+$
(S+[<HOST>])[: -]+ USER S+ (Login failed): Incorrect password.$
(S+[<HOST>])[: -]+ SECURITY VIOLATION: S+ login attempted.$
(S+[<HOST>])[: -]+ Maximum login attempts (d+) exceeded$
Para hacer esta comprobación, tenemos la herramienta: fail2ban-regex:
fail2ban-regex /var/log/proftpd/proftpd.auth_log /etc/fail2ban/filter.d/proftpd.conf
Nos da como resultado:
Summary
=======
Sorry, no match
Look at the above section 'Running tests' which could contain important
information.
Es decir, nuestro fichero log no se ajusta a los patrones del filtro, así que tenemos que hacer
un patrón concreto para nuestro caso:
(.*) (.*) <HOST> (.*) (.*) 530
5
6. Lo añadimos en el fichero filter.d/proftpd.conf:
cd /etc/fail2ban/filter.d/
vi proftpd.conf
failregex =
(S+[<HOST>])[: -]+ USER S+: no such user found from S+ [S+] to S+:S+$
(S+[<HOST>])[: -]+ USER S+ (Login failed): Incorrect password.$
(S+[<HOST>])[: -]+ SECURITY VIOLATION: S+ login attempted.$
(S+[<HOST>])[: -]+ Maximum login attempts (d+) exceeded$
(.*) (.*) <HOST> (.*) (.*) 530
Ahora, si comprobamos con fail2ban-regex:
fail2ban-regex /var/log/proftpd/proftpd.auth_log /etc/fail2ban/filter.d/proftpd.conf
Nos da como resultado:
Success, the total number of match is <num>
However, look at the above section 'Running tests' which could contain
important information.
4.- ARRANQUE Y ROTACIÓN DEL SERVICIO
4.1 – Configuración de determinadas acciones en el arranque
Al reiniciar el servicio iptables y el propio servicio fail2ban, se pierden las reglas fail2ban de
bloqueo a las ips atacantes. Para resolver este problema, tenemos que modificar las acciones
de baneo:
En el fichero /etc/fail2ban/action.d/iptables.conf, añadimos las siguientes líneas:
cd /etc/fail2ban/action.d/
vi iptables.conf
actionban = iptables -I fail2ban-<name> 1 -s <ip> -j DROP
echo "iptables -I fail2ban-<name> 1 -s <ip> -j DROP" >>
/etc/fail2ban/action.d/ListadoIPsbloquedas.txt
/usr/libexec/iptables.init save
En el fichero /etc/init.d/fail2ban, añadimos la siguiente línea:
vi /etc/init.d/fail2ban
start() {
echo -n $"Starting fail2ban: "
getpid
if [ -z "$pid" ]; then
$FAIL2BAN -x start > /dev/null
RETVAL=$?
fi
if [ $RETVAL -eq 0 ]; then
touch /var/lock/subsys/fail2ban
echo_success
sh /etc/fail2ban/action.d/ListadoIPsbloquedas.txt
else
echo_failure
fi
echo
return $RETVAL
}
6
7. 4.2 – Arranque del servicio fail2ban
Después de guardar los cambios, iniciamos fail2ban:
service fail2ban start
Metemos el servicio en el arranque, así al reiniciar la máquina se levantará el fail2ban:
systemctl enable fail2ban.service
4.3 – Rotación del servicio fail2ban
Integramos el fichero de log de fail2ban en el logrotate:
cd /etc/logrotate.d/
vi fail2ban
/var/log/fail2ban.log {
weekly
rotate 7
missingok
notifempty
create 0600 root root
postrotate
/usr/bin/fail2ban-client set logtarget SYSLOG 2> /dev/null || true
endscript
}
BIBLIOGRAFíA
http://www.fail2ban.org
http://www.fail2ban.org/wiki/index.php/HOWTOs
http://www.fail2ban.org/wiki/index.php/Manual
http://www.aradaen.com/seguridad/fail2ban-protege-tu-servidor-de-ataques-por-fuerza-
bruta/
http://www.aradaen.com/sysadmin/instalar-fail2ban-en-servidores-centos-y-debian/
7