Advertencia: Fail2Ban puede ocupar mucho espacio en tu servidor (Así lo solucioné)

En mi personal cruzada por reducir y optimizar el espacio ocupado en mi servidor, descubrí que Fail2Ban ocupaba ¡3.8GB! Aquí te cuento mi proceso para reducirlo paso a paso.

Una de las mejores meneras de localicar problemas de espacio es usando ncdu. Si todavía no lo tienes ya lo puedes ir instalando apt install ncdu

ncdu /

Mientras navegaba por los directorios, algo en /var/lib llamó mi atención. Al entrar, vi esto:

ncdu fail2ban

¿De verdad? ¿Esa herramienta que supuestamente solo guarda unos cuantos logs? ¿3.8 gigabytes?

sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "SELECT COUNT(*) FROM bans;"

Resultado: más de 2 millones de registros. ¡Dos millones de baneos! Y cuando verifiqué la antigüedad:

sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "SELECT DATE(MIN(timeofban), 'unixepoch') FROM bans;"

Descubrí registros desde 2022. Tres años de ataques, intrusiones fallidas e intentos de brute force acumulándose sin control.

Después de leer documentación y varios intentos fallidos, llegué a la solución elegante:

sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 \
"DELETE FROM bans WHERE DATE(timeofban, 'unixepoch') < '2025-06-01'; VACUUM;"

Traducción: «Elimina todos los baneos anteriores al 1 de junio de 2025 y luego compacta la base de datos.»

Ejecuté el comando y… funcionó. Los resultados fueron casi inmediatos

¡De 3.8GB a 3.9MB! Había recuperado el 99.9% del espacio ocupado.

Ahora tengo en mi /etc/fail2ban/jail.local:

[DEFAULT]
dbpurgeage = 30d

Lo que permite purgar la base de datos cada 30 días de manera automática.

¡Arreglado! y a seguir con otras cosas.

Cómo activar el log de MySQL

mysql

Si dispones una versión de MySQL superior a la 5.1.29, puedes activar el log de toda la actividad de la base de datos de la siguiente manera (atención, necesitas ser root):

  1. Edita el fichero /etc/my.cnf
  2. Añade una línea al final del fichero que contenga: general_log_file=/ruta/a/tu/fichero.log

Reinicia el servicio de MySQL y cuando se haya levantado de nuevo, entra en MySQL y ejecuta la sentencia:

SET global general_log = 1;

Ya está, ahora puedes ver qué está haciendo MySQL en tiempo real con tan sólo escribir:

tail -f /ruta/a/tu/fichero.log

Según la cantidad de tráfico que tengas en tu servidor, el fichero puede llegar a ocupar mucho espacio, así que recuerda echarle un vistazo de vez en cuando.

Usando SQLite

SQLite
SQLite

¿Qué es SQLite?

SQLite es un pequeño – pero genial – Sistema Gestor de Bases de Datos, como MySQL, Oracle, dBase o FileMaker. Las principales ventajas respecto a otros sistemas de gestión de bases de datos son:

  • Es un proyecto de dominio público.
  • Tamaño muy reducido, menos de 300Kb, que lo hace perfecto para ser utilizado junto con otras aplicaciones.
  • Las bases de datos se guardan en forma de ficheros, por lo que es posible trasladar sin problemas una base de datos (o fichero) a cualquier dispositivo que tenga instalado sqlite.
  • Es multiplataforma.
  • Estabilidad. Despues de más de 10 años de desarrollo, muchas aplicaciones como Firefox, OpenOffice o incluso Android confían en esta herramienta para gestionar sus datos.

Instalación

Instalarlo es muy sencillo, puedes descargarlo de su página oficial o bien ejecutar el siguiente comando en cualquier distribución basada en Debian:

pedro@pedro:~$ sudo apt-get install sqlite

para instalar la versión 2.x o bien

pedro@pedro:~$ sudo apt-get install sqlite3

para instalar la versión 3.x.

Voy a publicar algunos comandos que me han resultado útiles para preparar una base de datos a la que accede una pequeña aplicación en hecha en Mono.

Importar ficheros CSV a SQLite

Supongamos que tenemos el siguiente archivo:

pedro@pedro:~/prueba$ cat tabla.csv
Pedro;Carrasco;http://www.pedrocarrasco.org/
Juan;Gomez;http://www.paginawebdejuan.com/
Federico;Garcia;http://www.paginadefederico.com/

Con el siguiente comando crearemos un fichero llamado personas.db3, que contendrá la base datos que queremos importar:

pedro@pedro:~/prueba$ sqlite3 personas.db3
SQLite version 3.7.2
Enter «.help» for instructions
Enter SQL statements terminated with a «;»

La base de datos destino debe tener la misma cantidad y tipo de datos que el CSV, así que creamos la tabla personas adecuada a la información que queremos importar:

sqlite> create table personas ( nombre varchar(32), apellidos varchar(32), web varchar(32) );

Como nuestro archivo CSV separa los campos mediante el caracter punto y coma (;), lo indicaremos en sqlite de la siguiente manera:

sqlite> .separator ;

Ahora sólo falta importar el archivo:

sqlite> .import tabla.csv personas

Ya está, ahora podemos hacer un SELECT, para comprobar que todo está bien:

sqlite> select * from personas;
Pedro|Carrasco|http://www.pedrocarrasco.org/
Juan|Gomez|http://www.paginawebdejuan.com/
Federico|Garcia|http://www.paginadefederico.com/

Convertir de sqlite3 a sqlite2

La manera más sencilla y rápida de convertir una base de datos de la versión 3 de sqlite a la versión 2 es la siguiente:

pedro@pedro:~/prueba$ echo .dump | sqlite3 personas.db3 | sqlite personas.db