Seguridad en la Raspberry. Episodio VI: Bloqueando ataques

Evitar ataques de fuerza bruta

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.

Empezamos instalando:

sudo pacman -S fail2ban

En 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.local

Haremos lo mismo con el fichero jail.conf:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Modificamos el fichero jail.local:

sudo nano /etc/fail2ban/jail.local

Con 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@
action = %(action_mw)s

[sshd]
enabled = true
#port    = ssh
port    = 9994

Unas muy pequeñ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 numero 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.service

Utilizar msmtp como cliente de correo

Lógicamente, para utilizar msmtp debemos tenerlo instalado y configurado en el equipo.

sudo nano /etc/fail2ban/jail.local

Localizamos, comentamos y reescribimos el parámetro mta:

mta = msmtp

Hacemos 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.service

Procedimiento obsoleto

Las primeras veces que instale fail2ban no habían acciones especificas 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

su

De 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-*.conf

A continuación, cambiamos las referencias de sendmail -f a msmtp:

sed -i 's/sendmail -f /msmtp/p' /etc/fail2ban/action.d/msmtp-*.conf

Por último, en el fichero jail.local modificaremos:

nano /etc/fail2ban/jail.local
#mta = sendmail
mta = msmtp

Reiniciamos el servicio

systemctl restart fail2ban.service

Y finalizamos saliendo del usuario root:

exit

Comandos útiles

Para verificar los bloqueados, utilizaremos:

sudo iptables -L -n

Para desbloquear:

sudo iptables -D f2b-sshd -s 192.168.88.254 -j REJECT

Para conocer los bloques activos:

sudo fail2ban-client status
Status
|- Number of jail:    1
`- Jail list:    sshd

Para conocer el estado de algún bloque:

sudo fail2ban-client status sshd
Status 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.40

Para monitorizar fail2ban manualmente, podemos utilizar:

sudo cat /var/log/fail2ban.log

Para realizar un test general:

sudo fail2ban-testcases

o uno con expresiones regulares:

sudo fail2ban-regex

Configurando 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 day

Y 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.service

En el próximo articulo implementaremos un sistema de copias de seguridad.

Soy Jaume Ferré, aficionado a los nuevas tecnologias, aunque ya no lo son tanto.
¡Gracias por leerme!

Valora este artículo1 2 3 4 5 (0 votos)

(0 votos)

Categorias del blog

twitter

Últimos tweets