Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

miércoles, 18 de marzo de 2015

fail2ban, protección automatizada para Linux

En más de una ocasión he visto a gente con serios problemas para establecer filtros de seguridad en su sistema. En la mayoría de los casos es por desconocer la herramienta que manejan o por que no saben exactamente qué filtros usar. Actualmente por suerte tenemos numerosas herramientas que hacen esta tarea por nosotros y una de ellas me ha parecido muy interesante, ya que no solo no requiere muchos conocimientos sino que te ofrece una protección bastante sólida, que aunque no es infalible te puede proteger de la mayoría de las intrusiones más comunes. Se trata de fail2ban.


Fail2ban es una herramienta de software libre que destaca por tener unas funciones de protección básicas que luego se pueden expandir con facilidad escribiendo unas pocas líneas en unos pocos ficheros. Afortunadamente dichas líneas están muy bien documentadas en la propia página del proyecto y te señalan con gran exactitud que líneas hay que escribir y donde para poder proteger un servicio en concreto. El software en cuestión puede proteger ftps, accesos por ssh, servidores de correo, servidores web, servidores VPN, centralitas VOIP entre otros... y es tan sencilla de instalar cómo escribir:

apt-get install fail2ban(Debian)/yum install fail2ban (red hat)

Al ser un software cuya configuración se realiza directamente en sus ficheros sin mediación de ninguna interfaz gráfica, ocupa muy poco espacio y, aunque no lo parezca, es sencillo de configurar.

Antes de empezar a configurarlo hay que tener muy claro qué servicios hay que proteger ya que este software interactua con logs que emiten los servicios que quiere proteger y en caso de estar protegiendo un servicio que no está instalado, podríamos tener problemas. La lista de servicios que puede proteger son éstos y a modo de prueba voy establecer filtros para proteger uno de los programas más famosos dentro del sector informático: Apache. Apache es sin lugar a dudas el servidor web más usado del mundo y al estar siempre abierto al público, siempre es conveniente poner algunos filtros evitar sustos.

Para poner los filtros primero hay que tener unas nociones básicas sobre el programa en cuestión que son útiles tanto para este servicio cómo para cualquiera que se quiera proteger en el futuro. Lo primero que hay que saber, es que todas las configuraciones están alojadas en la carpeta /etc/fail2ban/. Esa carpeta aloja 4 elementos de vital importancia:

1. action.d: Carpeta que contiene las acciones que realiza el software tras encontrar algo que considera una intrusión. En un principio no es necesario configurar para que los filtros funcionen, pero en caso de tener unas necesidades muy personalizadas se pueden modificar algunos parametros de esta carpeta. Uno de las opciones más interesantes que ofrece esta carpeta es la configuración de fai2ban para que envíe un correo a una dirección en concreto al detectar una intrusión, pero para ello hay que tener el software sendmail correctamente instalado y configurado para que sea capaz de envíar correos.

2. fail2ban.conf: Fichero de configuración general del software: En éste fichero se configuran 3 parámetros. El nivel de log del sistema en el que se establece si quiere que los logs muestren simplemente información (valor por defecto) o por el contrario muestre avisos, errores o información detallada de todo (llamado debug). Esos niveles quedarían así:

           1 ERROR
           2 WARNING
           3 INFO
           4 DEBUG

El destino de esos logs también se configuran en este fichero, al igual que el puerto en el que escucha el servicio (recomendable no modificar este último valor)

3. filter.d: Esta carpeta almacena las expresiones de los logs que analiza para saber si la línea del log en cuestión se refiere a una intrusión o no. La carpeta tiene ficheros .conf y cada uno de éstos tiene en su interior las líneas que analiza en los logs. Si en el log apareciese una línea que coincidiese con lo que analiza uno de los ficheros que hay en filter.d, fail2ban tomaría las medidas pertinentes. Fail2ban almacena por defecto varios ficheros encargados de analizar (por ejemplo) ssh o apache.

4. jail.conf: Aquí se configura la gestión de filtros; es un fichero que tiene todo lo referente a los filtros y la gestión de éstos. El fichero se podría considerar que está compuesto por dos partes: La de configuración general y la de lo que yo llamo secciones. 

La parte de configuración general tiene tres parámetros muy importantes: bantime, maxretry y findtime. El bantime establecería durante cuanto tiempo se bloquea una ip atacante (en segundos). Por defecto viene con un valor de 600 segundos, un valor relativamente bajo que se podría modificar al gusto de cada uno. Cómo ayuda os informo de que 3600 equivaldría a una hora y 36000 a diez. Maxretry, establece el número de intentos máximos por defecto que se establecen en software, para que si se alcanzase el máximo de intentos, el sistema bloquease la ip atacante. Por último, pero no menos importante, está findtime:

Findtime no aparece por defecto en jail.conf, pero es muy interesante añadirlo ya que hace que se cuente el número de intentos de conexión dentro de un intervalo de tiempo. Me explico: Imaginemos que no tenemos puesto el parametro findtime y queremos autenticarnos en la página web que protege fail2ban y que tiene un límite de 3 intentos. Al no tener un findtime, si en cualquier momento llegasemos a fallar 3 veces (que no tienen que ser consecutivas, ni mucho menos), el acceso nos sería bloqueado aún cuando el primer intento fallido se realizó el 1 de enero, el segundo el 2 y el tercero el día 3. En cambio, con findtime lo que se consigue es establecer un periodo de tiempo que controla el número de intentos fallidos de conexión; Si por ejemplo se pusiese un findtime de 60 segundos, bloquearía al atacante sólo si realizase 3 intentos fallidos de conexión dentro de ese periodo de tiempo. Para añadir el findtime habría que escribir debajo de maxretry:

