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.