Home Linux FAIL2BAN – Securizar acceso SSH

FAIL2BAN – Securizar acceso SSH

by José Luis Sánchez Borque
fail2ban

Dado que la seguridad es un reto para todas las empresas y particulares, y cómo ya he comentado alguna vez, no todos son le dan la importancia que tiene, decidí empezar a caminar en ese sentido. Qué mejor manera que motivar y formar a los alumnos que están estudiando informática.

Durante el curso, les voy proponiendo trabajo «extra» en forma de retos, para aquellos que quieren profundizar más allá de los simples contenidos de sus estudios. No es algo obligatorio para todos, pero si que en general está teniendo buena aceptación.  Los trabajos de cada reto son presentados al resto de alumnos de clase para que también aprendan del trabajo de sus compañeros.

También les propuse darles «cierta notoriedad» si se me permite la expresión, publicando para aquellos que así me lo pidan el trabajo realizado en mi blog, así como darles la máxima difusión en linkedin, así que os pido eso mismo, que ayudéis si os gusta el artículo con vuestros «likes» en el blog y en su linkedin. Cada vez más, dicha red es utilizada por empresas y les puede ayudar en su futuro si dan continuidad a buenas publicaciones.

Dar las gracias a Marc Martín y German Panzardi por el trabajo bien hecho. Os dejo sus enlaces a linkedin para que los vayáis siguiendo.. hay cantera y futuro.

¿Qué es fail2ban?

Fail2ban es una aplicación escrita en Python para la prevención de intrusos en un sistema, que actúa penalizando o bloqueando las conexiones remotas que intentan accesos por fuerza bruta: Usuario + Contraseña. Puede controlar diferentes tipos de servicio: SSH, HTTP, etc.

El servicio Fail2Ban se basa en el rastro que dejan los intentos de acceso al sistema en los logs del sistema. Filtrando adecuadamente será capaz de detectar dichos intentos… Lo realmente complicado es filtrar dicha información para servicios complejos.

Esto es muy útil, por ejemplo, en casos que un atacante utilice herramientas de ataques por fuerza bruta como “Hydra” (Que se encargan de ir probando contraseñas hasta dar con la acertada). Se pueden añadir otras capas en nuestro nivel de seguridad, tales como “Port Knocking” o incluso el “CanaryToken

Empezaremos como siempre visualizando las versiones con las que trabajaremos:

Servidor Ubuntu:

demo@odoo:~$ sudo lsb_release -a

Distributor ID: Ubuntu
Description: Ubuntu 20.04.3 LTS
Release: 20.04
Codename: focal

Versión fail2ban 0.11:

demo@odoo:~$ apt list fail2ban

Listando... Hecho
fail2ban/focal,focal,now 0.11.1-1 all [instalado]

Es importante tener presente las versiones, pues hay diferentes como es obvio entre unas y otras.

Algo que queremos comentar antes de pasar a la parte de instalación y configuración del servicio, es explicar un par de conceptos que se verán a continuación:

  • Filter: Son las expresiones usadas para la obtención de datos de los Logs del servicio al cual vamos a aplicar el Fail2ban. Ejem : “Bantime”
  • Action: Son las acciones a realizar según los Logs
  • Jail: son un conjunto de filtros o instrucciones que forman una de estas Jails (Para simplificarlo, son los contenedores de ordenes o filtros que queremos que acate el Fail2ban sobre un servicio)

Bien, ahora que sabemos que es y para qué sirve, pasaremos a instalar el servicio.

Lo primero que necesitaremos será la maquina en la que queremos proteger el servicio con conexión a internet para poder instalar los paquetes necesarios.

Haremos una pequeña prueba de conexión, y nos cercioraremos que la pila de protocolos TCP/IP está funcionando correctamente:   ping www.google.com

Ahora que tenemos el escenario listo, empezaremos con la instalación.

Lo primero que haremos será instalar el paquete del servicio, este se llama “Fail2ban”

$ sudo apt install fail2ban

Una vez este esté instalado, pasaremos a la configuración del mismo. Lo que haremos será dirigirnos a la carpeta “fail2ban” situada en el directorio “/etc”.

$ cd /etc/fail2ban

Una vez dentro, modificaremos con un editor de texto (“nano” por ejemplo) el archivo “jail.conf”, para esta acción necesitaremos permisos por lo que usaremos el parámetro “Sudo” al inicio del comando.

$ sudo nano jail.conf

En este archivo encontraremos diversas opciones de configuración tales como el tiempo de “ban”, el número de intentos que tenemos antes del “ban”

En la sección «[DEFAULT]» encontramos la configuración global de las opciones. Allí veremos diversas variables que definir como las siguientes:

  • Bantime: Tiempo en segundos que la IP será baneada mediante IPTABLES
  • Maxretry: Número máximo de intentos que podrán realizarse antes de que la IP sea baneada.
  • Ignoreip: Lista de IP’s que serán ignoradas por el servicio “Fail2ban”
  • Logpath: Es la ruta del archivo de log proporcionada al filtro
  • Findtime: Findtime es para definir en segundos, cuanto tiempo queremos que se guarde en memoria la IP de las personas que han intentado conectarse al servicio, es decir si lo intentamos una vez, y tenemos puesto un máximo de 3 intentos, esto lo que hará es que la cuenta (3 intentos) no se reseteara hasta que pase el tiempo determinado.

