Zimbra 8.8: Medidas Seguridad UGIT CT debian 10

  • Esta guía explica las medidas de seguridad implementadas en servidor debian 10 con zimbra

Paso#01: Dependencias

  • Instalamos ciertas dependencias
apt-get install make build-essential net-tools git -y

PASO#02: prueba de correo

  • para comprobar que podemos enviar un correo desde la terminal, con el usuario root hacemos
su root
echo "Prueba de envio desde el usuario root" | sendmail -v admin@siua.ac.cr

{
echo FROM: admin@siua.ac.cr
echo To: admin@siua.ac.cr
echo Subject: "Este es el asunto"
echo
echo "Este es el contenido del mensaje"
} | sendmail -v admin@siua.ac.cr

Paso#03: RKhunter

  • Descargamos el programa: rkhunter-1.4.6.tar.gz
  • Instalamos rkhunter que es un escáner que analiza y busca en nuestro ordenador, backdoors, exploits, sniffers y por supuesto rootkits, realizando diferentes pruebas a nuestro sistema.
  • Ingresamos a tmp para que después del siguiente reinicio se eliminen los archivos:
cd /tmp
  • Descargamos el fichero:
wget https://ugit.siua.ac.cr/wp-content/uploads/2019/09/rkhunter-1.4.6.tar.gz
  • Lo descomprimimos:
tar -zxf rkhunter-1.4.6.tar.gz
  • Ingresamos a la carpeta:
cd rkhunter-1.4.6
  • Lo instalamos:
./installer.sh --install
  • Podemos verificar la versión:
rkhunter --versioncheck
  • RESULTADO:
[ Rootkit Hunter version 1.4.6 ]

Checking rkhunter version...
  This version  : 1.4.6
  Latest version: 1.4.6
  • Actualizamos la base de datos:
rkhunter --update
  • RESULTADO:
[ Rootkit Hunter version 1.4.6 ]

Checking rkhunter version...
  This version  : 1.4.6
  Latest version: 1.4.6
root@metis:/tmp/rkhunter-1.4.6# rkhunter --update
[ Rootkit Hunter version 1.4.6 ]

Checking rkhunter data files...
  Checking file mirrors.dat                                  [ Updated ]
  Checking file programs_bad.dat                             [ No update ]
  Checking file backdoorports.dat                            [ No update ]
  Checking file suspscan.dat                                 [ No update ]
  Checking file i18n/cn                                      [ No update ]
  Checking file i18n/de                                      [ No update ]
  Checking file i18n/en                                      [ No update ]
  Checking file i18n/tr                                      [ No update ]
  Checking file i18n/tr.utf8                                 [ No update ]
  Checking file i18n/zh                                      [ No update ]
  Checking file i18n/zh.utf8                                 [ No update ]
  Checking file i18n/ja                                      [ No update ]
  • Crear el archivo rkhunter.dat
rkhunter --propupd
  • Ahora podemos verificar el sistema
rkhunter -c
  • Ahora creamos un cron mensual para que verifique nuestro sistema
  • Creamos una archivo en:
nano /etc/cron.monthly/rkhunter.sh
  • Agregamos
#!/bin/bash
{
echo FROM: log@siua.ac.cr
echo To: log@siua.ac.cr
echo Subject:"Reporte rkhunter correo.siua.ac.cr"
echo 
 rkhunter --versioncheck
 rkhunter --update
 rkhunter -c --cronjob --report-warnings-only
} | sendmail -v log@siua.ac.cr
  • Le damos permisos
chmod +x /etc/cron.monthly/rkhunter.sh
  • Si deseamos consultar el log file
nano /var/log/rkhunter.log

Paso#04: Instalar logwatch

  • Logwatch es un sistema de monitoreo de logs personalizable. Su función es revisar los logs del sistema en un período de tiempo determinado y elaborar un resumen con el nivel de detalle que se desee. Luego es capaz de enviar el resumen por mail en forma de reporte. Es muy útil para monitorear la actividad de los servidores y detectar posibles abusos, intentos de intrusión, consumo de recursos, etc.
  • Es importante saber que logwatch se instala en «/usr/share/logwatch» pero crea una estructura de archivos en /etc/logwatch, la idea es que toda configuración «adicional» la hagamos aquí y esta sobreescriba a la de /usr/share/logwatch
  • Los instalamos
apt-get install logwatch -y
  • Copiamos el archivos de configuración de «fábrica»
cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/logwatch.conf
  • Creamos una carpeta requerida:
mkdir /var/cache/logwatch
  • Abrimos el archivo:
nano /etc/logwatch/conf/logwatch.conf
  • Modificamos:
--------------------------------------------------------------
Output = stdout
X
Output = mail
--------------------------------------------------------------
Format = text
X
Format = html
--------------------------------------------------------------
MailTo = root
X
MailTo = log@siua.ac.cr
--------------------------------------------------------------
MailFrom = Logwatch
X
MailFrom = Logwatch_POSEIDON
--------------------------------------------------------------
Range = yesterday
X
Range = yesterday
--------------------------------------------------------------
Detail = Low
X
Detail = 8
--------------------------------------------------------------
  • Si fuera necesario modificar el archivo:
nano /etc/cron.daily/00logwatch
  • para probarlo
logwatch

Paso#05: OpenSSH

  • Instalamos el servicio:
apt install openssh-server openssh-client -y
  • Abrimos el archivo:
nano /etc/ssh/sshd_config
  • Modificamos el número de puerto
#Port 22
X
Port 44
  • Por defecto cualquier usuario del sistema que tenga permisos de shell se puede conectar por SSH, para evitar esto vamos a negar la conexión SSH del usuario root.
#PermitRootLogin prohibit-password
X
PermitRootLogin no
  • Aplicamos las siguientes configuraciones:
-----------------------------------------------------------------------
#Tiempo para introducir la contraseña
-----------------------------------------------------------------------
#LoginGraceTime 2m
X
LoginGraceTime 120


-----------------------------------------------------------------------
#Número de sesiones máxima por usuario permitida
-----------------------------------------------------------------------
#StrictModes yes
X
StrictModes yes

-----------------------------------------------------------------------
#Números de intentos permitidos de introducir la contraseña antes de desconectarnos
-----------------------------------------------------------------------
#MaxAuthTries 6
X
MaxAuthTries 3

-----------------------------------------------------------------------
#Número de sesiones máxima por usuario permitida
-----------------------------------------------------------------------
#MaxSessions 10
X
MaxSessions 10


-----------------------------------------------------------------------
#Si queremos habilitar el acceso ssh de usuarios del sistema con usuario y clave
#yes
#Si lo queremos impedir: no
-----------------------------------------------------------------------
#PubkeyAuthentication yes
X
PubkeyAuthentication yes
-----------------------------------------------------------------------
#PasswordAuthentication yes
X
PasswordAuthentication yes
-----------------------------------------------------------------------


-----------------------------------------------------------------------
#Agregamos al final del archivo: usuarios permitidos para conexión ssh
-----------------------------------------------------------------------
#Servidor común
AllowUsers root ugit zimbra admin
  • NOTA: a zimbra no se le puede aplicar la medida de los cifrados (Esto no se aplica)
#KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group18-sha512,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512
#Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
#MACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,umac-128-etm@openssh.com
#HostKeyAlgorithms ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-rsa,ssh-dss,ssh-ed25519
  • Reiniciamos el servicio
/etc/init.d/ssh restart
  • Ahora zimbra ocupa conectarse por ssh para las estadisticas por esta razon debemos indicarle a zimbra que cambiamos el puerto de ssh
  • Sino nos presenta el siguiente error
su zimbra
zmprov ms 'correo.siua.ac.cr' zimbraRemoteManagementPort 44
zmcontrol restart

Paso#06: Instalar Fail2ban

  • Instalamos:
apt-get install fail2ban -y
  • Copiamos el archivo
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
  • Abrimos el archivo
nano /etc/fail2ban/jail.local
  • Buscamos y remplazamos:
ignoreip = 127.0.0.1/8
X
ignoreip = 127.0.0.1 10.20.190.0/24 10.20.200.0/24 181.193.87.0/28 10.30.240.0/24 201.237.206.56

--------------------------------------------------------------

bantime  = 10m
X
bantime = 172800

--------------------------------------------------------------

maxretry = 5
X
maxretry = 3

--------------------------------------------------------------

destemail = root@localhost
X
destemail = ataques@siua.ac.cr
  • Agregamos la linea
sendername = METIS_Fail2Ban
  • Guardamos el archivo y cerramos
  • Ahora con el siguiente comando podemos ver cuales servicios utiliza zibra
lsof -i -P -n | grep LISTEN
  • Entonces vamos abrir el archivo
