Esta guía contiene algunos consejos y recomendaciones para hacer tu servidor Linux más seguro. Dado que los servidores deben ser accesibles desde el exterior, es fundamental contar con una protección básica contra accesos no deseados y no debe ser descuidada.
Ten en cuenta que estas instrucciones no son exhaustivas y 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 es siempre la misma, sin importar el tipo de servidor: usa contraseñas seguras, actualiza tus servicios regularmente y presta atención a qué servicios instalas y qué guías sigues.
| Servicio | Puerto |
|---|---|
| SSH | 22 |
| FTP | 21 |
| Correo | 25 |
| DNS | 53 |
| HTTP | 80 |
| HTTPS | 443 |
Servicios como SSH o FTP usan por defecto siempre los mismos puertos (algunos están en la tabla anterior). Si un atacante externo intenta vulnerar tu servicio SSH mediante fuerza bruta, primero debe saber qué puerto usa SSH. Si no cambias estos puertos, los puertos 22 y 21 suelen ser los objetivos para ejecutar comandos directamente en el servidor o acceder a archivos vía FTP.
Para evitar esto, recomendamos configurar puertos personalizados para los servicios estándar. En la siguiente sección aprenderás cómo hacerlo:
El puerto que elijas debe estar entre 1024 y 65535 y no debe estar ya en uso.
Puedes usar cat /etc/services para ver algunos puertos estándar y evitar elegir uno ocupado.
Para cambiar el puerto SSH, debes modificar el archivo de configuración, normalmente ubicado en /etc/ssh/sshd_config. Si no lo encuentras, búscalo con:
find / -name "sshd_config" 2>/dev/null
Abre el archivo con nano (como root o usando sudo):
sudo nano /etc/ssh/sshd_config
Inserta el puerto deseado tras Port. Si Port está comentado (por ejemplo, #Port 22), elimina el "#" y reemplaza el 22 por el puerto que quieras. Guarda el archivo (en Nano con Ctrl + o) y ciérralo (Ctrl + x).
Luego reinicia el servicio SSH para aplicar los cambios:
# En Ubuntu/Debian/CentOS por ejemplo
sudo systemctl restart sshd
Si tienes instalado un servicio FTP como proFTPd, también puedes cambiar su puerto mediante el archivo de configuración, de forma similar a SSH.
Busca el archivo proftpd.conf:
find / -name "proftpd.conf" 2>/dev/null
Normalmente está en /etc/proftpd.conf (CentOS) o /etc/proftpd/proftpd.conf (Ubuntu, Debian).
Ábrelo con nano, quita el "#" delante de port y escribe el puerto deseado. Recuerda las indicaciones anteriores para no elegir un puerto inválido.
Usa Ctrl + W para buscar en nano.
nano /etc/proftpd/proftpd.conf
Fail2Ban es un servicio que bloquea direcciones IP que intentan acceder al servidor con intenciones probablemente maliciosas. Fail2Ban monitorea archivos de registro para detectar anomalías y protege tu sistema de forma sencilla y efectiva.
Tras la instalación, Fail2Ban incluye configuraciones predefinidas para servicios comunes, como:
- apache
- lighttpd
- sshd
- qmail
- postfix
- Courier Mail Server Otros servicios pueden añadirse fácilmente mediante expresiones regulares (RegEx) y especificando el archivo de registro deseado.
/var/log/auth.log. Este archivo contiene todos los intentos de inicio de sesión SSH, exitosos o fallidos.
Aquí ves 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 usa este archivo y lo monitorea para detectar autenticaciones fallidas. Como el archivo de registro contiene la IP del atacante, Fail2Ban puede bloquear esa IP tras varios intentos fallidos.
Inicia sesión en tu servidor Linux. Si necesitas ayuda, sigue nuestra guía Primer acceso (SSH). Ejecuta los comandos como root o con sudo.
sudo apt update && sudo apt upgrade -y
sudo apt install fail2ban
Tras la instalación, puedes verificar el estado con systemctl: (Ctrl+C para salir)
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 está instalado pero aún no activo ni configurado. Revisa /etc/fail2ban, donde deberían estar estos 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 una "jail" activa, crea un archivo llamado jail.local. Simplemente copia el contenido de jail.conf a este nuevo archivo y ábrelo:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
Aquí puedes hacer todas las configuraciones, incluyendo qué servicios monitorear.
Solo mira la sección después de [Default], que contiene configuraciones generales.
Baja hasta encontrar esta sección y modifícala así:
| Atributo | Explicación | Valor |
|---|---|---|
| ignoreip | IPs que no serán bloqueadas | 127.0.0.1/8 |
| ignorecommand | No relevante | |
| bantime | Tiempo que una IP queda bloqueada | 1h |
| findtime | Intervalo para contar intentos fallidos | 10m |
| maxretry | Número de intentos fallidos antes de bloquear | 5 |
# puede definirse separado por espacios y/o comas
#ignoreip = 127.0.0.1/8 ::1
# ignorecommand = /path/to/command <ip>
ignorecommand =
# "bantime" es el tiempo en segundos que un host queda bloqueado
bantime = 1h
# Un host se bloquea si tiene "maxretry" errores en los últimos "findtime" segundos
findtime = 10m
# "maxretry" es el número de errores antes de bloquear
maxretry = 5
Con esto tienes la configuración básica. Para monitorear el servicio SSH, baja hasta la etiqueta [sshd]. Si cambiaste el puerto, ponlo en port.
El bloque [sshd] debería verse así:
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 4
Como ves, puedes hacer configuraciones individuales para cada servicio (por ejemplo, maxretry más bajo que el valor por defecto). Si no haces esto, se usan las configuraciones generales.
Finalmente, reinicia Fail2Ban para activar la supervisión:
sudo systemctl restart fail2ban.service
Si tienes acceso a una VPN o un segundo servidor, puedes probar si Fail2Ban funciona bloqueándote a ti mismo. Con una VPN o hotspot móvil obtendrás otra IP para hacer la prueba.
No hagas esta prueba en tu red habitual, porque podrías bloquear tu propia IP y quedarte bloqueado.
Intenta conectarte por SSH a tu servidor (con otra IP) y escribe la contraseña incorrecta varias veces. El resultado debería ser:
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 ves, la conexión es rechazada (Connection refused en lugar de Permission denied).
Muestra el estado de Fail2Ban. Verás que una IP está bloqueada:
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 una IP, usa: fail2ban-client set sshd unbanip {tu IP}.
Si tienes muchas IP bloqueadas, considera aumentar el tiempo de bloqueo con cada intento fallido para reducir los intentos posibles.
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 4
bantime = 1h
# El tiempo de bloqueo aumenta con cada bloqueo de esta IP
bantime.increment = true
# Factor de escala de 24 horas (1h,24h,48h,3d,4d....)
bantime.factor = 24
# Tiempo máximo de bloqueo = 5 semanas
bantime.maxtime = 5w