Esta es la configuración por defecto, pero en este caso lo que queremos es hacer una configuración por nuestra cuenta.

Ahora que sabemos esto, volveremos a la carpeta “fail2ban”, y en la que posteriormente nos moveremos a la carpeta “jail.d” y dentro de esta, entraremos en el archivo “defaults-debian.conf” en el que podremos hacer esta configuración especifica.

$ cd /etc/fail2ban/jail.d

$ sudo nano defaults-debian.conf

Como hemos explicado anteriormente los parámetros posibles, pues simplemente lo haremos a nuestro gusto. En nuestro caso, lo que haremos será una estructura la cual permita un máximo de 3 intentos y si te banea, lo haga por un periodo de 1h (3600 segundos).

  • Podríamos usar también el parámetro:
  • Findtime: Este parámetro de lo que se encarga, es de definir el tiempo ha de transcurrir para que el contador de intentos fallidos de una determinada IP se resetee.

En mi caso lo dejare por defecto porque creo que el tiempo está bien determinado.

Guardaremos el archivo y reiniciaremos el servicio “Fail2ban”

$ sudo service fail2ban restart

Y con esto estaría listo el Fail2ban para el servicio SSH. Si hacemos un test contra el servicio SSH, y entrando tres veces de forma incorrecta la contraseña, la conexión es rechazada.

Al final, lo que hace fail2ban es modificar el firewall del sistema, IPTABLES, añadiendo una nueva cadena denominada Chain_f2b-sshd a la lógica del firewall. Podemos ver en la imagen adjunta como con rechazados, REJECT, todos los paquetes cuya IP origen sea 192.168.150.25 (máquina atacante), independientemente del protocolo (prot=all).

Listados todas las reglas de nuestro firewall con:

$ sudo iptables -L

Interfaz de usuario gráfica Descripción generada automáticamente con confianza media

Para realizar una consultar simple de los logs de fail2ban ejecutaremos el siguiente comando en la terminal:

$ less /var/log/fail2ban.log

Interfaz de usuario gráfica Descripción generada automáticamente

Para obtener un listado con el número de veces que ha sido bloqueada cada una de las IP ejecutaremos el siguiente comando en la terminal:

$ sudo zgrep -h "Ban " /var/log/fail2ban.log* | awk '{print $NF}' | sort | uniq -c

Si pretendemos obtener un listado las IP que han sido bloqueadas durante el día de hoy ejecutamos el siguiente comando:

$ sudo grep "Ban " /var/log/fail2ban.log | grep `date +%Y-%m-%d` | awk '{print $NF}' | sort | awk '{print $1,"("$1")"}' | logresolve | uniq -c | sort -n

En el caso que pretendamos obtener un listado del número de bloqueos por día y por servicio ejecutaremos el siguiente comando:

$ sudo zgrep -h "Ban " /var/log/fail2ban.log* | awk '{print $5,$1}' | sort | uniq -c

Disponemos del comando fail2ban-client para realizar múltiples tareas administrativas. Cómo muestra dos ejemplos:

demo@odoo:~$ sudo fail2ban-client status

Status
|- Number of jail: 1
`- Jail list: sshd

demo@odoo:~$ sudo fail2ban-client status sshd

Status for the jail: sshd

|- Filter
| |- Currently failed: 0
| |- Total failed: 3
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 0
|- Total banned: 1
`- Banned IP list:

En versiones superiores a la 0.9, fail2ban almacena toda la información en sqlite, es decir, en una base de datos, y como tal la podremos consultar mediante órdenes SQL:

Podemos ver donde almacena la base de datos mediante el comando:

demo@odoo:~$ sudo fail2ban-client get dbfile

Current database file is:

`- /var/lib/fail2ban/fail2ban.sqlite3

Podemos conectarnos de la siguiente manera:

demo@odoo:~$ sudo sqlite3 /var/lib/fail2ban/fail2ban.sqlite3

SQLite version 3.31.1 2020-01-27 19:55:54

Enter ".help" for usage hints.

sqlite>

Es posible que tengamos que instalar sqlite3 para poder ejecutar la orden anterior: apt install sqlite3

Veamos como podemos hacer una simple consulta:

sqlite> .tables

bans bips fail2banDb jails logs

sqlite> select * from bans;

sshd|192.168.1.10|1642266334|10|1|{"matches": ["Jan 15 18:05:27 odoo sshd[2193]: Failed password for demo from 192.168.1.10 port 5847 ssh2", "Jan 15 18:05:31 odoo sshd[2193]: Failed password for demo from 192.168.1.10 port 5847 ssh2", "Jan 15 18:05:34 odoo sshd[2193]: Failed password for demo from 192.168.1.10 port 5847 ssh2"], "failures": 3, "mlfid": " odoo sshd[2193]: ", "alt_user": "", "ip4": "192.168.1.10", "user": "demo", "users": "['demo']"}

sqlite>

A partir de aquí, podemos seguir profundizando y securizar otros servicios, automatizar procesos cómo envío de un correo cuando se “banea” una IP, etc, etc..

You may also like

Leave a Comment