En esta ocasión vamos a intentar evitar ataques de fuerza bruta a nuestro equipo. Esta técnica consiste, mediante procesos automáticos, en ir probando combinaciones de contraseñas. Por lo tanto el primer paso sería utilizar contraseñas robustas. El segundo paso será instalar un software que prevenga la intrusión de usuarios no autorizados. El programa que he elegido es Fail2ban.
Fail2ban es una aplicación escrita en Python. Supervisa para detectar síntomas de ataques automatizados y actúa penalizando o bloqueando las conexiones remotas que intentan acceder mediante un ataque de fuerza bruta.
Instalación y configuración básica
Empezamos instalando:
sudo pacman -S fail2banEn Fail2ban prevalecen las configuraciones de los ficheros .local. Así que empezaremos copiando el fichero fail2ban.conf a fail2ban.local para tener una copia limpia:
sudo cp /etc/fail2ban/fail2ban.conf /etc/fail2ban/fail2ban.localHaremos lo mismo con el fichero jail.conf:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.localModificamos el fichero jail.local:
sudo nano /etc/fail2ban/jail.localCon las siguientes configuraciones y aprovechamos y activamos el bloque [sshd] recordando que si el puerto SSH ha sido cambiado, hay que indicarlo también. Si no, no es necesario:
ignoreip = 127.0.0.1/8 192.168.1.0/24
findtime = 360
bantime = 86400
maxretry = 5
destemail = receiver@mail
sender = root@hostname
action = %(action_mw)s
[sshd]
enabled = true
#port = ssh
port = 9994Pequeñas explicaciones:
- ignoreip: Ignoramos la propia red y el propio servidor.
- findtime: Plazo expresado en segundos de errores consecutivos.
- bantime: Plazo expresado en segundos de bloqueo.
- maxretry: Máximo número de reintentos.
- destemail: Destinatario del correo electrónico.
- sender: Remitente del correo electrónico.
- action_mw: Si queremos que bloquee y envíe un correo de aviso.
Activamos y arrancamos el servicio:
sudo systemctl enable fail2ban.service
sudo systemctl start fail2ban.serviceUtilizar MSMTP como cliente de correo
Lógicamente, para utilizar MSMTP debemos tenerlo instalado y configurado en el equipo.
sudo nano /etc/fail2ban/jail.localLocalizamos, comentamos y reescribimos el parámetro mta:
mta = msmtpHacemos lo mismo con el parámetro action_mw y lo reescribimos:
action_mw = %(action_)s
sendmail-whois[mailcmd='msmtp ""', name=%(__name__)s, sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]Reiniciamos el servicio:
sudo systemctl restart fail2ban.serviceProcedimiento obsoleto
Las primeras veces que instalé Fail2ban no había acciones específicas para MSMTP. Había que hacer un proceso que ya no es necesario, pero que voy a mantener porque la sintaxis de los comandos utilizados me pueden venir bien en el futuro:
Cambiamos a root:
suDe la carpeta /etc/fail2ban/action.d copiamos los ficheros de configuración que empiecen por sendmail a otros que empiecen por msmtp:
for FILE in /etc/fail2ban/action.d/sendmail*.conf; do cp ${FILE} ${FILE/sendmail/msmtp}; done;Cambiamos en los ficheros recién creados las referencias before = sendmail a before = msmtp:
sed -i 's/before = sendmail/before = msmtp/' /etc/fail2ban/action.d/msmtp-*.confA continuación, cambiamos las referencias de sendmail -f a msmtp:
sed -i 's/sendmail -f /msmtp/p' /etc/fail2ban/action.d/msmtp-*.confPor último, en el fichero jail.local modificaremos:
nano /etc/fail2ban/jail.local#mta = sendmail
mta = msmtpReiniciamos el servicio:
systemctl restart fail2ban.serviceY finalizamos saliendo del usuario root:
exitComandos útiles
Para verificar los bloqueados, utilizaremos:
sudo iptables -L -nPara desbloquear:
sudo iptables -D f2b-sshd -s 192.168.88.254 -j REJECTPara conocer los bloques activos:
sudo fail2ban-client statusStatus
|- Number of jail: 1
`- Jail list: sshdPara conocer el estado de algún bloque:
sudo fail2ban-client status sshdStatus for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 16
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 3
|- Total banned: 3
`- Banned IP list: 176.83.85.38 213.4.184.10 176.83.175.40Para monitorizar Fail2ban manualmente, podemos utilizar:
sudo cat /var/log/fail2ban.logPara realizar un test general:
sudo fail2ban-testcaseso uno con expresiones regulares:
sudo fail2ban-regexConfigurando Fail2ban para Nginx
Si no estamos utilizando o no vamos a utilizar un servidor LEMP, podemos saltarnos este paso.
Vamos a configurar Fail2ban para que bloquee bad bots y a:
- Todo aquel intentando ejecutar scripts (.pl, .cgi, .exe, etc).
- Todo aquel intentando usar el servidor como un proxy.
- Todo aquel que falle al usar la autenticación básica de nginx.
- Todo aquel que falle al autentificarse en nuestra aplicación.
Añadimos en el fichero jail.local:
sudo nano /etc/fail2ban/jail.local[nginx-auth]
enabled = true
filter = nginx-auth
action = iptables-multiport[name=NoAuthFailures, port="http,https"]
logpath = /var/log/nginx*/*error*.log
bantime = 600 # 10 minutes
maxretry = 6
[nginx-login]
enabled = true
filter = nginx-login
action = iptables-multiport[name=NoLoginFailures, port="http,https"]
logpath = /var/log/nginx*/*access*.log
bantime = 600 # 10 minutes
maxretry = 6
[nginx-badbots]
enabled = true
filter = apache-badbots
action = iptables-multiport[name=BadBots, port="http,https"]
logpath = /var/log/nginx*/*access*.log
bantime = 86400 # 1 day
maxretry = 1
[nginx-noscript]
enabled = true
action = iptables-multiport[name=NoScript, port="http,https"]
filter = nginx-noscript
logpath = /var/log/nginx*/*access*.log
maxretry = 6
bantime = 86400 # 1 day
[nginx-proxy]
enabled = true
action = iptables-multiport[name=NoProxy, port="http,https"]
filter = nginx-proxy
logpath = /var/log/nginx*/*access*.log
maxretry = 0
bantime = 86400 # 1 dayY sus correspondientes filtros en /etc/fail2ban/filter.d/ (cada uno en un fichero separado, con el mismo nombre que aparece en la primera línea):
sudo nano /etc/fail2ban/filter.d/nginx-proxy.conf# Proxy filter /etc/fail2ban/filter.d/nginx-proxy.conf:
#
# Block IPs trying to use server as proxy.
#
# Matches e.g.
# 192.168.1.1 - - "GET http://www.something.com/
#
[Definition]
failregex = ^ -.*GET http.*
ignoreregex =sudo nano /etc/fail2ban/filter.d/nginx-noscript.conf# Noscript filter /etc/fail2ban/filter.d/nginx-noscript.conf:
#
# Block IPs trying to execute scripts such as .php, .pl, .exe and other funny scripts.
#
# Matches e.g.
# 192.168.1.1 - - "GET /something.php
#
[Definition]
failregex = ^ -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\scgi)
ignoreregex =sudo nano /etc/fail2ban/filter.d/nginx-auth.conf# Auth filter /etc/fail2ban/filter.d/nginx-auth.conf:
#
# Blocks IPs that fail to authenticate using basic authentication
#
[Definition]
failregex = no user/password was provided for basic authentication.*client:
user .* was not found in.*client:
user .* password mismatch.*client:
ignoreregex =sudo nano /etc/fail2ban/filter.d/nginx-login.conf# Login filter /etc/fail2ban/filter.d/nginx-login.conf:
#
# Blocks IPs that fail to authenticate using web application's log in page
#
# Scan access log for HTTP 200 + POST /sessions => failed log in
[Definition]
failregex = ^ -.*POST /sessions HTTP/1\.." 200
ignoreregex =Reiniciamos el servicio:
sudo systemctl restart fail2ban.serviceEn el próximo artículo implementaremos un sistema de copias de seguridad.
¿Te ha sido útil?
Ayúdame a mejorar con tu puntuación y comentarios.
💬 Comentarios
Los comentarios están gestionados por GitHub Discussions. Necesitas una cuenta de GitHub para participar. ¡Es gratis y rápido!