Endurecimiento de servidores Linux: qué hacer después del primer arranque
Una guía práctica paso a paso para endurecer un servidor Linux — SSH, firewall, fail2ban, actualizaciones automáticas, auditd y AppArmor para una seguridad lista para producción.
Instalar un servidor Linux es la parte fácil. Fortalecerlo — ahí es donde la mayoría de las personas complican demasiado las cosas o se saltan pasos críticos por completo.
Esta guía cubre los pasos prácticos de fortalecimiento que aplico a cada servidor nuevo, ya sea un VPS, una VM de Proxmox o un nodo de homelab en hardware físico. Están ordenados de mayor a menor impacto, así que incluso si solo haces los primeros, estarás en mejor posición que la mayoría.
1. Fortalecimiento de SSH
SSH es tu superficie de ataque principal. Una instalación predeterminada en el puerto 22 con autenticación por contraseña es cuestión de tiempo antes de que aparezca en los registros de alguien.
Deshabilitar la autenticación por contraseña
# Ejecuta esto SOLO después de confirmar que tu clave SSH funciona
sudo sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo sed -i 's/^PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
Restringir el inicio de sesión de root
sudo sed -i 's/^#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
Opciones adicionales de fortalecimiento de SSH
Agrega o asegura estas configuraciones en /etc/ssh/sshd_config:
# Adiciones a /etc/ssh/sshd_config
MaxAuthTries 3
MaxSessions 3
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers tu-usuario # Solo permite usuarios específicos
Protocol 2 # Deshabilitar protocolo heredado
Aplica los cambios:
sudo systemctl restart sshd
Verificar
# Debería devolver un error (sin solicitud de contraseña) si la autenticación por contraseña está deshabilitada
ssh -o PreferredAuthentications=password tu-usuario@localhost
2. Cortafuegos: ufw
ufw (Uncomplicated Firewall) es la forma más sencilla de bloquear un servidor. Denegar entrada por defecto, permitir solo lo que necesitas:
sudo ufw default deny incoming
sudo ufw default allow outgoing
# SSH — cambia al puerto que hayas configurado si lo moviste
sudo ufw allow ssh
# Servicios web (si aplica)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# Habilitar
sudo ufw --force enable
sudo ufw status verbose
Para reglas más complejas, nftables es el reemplazo moderno de iptables, pero ufw cubre el 90% de los casos de uso en homelab.
Alternativa: Referencia rápida de nftables
sudo nft add table inet filter
sudo nft add chain inet filter input '{ type filter hook input priority 0; policy drop; }'
sudo nft add rule inet filter input ct state established,related accept
sudo nft add rule inet filter input iif lo accept
sudo nft add rule inet filter input tcp dport 22 accept
3. Fail2ban
Fail2ban monitorea registros y bloquea temporalmente IPs con intentos de inicio de sesión fallidos repetidos:
sudo apt install fail2ban
Crea un archivo de configuración local en lugar de editar los valores predeterminados:
# /etc/fail2ban/jail.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
banaction = ufw
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
Fail2ban es un multiplicador de fuerza. Un solo VPS con SSH en el puerto predeterminado puede acumular cientos de intentos de inicio de sesión fallidos al día. Fail2ban los reduce a cero después de los primeros.
4. Actualizaciones automáticas de seguridad
Las actualizaciones desatendidas mantienen tu servidor parcheado contra CVEs conocidos sin intervención manual:
sudo apt install unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades
Revisa y ajusta la configuración:
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
Configuraciones clave para verificar:
// Reparar automáticamente paquetes rotos
Unattended-Upgrade::AutoFixInterruptedDependencies "true";
// Enviar alertas por correo electrónico (configurar postfix o msmtp primero)
Unattended-Upgrade::Mail "[email protected]";
// Eliminar paquetes de kernel no utilizados
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
// Eliminar dependencias no utilizadas nuevas
Unattended-Upgrade::Remove-New-Unused-Dependencies "true";
// Reiniciar si es necesario (establecer en false si prefieres reinicios manuales)
Unattended-Upgrade::Automatic-Reboot "false";
5. Auditd para auditoría del sistema
auditd rastrea eventos del sistema — quién accedió a qué, cuándo y desde dónde:
sudo apt install auditd
Agrega reglas de monitoreo clave:
# Monitorear cambios en /etc/passwd y /etc/shadow
sudo auditctl -w /etc/passwd -p wa -k passwd-changes
sudo auditctl -w /etc/shadow -p wa -k shadow-changes
# Monitorear cambios en la configuración de SSH
sudo auditctl -w /etc/ssh/sshd_config -p wa -k sshd-config
# Monitorear uso de su y sudo
sudo auditctl -w /usr/bin/su -p x -k su-exec
sudo auditctl -w /usr/bin/sudo -p x -k sudo-exec
Haz que las reglas sean persistentes:
sudo nano /etc/audit/rules.d/custom.rules
Contenido:
-w /etc/passwd -p wa -k passwd-changes
-w /etc/shadow -p wa -k shadow-changes
-w /etc/ssh/sshd_config -p wa -k sshd-config
-w /usr/bin/su -p x -k su-exec
-w /usr/bin/sudo -p x -k sudo-exec
sudo systemctl restart auditd
Consultar registros de auditoría:
# Ejecuciones recientes de sudo
sudo ausearch -k sudo-exec --start recent
# Monitoreo en vivo
sudo tail -f /var/log/audit/audit.log
6. AppArmor
AppArmor proporciona control de acceso obligatorio — restringiendo lo que los procesos pueden hacer incluso si están comprometidos:
# Verificar estado
sudo aa-status
# Instalar apparmor-utils para gestión
sudo apt install apparmor-utils
# Aplicar un perfil
sudo aa-enforce /usr/bin/man # Ejemplo
sudo aa-complain /usr/bin/foo # Registrar violaciones pero no aplicar
La mayoría de los paquetes de Ubuntu incluyen perfiles de AppArmor. Asegúrate de que estén en modo enforce:
sudo aa-status | head -20
Busca perfiles en modo complain y considera moverlos a enforce después de probar.
7. Fortalecimiento del kernel (sysctl)
Estas configuraciones de sysctl reducen la superficie de ataque a nivel de kernel:
# /etc/sysctl.d/99-hardening.conf
# Protección contra suplantación de IP
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Ignorar redirecciones ICMP
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
# Deshabilitar enrutamiento de paquetes de origen
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
# Ignorar redirecciones de envío
net.ipv4.conf.all.send_redirects = 0
# Habilitar cookies SYN de TCP
net.ipv4.tcp_syncookies = 1
# Reducir riesgo de DoS por tiempo de espera de conexión
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
sudo sysctl -p /etc/sysctl.d/99-hardening.conf
8. Verificación regular
La seguridad es un proceso, no una configuración. Verifica periódicamente:
# Verificar puertos en escucha
ss -tlnp
# Verificar intentos de inicio de sesión fallidos
sudo journalctl -u sshd | grep "Failed password" | wc -l
# Verificar actualizaciones disponibles
apt list --upgradable 2>/dev/null | grep -v "^Listing"
# Verificar reglas del cortafuegos
sudo ufw status verbose
# Verificar estado de AppArmor
sudo aa-status | head -10
La regla del 80/20
Si solo tienes 30 minutos para fortalecer un servidor, haz estas tres cosas en orden:
- Deshabilitar la autenticación por contraseña de SSH — elimina el vector de ataque más común
- Configurar el cortafuegos — denegar entrada por defecto, permitir solo lo necesario
- Habilitar actualizaciones desatendidas — parcheado automáticamente o no en absoluto
Todo lo demás es defensa en profundidad. Vale la pena tenerlo, pero estos tres pasos eliminan la gran mayoría de las vulneraciones reales de servidores.
¿Necesitas ayuda para fortalecer tu infraestructura? Contáctanos para una revisión de seguridad.