🛡️ Hardening Linux — Endurecimiento de Servidores

Lección 4 de 6 — Guía práctica para asegurar un servidor Linux contra ataques y accesos no autorizados.

1. Gestión de Puertos y Servicios

Cada puerto abierto es una superficie de ataque potencial. Principio: menos es más.

Identificar servicios en ejecución

# Ver todos los puertos en escucha
ss -tlnp

# Ver conexiones activas
netstat -tulpn

# Listar servicios del sistema
systemctl list-units --type=service --state=running

Eliminar servicios innecesarios

# Detener y deshabilitar un servicio
systemctl stop cups.service
systemctl disable cups.service

# Ejemplos de servicios que suelen ser innecesarios en servidores:
# - cups (impresión)
# - avahi-daemon (descubrimiento mDNS)
# - bluetooth
# - postfix (si no es servidor de correo)
# - rpcbind
✅ Buenas prácticas: usa el principio de mínimos privilegios. Si no necesitas un servicio, desactívalo.

2. Firewall: UFW e Iptables

UFW (Uncomplicated Firewall)

Interfaz simplificada sobre iptables, ideal para administradores principiantes.

# Configuración básica UFW
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh                           # Puerto 22
ufw allow 80/tcp                        # HTTP
ufw allow 443/tcp                       # HTTPS
ufw allow from 192.168.1.0/24 to any port 3306  # MySQL solo red interna
ufw enable
ufw status verbose

Iptables (control directo)

# Políticas por defecto
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Permitir tráfico loopback
iptables -A INPUT -i lo -j ACCEPT

# Permitir conexiones establecidas
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Permitir SSH, HTTP, HTTPS
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Guardar reglas
iptables-save > /etc/iptables/rules.v4

3. SSH Seguro

El servicio SSH es una de las puertas de entrada más atacadas. Configúralo en /etc/ssh/sshd_config:

# /etc/ssh/sshd_config — configuraciones recomendadas
Port 2222                    # Cambiar puerto (reduce ruido de bots)
PermitRootLogin no           # Nunca permitir login como root
PasswordAuthentication no    # Solo autenticación por clave pública
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
MaxAuthTries 3               # Máximo 3 intentos
MaxSessions 2                # Máximo 2 sesiones simultáneas
ClientAliveInterval 300      # Timeout de 5 min
ClientAliveCountMax 2
AllowUsers alice bob         # Solo usuarios específicos
DenyUsers root mysql         # Bloquear usuarios específicos
Protocol 2                   # Solo SSHv2 (SSHv1 es inseguro)
⚠️ Antes de cerrar tu sesión: prueba siempre la nueva configuración en otra terminal con sshd -t para verificar que no hay errores que te dejen fuera.
# Verificar sintaxis
sshd -t

# Recargar configuración
systemctl reload sshd

4. Actualizaciones y Parches

Mantener el sistema actualizado es la defensa más básica y efectiva contra vulnerabilidades conocidas.

Actualizaciones automáticas (Debian/Ubuntu)

# Instalar unattended-upgrades
apt install unattended-upgrades
dpkg-reconfigure --priority=low unattended-upgrades

# Configurar actualizaciones automáticas
cat > /etc/apt/apt.conf.d/50unattended-upgrades << 'EOF'
Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
    "${distro_id}:${distro_codename}-updates";
};
Unattended-Upgrade::AutoFixInterruptedDpkg "true";
Unattended-Upgrade::MinimalSteps "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "false";
EOF

Comandos útiles

# Ver paquetes actualizables
apt list --upgradable

# Aplicar actualizaciones de seguridad
apt update && apt upgrade -y

# Ver kernel actual
uname -r

# Ver versiones de paquetes instalados
dpkg -l | grep openssh

5. Otras Medidas de Hardening

Fail2ban — Protección contra fuerza bruta

apt install fail2ban
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# Configuración personalizada en jail.local:
[sshd]
enabled = true
port = 2222
maxretry = 5
bantime = 3600
findtime = 600

Auditar permisos de archivos

# Buscar archivos con permisos peligrosos
find / -perm -4000 -type f 2>/dev/null   # SUID binaries
find / -perm -2000 -type f 2>/dev/null   # SGID binaries
find / -perm -o+w -type f 2>/dev/null    # World-writable files

Lynis — Auditoría de seguridad

apt install lynis
lynis audit system

Protección adicional del kernel

# /etc/sysctl.d/99-hardening.conf
net.ipv4.tcp_syncookies = 1              # Protección SYN flood
net.ipv4.conf.all.accept_redirects = 0   # Ignorar ICMP redirects
net.ipv4.conf.all.rp_filter = 1          # Filtro de ruta inversa
kernel.randomize_va_space = 2            # ASLR (Address Space Layout Randomization)
kernel.exec-shield = 1                   # Protección de ejecución

# Aplicar
sysctl -p /etc/sysctl.d/99-hardening.conf

📋 Checklist de Hardening

📌 Resumen