nano /etc/fail2ban/jail.d/defaults-debian.conf
  • Agregamos
#***********************************
#*********** SSH  ******************
#***********************************
[sshd]
enabled = true



  • Ahora creamos el archivo
nano /etc/fail2ban/filter.d/zimbra.conf
  • Agregamos el siguiente contenido

#*********************************** 
#**********  POSTFIX *************** 
#***********************************

[postfix]
enabled = true

[postfix-rbl]
enabled = true# Fail2Ban configuration file
#
# Author: 
#
# $Revision: 1 $
#
[Definition]
# Option: failregex
# Notes.: regex to match the password failures messages in the logfile. The
# host must be matched by a group named "host". The tag "<HOST>" can
# be used for standard IP/hostname matching and is only an alias for
# (?:::f{4,6}:)?(?P<host>[\w\-.^_]+)
# Values: TEXT
#
failregex = \[ip=<HOST>;\] account - authentication failed for .* \(no such account\)$
            \[ip=<HOST>;\] security - cmd=Auth; .* error=authentication failed for .*, invalid password;$
            ;oip=<HOST>;.* security - cmd=Auth; .* protocol=soap; error=authentication failed for .* invalid password;$
            \[oip=<HOST>;.* SoapEngine - handler exception: authentication failed for .*, account not found$
            WARN .*;ip=<HOST>;ua=ZimbraWebClient .* security - cmd=AdminAuth; .* error=authentication failed for .*;$
            NOQUEUE: reject: RCPT from .*\[<HOST>\]: 550 5.1.1 .*: Recipient address rejected:
failregex = WARN  \[.*\] \[name=.*;ip=<HOST>;ua=.*;\] security - cmd=Auth; account=.*; protocol=.*; error=.*, invalid password;

# .*\[ip=<HOST>;\] .* - authentication failed for .* \(invalid password\)
# 
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =
  • Creamos el archivo
nano /etc/fail2ban/filter.d/sasl.conf
  • El agregamos
# Fail2Ban configuration file
#
# Author: Yaroslav Halchenko
#
# $Revision: 728 $
#
[Definition]
# Option: failregex
# Notes.: regex to match the password failures messages in the logfile. The
# host must be matched by a group named "host". The tag "<HOST>" can
# be used for standard IP/hostname matching and is only an alias for
# (?:::f{4,6}:)?(?P<host>[\w\-.^_]+)
# Values: TEXT
#
###failregex = (?i): warning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: 
A-Za-z0-9+/]*={0,2})?$
failregex = (?i): warning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed\: authentication failure
 
#Jul 31 15:05:45 zimbratest postfix/smtpd[24158]: warning: host.dominio.cl[X.X.X.X]: SASL PLAIN authentication failed: authentication failure
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =
  • Ahora abrimos el archivo
nano /etc/fail2ban/jail.local
  • Agregamos al final
[zimbra-account]
enabled = true
filter = zimbra
action = iptables-allports[name=Zimbra-account]
logpath = /opt/zimbra/log/mailbox.log
bantime = 600
maxretry = 5

[zimbra-audit]
enabled = true
filter = zimbra
action = iptables-allports[name=Zimbra-audit]
logpath = /opt/zimbra/log/audit.log
bantime = 600
maxretry = 5

[zimbra-recipient]
enabled = true
filter = zimbra
action = iptables-allports[name=Zimbra-recipient]
logpath = /var/log/mail.log
findtime = 604800
bantime = 600
maxretry = 5

[zimbra-webmail]
enabled = true
filter = zimbra
action = iptables[name=Zimbra-account, port=http, protocol=tcp]
mail-whois[name=Zimbra-account, dest=admin@siua.ac.cr, sender=ataques@siua.ac.cr]
#logpath = /opt/zimbra/log/mailbox.log
logpath = /opt/zimbra/log/audit.log
maxretry = 5


[postfix]
enabled = true
filter = postfix
action = iptables-multiport[name=Postfix, port=smtp, protocol=tcp]
logpath = /var/log/mail.log
bantime = 600
maxretry = 5 

[sasl-iptables]
enabled = true
filter = sasl
action = iptables-allports[name=sasl]
logpath = /var/log/mail.log
bantime = 600
  • Comentamos
#[postfix]
# To use another modes set filter parameter "mode" in jail.local:
#mode    = more
#port    = smtp,465,submission
#logpath = %(postfix_log)s
#backend = %(postfix_backend)s
  • Reiniciamos fail2ban:
