En el siguiente tutorial procederemos a configurar el servicio fail2ban sobre una máquina con sistema operativo Centos 7, concretamente con la versión 3.10.0 del Kernel 64 bits, para el servicio ssh.

Es cierto que fail2ban permite proteger muchos más servicios, pero hemos considerado que posiblemente uno de los servicios más críticos de un sistema, sea el acceso remoto.

Qué es Fail2Ban

Fail2ban es una aplicación escrita en Python que permite prevenir intrusiones en un sistema. Principalmente actúa bloqueando las conexiones remotas que intentan accesos por fuerza bruta. Se distribuye bajo licencia GNU.

Uno de los ataques más extendidos, a nivel global, son los denominados ataques de fuerza bruta, sobre servicios como ssh, ftp, web… Es cierto, que con contraseñas robusta dificultan enormemente el éxito de dichos ataques, pero debemos tener en cuenta que los ataques por fuerza bruta consumen un gran ancho de banda, disparan el crecimiento de los archivos de log  y consumen CPU.

Cómo funciona fail2ban

Básicamente fail2ban analiza los ficheros de log en busca de patrones o indicadores concretos, por ejemplo intentos de login fallidos, para ejecutar ciertos comportamientos, como el bloqueo total o temporal de la conexión y/o la notificación por mail del evento… Estas reglas y bloqueos son definidos por el usuario administrador del sistema.

Antes de empezar

Como ya hemos dicho, el servicio que vamos a proteger será ssh, esto no quiere decir que fail2ban sea la panacea y podamos descuidar otros aspectos de seguridad que nos permite tanto la configuración del servicio ssh como la de nuestro sistema. Por ello recordaremos ciertos aspectos a considerar en cuanto a los accesos remotos a nuestros sistemas Linux.

  1. No es recomendable tener el acceso root por ssh habilitado.
  2. Es conveniente utilizar juegos de llaves, con passphrase, para acceder al sistema.
  3. El acceso de usuarios remotos debe ser nominativo, a poder ser, y los permisos limitados, por ejemplo, con sudoers.
  4. Se debe limitar el número de conexiones concurrentes.
  5. Se debe limitar el tiempo de inactividad de las conexiones.
  6. Siempre que sea posible se deben filtrar los orígenes de conexión a nuestros sistemas.
  7. Se deben definir reglas de firewall.
  8. Se deben realizar actualizaciones periódicas del sistema..

Configuración de fail2ban para ssh

Antes de comenzar la configuración, de fail2ban para ssh, es conveniente que conozcamos las opciones y ficheros que componen esta herramienta.

Paso 1

En primer lugar deberemos instalar los paquetes necesarios y lo haremos de la siguiente manera:

  • yum install epel-release -y
    • Instala el repositorio necesario para descargar fail2ban
  • yum install fail2ban && yum install fail2ban-systemd -y
    • Instala el paquete fail2ban y los paquetes  para systemd.

Realizada la instalación nos dirigimos al directorio /etc/fail2ban, donde encontraremos las siguiente estructura:

  • ls -lt /etc/fail2ban |awk {‘print $9’}
    • jail.d/
    • action.d/
    • filter.d/
    • fail2ban.d/
    • jail.conf
    • fail2ban.conf
    • paths-common.conf
    • paths-debian.conf
    • paths-fedora.conf
    • paths-freebsd.conf
    • paths-opensuse.conf
    • paths-osx.conf

Es importante tener una noción, al menos básica, de la estructura y cuál es la función de cada archivo o directorio, por ello a continuación mostramos un breve resumen:

jail.d/ Contiene archivos .conf, con declaraciones de jails.
action.d/ Contiene las acciones a realizar si el resultado del proceso de un filtro es verdadero
filter.d/ Contiene expresiones regulares que se utilizan para detectar intentos de denegación, errores de login, etc…
fail2ban.d/ Puede contener archivos .conf.
jail.conf Contiene la declaración de las jails. Algunas secciones existen como plantillas.

No es recomendable modificar este fichero, las personalizaciones deben realizarse en un jail.local o bien con archivos .conf en el directorio jail.d/

fail2ban.conf Contiene la configuración general del daemon fail2ban-server, como el nivel de log o la ubicación de estos.. También se puede especificar la path del socket usado para la comunicación entre el cliente y el servidor.
paths-common.conf Contiene básicamente las paths de acceso a los ficheros de log.
paths-debian.conf Contiene básicamente las paths de acceso a los ficheros de log. Según sistema operativo. DEBAN
paths-fedora.conf Contiene básicamente las paths de acceso a los ficheros de log. Según sistema operativo.  FEDORA
paths-freebsd.conf Contiene básicamente las paths de acceso a los ficheros de log. Según sistema operativo. FREEBSD
paths-opensuse.conf Contiene básicamente las paths de acceso a los ficheros de log. Según sistema operativo. OPENSUSE
paths-osx.conf Contiene básicamente las paths de acceso a los ficheros de log. Según sistema operativo. MAC

***Los fichero .conf se leen antes que los ficheros .local, debemos saber entonces, que las configuraciones posteriores anulan a las anteriores. Por lo tanto, un archivo .local no tiene que incluir todo en el archivo .conf correspondiente, sólo aquellas configuraciones que desea modificar. Las modificaciones deben realizarse en el .local y no en el .conf, lo que evitará problemas en las fusiones de ficheros al actualizar.

Paso 2

Una vez descargados e instalados los paquetes de fail2ban y conocidos los ficheros y directorios más esenciales, comenzaremos la configuración para el control del servicio ssh.

