Endurecimiento de Servidores Linux: Guía Completa
Introducción
El endurecimiento de servidores Linux es el proceso crítico de asegurar un sistema Linux reduciendo su superficie de ataque e implementando múltiples capas de controles de seguridad. En el panorama actual de amenazas, donde los ciberataques son cada vez más sofisticados y automatizados, un servidor correctamente endurecido puede marcar la diferencia entre la continuidad del negocio y brechas de datos catastróficas.
Esta guía completa proporciona a administradores de sistemas, ingenieros DevOps y profesionales de seguridad un enfoque sistemático para endurecer servidores Linux. Ya sea que estés gestionando un solo VPS o una infraestructura empresarial, implementar estas medidas de seguridad reducirá significativamente tu exposición al riesgo y garantizará el cumplimiento de los estándares de seguridad de la industria.
El endurecimiento de servidores no es una tarea única sino un proceso continuo que requiere evaluación regular, actualizaciones y adaptación a las amenazas emergentes. Esta guía sigue los principios de defensa en profundidad, implementando múltiples capas de seguridad para que si un control falla, otros permanezcan en su lugar para proteger tus sistemas.
Comprendiendo el Panorama de Amenazas
Vectores de Ataque Comunes
Los servidores Linux modernos enfrentan numerosas amenazas de múltiples fuentes:
Ataques de Fuerza Bruta: Los bots automatizados escanean continuamente Internet intentando obtener acceso SSH mediante adivinación de contraseñas. Estos ataques pueden generar miles de intentos de inicio de sesión por día contra servidores expuestos.
Explotación de Vulnerabilidades: Las vulnerabilidades de software sin parchear siguen siendo uno de los vectores de ataque principales. Los atacantes escanean activamente sistemas que ejecutan software desactualizado con exploits conocidos.
Escalada de Privilegios: Una vez que los atacantes obtienen acceso limitado, intentan explotar configuraciones incorrectas o vulnerabilidades del kernel para obtener privilegios de root.
Malware y Rootkits: Las amenazas persistentes avanzadas despliegan malware sofisticado diseñado para mantener acceso a largo plazo mientras evaden la detección.
Ataques DDoS: Los ataques de denegación de servicio distribuido pueden saturar los recursos del servidor, haciendo que los servicios no estén disponibles para usuarios legítimos.
Ataques a la Cadena de Suministro: Los paquetes de software o dependencias comprometidos pueden introducir vulnerabilidades directamente en tu infraestructura.
Evaluación de Riesgos
Antes de implementar medidas de endurecimiento, comprende tu perfil de riesgo específico:
- Sensibilidad de Datos: ¿Qué tipo de datos procesa o almacena tu servidor?
- Requisitos de Cumplimiento: ¿Qué marcos regulatorios aplican a tus operaciones?
- Disponibilidad del Servicio: ¿Cuál es el umbral aceptable de tiempo de inactividad?
- Restricciones de Recursos: ¿Qué herramientas de seguridad puede soportar el rendimiento de tu servidor?
- Superficie de Ataque: ¿Qué servicios están expuestos a Internet?
Preparación Previa al Endurecimiento
Inventario del Sistema
Documenta la configuración actual de tu servidor antes de hacer cambios:
# System information
hostnamectl
uname -a
cat /etc/os-release
# Network configuration
ip addr show
ip route show
ss -tuln
# Installed services
systemctl list-unit-files --type=service --state=enabled
Respaldo de Configuración Crítica
Siempre respalda los archivos de configuración antes de modificarlos:
# Create backup directory
sudo mkdir -p /root/config-backup-$(date +%Y%m%d)
# Backup critical files
sudo cp -r /etc/ssh /root/config-backup-$(date +%Y%m%d)/
sudo cp -r /etc/sysctl.conf /root/config-backup-$(date +%Y%m%d)/
sudo cp -r /etc/security /root/config-backup-$(date +%Y%m%d)/
Endurecimiento del Sistema Operativo
Instalación Mínima
Comienza con una instalación mínima del SO que contenga solo paquetes esenciales:
# Ubuntu/Debian - Remove unnecessary packages
sudo apt-get autoremove
sudo apt-get purge $(dpkg -l | grep '^rc' | awk '{print $2}')
# CentOS/Rocky Linux - List installed packages
sudo dnf list installed
sudo dnf remove package-name
Actualizaciones del Sistema y Gestión de Parches
Mantener los parches de seguridad actuales es crítico:
# Ubuntu/Debian
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get dist-upgrade -y
# Enable automatic security updates
sudo apt-get install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
Configurar actualizaciones automáticas en CentOS/Rocky:
# CentOS/Rocky Linux
sudo dnf update -y
sudo dnf install dnf-automatic
sudo systemctl enable --now dnf-automatic.timer
Editar /etc/dnf/automatic.conf:
[commands]
upgrade_type = security
apply_updates = yes
Endurecimiento del Kernel con Sysctl
Los parámetros del kernel proporcionan controles de seguridad poderosos:
Editar /etc/sysctl.conf o crear /etc/sysctl.d/99-hardening.conf:
# IP Forwarding
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0
# Syn flood protection
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_max_syn_backlog = 4096
# Ignore ICMP redirects
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
# Ignore send redirects
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# Disable source packet routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.ipv6.conf.default.accept_source_route = 0
# Reverse path filtering
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Log martian packets
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
# Ignore ICMP ping requests
net.ipv4.icmp_echo_ignore_all = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Ignore bogus ICMP errors
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Enable TCP/IP stack hardening
kernel.randomize_va_space = 2
kernel.exec-shield = 1
kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1
# Restrict kernel pointers in /proc
kernel.kptr_restrict = 2
Aplicar cambios:
sudo sysctl -p
sudo sysctl --system
Seguridad de Cuentas de Usuario
Deshabilitar el Inicio de Sesión Root
Nunca permitas el inicio de sesión root directo vía SSH:
Editar /etc/ssh/sshd_config:
PermitRootLogin no
Políticas de Contraseñas Fuertes
Configurar requisitos de complejidad de contraseñas:
Editar /etc/security/pwquality.conf:
# Password minimum length
minlen = 14
# Require complexity
dcredit = -1 # At least one digit
ucredit = -1 # At least one uppercase
lcredit = -1 # At least one lowercase
ocredit = -1 # At least one special character
# Reject passwords with username
usercheck = 1
# Maximum consecutive characters
maxrepeat = 3
Vencimiento de Contraseñas
Aplicar políticas de expiración de contraseñas:
Editar /etc/login.defs:
PASS_MAX_DAYS 90
PASS_MIN_DAYS 1
PASS_WARN_AGE 7
Aplicar a usuarios existentes:
sudo chage -M 90 -m 1 -W 7 username
Bloqueo de Cuentas
Prevenir ataques de fuerza bruta con bloqueos de cuentas:
Editar /etc/security/faillock.conf:
# Lock account after 5 failed attempts
deny = 5
# Unlock time (seconds)
unlock_time = 900
# Root account also subject to lockout
even_deny_root
Endurecimiento de SSH
Autenticación Basada en Claves
Deshabilitar completamente la autenticación por contraseña:
# Generate SSH key on client
ssh-keygen -t ed25519 -a 100
# Copy to server
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server
Configurar el demonio SSH (/etc/ssh/sshd_config):
# Authentication
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
UsePAM yes
# Root login
PermitRootLogin no
# Protocol
Protocol 2
# Key types
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key
# Ciphers and algorithms
KexAlgorithms curve25519-sha256,[email protected]
Ciphers [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr
MACs [email protected],[email protected],hmac-sha2-512,hmac-sha2-256
# Connection settings
ClientAliveInterval 300
ClientAliveCountMax 2
MaxAuthTries 3
MaxSessions 2
LoginGraceTime 60
# Limit users
AllowUsers deployuser adminuser
Cambiar el Puerto SSH Predeterminado
Reducir ataques automatizados cambiando el puerto predeterminado:
# Edit SSH config
Port 2222
# Update firewall
sudo ufw allow 2222/tcp
sudo ufw delete allow 22/tcp
# Restart SSH
sudo systemctl restart sshd
Configuración del Firewall
UFW (Ubuntu/Debian)
Implementar una política de firewall estricta:
# Install UFW
sudo apt-get install ufw
# Default policies
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Allow SSH (custom port)
sudo ufw allow 2222/tcp
# Allow HTTP/HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# Rate limit SSH
sudo ufw limit 2222/tcp
# Enable firewall
sudo ufw enable
# Check status
sudo ufw status verbose
Firewalld (CentOS/Rocky)
# Install firewalld
sudo dnf install firewalld
sudo systemctl enable --now firewalld
# Set default zone
sudo firewall-cmd --set-default-zone=public
# Configure services
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# Custom SSH port
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --permanent --remove-service=ssh
# Rich rules for rate limiting
sudo firewall-cmd --permanent --add-rich-rule='rule service name=ssh limit value=10/m accept'
# Reload
sudo firewall-cmd --reload
Control de Acceso Obligatorio
Configuración de SELinux
Para sistemas basados en Red Hat:
# Check SELinux status
sestatus
# Set enforcing mode
sudo setenforce 1
# Make permanent
sudo sed -i 's/SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config
Gestionar contextos de SELinux:
# Relabel filesystem
sudo touch /.autorelabel
sudo reboot
# Check file contexts
ls -Z /path/to/file
# Restore default context
sudo restorecon -Rv /path/to/directory
Configuración de AppArmor
Para sistemas basados en Debian:
# Install AppArmor
sudo apt-get install apparmor apparmor-utils
# Check status
sudo aa-status
# Enable profiles
sudo aa-enforce /etc/apparmor.d/*
# Create custom profile
sudo aa-genprof /usr/bin/application
Seguridad del Sistema de Archivos
Seguridad de Particiones con Opciones de Montaje
Editar /etc/fstab con opciones de montaje seguras:
/dev/sda1 / ext4 defaults,nodev,nosuid,noexec 1 1
/dev/sda2 /home ext4 defaults,nodev,nosuid 1 2
/dev/sda3 /tmp ext4 defaults,nodev,nosuid,noexec 1 2
/dev/sda4 /var ext4 defaults,nodev 1 2
/dev/sda5 /var/tmp ext4 defaults,nodev,nosuid,noexec 1 2
tmpfs /dev/shm tmpfs defaults,nodev,nosuid,noexec 0 0
Aplicar inmediatamente:
sudo mount -o remount /tmp
sudo mount -o remount /var/tmp
Endurecimiento de Permisos de Archivos
Establecer permisos predeterminados restrictivos:
# Set umask in /etc/profile and /etc/bash.bashrc
umask 027
# Secure sensitive files
sudo chmod 600 /etc/ssh/sshd_config
sudo chmod 600 /boot/grub/grub.cfg
sudo chmod 644 /etc/passwd
sudo chmod 640 /etc/shadow
sudo chmod 640 /etc/gshadow
Encontrar y corregir archivos con escritura mundial:
# Find world-writable files
sudo find / -xdev -type f -perm -0002 -ls
# Find files without owner
sudo find / -xdev -nouser -o -nogroup
# Find SUID/SGID files
sudo find / -xdev -type f \( -perm -4000 -o -perm -2000 \) -ls
Endurecimiento de Procesos y Servicios
Deshabilitar Servicios Innecesarios
# List enabled services
systemctl list-unit-files --type=service --state=enabled
# Disable unnecessary services
sudo systemctl disable cups
sudo systemctl disable avahi-daemon
sudo systemctl disable bluetooth
Restringir Core Dumps
Prevenir la filtración de datos sensibles a través de core dumps:
Editar /etc/security/limits.conf:
* hard core 0
Crear /etc/sysctl.d/50-coredump.conf:
kernel.core_pattern = |/bin/false
fs.suid_dumpable = 0
Monitoreo y Registro
Registro Centralizado
Configurar rsyslog para registro remoto:
Editar /etc/rsyslog.conf:
# Send logs to remote server
*.* @@logserver.example.com:514
Registro de Auditoría con Auditd
# Install auditd
sudo apt-get install auditd audispd-plugins
# Enable and start
sudo systemctl enable auditd
sudo systemctl start auditd
Configurar reglas de auditoría en /etc/audit/rules.d/hardening.rules:
# Delete all existing rules
-D
# Buffer size
-b 8192
# Failure mode
-f 1
# Monitor authentication
-w /etc/passwd -p wa -k passwd_changes
-w /etc/group -p wa -k group_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/sudoers -p wa -k sudoers_changes
# Monitor login/logout
-w /var/log/lastlog -p wa -k logins
-w /var/run/faillock/ -p wa -k logins
# Monitor network changes
-w /etc/hosts -p wa -k network_changes
-w /etc/network/ -p wa -k network_changes
# Monitor privilege escalation
-w /usr/bin/sudo -p x -k privilege_escalation
-w /usr/bin/su -p x -k privilege_escalation
# Monitor SSH
-w /etc/ssh/sshd_config -p wa -k sshd_config
# System calls
-a always,exit -F arch=b64 -S execve -k exec
-a always,exit -F arch=b64 -S connect -k network_connect
Recargar reglas:
sudo augenrules --load
sudo systemctl restart auditd
Retención de Registros
Configurar la rotación de registros en /etc/logrotate.d/rsyslog:
/var/log/syslog
/var/log/auth.log
{
rotate 90
daily
missingok
notifempty
compress
delaycompress
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
Detección y Prevención de Intrusiones
Configuración de Fail2Ban
# Install Fail2Ban
sudo apt-get install fail2ban
# Create local configuration
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Editar /etc/fail2ban/jail.local:
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
destemail = [email protected]
sendername = Fail2Ban
action = %(action_mwl)s
[sshd]
enabled = true
port = 2222
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
AIDE (Advanced Intrusion Detection Environment)
# Install AIDE
sudo apt-get install aide
# Initialize database
sudo aideinit
# Move database
sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# Run checks
sudo aide --check
# Automate with cron
echo "0 3 * * * root /usr/bin/aide --check | mail -s 'AIDE Report' [email protected]" | sudo tee -a /etc/crontab
Procedimientos de Respuesta a Incidentes
Detección y Análisis
Cuando se detecta actividad sospechosa:
# Check active connections
sudo ss -tupn
sudo netstat -tupn
# Review authentication logs
sudo tail -100 /var/log/auth.log
sudo journalctl -u sshd -n 100
# Check for new users
sudo tail /etc/passwd
sudo tail /etc/shadow
# Identify suspicious processes
ps aux | grep -v root
ps aux --sort=-pcpu | head -10
Contención
# Block attacking IP
sudo ufw deny from <attacking-ip>
sudo iptables -I INPUT -s <attacking-ip> -j DROP
# Disable compromised account
sudo usermod -L compromised-user
sudo passwd -l compromised-user
# Kill suspicious processes
sudo kill -9 <pid>
# Disconnect network (if necessary)
sudo ip link set eth0 down
Recolección de Evidencia
# Capture system state
sudo ps aux > /root/incident-$(date +%Y%m%d-%H%M%S)-ps.txt
sudo netstat -tupn > /root/incident-$(date +%Y%m%d-%H%M%S)-netstat.txt
sudo ss -tupn > /root/incident-$(date +%Y%m%d-%H%M%S)-ss.txt
# Copy logs
sudo tar czf /root/incident-$(date +%Y%m%d-%H%M%S)-logs.tar.gz /var/log/
# Memory dump (if installed)
sudo dd if=/dev/mem of=/root/memory-dump-$(date +%Y%m%d-%H%M%S).img
Recuperación
# Change all passwords
sudo passwd root
sudo passwd username
# Regenerate SSH host keys
sudo rm /etc/ssh/ssh_host_*
sudo dpkg-reconfigure openssh-server
# Update all packages
sudo apt-get update && sudo apt-get upgrade -y
# Review and close unnecessary ports
sudo ss -tuln
Consideraciones de Cumplimiento
Requisitos PCI-DSS
Para el procesamiento de tarjetas de pago:
- Control de acceso fuerte (Requisitos 7, 8)
- Cifrar transmisión de datos (Requisito 4)
- Mantener registros de auditoría (Requisito 10)
- Pruebas de seguridad regulares (Requisito 11)
- Gestión de vulnerabilidades (Requisito 6)
Cumplimiento HIPAA
Para datos de atención médica:
- Implementar controles de acceso
- Controles de auditoría y registro
- Cifrado de ePHI
- Evaluaciones de riesgo regulares
Requisitos GDPR
Para datos personales de la UE:
- Protección de datos por diseño
- Seudonimización y cifrado
- Capacidad de restaurar disponibilidad de datos
- Pruebas regulares de medidas de seguridad
Lista de Verificación de Implementación
# Verify compliance controls
- [ ] Multi-factor authentication enabled
- [ ] Full disk encryption configured
- [ ] Audit logging active and monitored
- [ ] Regular vulnerability scans scheduled
- [ ] Incident response plan documented
- [ ] Data retention policies configured
- [ ] Backup and recovery tested
- [ ] Security awareness training completed
Mantenimiento de Seguridad Continua
Auditorías de Seguridad Regulares
Programar revisiones de seguridad mensuales:
#!/bin/bash
# Security audit script
echo "=== Security Audit $(date) ===" > /root/security-audit.log
# Check for updates
apt-get -s upgrade >> /root/security-audit.log
# List listening ports
echo -e "\n=== Listening Ports ===" >> /root/security-audit.log
ss -tuln >> /root/security-audit.log
# Check failed login attempts
echo -e "\n=== Failed Login Attempts ===" >> /root/security-audit.log
grep "Failed password" /var/log/auth.log | tail -20 >> /root/security-audit.log
# World-writable files
echo -e "\n=== World-Writable Files ===" >> /root/security-audit.log
find / -xdev -type f -perm -0002 >> /root/security-audit.log 2>/dev/null
# SUID files
echo -e "\n=== SUID/SGID Files ===" >> /root/security-audit.log
find / -xdev -type f \( -perm -4000 -o -perm -2000 \) >> /root/security-audit.log 2>/dev/null
Escaneo de Vulnerabilidades
# Schedule weekly vulnerability scans
0 2 * * 0 /usr/bin/lynis audit system --cronjob > /var/log/lynis/$(date +\%Y\%m\%d).log
Gestión de Actualizaciones de Seguridad
Establecer un calendario de gestión de parches:
- Parches de seguridad críticos: Dentro de 24 horas
- Parches de seguridad importantes: Dentro de 7 días
- Actualizaciones normales: Ventana de mantenimiento mensual
- Probar actualizaciones en staging antes de producción
Conclusión
El endurecimiento de servidores Linux es un proceso integral y continuo que requiere implementación sistemática de controles de seguridad a través de múltiples capas. Siguiendo esta guía, has establecido una base de seguridad robusta que aborda:
Prevención: A través de autenticación fuerte, reglas de firewall y controles de acceso Detección: Mediante registro completo, monitoreo y sistemas de detección de intrusiones Respuesta: Con procedimientos documentados de respuesta a incidentes y métodos de recolección de evidencia
Recuerda que la seguridad no es un destino sino un viaje continuo. El panorama de amenazas evoluciona constantemente, requiriendo reevaluación regular de tu postura de seguridad. Mantén vigilancia a través de:
- Revisión semanal de registros de seguridad
- Escaneos de vulnerabilidades mensuales
- Auditorías de seguridad trimestrales
- Pruebas de penetración anuales
- Educación continua sobre amenazas emergentes
Un servidor Linux correctamente endurecido reduce significativamente tu superficie de ataque y proporciona múltiples capas defensivas. Sin embargo, el endurecimiento debe equilibrarse con los requisitos operacionales y la usabilidad. Documenta todos los cambios, mantén respaldos y prueba las configuraciones de seguridad regularmente.
La inversión en endurecimiento completo de servidores paga dividendos a través de incidentes de seguridad reducidos, postura de cumplimiento mejorada y protección de activos comerciales críticos. Comienza con los fundamentos descritos en esta guía, luego implementa progresivamente controles de seguridad avanzados a medida que evoluciona tu madurez de seguridad.
Mantente informado sobre nuevas vulnerabilidades, sigue las listas de correo de seguridad de tu distribución Linux y participa en la comunidad de seguridad para mantener conciencia de amenazas emergentes y mejores prácticas.


