Esta guía contiene algunos consejos y recomendaciones para mejorar la seguridad de tu servidor Linux. Precisamente porque los servidores (virtuales) deben ser accesibles desde el exterior, es recomendable contar con una protección básica contra accesos no deseados y no descuidarla.
Ten en cuenta que estas instrucciones no son exhaustivas y que puedes encontrar información más detallada en otras secciones de la documentación de ZAP. (Por ejemplo, 2FA (SSH))
La forma más sencilla de proteger tu servidor siempre es la misma, independientemente del servidor: utiliza contraseñas seguras, actualiza tus servicios con regularidad y, en general, presta atención a los servicios que instalas y a las guías que sigues.
| Servicio | Puerto |
|---|---|
| SSH | 22 |
| FTP | 21 |
| Correo | 25 |
| DNS | 53 |
| HTTP | 80 |
| HTTPS | 443 |
Servicios como SSH o FTP utilizan siempre los mismos puertos de forma predeterminada (algunos de ellos se muestran en la tabla anterior). Si un atacante externo intenta atacar tu servicio SSH mediante fuerza bruta, primero debe averiguar qué puerto se utiliza para SSH. Si no configuras estos puertos de otra manera, los puertos 22 y 21 suelen ser los objetivos para ejecutar comandos directamente en el servidor o acceder a archivos mediante FTP.
Para evitarlo, recomendamos configurar puertos personalizados para los servicios predeterminados. En la siguiente sección aprenderás cómo hacerlo:
¡El puerto que elijas debe estar entre 1024 y 65535 y no puede ser un puerto que ya esté en uso!
Con cat /etc/services puedes consultar algunos puertos predeterminados para no elegir uno que ya esté ocupado.
Para cambiar el puerto SSH, debes modificar el archivo de configuración. Normalmente se encuentra en /etc/ssh/sshd_config. Si no está ahí, puedes buscarlo con el siguiente comando:
find / -name "sshd_config" 2>/dev/null
Ahora abre el archivo con nano (como root o con sudo).
sudo nano /etc/ssh/sshd_config
Introduce el puerto que quieras después de Port. Si la línea Port está comentada (es decir, #Port 22), elimina el símbolo "#" y sustituye el 22 por el puerto que quieras. Guarda el archivo (en Nano, con Ctrl + o) y ciérralo (Nano: Ctrl + x).
Ahora debes reiniciar el servicio SSH para que los cambios surtan efecto.
# Unter Ubuntu/Debian/CentOS z.B.
sudo systemctl restart sshd
Si has instalado un servicio FTP como proFTPd, también puedes cambiar el puerto fácilmente editando el archivo de configuración. El procedimiento es similar al del servicio SSH.
Busca el archivo de configuración proftpd.conf
find / -name "proftpd.conf" 2>/dev/null
El archivo suele estar en /etc/proftpd.conf (CentOS) o /etc/proftpd/proftpd.conf (Ubuntu, Debian).
Abre el archivo con nano, elimina el símbolo "#" delante de port e introduce el puerto que quieras a continuación. Sigue las indicaciones anteriores para no introducir un puerto no válido.
Pulsa Ctrl + W para buscar en nano.
nano /etc/proftpd/proftpd.conf
Fail2Ban es un servicio que bloquea las direcciones IP que intentan iniciar sesión en el servidor con posibles intenciones maliciosas. Fail2Ban supervisa los archivos de registro para detectar actividad sospechosa y protege tu sistema de forma sencilla y eficaz.
Tras la instalación, Fail2Ban incluye ajustes preconfigurados para algunos de los servicios más utilizados, entre ellos:
- apache
- lighttpd
- sshd
- qmail
- postfix
- Courier Mail Server Puedes añadir otros servicios fácilmente mediante una expresión regular (RegEx) y especificando el archivo de registro que quieras.
/var/log/auth.log. Este archivo contiene todos los intentos de inicio de sesión por SSH, tanto los correctos como los fallidos.
Aquí puedes ver la entrada:
Dec 2 12:59:19 vps-zap515723-2 sshd[364126]: Failed password for root from 92.117.xxx.xxx port 52504 ssh2
Fail2Ban utiliza este archivo de registro y lo supervisa para detectar autenticaciones fallidas. Como el archivo de registro incluye directamente la dirección IP del atacante, Fail2Ban puede bloquearla después de varios intentos fallidos.
Inicia sesión primero en tu servidor Linux. Si necesitas ayuda, sigue nuestra guía Acceso inicial (SSH). Debes ejecutar los comandos como root o con sudo.
sudo apt update && sudo apt upgrade -y
sudo apt install fail2ban
Tras la instalación, puedes comprobar el estado directamente con systemctl: (Pulsa Ctrl+C para salir de systemctl)
systemctl status fail2ban.service
* fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor pres>
Active: active (running) since Sat 2023-12-02 13:10:33 UTC; 24s ago
Docs: man:fail2ban(1)
Process: 23988 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, statu>
Main PID: 23989 (fail2ban-server)
CPU: 409ms
CGroup: /system.slice/fail2ban.service
`-23989 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
Dec 02 13:10:33 vps-zap515723-1 systemd[1]: Starting Fail2Ban Service...
Dec 02 13:10:33 vps-zap515723-1 systemd[1]: Started Fail2Ban Service.
Dec 02 13:10:34 vps-zap515723-1 fail2ban-server[23989]: Server ready
Fail2Ban ya está instalado, pero todavía no está activo ni configurado. Echa un vistazo a /etc/fail2ban; allí deberían encontrarse los siguientes archivos:
action.d fail2ban.d jail.conf paths-arch.conf paths-debian.conf
fail2ban.conf filter.d jail.d paths-common.conf paths-opensuse.conf
Para crear un «jail» activo, debes crear un archivo llamado jail.local. Solo tienes que copiar el contenido de jail.conf en el archivo nuevo y abrirlo:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
Ahora puedes configurar todos los ajustes en el archivo jail.local, incluidos los servicios que quieres supervisar.
Concéntrate únicamente en la sección que aparece después de [Default]. La sección Default contiene los ajustes generales.
Desplázate hacia abajo hasta encontrar esta sección y adáptala, por ejemplo, de la siguiente manera:
| Atributo | Explicación | Valor |
|---|---|---|
| ignoreip | Direcciones IP que no se deben bloquear | 127.0.0.1/8 |
| ignorecommand | No es relevante. | |
| bantime | Tiempo durante el que se bloquea una dirección IP | 1h |
| findtime | Periodo durante el que se cuentan los inicios de sesión fallidos | 10m |
| maxretry | Número de intentos fallidos que provocan un bloqueo | 5 |
# kann mit Leerzeichen (und/oder Komma) getrennt definiert werden.
#ignoreip = 127.0.0.1/8 ::1
# ignorecommand = /path/to/command <ip>
ignorecommand =
# "bantime" ist die Anzahl der Sekunden, die ein Host gesperrt ist.
bantime = 1h
# Ein Host wird gesperrt, wenn er "maxretry" Fehler innerhalb von "findtime"
# Sekunden erzeugt hat.
findtime = 10m
# "maxretry" ist die Anzahl der Fehler, bevor ein Host gesperrt wird.
maxretry = 5
Ya has terminado de configurar los ajustes básicos. Por ejemplo, para supervisar el servicio SSH, desplázate hacia abajo hasta la sección [sshd]. Si has cambiado el puerto, indícalo en port.
La sección [sshd] debería quedar así:
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 4
Como puedes ver, también es posible configurar ajustes específicos para cada servicio (por ejemplo, maxretry, cuyo valor es menor que el ajuste predeterminado). Aunque ya hayas configurado los ajustes generales, puedes volver a configurar la mayoría de ellos por separado para cada servicio. Si no lo haces, se utilizará el ajuste general.
Ahora solo tienes que reiniciar Fail2Ban para iniciar la supervisión.
sudo systemctl restart fail2ban.service
Si tienes acceso a una VPN o a un segundo servidor, puedes intentar que Fail2Ban te bloquee para comprobar que el servicio funciona. Con una VPN o un punto de acceso desde tu móvil deberías obtener una dirección IP diferente para probar Fail2Ban.
No lo pruebes desde tu red habitual, ya que podrías bloquear tu propia dirección IP y quedarte sin acceso.
Intenta conectarte por SSH a tu servidor (¡desde otra dirección IP!) e introduce una contraseña incorrecta cada vez. El resultado debería ser más o menos así:
root@185.223.29.xxx's password:
Permission denied, please try again.
root@185.223.29.xxx's password:
Permission denied, please try again.
root@185.223.29.xxx's password:
root@185.223.29.xxx: Permission denied (publickey,password).
root@vps-zap515723-2:/var/log# ssh root@185.223.29.179
root@185.223.29.xxx's password:
Permission denied, please try again.
root@185.223.29.xxx's password:
Permission denied, please try again.
root@185.223.29.xxx's password:
^C
root@vps-zap515723-2:/var/log# ssh root@185.223.29.xxx
ssh: connect to host 185.223.29.xxx port 22: Connection refused
Como puedes ver, ahora el servidor protegido por Fail2Ban rechaza la conexión (Connection refused en lugar de Permission denied).
Ahora muestra el estado de Fail2Ban. Aquí puedes ver que se ha bloqueado una dirección IP.
fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 4
| |- Total failed: 8
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: xxx
Si quieres desbloquear la IP, puedes hacerlo con el siguiente comando: fail2ban-client set sshd unbanip {deine IP}.
Si se bloquean muchas direcciones IP de forma inusual, se recomienda aumentar el tiempo de bloqueo con cada intento fallido para reducir el número de intentos de inicio de sesión posibles.
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 4
bantime = 1h
# Bantime sollte mit jeder Sperre dieser IP steigen
bantime.increment = true
# Skalierungsfaktor von 24 Stunden (1h,24h,48h,3d,4d....)
bantime.factor = 24
# Maximale Sperrzeit = 5 Wochen
bantime.maxtime = 5w