Lo primero  que haremos es generar el fichero jail.local:

  • cp -a jail.conf jail.local o bien touch jail.local && chmod 644 jail.local

Una vez generado el fichero jail.local deberemos comenzar a realizar las modificaciones pertinentes.

A continuación, procederemos a la configuración de la sección Default y de la Jail para el servicio ssh.

Los parámetros definidos en las sección Default, como su nombre indican, son parámetros generales, que afectarán a todas las jails, de cada uno de los servicios que deseemos proteger (ssh, http, ftp, etc…) , en consecuencia si en una jail no indicamos un campo, por ejemplo maxretry, el valor que se le asignará será el que aparezca en la sección Default. Por el contrario, si en una jail indicamos un parámetro y ponemos un valor distinto al indicado en la sección Default, prevalecerá el definido en la jail.

Bajo nuestro criterio personal, hemos marcado en color rojo, aquellos valores que conviene definir únicamente en la sección Default. El criterio que hemos empleado solamente tiene como consideración guardar un cierto orden.

Sección Default

Dentro del fichero jail.local, lo primero que nos ocupará será entender las sección Default (En caso de no existir deberemos fijarnos en la sección Default del fichero jail.conf), que consta básicamente de los siguientes parámetros:

  • ignoreip: Permite indicar direcciones IP que no serán consideradas por fail2ban.
  • bantime: Tiempo en segundos que durará el bloqueo de la dirección. Por defectos son 600 segundos o 10 minutos.
  • findtime: Ventana de tiempo en segundos (Por defecto 600) durante el cual se considera el parámetro maxretry.
  • maxretry: número máximo de intentos erróneos de autenticación para ser bloqueado.
  • backend: Permite especificar como fail2ban monitorizará los ficheros de log. Si está con el valor AUTO, fail2ban probará primero con pyinotify, luego con gamin y luego un algoritmo de sondeo basado en lo que está disponible
  • usedns: Permite la resolución o no de nombres.
  • destemail: Permite indicar una dirección mail de notificación.
  • sendername: Permite indicar un el campo FROM del mail de notificación.
  • banaction: Establece la acción que se ejecutará cuando se llegue al límite de intentos de autenticación. Básicamente contiene el nombre el nombre del fichero iptables-multiport.conf (ubicado en /etc/fail2ban/action.d/) que contiene las reglas para denegar el acceso a una IP.
  • mta: Permite definir el agente para transmitir las notificaciones mail.
  • protocol: Es el tipo de tráfico que se eliminará cuando se aplique una prohibición de IP.
  • chain: Especifica el tipo de cadena para iptables (por defecto INPUT)

Sección Jail

Justo debajo de la sección Default, podremos ver las definiciones de jail que contiene el fichero jail.local (En caso de no existir, podemos ver las definiciones de jails en el fichero jail.conf), o bien crearlas.

Los parámetros generales que debemos conocer mínimamente son:

  • enabled: (true / false)  habilitar o deshabilitar la jail.
  • port: indica el puerto del servicio a gestionar. Por nombre o por número.
  • filter: expresión regular para buscar.
  • action: acciones a ejecutar.
  • logpath: path de acceso a los logs.

Ahora que conocemos un poco mejor la sección de jails,así como la sección Default, podemos definir la jail para el servicio ssh.

jail

[sshd] Nombre jail
enabled = true Habilitamos la jail
port    = ssh Indicamos el puerto, en este caso ssh (22)
filter   = sshd Indicamos el filtro que vamos a utilizar (Ubicado en  /etc/fail2ban/filter.d/sshd.conf). Estos filtros existe por defecto, pero podemos crear los nuestros propios.
maxretry = 3 Indicamos el número máximo de intentos de login erróneos.
findtime = 500 Modificamos el valor por defecto indicado en la sección Default y dejando  el findtime a 500 segundos.
logpath = %(sshd_log)s Indicaremos la path del los logs mediante la variable que apunta  a:  

Fichero/Variable/Path paths-common.conf:sshd_log = %(syslog_authpriv)s.
Que a su vez hace referencia a:

Fichero/Variable/Path paths-fedora.conf:syslog_authpriv = /var/log/secure

backend = %(sshd_backend)s Indicaremos el backend utilizado para la gestión del servicio mediante la variable que apunta a :

Fichero/Variable/Path paths-common.conf:sshd_backend = %(default_backend)s
Que a su vez hace referencia a:

Fichero/Variable/Pathpaths-fedora.conf:sshd_backend = systemd

***Recordar que los parámetros de las sección Default pueden ser modificados dentro de cada jail en cuestión, en consecuencia, prevalecerán los parámetros indicados dentro de cada jail siempre que estos sean definidos.

Paso 3

Por último nos quedará arrancar el servicio y comprobar el correcto funcionamiento.

Para registrar, arrancar y comprobar el estado del servicio de fail2ban utilizaremos, como de costumbre, systemctl:

  • systemctl enable fail2ban
  • systemctl start fail2ban
  • systemctl status fail2ban

 

fail-service.png

Realizados los pasos anteriores con una sencilla prueba podremos observar el correcto funcionamiento de nuestra configuración

La captura siguiente, muestra tres intentos de acceso (vía ssh) con destino al equipo que hemos configurado, así como el bloqueo al introducir un password erróneo.

bloqueo.png

En la siguiente captura, realizada sobre el log /var/log/fail2ban.log, se puede observar básicamente: La activación de la jail sshd, los parámetros definidos para dicha jail así como el número de intentos fallidos de login y el consiguiente bloqueo.

pruebadefinitiva.png

Bueno, espero que haya sido útil. Saludos  y hasta la próxima.

Referencias:

Anuncios