SSH es bastante seguro, especialmente si toma precauciones razonables, como requerir autenticación basada en pares de claves. Sin embargo, todavía hay muchos bots en la naturaleza que intentan encontrar hosts vulnerables al intentar iniciar sesión con nombres de usuario y contraseñas comunes comprometidos, como root / root o admin / admin. Si bien es poco probable que tengan éxito, seguirán usando su ancho de banda y generarán cantidades masivas de registros.
Una forma de minimizar los intentos de inicio de sesión por fuerza bruta es cambiar el puerto predeterminado en el que escucha SSH. Sin embargo, esto no se considera una buena práctica; en primer lugar, recuerde que cada vez que se conecten al servidor, deben configurar el puerto correcto, que no sea el predeterminado. Además, puede crear otra vulnerabilidad de seguridad si el puerto seleccionado es mayor que 1024. Por lo general, solo la raíz puede vincularse a números de puerto inferiores a 1024. Sin embargo, si se usa un número de puerto más alto para SSH, bajo ciertas circunstancias, los usuarios sin acceso de raíz pueden reemplazar el demonio SSH con otro servicio posiblemente malicioso.
La mejor manera de resolver este problema es utilizar una herramienta que bloquee el acceso de un atacante al servidor SSH. Una de estas herramientas ampliamente utilizada es fail2ban ( www.fail2ban.org ). Al analizar los registros, fail2ban detecta repetidos intentos fallidos de autenticación y establece automáticamente reglas de firewall para descartar el tráfico que se origina en la dirección IP del atacante.
Instalar fail2ban en Ubuntu
Instalación manual
Instalar fail2ban en Ubuntu (y otras distribuciones basadas en Debian) es muy simple:
$ sudo apt install fail2ban
Comprobando cómo funciona
Puede comprobar si el servicio se está ejecutando con el siguiente comando:
$ sudo systemctl status fail2ban
La salida debería verse similar a la siguiente - el estado del servicio debería estar activo:
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2021-05-18 12:36:36 ***; ** min ago
Docs: man:fail2ban(1)
Process: 723*** ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)
Main PID: 723*** (f2b/server)
Tasks: 5 (limit: 38293)
Memory: 18.0M
CGroup: /system.slice/fail2ban.service
└─723488 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
Veamos cómo fail2ban cambió las reglas de iptables:
$ sudo iptables -L -n -v
También debería ver que hay una nueva cadena f2b-sshd en la configuración de iptables a la que hace referencia la regla de la cadena INPUT:
Chain INPUT (policy ACCEPT 73411 packets, 6622K bytes)
pkts bytes target prot opt in out source destination
1019 65297 f2b-sshd tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 22
Chain f2b-sshd (1 references)
pkts bytes target prot opt in out source destination
8 480 REJECT all -- * * 94.191.93.46 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 REJECT all -- * * 77.50.75.162 0.0.0.0/0 reject-with icmp-port-unreachable
10 600 REJECT all -- * * 51.254.143.190 0.0.0.0/0 reject-with icmp-port-unreachable
10 600 REJECT all -- * * 46.101.97.5 0.0.0.0/0 reject-with icmp-port-unreachable
9 540 REJECT all -- * * 43.129.28.88 0.0.0.0/0 reject-with icmp-port-unreachable
9 540 REJECT all -- * * 41.221.168.167 0.0.0.0/0 reject-with icmp-port-unreachable
9 540 REJECT all -- * * 35.247.219.12 0.0.0.0/0 reject-with icmp-port-unreachable
12 720 REJECT all -- * * 220.180.119.192 0.0.0.0/0 reject-with icmp-port-unreachable
10 600 REJECT all -- * * 218.75.121.75 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 REJECT all -- * * 213.87.101.176 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 REJECT all -- * * 192.139.15.34 0.0.0.0/0 reject-with icmp-port-unreachable
21 1260 REJECT all -- * * 187.104.145.210 0.0.0.0/0 reject-with icmp-port-unreachable
8 480 REJECT all -- * * 177.191.189.13 0.0.0.0/0 reject-with icmp-port-unreachable
10 600 REJECT all -- * * 159.89.82.134 0.0.0.0/0 reject-with icmp-port-unreachable
10 600 REJECT all -- * * 159.75.140.97 0.0.0.0/0 reject-with icmp-port-unreachable
8 480 REJECT all -- * * 157.92.13.105 0.0.0.0/0 reject-with icmp-port-unreachable
11 660 REJECT all -- * * 117.80.225.245 0.0.0.0/0 reject-with icmp-port-unreachable
9 540 REJECT all -- * * 106.53.121.179 0.0.0.0/0 reject-with icmp-port-unreachable
865 56057 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0
El paquete fail2ban contiene una herramienta llamada fail2ban-client. Te permite verificar el estado del servicio e interactuar con él (por ejemplo, te permite bloquear y desbloquear manualmente direcciones IP, habilitar y deshabilitar jaulas, etc.)
Veamos qué cárceles están activas:
$ sudo fail2ban-client status
Status |- Number of jail: 1 `- Jail list: sshd
Solo hay una cárcel, sshd, que es responsable de monitorear los registros del servidor SSH en busca de inicios de sesión fallidos y configurar las reglas del firewall para bloquear más intentos.
Ahora podemos comprobar las estadísticas de la cárcel sshd:
$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 8
| |- Total failed: 26
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 22
|- Total banned: 25
`- Banned IP list: 106.53.121.179 117.80.225.245 157.92.13.105 159.75.140.97 159.89.82.134 177.191.189.13 187.104.145.210 213.87.101.176 218.75.121.75 220.180.119.192 35.247.219.12 41.221.168.167 43.129.28.88 46.101.97.5 51.254.143.190 77.50.75.162 94.191.93.46 1.55.165.141 120.53.245.68 104.131.178.145 106.56.102.83 152.32.146.21
Configuración de fail2ban
En la mayoría de los casos, la configuración predeterminada debería ser suficiente. Sin embargo, es útil comprender cuáles son estos valores predeterminados y cómo se pueden cambiar para adaptarlos a sus necesidades.
En una configuración estándar, fail2ban protegerá el servidor SSH y bloqueará al atacante durante 10 minutos después de 5 intentos fallidos de inicio de sesión en 10 minutos. El archivo de configuración predeterminado se puede encontrar en /etc/fail2ban/jail.conf. El archivo está bien documentado y en su mayoría se explica por sí mismo. Tenga en cuenta que no debe realizar ningún cambio en este archivo, ya que puede sobrescribirse durante la actualización de fail2ban.
Después de cambiar la configuración, no olvide reiniciar el servicio:
$ sudo systemctl restart fail2ban
Debo señalar que en este caso, cambié los parámetros de configuración, entendí la estrategia de ataque y recibí una lista diaria de hosts atacantes y la bloqueé.
Pero te lo contaré más adelante en una nota separada, si esta es útil e interesante para alguien.