Agregando reglas de firewall a router mikrotik usando fail2ban script

El siguiente documento muestra como conseguimos liminar automáticamente a los atacantes conocidos de nuestro servidor de correo y usar esa información de base para generar reglas de firewall e iyectarlas en un router mikrotik.

Comenzamos.

Nosotros tenemos configurado fail2ban para que los atacantes más conocidos estén siempre listados en /etc/fail2ban/ip.blacklist de manera que esta es nuestra lista base.

Creamos un script de perl para leer este archivo y producir un archivo llamado mailfail2ban.rsc (tiene que tener esa extensión) que tiene todo lo necesario para ser importado por el router mikrotik.

Creamos una regla en el router mikrotik que deniega todo el tráfico input y forward que provenga de la lista mailfail2ban.

Copiamos con scp el archivo mailfail2ban.rsc al router y lo importamos como script para que lea todo el contenido y lo ejecute ingresando todos los ips de atacantes dentro de la lista mailfail2ban.

Creación de llave pública y privada en el server origen que tiene instalado fail2ban:

En máquina linux-fail2ban
# Crear un usuario llamado linuxmk y crear el par de llaves logueado como él.

$ssh-keygen -t rsa -b 2048 -f /home/linuxmk/llave-rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in llavecita.
Your public key has been saved in llavecita.pub.
The key fingerprint is:
18:c9:4f:5d:fc:75:95:a9:75:e6:78:11:49:62:ba:00 linuxmk@server1
The key's randomart image is:
+--[ RSA 2048]----+
|              .=*|
|     E .   + .+=o|
|      =   o +.+oo|
|       = o . o...|
|      . S o   .  |
|         o       |
|                 |
|                 |
|                 |
+-----------------+


No se ingresa el passphrase solo enter para que no pida la contraseña.
Ésta acción genera dos llaves:  /home/linuxmk/llave-rsa, /home/linuxmk/llave-rsa.pub .

Al archivo llave-rsa.pub le hicimos una modificación. Al final de la línea decidimos que debía estar directamente el ip y no el host de la máquina.
El archivo debería lucir algo como esto:

linuxmk@Server1:$ cat llavin-rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6b8KAMSaUx3OD8X4yhzSMOLnflwC/ps2UKWkTOayaQipxcaheipYBI16/Q2hjhOLDYADIJISTEFAgFq5kPIikULN9MMP9123k+75yUFtiHCO4AmKZACTJzhl6RrQ7ZBSq0uQfMRJ6kkY0ZY1D5o42VJWzTn4bXRv9ViEQbZ2i5JgiryVTtJF8STpHtEb6QRGa3mrSIzWUXQ8cOxmpYpcLihzaJZS3W0UYp0Rq9zsSoDgjC+WMSe9liJFycxXoVAzk6papfCd/puPbmdQC5WWC2mJHMG8kJaoMIHUEVOQUEPONDRIALAMISMANk0/PLZ3/mwd1XUylSMWSJN21PKLC/OhVYorP93IZPk9 linuxmk@190.1.1.1


Luego es necesario crear un usuario en el router mikrotik de la siguiente manera:

[admin@MikroTik] > /user add name=linuxmk address=190.1.1.1 password=Clave12345 group=full

Con ello aseguramos que tendrá acceso desde la ip 190.1.1.1 únicamente.
Hacemos logout del router y volvemos a conectar con el usuario linuxmk, esto es importante para que la importación de la llave pública sea con el usuario linuxmk.

Yo ingresé con winbox y fui a la sección de Files y subí el archivo:



Luego de copiarla se procede con la importación, de nuevo desde la línea de comandos:

[linuxmk@MikroTik] > /user ssh-keys import public-key-file=llave-rsa.pub

Ojo que estamos logueados como linuxmk. Una vez correctamente importada debríamos ver la sección de usuarios y llaves ssh de la siguiente manera:

[linuxmk@MikroTik] > /user ssh-keys print 
                                                                                 0 R linuxmk              2048 linuxmk@190.1.1.1

