Lección 4 de 6 — Guía práctica para asegurar un servidor Linux contra ataques y accesos no autorizados.
Cada puerto abierto es una superficie de ataque potencial. Principio: menos es más.
# Ver todos los puertos en escucha ss -tlnp # Ver conexiones activas netstat -tulpn # Listar servicios del sistema systemctl list-units --type=service --state=running
# 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
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
# 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
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)
sshd -t para verificar que no hay errores que te dejen fuera.
# Verificar sintaxis sshd -t # Recargar configuración systemctl reload sshd
Mantener el sistema actualizado es la defensa más básica y efectiva contra vulnerabilidades conocidas.
# 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
# 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
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
# 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
apt install lynis lynis audit system
# /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