- Esta guía explica las medidas de seguridad implementadas en los servidores de la SIUA
Paso#01: Dependencias
- Instalamos ciertas dependencias
apt-get install make build-essential net-tools git -y
Paso#02: Postfix-Gmail
- Para dar soporte para el envió de correos vamos a configurar postfix-gmail
- Guía: PROXMOX 6: Configuración de postfix – gmail
- Guía: Postfix-Gmail
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 /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 ( rkhunter --versioncheck rkhunter --update rkhunter -c --cronjob --report-warnings-only )| mail -a "From: ataques@siua.ac.cr" -s "rkhunter: $(hostname -s)" ataques@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: Chkrootkit
- Programa que permite buscar rootkits
- Ingresamos a /tmp para que los archivos sean eliminados después de reiniciar
cd /tmp
- Descargamos el archivo: chkrootkit053
wget /wp-content/uploads/2019/09/chkrootkit.tar.gz
- Lo descomprimimos:
tar xvfz chkrootkit.tar.gz
- Ingresamos a la carpeta:
cd chkrootkit-0.53/
- Lo compilamos:
make sense
- Regresamos un nivel en la capeta:
cd ..
- Movemos el contenido a /usr/local/chkrootkit
mv chkrootkit-0.53/ /usr/local/chkrootkit
- Ingresamos a la carpeta para verificar que existen los archivos
cd /usr/local/chkrootkit/
- Creamos una enlace simbólico
ln -s /usr/local/chkrootkit/chkrootkit /usr/local/bin/chkrootkit
- Verificamos el servidor:
#Muestra todo la salida
chkrootkit
#Muestra solo las detecciones
chkrootkit -q
- Creamos un cron que se ejecute todos los meses
- Ejecutamos:
crontab -e
- Le agregamos el siguiente contenido
@monthly /usr/local/chkrootkit/chkrootkit -q | mail -s "chkrootkit: $(hostname -s)" ataques@siua.ac.cr
Paso#05: 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 --------------------------------------------------------------
Detail = Low
X
Detail = 8
--------------------------------------------------------------
- Si fuera necesario modificar el archivo:
nano /etc/cron.daily/00logwatch
Paso#06: OpenSSH-RESUMEN
- Esta sección explica cómo instalar el servicio openssh sobre el puerto 44 y con medidas de seguridad
- Seguimos la guía: OpenSSH-Resumen
- Si desea comprender mejor puede consultar la guía: OpenSSH-Completa
Paso#07: Creación de llaves ED25519
- Si desea ingresar a los servidores de forma automática a través de llaves, siga este paso
- Si ya cuanta con una llave puede saltar este paso
- Creamos una llave
ssh-keygen -o -a 100 -t ed25519 -f ~/.ssh/id_ed25519 -C "ugit@metis.siua.ac.cr"
- Donde:
- -o: indica que utilice el nuevo formato de OpenSSH en vez de PEM. Actualmente esta opción esta implícita para el tipo ed25519.
- -a: Son los números de KDF (Key Derivation Function), números más altos hacen más lenta la verificación de la contraseña, pero aumentan la resistencia en ataques de fuerza bruta cuando se da un robo de la contraseña privada.
- -t: inidca el tipo de llave a crear, para nuestro caso ed25519.
- -f: indica el ligar y nombre de archivo
- -c: indica un comentario, es pura información y opcional, pero generalmente es en formato: <login>@<hostname>
- Ahora puede encontrar su llave privada en: ~/.ssh/id_ed25519
- Y su llave publica en: ~/.ssh/id_ed25519.pub
- Antes de agregar su nueva llave al agente SSH, verifique que se esta ejecutando con el siguiente comando:
eval "$(ssh-agent -s)"
- Ahora agregamos la lave al agente SSH
ssh-add ~/.ssh/id_ed25519
- O si desea agregar todas la llaves disponibles en el directorio .ssh ejecute
ssh-add
Paso#08: Agregar llaves en el servidor remoto
- Para agregar solo la lave creada en el paso anterior:
ssh -i ~/.ssh/id_ed25519 ugit@metis.siua.ac.cr
NOTA: Si ya tenia un allave asociada
- Si nos da el siguiente error
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: POSSIBLE DNS SPOOFING DETECTED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The ED25519 host key for metis.siua.ac.cr has changed,
and the key for the corresponding IP address 10.20.200.25
has a different value. This could either mean that
DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
Offending key for IP in /home/tavo/.ssh/known_hosts:43
remove with:
ssh-keygen -f "/home/tavo/.ssh/known_hosts" -R "10.20.200.25"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:ZMhaG0oHSEy/jnGkIGuVGzVc5rB+i4PJ0qjBHbnd8Ks.
Please contact your system administrator.
Add correct host key in /home/tavo/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/tavo/.ssh/known_hosts:58
remove with:
ssh-keygen -f "/home/tavo/.ssh/known_hosts" -R "metis.siua.ac.cr"
ED25519 host key for metis.siua.ac.cr has changed and you have requested strict checking.
Host key verification failed.
- Debemos ejecutar los comando para eliminar por la IP y FQDN
ssh-keygen -f "/home/tavo/.ssh/known_hosts" -R "10.20.200.25"
ssh-keygen -f "/home/tavo/.ssh/known_hosts" -R "metis.siua.ac.cr"
Continuamos
- Ahora le pasamos la llave a los servidores
ssh-copy-id -i ~/.ssh/id_ed25519.pub ugit@metis.siua.ac.cr
ssh-copy-id -i ~/.ssh/id_ed25519.pub ugit@apolo.siua.ac.cr
ssh-copy-id -i ~/.ssh/id_ed25519.pub ugit@hestia.siua.ac.cr
Paso#09: 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
Si es un servidor PROXMOX
- Agregamos al final
[proxmox]
port = https,http,8006
filter = proxmox
logpath = /var/log/daemon.log
maxretry = 3
# 1 hour
bantime = 172800
- Creamos el archivo
nano /etc/fail2ban/filter.d/proxmox.conf
- Con el siguiente código
[Definition]
failregex = pvedaemon\[.*authentication failure; rhost=<HOST> user=.* msg=.*
ignoreregex =
- Ahora puede intentar ingresar en proxmox mas de 3 veces y correr el comando para ver el bloqueo
fail2ban-regex /var/log/daemon.log /etc/fail2ban/filter.d/proxmox.conf
Continuamos
- Guardamos el archivo y cerramos
- Ahora abrimos el archivo de jail para habilitar servicios
nano /etc/fail2ban/jail.d/defaults-debian.conf
- Remplazamos el contenido dependiendo de los servicios que desea controlar
- Podemos saber los servicios corriendo con alguno de los siguientes comandos:
ps -axf
lsof -i -P -n
lsof -i -P -n | grep LISTEN
SSH
#***********************************
#*********** SSH ******************
#***********************************
[sshd]
enabled = true
[sshd-ddos]
enabled = true
APACHE
#***********************************
#********** APACHE ****************
#***********************************
[apache-auth]
enabled = true
[apache-badbots]
enabled = true
[apache-noscript]
enabled = true
[apache-overflows]
enabled = true
[apache-nohome]
enabled = true
[apache-botsearch]
enabled = true
[apache-fakegooglebot]
enabled = true
[apache-modsecurity]
enabled = true
[apache-shellshock]
enabled = true
NGINX
#***********************************
#********** NGINX ****************
#***********************************
[nginx-http-auth]
enabled = true
[nginx-botsearch]
enabled = true
[nginx-limit-req]
enabled = true
NGINX-FAVEO
- Primero debemos abrir el archivo
nano /etc/fail2ban/jail.local
- Buscar la linea
[php-url-fopen]
- Y dejar el contenido así:
[php-url-fopen]
port = http,https
#logpath = %(nginx_access_log)s
# %(apache_access_log)s
logpath = /opt/faveo/log/faveo_access_log
- Luego abrimos:
nano /etc/fail2ban/jail.d/defaults-debian.conf
- Y lo dejamos así
#***********************************
#********** NGINX ****************
#***********************************
[nginx-http-auth]
enabled = true
[nginx-botsearch]
enabled = true
[nginx-limit-req]
enabled = true
#***********************************
#********** PHP ****************
#***********************************
[php-url-fopen]
enabled = true
NGINX-GITLAB
- Primero debemos abrir el archivo
nano /etc/fail2ban/jail.local
- Buscar la linea
[nginx-http-auth]
- Y dejar el contenido así:
[nginx-http-auth]
port = http,https
#logpath = %(nginx_error_log)s
logpath = /var/log/gitlab/nginx/gitlab_error.log
- Luego abrimos:
nano /etc/fail2ban/jail.d/defaults-debian.conf
- Y lo dejamos así
#***********************************
#*********** SSH ******************
#***********************************
[sshd]
enabled = true
[sshd-ddos]
enabled = true
#***********************************
#********** NGINX ****************
#***********************************
[nginx-http-auth]
enabled = true
#***********************************
#********** POSTFIX ***************
#***********************************
[postfix]
enabled = true
[postfix-rbl]
enabled = true
MYSQLP
#***********************************
#********* MYSQL ***************
#***********************************
[mysqld-auth]
enabled = true
POSTFIX
#***********************************
#********** POSTFIX ***************
#***********************************
[postfix]
enabled = true
[postfix-rbl]
enabled = true
PROXMOX
#***********************************
#********** PROXMOX ***************
#***********************************
[proxmox]
enabled = true
RESUMEN PARA SERVIDOR PORXMOX
#***********************************
#*********** SSH ******************
#***********************************
[sshd]
enabled = true
[sshd-ddos]
enabled = true
#***********************************
#********** APACHE ****************
#***********************************
[apache-auth]
enabled = true
[apache-badbots]
enabled = true
[apache-noscript]
enabled = true
[apache-overflows]
enabled = true
[apache-nohome]
enabled = true
[apache-botsearch]
enabled = true
[apache-fakegooglebot]
enabled = true
[apache-modsecurity]
enabled = true
[apache-shellshock]
enabled = true
#***********************************
#********** POSTFIX ***************
#***********************************
[postfix]
enabled = true
[postfix-rbl]
enabled = true
#***********************************
#********** PROXMOX ***************
#***********************************
[proxmox]
enabled = true
- Reiniciamos fail2ban:
service fail2ban restart
- Si quiere conocer cuales jaulas están activadas
fail2ban-client status
- 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
- 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
Base de datos
- Para descargar la BD haga clic aquí
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
Servidor con: PROXMOX-ADMINISTRADOR IPSET: blacklist-UGIT (POSEIDON)
- Proceso:
- Verifica si la ip esta en la BD centralizada
- Sino esta la agrega / si está sale
- Agrega la IP a la blacklist -ugit de proxmox
- Le insertamos el siguiente contenido (Recuerde cambiar los datos de conexión)
- Descargar: archivo
Servidor con firewall UFW (Anuncios)
- Proceso
- Verifica si la ip esta en la base de datos
- Si no está la agrega / si está sale
- La agrega en el archivo del firewall UFW
- Descargar: archivo
Servidor que solo tiene que incluir IP en la BD (MV,CT,NODOS)
- Proceso:
- Verifica si la ip esta en la base de datos
- Si no está la agrega / si está sale
- Descargar: archivo
Continuamos
- 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
Verificador de IP’s en Base de Datos (SOLO EN SERVIDOR PRINCIPAL)
- Ahora vamos a crear otro script que se va encargar de consultar en la base de datos a las 12:00am las ips baneadas y la va comparar con con las ips bloqueadas en sus respectivos firewall
- Una vez más dependemos del firewall instalado PROXMOX o UFW
- Creamos el archivo
nano /etc/fail2ban/verifica_ips_bd_PROXMOX.sh
nano /etc/fail2ban/verifica_ips_bd_UFW.sh
Servidor con firewall PROXMOX (POSEIDON)
- Proceso:
- A las 12:00 am se conecta a la base de datos
- Verifica las IP’s contra el archivo: /etc/pve/firewall/cluster.fw
- Descargar: archivo
Servidor con firewall UFW (Anuncios)
- Proceso:
- A las 12:00 am se conecta a la base de datos
- Verifica las IP’s contra el archivo:
- Descargar: archivo
Continuamos
- Le damos permisos
chmod 777 /etc/fail2ban/verifica_ips_bd_PROXMOX.sh
chmod 777 /etc/fail2ban/verifica_ips_bd_UFW.sh
- Ahora podemos probarlo
./verifica_ips_bd_PROXMOX.sh
./verifica_ips_bd_UFW.sh
- RESULTADO:
*****************************************
PROCESANDO IPS...
*****************************************
103.99.0.193 INCLUIDA CON EXITO!
109.248.9.9 INCLUIDA CON EXITO!
110.78.146.210 INCLUIDA CON EXITO!
113.172.168.234 INCLUIDA CON EXITO!
92.78.26.142 INCLUIDA CON EXITO!
*****************************************
FIN DE PROCESAMIENTO
*****************************************
- Ahora incluimos el script como una tarea de cron
crontab -e
- Agregamos
0 0 * * * /etc/fail2ban/verifica_ips_bd_PROXMOX.sh
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
- Ahora creamos una nuevo aliases
nano /etc/aliases
- Agregamos
fail2ban: root
- Actualizamos
newaliases
- 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_METIS]
- Reiniciamos el servicio
service fail2ban restart
- Si desea ver la cola
tail -f /var/log/fail2ban.log