Blog

No pretendo ser un gurú. En la red hay muchos y muy buenos.

30 Mar 2018

Seguridad en la Raspberry. Episodio VI: Bloqueando ataques

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

ignoreip = 127.0.0.1/8 192.168.1.0/24
findtime = 360
bantime = 86400
maxretry = 5
destemail = <usuario>@jaumeferre.net
sender = root@<fq-hostname>
action = %(action_mwl)s

[sshd]
enabled = true

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_: Si solo queremos que bloquee y guarde la información en los logs.
action_mw: Si queremos que bloquee y envíe un correo de aviso.
action_mwl: Una combinación de las dos anteriores.

Activamos y arrancamos el servicio:

sudo systemctl enable fail2ban.service
sudo systemctl start fail2ban.service

Para verificar los bloqueados, utilizaremos:

sudo iptables -L -n

Para desbloquear:

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

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

Utilizar msmtp como cliente de correo 

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

Cambiamos a root

su

De la carpeta /etc/fail2ban/action.d copiamos los ficheros de sendmail*.conf a msmtp*.conf

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 <sender> a msmtp en action.d/msmtp-*.conf:

sed -i 's/sendmail -f <sender>/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

Finalizamos saliendo del usuario root:

exit

Configurando fail2ban para nginx

Si no estamos utilizando o 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 autentificació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 dnginx-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 = ^<HOST> -.*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 = ^<HOST> -.*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: <HOST>
            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 = ^<HOST> -.*POST /sessions HTTP/1\.." 200
ignoreregex =
Visto 278 veces
Valora este artículo
(1 Voto)

Deja un comentario

Asegúrate de llenar la información requerida marcada con (*). No está permitido el código HTML. Tu dirección de correo NO será publicada.

Twitter

Últimos tweets