Un servidor recién desplegado en cualquier proveedor cloud (AWS, DigitalOcean, Hetzner, Vultr) recibe miles de intentos de escaneo de puertos y ataques de fuerza bruta por minuto. Aplicar un perfil de hardening inicial reduce exponencialmente la superficie de ataque.
1. Creación de Usuario no Privilegiado y Configuración de Sudo
El primer paso consiste en deshabilitar el inicio de sesión interactivo de `root` y operar mediante un usuario dedicado asignado al grupo con privilegios administrativos (`sudo` o `wheel`).
# Crear usuario de administración
adduser sysadmin_jorge
# Asignar al grupo sudo (en Debian/Ubuntu) o wheel (en RHEL/Rocky)
usermod -aG sudo sysadmin_jorge
# Copiar clave pública SSH autorizada
mkdir -p /home/sysadmin_jorge/.ssh
chmod 700 /home/sysadmin_jorge/.ssh
cp /root/.ssh/authorized_keys /home/sysadmin_jorge/.ssh/
chown -R sysadmin_jorge:sysadmin_jorge /home/sysadmin_jorge/.ssh
chmod 600 /home/sysadmin_jorge/.ssh/authorized_keys2. Hardening del Servicio OpenSSH (/etc/ssh/sshd_config)
El demonio OpenSSH debe ser configurado de forma estricta para restringir cifrados débiles y exigir autenticación basada exclusivamente en pares de claves criptográficas (Ed25519 o RSA 4096).
# Cambiar el puerto por defecto (opcional para reducir ruido en logs)
Port 2222
# Deshabilitar acceso directo de root
PermitRootLogin no
# Exigir autenticación por claves públicas y deshabilitar contraseñas
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
# Limitar intentos máximos de autenticación por conexión
MaxAuthTries 3
MaxSessions 2
# Desactivar reenvío de X11 y agentes no requeridos
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
# Ajustar tiempo de inactividad de la sesión
ClientAliveInterval 300
ClientAliveCountMax 2
# Permitir inicio de sesión únicamente al usuario autorizado
AllowUsers sysadmin_jorgeTras modificar la configuración, se debe validar la sintaxis antes de reiniciar el servicio para evitar perder acceso al servidor:
# Validar sintaxis del archivo de configuración
sshd -t
# Si no arroja errores, reiniciar el demonio OpenSSH
systemctl restart sshd3. Configuración del Cortafuegos (UFW / Nftables)
Se debe establecer una política predeterminada de denegación total (Default Deny), permitiendo de forma explícita únicamente los puertos estrictamente indispensables:
# Restablecer reglas previas
ufw --force reset
# Política predeterminada: bloquear todo lo entrante, permitir todo lo saliente
ufw default deny incoming
ufw default allow outgoing
# Permitir SSH en el puerto personalizado
ufw allow 2222/tcp comment 'OpenSSH Custom Port'
# Permitir tráfico web HTTP y HTTPS
ufw allow 80/tcp comment 'HTTP Web Server'
ufw allow 443/tcp comment 'HTTPS Web Server'
# Habilitar el firewall
ufw enable
# Verificar estado operativo
ufw status verbose4. Protección contra Fuerza Bruta con Fail2ban
Fail2ban inspecciona continuamente los registros del sistema (`/var/log/auth.log` o `journalctl`) e introduce reglas automáticas de bloqueo en `iptables` cuando detecta intentos fallidos recurrentes.
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 3
[sshd]
enabled = true
port = 2222
logpath = %(sshd_log)s
backend = %(sshd_backend)s5. Actualizaciones de Seguridad Automatizadas
En sistemas basados en Debian o Ubuntu, se debe configurar el paquete `unattended-upgrades` para garantizar la aplicación automática de parches de seguridad críticos sin intervención manual:
apt install unattended-upgrades dpkg-dev -y
dpkg-reconfigure --priority=low unattended-upgrades