service fail2ban restart
  • Si quiere conocer cuales jaulas están activadas
fail2ban-client status
  • Resultado:
* fail2ban.service - Fail2Ban Service
   Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2020-09-08 20:49:06 UTC; 3s ago
     Docs: man:fail2ban(1)
  Process: 709623 ExecStop=/usr/bin/fail2ban-client stop (code=exited, status=0/SUCCESS)
  Process: 721654 ExecStartPre=/bin/mkdir -p /var/run/fail2ban (code=exited, status=0/SUCCESS)
 Main PID: 719138 (fail2ban-server)
    Tasks: 0 (limit: 231907)
   CGroup: /system.slice/fail2ban.service
           > 719138 /usr/bin/python3 /usr/bin/fail2ban-server --async -b -s /var/run/fail2ban/fail2ban.sock -p /var/run/fail2ban/fail2ban.pid --loglevel INFO --logtarget /var/log/fail2ban.log --syslogsocket auto

Sep 08 20:49:06 correo systemd[1]: Starting Fail2Ban Service...
Sep 08 20:49:06 correo systemd[1]: Started Fail2Ban Service.
Sep 08 20:49:06 correo fail2ban-server[721655]:  Server already running
Sep 08 20:49:06 correo fail2ban-server[721655]:  Async configuration of server failed
  • Si quiere ver el estado de una jaula especifica
fail2ban-client status sshd
  • RESULTADO:
Status
|- Number of jail:	12
`- Jail list:	apache-auth, apache-badbots, apache-botsearch, apache-fakegooglebot, apache-modsecurity, apache-nohome, apache-noscript, apache-overflows, apache-shellshock, postfix, postfix-rbl, sshd
root@metis:/tmp/ssh-audit# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed:	0
|  |- Total failed:	0
|  `- File list:	/var/log/auth.log
`- Actions
   |- Currently banned:	0
   |- Total banned:	0
   `- Banned IP list:
  • Si quiere saber que el servicio esta activo
systemctl status fail2ban

Modificaciones extras

  • Ahora vamos aplicarle algunas otras modificaciones
  • Podemos ver el nivel del log y modificarlo si fuera necesario
fail2ban-client get loglevel
  • Si deseamos modificarlo:
fail2ban-client set loglevel {CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG}
  • Si deseamos limpiar el log
fail2ban-client flushlogs
  • Si deseamos consultar cuánto tiempo se almacena una BAN en la BD (por defecto: 86400 seconds)
fail2ban-client get dbpurgeage
  • Lo modificamos a 2 días (2880 segundos)
fail2ban-client set dbpurgeage 2880

Fail2Ban: Centralización de Blacklist IP UGIT

  • Lo que vamos a explicar en este post es que hemos construido una base de datos que centralizaría todos los ataques que se den a los servidores con IP’s públicas, través fail2ban y un personalizado script bash que enviaría los datos del ataque a la BD y otro script que se ejecutaría en todos los servidores todos los días a las 12:00am y revisaría la BD y incluiría en su firewall las ip’s que no tenga ya incluidas

Servidor cliente – Instalar MYSQL-CLIENT

  • Ingresamos por ssh como usuario «root»
  • Instalamos dependencias
apt-get install mysql-client curl jq -y
apt-get install curl jq -y

NOTA: si estamos en debian 10 (proxmox 6) el comando anterior da error, para esto seguimos la siguiente guía: mysql en debian 10

  • Ingresamos al directorio
cd /etc/fail2ban/
  • Abrimos el archivo
nano /etc/fail2ban/jail.local
  • Buscamos la linea
# The simplest action to take: ban only
  • Y antes de esta linea insertamos
############################################################################################################################################
################ ACCION UGIT: Banea la Ip, envia un mail, Inserta en BD y la incluye en el IPSET de PROMOX ################################
############################################################################################################################################

