Un servidor con la configuración por defecto es un servidor vulnerable. Los valores por defecto están diseñados para compatibilidad y facilidad de uso, no para seguridad. SSH con acceso root habilitado, servicios innecesarios corriendo, firewall desactivado, sin límites de intentos de login — cada uno es una puerta abierta para un atacante.
Esta guía te lleva por los 15 pasos esenciales de hardening que aplicamos en cada servidor que desplegamos para nuestros clientes. No es una lista académica — son las configuraciones que bloquean los vectores de ataque más comunes que vemos en auditorías de ciberseguridad en empresas mexicanas.
Antes de empezar
Haz estos cambios en un ambiente de pruebas primero
Aplicar hardening en un servidor de producción sin probar puede dejarte fuera del servidor o romper aplicaciones. Prueba cada paso en una VM de Proxmox o en un servidor de staging antes de aplicar en producción.
Todos los comandos asumen Ubuntu 24.04 LTS. La mayoría aplican también a Debian 12.
1. Actualizar el sistema
Lo más básico y lo más olvidado. Las actualizaciones de seguridad parchean vulnerabilidades conocidas:
sudo apt update && sudo apt upgrade -y
sudo apt autoremove -y
2. Configurar actualizaciones automáticas de seguridad
Las actualizaciones manuales dependen de que alguien se acuerde. Las automáticas no:
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure -plow unattended-upgrades
Verifica que esté activo:
cat /etc/apt/apt.conf.d/20auto-upgrades
Debe tener:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
3. Configurar firewall con UFW
Si aún no lo has hecho, sigue nuestra guía de UFW. El resumen rápido:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw limit ssh
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
4. Endurecer SSH
SSH es el vector de ataque #1 en servidores Linux. Edita /etc/ssh/sshd_config:
sudo nano /etc/ssh/sshd_config
Aplica estos cambios:
# Deshabilitar acceso root por SSH
PermitRootLogin no
# Solo autenticación por llaves (deshabilitar contraseñas)
PasswordAuthentication no
PubkeyAuthentication yes
# Deshabilitar autenticación por teclado interactivo
KbdInteractiveAuthentication no
# Cambiar puerto (reduce 99% del ruido de bots)
Port 2222
# Limitar intentos de autenticación
MaxAuthTries 3
MaxSessions 3
# Timeout de conexiones inactivas
ClientAliveInterval 300
ClientAliveCountMax 2
# Deshabilitar X11 forwarding (no necesitas GUI en un servidor)
X11Forwarding no
# Solo permitir usuarios específicos
AllowUsers tuusuario admin
Antes de deshabilitar contraseñas
Asegúrate de haber copiado tu llave pública SSH al servidor con ssh-copy-id y de que puedes conectarte sin contraseña. Si desactivas PasswordAuthentication sin tener una llave configurada, te quedas fuera permanentemente.
Reinicia SSH:
sudo systemctl restart sshd
5. Instalar fail2ban
fail2ban monitorea los logs de SSH y bloquea automáticamente IPs que intentan fuerza bruta:
sudo apt install fail2ban -y
Crea la configuración local:
sudo tee /etc/fail2ban/jail.local > /dev/null <<EOF
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
banaction = ufw
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
EOF
sudo systemctl enable --now fail2ban
Verifica las IPs bloqueadas:
sudo fail2ban-client status sshd
6. Deshabilitar servicios innecesarios
Cada servicio corriendo es una superficie de ataque potencial. Revisa qué está corriendo:
sudo systemctl list-units --type=service --state=running
Deshabilita lo que no necesites:
# Ejemplos comunes de servicios innecesarios en un servidor
sudo systemctl disable --now cups # Impresión
sudo systemctl disable --now avahi-daemon # Descubrimiento de red
sudo systemctl disable --now bluetooth # Bluetooth
sudo systemctl disable --now ModemManager # Módem
7. Configurar permisos de archivos críticos
# Proteger archivos de configuración
sudo chmod 600 /etc/ssh/sshd_config
sudo chmod 600 /etc/shadow
sudo chmod 644 /etc/passwd
sudo chmod 700 /root
# Proteger crontab
sudo chmod 600 /etc/crontab
sudo chmod 700 /etc/cron.d
sudo chmod 700 /etc/cron.daily
sudo chmod 700 /etc/cron.hourly
8. Configurar política de contraseñas
Aunque uses llaves SSH, los usuarios locales deben tener contraseñas fuertes:
sudo apt install libpam-pwquality -y
Edita /etc/security/pwquality.conf:
minlen = 12
dcredit = -1
ucredit = -1
ocredit = -1
lcredit = -1
maxrepeat = 3
9. Limitar el uso de sudo
No todos los usuarios deben tener acceso sudo completo:
# Crear un grupo de administradores
sudo groupadd sysadmins
# Agregar usuarios al grupo
sudo usermod -aG sysadmins tuusuario
# Configurar sudo solo para el grupo
sudo visudo
Agrega:
%sysadmins ALL=(ALL:ALL) ALL
Verifica que no haya entradas genéricas de sudo innecesarias.
10. Habilitar auditoría del sistema
auditd registra eventos de seguridad — quién accedió a qué archivo, quién ejecutó qué comando:
sudo apt install auditd audispd-plugins -y
sudo systemctl enable --now auditd
Agrega reglas de auditoría para archivos críticos:
sudo tee /etc/audit/rules.d/hardening.rules > /dev/null <<EOF
# Monitorear cambios en usuarios y grupos
-w /etc/passwd -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/sudoers -p wa -k identity
# Monitorear cambios en SSH
-w /etc/ssh/sshd_config -p wa -k sshd_config
# Monitorear cambios en cron
-w /etc/crontab -p wa -k cron
-w /var/spool/cron -p wa -k cron
# Monitorear ejecución de comandos como root
-a always,exit -F arch=b64 -F euid=0 -S execve -k root_commands
EOF
sudo augenrules --load
11. Configurar los parámetros del kernel
Edita /etc/sysctl.conf para endurecer la pila de red y el kernel:
sudo tee -a /etc/sysctl.conf > /dev/null <<EOF
# --- Hardening de red ---
# Deshabilitar redirecciones ICMP (previene MitM)
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
# Deshabilitar source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# Habilitar protección contra SYN flood
net.ipv4.tcp_syncookies = 1
# Ignorar pings broadcast (previene Smurf attack)
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Log de paquetes marcianos (paquetes con IPs imposibles)
net.ipv4.conf.all.log_martians = 1
# Deshabilitar IPv6 si no lo usas
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
# --- Hardening del kernel ---
# Restringir acceso a logs del kernel
kernel.dmesg_restrict = 1
# Deshabilitar SysRq (teclas mágicas del kernel)
kernel.sysrq = 0
# ASLR habilitado (randomización de memoria)
kernel.randomize_va_space = 2
EOF
sudo sysctl -p
12. Deshabilitar USB y medios removibles (servidores)
En un servidor de producción nadie debería conectar una USB:
echo "blacklist usb-storage" | sudo tee /etc/modprobe.d/disable-usb-storage.conf
13. Configurar banners de advertencia
Un banner legal advierte a posibles intrusos que el acceso no autorizado es ilegal y será perseguido:
sudo tee /etc/issue.net > /dev/null <<EOF
***********************************************
* Acceso restringido a personal autorizado *
* Toda actividad es monitoreada y registrada *
* El acceso no autorizado será procesado *
***********************************************
EOF
Actívalo en SSH:
# En /etc/ssh/sshd_config
Banner /etc/issue.net
14. Configurar NTP (sincronización de tiempo)
Los logs de seguridad son inútiles si la hora del servidor está mal. Los timestamps inconsistentes hacen imposible correlacionar eventos entre servidores:
sudo apt install chrony -y
sudo systemctl enable --now chrony
# Verificar sincronización
chronyc tracking
15. Programar escaneos de vulnerabilidades
Instala Lynis para auditorías periódicas de seguridad:
sudo apt install lynis -y
sudo lynis audit system
Lynis genera un reporte con puntuación de hardening y recomendaciones específicas. Prográmalo semanal con cron y revisa el reporte:
# Crontab semanal
0 2 * * 0 /usr/bin/lynis audit system --quiet >> /var/log/lynis-weekly.log 2>&1
Script de hardening automatizado
Para aplicar todos los pasos en servidores nuevos, automatiza con un script o con Ansible. Aquí el resumen en un script:
#!/bin/bash
# hardening.sh — Hardening básico para Ubuntu 24.04
# Ejecutar como root en servidores NUEVOS antes de poner en producción
set -e
echo "=== Actualizando sistema ==="
apt update && apt upgrade -y
echo "=== Configurando actualizaciones automáticas ==="
apt install unattended-upgrades -y
dpkg-reconfigure -plow unattended-upgrades
echo "=== Configurando firewall ==="
ufw default deny incoming
ufw default allow outgoing
ufw limit 2222/tcp
ufw --force enable
echo "=== Instalando fail2ban ==="
apt install fail2ban -y
systemctl enable --now fail2ban
echo "=== Instalando auditoría ==="
apt install auditd -y
systemctl enable --now auditd
echo "=== Aplicando sysctl ==="
sysctl -p
echo "=== Ejecutando Lynis ==="
apt install lynis -y
lynis audit system --quiet
echo "=== Hardening completado ==="
echo "NOTA: Configura SSH manualmente (/etc/ssh/sshd_config)"
echo "NOTA: Revisa el reporte de Lynis en /var/log/lynis.log"
Siguientes pasos
Con estos 15 pasos cubiertos, tu servidor es significativamente más difícil de comprometer. Para ir más allá:
- Automatización con Ansible — aplica el hardening a decenas de servidores en minutos con playbooks reproducibles
- AIDE/Tripwire — detección de cambios no autorizados en archivos del sistema (integridad de archivos)
- Wazuh — SIEM open source que correlaciona eventos de seguridad de todos tus servidores en un solo dashboard
- Pentesting — contrata una auditoría de penetración para validar que el hardening es efectivo contra ataques reales
- CIS Benchmark completo — esta guía cubre los puntos más críticos; el benchmark CIS completo tiene 200+ controles
Seguridad empresarial
¿Quieres que tus servidores nazcan seguros?
Implementamos hardening automatizado con Ansible y CIS benchmarks para que cada servidor nuevo de tu infraestructura esté protegido desde el primer minuto.