Ahí la importancia de que sea el mismo usuario el que importe la clave.

Podemos probar la comunicación intentando listar algún comando de mikrotik, como el siguiente, ejecutado desde el server linux.

linuxmk@Server1:$ ssh -i /home/linuxmk/llave-rsa -l linuxmk 190.1.1 "/user print"
Flags: X - disabled
 #   NAME             GROUP             ADDRESS            LAST-LOGGED-IN     
 0   ;;; system default user
     admin            full                                 aug/16/2016 22:21:54
 1   ;;; Linuxmik para seguridad fail2ban
     linuxmk          full              190.1.1.1/32       jan/31/2017 17:19:46


Si obtenemos una salida como la anterior significa que la llave está bien importada, que la comunicación para comandar el mikrotik vía ssh con llave privada y sin contraseña funciona efectivamente. Ahora procedemos con el script de reglas


Script de perl:

#!/usr/bin/perl -w
# Script para carga de reglas router mikrotik de atancantes registrados en fail2ban del server de mail.
# Autor: Jaime R. C. Letona
# Fecha: 27EN2017
# ver:     1.0

$PATH_BL="/etc/fail2ban/ip.blacklist"; #Archivo de lista negra generado por atacantes del server de correo
open (BL,"<$PATH_BL");
$PATH_BLMK="/etc/fail2ban/bl_mikrotik/mailfail2ban.txt";

$PATH_BLMK1="/etc/fail2ban/bl_mikrotik/mailfail2ban.rsc"; # Archivo final
open (BLMK, ">>$PATH_BLMK");

while  ($linea = )
    {
        chomp($linea);
        @tupla=split(/,/,$linea);
    $tupla[0]=~s/^\s*//; #quita espacios iniciales
    $tupla[0]=~s/\s*$//; #quita espacios finales
    print BLMK "/ip firewall address-list add list=mailfail2ban address=$tupla[0]  timeout=60m comment=Fail2banIpBlacklist \n"; # Creacion de cada regla
    }

close (BL);
close (BLMK);

# Verificacion y eliminacion de lineas duplicadas y la red privada 10.0
$DUP = "cat $PATH_BLMK | sort | uniq | sed '/10\.0/d' > $PATH_BLMK1";
system ($DUP);

# Inserta dos lineas al inicio del archivo. Caracteres reservados (: " $) por ello puse \.
# que sirven para agregar un log y para borrar lo existente.
$INI2 = "sed -i '1i \:foreach subnet in [/ip firewall address-list find list=mailfail2ban] do={ /ip firewall address-list remove \$subnet }' $PATH_BLMK1";
system ($INI2);
$INI1 = "sed -i '1i \:log info \"mailfail2ban importacion iniciada\"' $PATH_BLMK1";
system ($INI1);

# Inserta una linea al final del archivo
$FIN = "sed -i '\$a \:log info \"mailfail2ban script end run\"' $PATH_BLMK1";
system ($FIN);

$DEL_TMP = "rm $PATH_BLMK";
system ($DEL_TMP);

# Copiando el archivo generado a router mikrotik
$CP_MIKROTIK = "scp -i /home/linuxmk/llave-rsa  /etc/fail2ban/bl_mikrotik/mailfail2ban.rsc linuxmk\@190.1.1.1:mailfail2ban.rsc";
system($CP_MIKROTIK);

# Ejecutando el import en router mikrotik
$IMPORT_MK = "ssh -l linuxmk -i /home/linuxk/llave-rsa 190.1.1.1 \"\/import mailfail2ban.rsc\"";
system($IMPORT_MK);

# Eliminando el archivo de files en mikrotik
$DEL_F = "ssh -l linuxmk -i /home/linuxmk/llave-rsa 190.1.1.1 \"\/file remove mailfail2ban.rsc\"";
system($DEL_F);
   
exit 0;

   


El programa puede validarse si hay reglas creadas en mikrotik.

Éxitos en la implementación!!!


Comentarios

Entradas populares