action_ugit = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
              %(mta)s-whois[name=%(__name__)s, sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
              ip-to-blacklist-ugit
  • Las acciones que van hacer son:
    • Banea la IP por 2 días
    • Envía un correo con la información de whois
    • Solicita ejecutar la acción «ip-to-blacklist-ugit» la cual:
      • Verifica si la ip ya esta incluida en la BD
      • Si no esta incluida obtiene la información de la IP a través de freegeoip y whois
      • La inserta en la BD
  • Ahora cambiamos la accion defecto por buscamos y remplazamos
action = %(action_)s
X
action = %(action_ugit)s
  • Creamos el archivo
nano /etc/fail2ban/action.d/ip-to-blacklist-ugit.conf
  • Agregamos el siguiente contenido
[INCLUDES]

before = iptables-common.conf

[Definition]

actionban = /etc/fail2ban/agrega_ip_blacklist-ugit.sh <ip>

[Init]
  • Reiniciamos fail2ban
service fail2ban restart

Creación de archivos

  • Dependiendo del servidor y el firewall que tenga este es necesario un archivo u otro
  • Creamos el archivo
nano /etc/fail2ban/agrega_ip_blacklist-ugit.sh
  • Le insertamos el siguiente contenido (Recuerde cambiar los datos de conexión)
#! /bin/bash

#######################################################################
#################           PARAMETROS             ####################
#######################################################################
#ip_ban="119.94.116.145"
#Le pasamos el primer parametro del script
ip_ban=$1


#######################################################################
######################     VARIABLES   CONEXION    ####################
#######################################################################
ip_servidor="FQDN:MP"
usuario_servidor="nombre_usuario"
password_servidor="Pass_usuario"
BD_servidor="nombre_BD"
servidor_atacado=$(hostname -s)



#######################################################################
###########   FUNCION Comprobar si ya existe la IP    #################
#######################################################################
function verificaExiste () {
    export MYSQL_PWD=$3
    RESPUESTA=$(mysql $1 -u$2  -h$4 -s <<<"SELECT IP_SAE_SIGESTIC_BLIP FROM tab_sae_sigetic_blacklist_ips WHERE IP_SAE_SIGESTIC_BLIP = '$ip_ban'")
    if [[ $RESPUESTA ]]
    then
      #Existe
      true
    else
      #No existe
      false
    fi
}


#######################################################################
###########        FUNCION Guarda IP en BD            #################
#######################################################################
function guardaIP(){
  ##PARAMETROS
  #$1:$BD_servidor
  #$2:$usuario_servidor
  #$3:$password_servidor
  #$4:$ip_servidor
  #$5:$ip_ban
  #$6:$servidor_atacado
  Fecha_Hora=`date +"%Y-%m-%d %T"`
  servidor_atacado=$(hostname -s)
  freegeoip="DESCONOCIDO"
  ip="DESCONOCIDO"
  country_code="DESCONOCIDO"
  country_name="DESCONOCIDO"
  region_code="DESCONOCIDO"
  region_name="DESCONOCIDO"
  city="DESCONOCIDO"
  latitude="DESCONOCIDO"
  longitude="DESCONOCIDO"
  netname="DESCONOCIDO"
  organization="DESCONOCIDO"
  responsible="DESCONOCIDO"
  role="DESCONOCIDO"
  cidr="DESCONOCIDO"
  route="DESCONOCIDO"

  #######################################################################
  ################# P1:  Ejecutar consulta a Freegeoip   ##################
  #######################################################################
  freegeoip=`curl -s --get http://anuncios.siua.ac.cr:8080/json/$ip_ban`
  #freegeoip=`curl -s --get http://freegeoip.net/json/$5`

  ip=$(echo "$freegeoip" | jq -r '.ip')
  if [ ! -z "$ip" ]
  then
    ip=$ip
  else
    ip=$5
  fi
  country_code=$(echo "$freegeoip" | jq -r '.country_code')
  if [ ! -z "$country_code" ]
  then
    country_code=$country_code
  else
    country_code="VACIO"
  fi
  country_name=$(echo "$freegeoip" | jq -r '.country_name')
  if [ ! -z "$country_name" ]
  then
    country_name=$country_name
  else
    country_name="DESCONOCIDO"
  fi
  region_code=$(echo "$freegeoip" | jq -r '.region_code')
  if [ ! -z "$region_code" ]
  then
    region_code=$region_code
  else
    region_code="VACIO"
  fi
  region_name=$(echo "$freegeoip" | jq -r '.region_name')
  if [ ! -z "$region_name" ]
  then
    region_name=$region_name
  else
    region_name="DESCONOCIDO"
  fi
  city=$(echo "$freegeoip" | jq -r '.city')
  if [ ! -z "$city" ]
  then
    city=$city
  else
    city="DESCONOCIDO"
  fi
  latitude=$(echo "$freegeoip" | jq -r '.latitude')
  if [ ! -z "$latitude" ]
  then
    latitude=$latitude
  else
    latitude="10.019816"
  fi
  longitude=$(echo "$freegeoip" | jq -r '.longitude')
  if [ ! -z "$longitude" ]
  then
    longitude=$longitude
  else
    longitude="-84.197004"
  fi

#printf "******************************************\n"
#printf "*********** DATOS: FREEGEOIP     *********\n"
#printf "******************************************\n"
#printf "ip:${ip}\n"
#printf "country_code:${country_code}\n"
#printf "country_name:${country_name}\n"
#printf "region_code:${region_code}\n"
#printf "region_name:${region_name}\n"
#printf "city:${city}\n"
#printf "latitude:${latitude}\n"
#printf "longitude:${longitude}\n"


  #######################################################################
  #################  P2: Ejecutar consulta a ARIN       #################
  #######################################################################
  #netname
  netname=`whois $5 -h whois.arin.net | grep -i netname: | tail -n 1`
  netname=${netname#"NetName:        "}
  netname=${netname#"netname:        "}

  #organization
  organization=`whois $5 -h whois.arin.net | grep -i organization: | tail -n 1`
  organization=${organization#"Organization:   "}

  #responsible
  responsible=`whois $5 -h whois.arin.net | grep -i responsible: | tail -n 1`
  responsible=${responsible#"responsible: "}

  #role
  role=`whois $5 -h whois.arin.net | grep -i role: | tail -n 1`
  role=${role#"role:           "}

  #cidr
  cidr=`whois $5 -h whois.arin.net | grep -i cidr: | tail -n 1`
  cidr=${cidr#"CIDR:           "}

  #route
  route=`whois $5 -h whois.arin.net | grep -i route: | tail -n 1`
  route=${cidr#"route:          "}


#printf "******************************************\n"
#printf "***********     DATOS: WHOIS     *********\n"
#printf "******************************************\n"
#printf "netname:${netname}\n"
#printf "organization:${organization}\n"
#printf "responsible:${responsible}\n"
#printf "role:${role}\n"
#printf "cidr:${cidr}\n"
#printf "route:${route}\n"


  ##########################################################################
  #####################  P3:OBTENER NOMBRE       ###########################
  ##########################################################################
  if [ ! -z "$netname" ]
  then
  	nombre=$netname
  else
  	if [ ! -z "$organization" ]
  	then
  		nombre=$organization
  	else
  		if [ ! -z "$responsible" ]
  		then
  			nombre=$responsible
  		else
  			if [ ! -z "$role" ]
  			then
  				nombre=$role
  			else
  				nombre="No existe"
  			fi
  		fi
  	fi
  fi

  ##########################################################################
  ##################### P4: OBTENER ORGANIZACION   #########################
  ##########################################################################
  if [ ! -z "$organization" ]
  then
  	organizacion=$organization
  else
  	if [ ! -z "$netname" ]
  	then
  		organizacion=$netname
  	else
  		if [ ! -z "$responsible" ]
  		then
  			organizacion=$responsible
  		else
  			if [ ! -z "$role" ]
  			then
  				organizacion=$role
  			else
  				organizacion="No existe"
  			fi
  		fi
  	fi
  fi

  ##########################################################################
  #####################     P5: OBTENER CIDR       #########################
  ##########################################################################
  if [ ! -z "$cidr" ]
  then
  	cidr=$cidr
  else
  	if [ ! -z "$route" ]
  	then
  		cidr=$route
  	else
  		cidr=""
  	fi
  fi



#printf "******************************************\n"
#printf "***********     DATOS: TRABAJADOS  *******\n"
#printf "******************************************\n"
#printf "nombre:${nombre}\n"
#printf "organizacion:${organizacion}\n"
#printf "cidr:${cidr}\n"


  ##########################################################################
  #####################  P6: Inserta en MYSQL      #########################
  ##########################################################################
  export MYSQL_PWD=$3
  mysql -u$2 -h$4 -e "
  insert into tab_sae_sigetic_blacklist_ips
    (
      IP_SAE_SIGESTIC_BLIP,
      Nombre_Red_SAE_SIGESTIC_BLIP,
      Organizacion_SAE_SIGESTIC_BLIP,
      Codigo_Pais_SAE_SIGESTIC_BLIP,
      Nombre_Pais_SAE_SIGESTIC_BLIP,
      Codigo_Region_SAE_SIGESTIC_BLIP,
      Nombre_Region_SAE_SIGESTIC_BLIP,
      Ciudad_SAE_SIGESTIC_BLIP,
      CIDR_SAE_SIGESTIC_BLIP,
      Latitud_SAE_SIGESTIC_BLIP,
      Longitud_SAE_SIGESTIC_BLIP,
      Fecha_Hora_SAE_SIGESTIC_BLIP,
      Servidor_SAE_SIGESTIC_BLIP
    ) values(
      '$ip',
      '$nombre',
      '$organizacion',
      '$country_code',
      '$country_name',
      '$region_code',
      '$region_name',
      '$city',
      '$cidr',
      '$latitude',
      '$longitude',
      '$Fecha_Hora',
      '$servidor_atacado'
    );" $1 &> /dev/interuniversitariadealajuela


  true
}


#######################################################################
############  PASO1: Comprobamos si ya existe en la BD ################
#######################################################################
printf "\n"
printf "*********************************************\n"
printf "RESULTADO de la IP: $ip_ban\n"
printf "*********************************************\n"
if verificaExiste $BD_servidor $usuario_servidor $password_servidor $ip_servidor $ip_ban
then
    #Salimos del script
    printf "La IP YA EXISTE en la BD, salimos!!\n\n"
    exit
else
    #Si no existe mandela a guardar
    if guardaIP $BD_servidor $usuario_servidor $password_servidor $ip_servidor $ip_ban $servidor_atacado
    then
      printf "La IP ha sido INCLUIDA correctamente!!\n\n"


      correo="<!DOCTYPE>"
      correo="$correo<html>"
      correo="$correo<head>"
      correo="$correo<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>"
      correo="$correo<meta name='viewport' content='width=device-width, initial-scale=1'>"
      correo="$correo<title>[BD/$servidor_atacado/$ip_ban] </title>"
      correo="$correo<style type='text/css'>"
      correo="$correo table, th, td {border: 1px solid black; padding:5px}a{text-decoration: none;}.link:hover {text-decoration: none !important;}@media screen and (min-width: 650px) {.des-pt50 {padding-top: 50px !important;}.des-pb50 {padding-bottom: 50px !important;}.des-mauto {margin: 0px !important;}.des-pb0 {padding-bottom: 0px !important;}.td, .tfoot, .thead {display: table-cell !important;}.table {display: table;	width: 100%;}}"
      correo="$correo</style>"
      correo="$correo</head>"
      correo="$correo<body style='margin:0;padding:0;background: #F8F8F8;' id='body'>"
      correo="$correo<div class='tac pt10 pb10 pl10 pr10' style='padding-top:10px;padding-bottom:10px;padding-right:10px;padding-left:10px;text-align:center;background: #015289;'>"
      correo="$correo<div class='table' style='max-width: 600px; margin:0 auto;'>"
      correo="$correo<div class='td w50p vam' style='vertical-align:middle;'>"
      correo="$correo<img alt='SIUA' border='0' class='pb10 des-mauto des-pb0' src='https://www.siua.ac.cr/img/logo.png' style='display:block;border:0;padding-bottom:10px;margin:0 auto; display: block; color: #ffffff; ' width='125'>"
      correo="$correo</div>"
      correo="$correo<div class='td w50p vam des-tar' style='vertical-align:middle;'>"
      correo="$correo<p class='white' style='margin:0;font-size:16px;font-family: Helvetica, Arial, sans-serif;color:#ffffff;'>"
      correo="$correo Unidad de Gestión e Innnovación Tecnológica"
      correo="$correo</p>"
      correo="$correo</div>"
      correo="$correo</div>"
      correo="$correo</div>"
      correo="$correo<div class='frame' style='background:#F8F8F8;'>"
      correo="$correo<div class='pl15 pr15 pt35 des-pt50 pb25 des-pb50' style='padding-right:15px;padding-left:15px;padding-bottom:25px;padding-top:35px;'>"
      correo="$correo<div class='wrapper pt35 pb35 pl35 pr35 box' style='padding-top:35px;padding-bottom:35px;padding-right:35px;padding-left:35px;max-width:600px;margin:0 auto;text-align:center;mso-element-frame-width:800px;mso-element:para-border-div;mso-element-left:center;mso-element-wrap:no-wrap-beside;mso-padding-top-alt:50px;background:#ffffff;border-radius:10px;'>"
      correo="$correo<h2 class='fsz30 lh36 bold pt25 pb15 mso-mb15' style='font-family:Helvetica, Arial, sans-serif;margin:0;padding-bottom:15px;padding-top:25px;color:#353a3e;font-family:Helvetica, Arial, sans-serif;font-weight:bold;font-size:30px;line-height:36px;mso-margin-bottom-alt:15px;'>"
      correo="$correo IPs Incluidas en BD"
      correo="$correo</h2>"
      correo="$correo<p class='fsz16 lh24 mso-mb25' style='margin:0;color:#777777;font-family:Helvetica, Arial, sans-serif;font-size:16px;line-height:24px;mso-margin-bottom-alt:25px;'>"
      correo="$correo<table style='width:100%; background-color:#FFFFFF;border-collapse: collapse;align:center'>"
      correo="$correo<tr style='text-align:center; background-color:#015289;color:#ffffff;'>"
      correo="$correo<td>IP</td>"
      correo="$correo<td>Fecha y Hora</td>"
      correo="$correo<td>Organización</td>"
      correo="$correo</tr>"
      correo="$correo<tr style='text-align:center; background-color:#FFFFFF;color:#333333;'>"
      correo="$correo<td>$ip_ban</td>"
      correo="$correo<td>$Fecha_Hora</td>"
      correo="$correo<td>$organizacion</td>"
      correo="$correo</tr>"
      correo="$correo</table>"
      correo="$correo</p>"
      correo="$correo</div>"
      correo="$correo</div>"
      correo="$correo</div>"
      correo="$correo</body>"
      correo="$correo</html>"


      {
	echo FROM: ataques@siua.ac.cr
	echo To: ataques@siua.ac.cr
	echo MIME-Version: "1.0"
	echo Content-Type: "text/html"
	echo Subject:"fail2ban Ataque $servidor_atacado/$ip_ban"
	echo $correo
	} | sendmail -v ataques@siua.ac.cr



      exit
    else
      printf "La IP NO se agrego correctamente por favor verifiquela!!\n\n"
      echo "Problema al agregar IP: $ip_ban" | mail -s "[ERROR_AB_$servidor_atacado]: $ip_ban" interuniversitariadealajuela@gmail.com
      exit
    fi

fi
  • Ahora de damos permisos de ejecución
chmod 777 /etc/fail2ban/agrega_ip_blacklist-ugit.sh
  • Aquí puede probar ejecutando
/etc/fail2ban/agrega_ip_blacklist-ugit.sh 124.7.227.107

Personalizamos el mensaje de banned

  • Abrimos el archivo
nano /etc/fail2ban/action.d/sendmail-whois.conf 
  • Vamos a la sección de actions y veamos que tenemos
  • Lo dejamos así:
            Hola UGIT,\n
            **************************************************
            La IP <ip> ha sido baneada por Fail2ban despues de:
            <failures> intentos fallidos por <name>.\n\n
            **************************************************
            Aqui hay mas informacion acerca de la ip: <ip> :\n
            `/usr/bin/whois <ip> || echo missing whois program`\n
            Saludos,\n
            UGIT" | /usr/sbin/sendmail -f <sender> <dest>
  • Reiniciamos el servicio
service fail2ban restart
  • Si deseamos consultar el tiempo de una acción (Por defecto 60 segundos)
fail2ban-client get sshd action ip-to-blacklist-ugit timeout
  • Lo modificamos a 300 segundos
fail2ban-client set sshd action ip-to-blacklist-ugit timeout 300
  • Si fuera necesario personalizamos el asunto de los demás correos
cd /etc/fail2ban/action.d/
  • Abrimos
nano sendmail-whois-ipjailmatches.conf
nano sendmail-whois-ipmatches.conf
nano sendmail-whois-lines.conf
nano sendmail-whois-matches.conf
nano sendmail-whois.conf 
nano sendmail.conf
nano sendmail-buffered.conf
nano sendmail-common.conf
nano sendmail-geoip-lines.conf
nano mail.conf
nano mail-whois.conf
nano mail-whois-lines.conf
nano mail-buffered.conf 
  • Y modificamos 
[Fail2Ban]
X
[fail2ban_CORREO]
  • Reiniciamos el servicio
service fail2ban restart
  • Si desea ver la cola
tail -f /var/log/fail2ban.log