findtime= número de segundos

Por otro lado están las secciones. Las secciones son las que almacenan toda la gestión de los filtros: Una sección sería reconocida mediante la siguiente nomenclatura:

[Nombre-sección] --> Ejemplo: [apache]

Cada sección estaría compuesta de los siguientes puntos:


enabled --> Aquí se dice si se quiere tener habilitado el filtro de la sección o no. Solo hay dos posibles valores: true y false

port --> Aquí se establece el puerto que "vigila" el filtro. El puerto puede ser numerico o se puede poner el nombre del puerto en cuestión. En caso de no conocer bien los puertos o no acordarte de todos, puedes consultarlos entrando aquí.

filter -->Aquí habría que poner el nombre del fichero que está dentro de la carpeta filter.d. Tal y cómo he comentado antes, todos los ficheros de filter.d tienen la extensión .conf, pues aquí habría que omitir dicha extensión; es decir que si por ejemplo para esta sección se usase apache-auth.conf cómo fichero que va a encargarse de revisar los logs, habría que poner aquí solamente apache-auth.

logpath -> Aquí simplemente se pondría la ruta del log que se quiere revisar.

maxretry -> Aquí se cuentan el número de intentos que se pueden realizar cómo máximo al servicio que se está filtrando. Si se alcanzase el máximo de intentos, el sistema bloquearía la ip atacante. En caso de establecer un maxretry distinto al de la sección general, el maxretry de la sección tendría más prioridad.

Ahora que se poseen las nociones básicas de lo que compone fail2ban, tocaría habilitar apache para que filtre las intrusiones. Para ello habría que entrar en jail.conf y buscar las secciones: apache, apache-multiport,apache-noscript,apache-overflows; En todas éstas sólo habría que cambiar el parametro enabled a true, quedando tal que así:

  1. [apache]
  2. enabled  = true
  3. port     = http,https
  4. filter   = apache-auth
  5. logpath  = /var/log/apache*/*error.log
  6. maxretry = 6
  7. # default action is now multiport, so apache-multiport jail was left
  8. # for compatibility with previous (<0.7.6-2) releases
  9. [apache-multiport]
  10. enabled   = true
  11. port      = http,https
  12. filter    = apache-auth
  13. logpath   = /var/log/apache*/*error.log
  14. maxretry  = 6
  15. [apache-noscript]
  16. enabled  = true
  17. port     = http,https
  18. filter   = apache-noscript
  19. logpath  = /var/log/apache*/*error.log
  20. maxretry = 6
  21. [apache-overflows]
  22. enabled  = true
  23. port     = http,https
  24. filter   = apache-overflows
  25. logpath  = /var/log/apache*/*error.log
  26. maxretry = 2

Ahora sólo quedaría reiniciar fail2ban y ya tendríamos el filtrado preparado. Para saber que efectivamente tenemos los nuevos filtros implantado, solamente habría que escribir:

iptables -nvL

Con dicho comando veríamos todos los filtros que fail2ban ha implantado.

Añadiendo un filtro completamente nuevo

Los servicios más usados aparecen por defecto en la carpeta filter.d y en el fichero jail.conf, pero imaginemos que no es un servicio tan "popular" cómo el resto. ¿Qué habría que hacer ahí? En el listado de servicios que he mencionado anteriormente se puede acceder a la documentación que señala todo lo necesario para añadir nuevos filtros, pero es interesante entender el concepto.

En caso de querer añadir un nuevo servicio, habría que hacer dos cosas. La primera sería entrar en la página del proyecto para copiar el contenido necesario para el fichero que iría en la carpeta filter.d, y segundo modificar el fichero jail.conf para referirse tanto a los logs deseados cómo al nuevo fichero almacenado en filter.d. Pongamos por ejemplo el servicio Asterisk; Asterisk es uno de los servicios que el programa es capaz de proteger, pero no incluye la información necesaria por defecto para hacerlode la misma forma que lo hemos hecho con Apache.

Para este caso en particular habría que acceder aquí y copiar el contenido que explica a un fichero llamado asterisk.conf, el cual iría almacenado en filter.d. Por último habría que entrar en jail.conf y añadir las líneas necesarias para que los filtros funcionen; en este caso por ejemplo habría que añadir al final del fichero; cómo podéis ver sigue la misma estructura que la que he comentado antes con la diferencia de que añade una nueva línea :


  1. [asterisk-iptables]
  2. # if more than 4 attempts are made within 6 hours, ban for 24 hours
  3. enabled  = true
  4. filter   = asterisk
  5. action   = iptables-allports[name=ASTERISK, protocol=all]
  6.               sendmail[name=ASTERISK, dest=you@yourmail.co.uk, sender=fail2ban@local.local]
  7. logpath  = /var/log/asterisk/messages
  8. maxretry = 4
  9. bantime = 86400

Recordad que después de aplicar cualquier cambio hay que reiniciar fail2ban para que aplique los cambios.

Espero que os sea útil.

Saludos.

No hay comentarios :

Publicar un comentario