Hardening de servidores Linux: checklist completo con ejemplos aplicables en producción
Guía técnica práctica para fortalecer la seguridad de servidores Linux en entornos empresariales, con scripts y configuraciones validadas en producción.
Introducción
El hardening de servidores Linux no es un proceso puntual sino una práctica continua de reducción de la superficie de ataque. En más de una década administrando infraestructuras críticas, he visto cómo vulnerabilidades básicas en configuración de sistemas operativos comprometen redes completas. Este artículo aborda los controles esenciales que todo sysadmin debe implementar antes de llevar un servidor a producción.
1. Gestión de acceso y autenticación
SSH Hardening
El protocolo SSH es el vector más expuesto en servidores Linux. La configuración por defecto es insegura:
# /etc/ssh/sshd_config - Configuración recomendada para producción
Port 2222
AddressFamily inet
ListenAddress 10.0.1.5
# Autenticación
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
MaxAuthTries 3
MaxSessions 5
# Criptografía
HostKey /etc/ssh/ssh_host_ed25519_key
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
# Límites y timeouts
ClientAliveInterval 300
ClientAliveCountMax 2
LoginGraceTime 30s
# Logging
SyslogFacility AUTH
LogLevel VERBOSE
# Restricciones
AllowUsers usuario1@10.0.*.* usuario2@10.1.*.*
DenyUsers root daemon bin
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
PermitTunnel no
systemctl restart ssh
sshd -t # Validar sintaxis antes de aplicar
Eliminar claves débiles del sistema:
# Mantener solo Ed25519
rm -f /etc/ssh/ssh_host_rsa_key*
rm -f /etc/ssh/ssh_host_ecdsa_key*
ssh-keygen -A
Control de permisos y sudo
# Limitar permisos sudo para usuarios específicos
cat >> /etc/sudoers.d/hardening <<EOF
Defaults use_pty
Defaults logfile="/var/log/sudo.log"
Defaults log_input, log_output
Defaults requiretty
Defaults passwd_timeout=1
Defaults timestamp_timeout=5
%sysadmins ALL=(ALL) NOPASSWD: /usr/bin/systemctl
%sysadmins ALL=(ALL) NOPASSWD: /usr/sbin/iptables
EOF
# Validar sintaxis
visudo -c -f /etc/sudoers.d/hardening
# Permisos restrictivos
chmod 600 /etc/sudoers
chmod 750 /etc/sudoers.d
chmod 440 /etc/sudoers.d/hardening
2. Firewall y acceso a la red
UFW en Ubuntu/Debian
# Denegar todo por defecto, permitir lo necesario
ufw default deny incoming
ufw default allow outgoing
ufw limit 2222/tcp comment "SSH con rate limiting"
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow from 10.0.0.0/8 to any port 5432 proto tcp comment "PostgreSQL interno"
# Habilitar con confirmación
ufw enable
ufw status verbose
iptables en producción
Para sistemas que requieren control más granular:
# Tabla de reglas estructurada
iptables -N TCP
iptables -N UDP
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Loopback siempre permitido
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -d 127.0.0.0/8 -j REJECT
# Conexiones establecidas
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# Redirigir TCP/UDP a cadenas específicas
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -j TCP
iptables -A INPUT -p udp -m conntrack --ctstate NEW -j UDP
# Reglas específicas
iptables -A TCP -p tcp --dport 2222 -j ACCEPT
iptables -A TCP -p tcp --dport 80 -j ACCEPT
iptables -A TCP -p tcp --dport 443 -j ACCEPT
# Loguear intentos rechazados (úsalo con moderación)
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "DROP_INPUT: " --log-level 7
# Persistir configuración
apt-get install iptables-persistent
netfilter-persistent save
3. Actualizaciones y parches
# Automatizar actualizaciones de seguridad (Debian/Ubuntu)
apt-get install unattended-upgrades apt-listchanges
cat > /etc/apt/apt.conf.d/50unattended-upgrades <<EOF
Unattended-Upgrade::Allowed-Origins {
"\${distro_id}:\${distro_codename}-security";
"\${distro_id}ESMApps:\${distro_codename}-apps-security";
};
Unattended-Upgrade::AutoFixInterruptedDpkg "true";
Unattended-Upgrade::MinimalSteps "true";
Unattended-Upgrade::Mail "sysadmin@empresa.com";
Unattended-Upgrade::MailReport "on-change";
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Automatic-Reboot "false";
EOF
# Habilitar
dpkg-reconfigure -plow unattended-upgrades
4. Auditoría y logging
auditd para monitoreo de cambios críticos
apt-get install auditd audispd-plugins
# Agregar reglas de auditoría
cat >> /etc/audit/rules.d/hardening.rules <<EOF
# Monitorear cambios en configuración crítica
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/sudoers -p wa -k sudoers_changes
-w /etc/sudoers.d/ -p wa -k sudoers_d_changes
-w /etc/ssh/sshd_config -p wa -k sshd_config_changes
# Ejecutables sensibles
-w /usr/sbin/userdel -p x -k user_modification
-w /usr/sbin/useradd -p x -k user_modification
-w /usr/sbin/usermod -p x -k user_modification
# Syscalls peligrosos
-a always,exit -F arch=b64 -S adjtimex,settimeofday -k time_change
-a always,exit -F arch=b64 -S execve -F uid=0 -k root_exec
EOF
augenrules --load
systemctl restart audit