Todo servidor Linux conectado a internet es un objetivo. Los bots automatizados escanean todo el espacio de direcciones IPv4 en minutos, buscando credenciales predeterminadas, servicios sin parches y firewalls mal configurados. Ya sea que estés ejecutando un servidor web de producción, un entorno de desarrollo o un laboratorio casero, un enfoque sistemático de seguridad es esencial.

Este artículo proporciona una lista de verificación de seguridad de 20 pasos organizada en cinco secciones: Sistema, Acceso, Red, Sistema de Archivos y Monitoreo/Mantenimiento. Cada paso incluye los comandos reales que necesitas ejecutar en sistemas Ubuntu/Debian (con notas para RHEL/CentOS donde los comandos difieren). Guarda esta página en favoritos y trabaja a través de ella cada vez que aprovisiones un nuevo servidor.


Sección 1: Endurecimiento del Sistema

Paso 1: Mantener el Sistema Actualizado

La medida de seguridad más importante es mantener todos los paquetes actualizados. La mayoría de los exploits apuntan a vulnerabilidades conocidas que ya tienen parches disponibles.

# Actualizar listas de paquetes y actualizar todos los paquetes
sudo apt update && sudo apt upgrade -y

# En RHEL/CentOS/Fedora
sudo dnf update -y

Verifica las actualizaciones pendientes regularmente:

# Listar paquetes actualizables
apt list --upgradable

Mejor Práctica: Programa las actualizaciones durante ventanas de mantenimiento, pero nunca retrases los parches de seguridad más de 48 horas. La ventana entre la divulgación de un CVE y la explotación activa se reduce cada año.

Paso 2: Habilitar Actualizaciones Automáticas de Seguridad

Para parches de seguridad desatendidos, configura unattended-upgrades:

sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

Verifica la configuración:

cat /etc/apt/apt.conf.d/20auto-upgrades

Salida esperada:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

Ajusta qué actualizaciones se aplican automáticamente en /etc/apt/apt.conf.d/50unattended-upgrades:

sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}";
    "${distro_id}:${distro_codename}-security";
    "${distro_id}ESMApps:${distro_codename}-apps-security";
    "${distro_id}ESM:${distro_codename}-infra-security";
};

// Notificaciones por email
Unattended-Upgrade::Mail "[email protected]";

// Reinicio automático si es necesario (con horario)
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";

Paso 3: Eliminar Paquetes Innecesarios

Cada paquete instalado es una superficie de ataque potencial. Elimina lo que no necesites:

# Listar paquetes instalados manualmente
apt-mark showmanual

# Eliminar un paquete y sus archivos de configuración
sudo apt purge -y <nombre-del-paquete>

# Limpiar dependencias huérfanas
sudo apt autoremove -y

Paquetes comunes a evaluar para eliminación en servidores:

# Entornos de escritorio (nunca deberían estar en un servidor)
sudo apt purge -y ubuntu-desktop gdm3 gnome-shell

# Telnet (usa SSH en su lugar)
sudo apt purge -y telnet telnetd

# rsh/rlogin (acceso remoto inseguro)
sudo apt purge -y rsh-client rsh-server

Paso 4: Deshabilitar Servicios No Utilizados

Lista todos los servicios activos y deshabilita los que no necesites:

# Listar todos los servicios habilitados
systemctl list-unit-files --type=service --state=enabled

# Deshabilitar y detener un servicio innecesario
sudo systemctl disable --now cups.service        # Servicio de impresión
sudo systemctl disable --now avahi-daemon.service # mDNS/Bonjour
sudo systemctl disable --now bluetooth.service    # Bluetooth

Verifica los servicios escuchando en puertos de red:

sudo ss -tlnp

Cualquier servicio escuchando en 0.0.0.0 o :: es accesible desde la red. Si no lo necesitas, deshabilítalo o vincúlalo a 127.0.0.1.


Sección 2: Control de Acceso

Paso 5: Endurecimiento de SSH

SSH es el método principal de acceso remoto y el servicio más comúnmente atacado. Endurécelo agresivamente.

Edita /etc/ssh/sshd_config:

sudo nano /etc/ssh/sshd_config

Aplica estas configuraciones:

# Deshabilitar login como root
PermitRootLogin no

# Deshabilitar autenticación por contraseña (usar solo claves SSH)
PasswordAuthentication no

# Deshabilitar contraseñas vacías
PermitEmptyPasswords no

# Usar solo el Protocolo SSH 2
Protocol 2

# Cambiar el puerto predeterminado (opcional pero reduce el ruido)
Port 2222

# Limitar intentos de autenticación
MaxAuthTries 3

# Establecer período de gracia para login
LoginGraceTime 30

# Deshabilitar reenvío X11 a menos que sea necesario
X11Forwarding no

# Deshabilitar reenvío TCP a menos que sea necesario
AllowTcpForwarding no

# Limitar SSH a usuarios específicos
AllowUsers deploy admin

# Usar algoritmos de intercambio de claves fuertes
KexAlgorithms [email protected],[email protected],curve25519-sha256

# Usar cifrados fuertes
Ciphers [email protected],[email protected],[email protected]

# Usar MACs fuertes
MACs [email protected],[email protected]

# Tiempo de espera por inactividad (desconectar después de 5 minutos de inactividad)
ClientAliveInterval 300
ClientAliveCountMax 0

Reinicia SSH:

sudo systemctl restart sshd

Advertencia: Antes de deshabilitar la autenticación por contraseña, asegúrate de tener un par de claves SSH funcionando configurado. Prueba el login basado en claves en una nueva sesión de terminal antes de cerrar tu conexión actual. Quedarse bloqueado fuera de un servidor remoto no es recuperable sin acceso a la consola.

Paso 6: Usar sudo en Lugar de Root

Nunca inicies sesión como root. Crea un usuario administrativo con privilegios sudo:

# Crear un nuevo usuario administrador
sudo adduser admin

# Añadir al grupo sudo
sudo usermod -aG sudo admin

# Verificar acceso sudo
su - admin
sudo whoami  # Debería mostrar: root

Bloquea la cuenta root para login directo:

sudo passwd -l root

Paso 7: Políticas de Contraseñas Fuertes

Incluso con autenticación por clave SSH, aplica contraseñas fuertes para cuentas locales y sudo:

# Instalar la biblioteca de verificación de calidad de contraseñas
sudo apt install -y libpam-pwquality

Configura /etc/security/pwquality.conf:

# Longitud mínima de contraseña
minlen = 14

# Requerir al menos un dígito
dcredit = -1

# Requerir al menos una letra mayúscula
ucredit = -1

# Requerir al menos una letra minúscula
lcredit = -1

# Requerir al menos un carácter especial
ocredit = -1

# Máximo de caracteres idénticos consecutivos
maxrepeat = 3

# Rechazar contraseñas que contengan el nombre de usuario
usercheck = 1

Establece políticas de caducidad de contraseñas:

# Establecer caducidad de contraseña para usuarios existentes
sudo chage -M 90 -m 7 -W 14 admin

# Ver la política de contraseña de un usuario
sudo chage -l admin

Paso 8: Autenticación de Dos Factores

Añade un segundo factor al login SSH usando Google Authenticator (TOTP):

sudo apt install -y libpam-google-authenticator

Ejecuta la configuración como el usuario que quieres proteger:

google-authenticator

Responde a las indicaciones:

  • Tokens basados en tiempo:
  • Actualizar archivo .google_authenticator:
  • No permitir múltiples usos del mismo token:
  • Permitir ventana de 30 segundos:
  • Habilitar limitación de velocidad:

Configura PAM para SSH. Edita /etc/pam.d/sshd:

# Añadir al final
auth required pam_google_authenticator.so

Habilita challenge-response en /etc/ssh/sshd_config:

ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive

Reinicia SSH:

sudo systemctl restart sshd

Ahora el login SSH requiere tanto una clave SSH válida como un código TOTP.


Sección 3: Seguridad de Red

Paso 9: Configurar el Firewall (UFW)

UFW (Uncomplicated Firewall) es el firewall estándar para Ubuntu. Habilítalo con una política predeterminada de denegar todo el tráfico entrante:

# Establecer políticas predeterminadas
sudo ufw default deny incoming
sudo ufw default allow outgoing

# Permitir SSH (ajusta el puerto si lo cambiaste)
sudo ufw allow 2222/tcp comment 'SSH'

# Permitir HTTP y HTTPS si ejecutas un servidor web
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'

# Habilitar el firewall
sudo ufw enable

# Verificar estado
sudo ufw status verbose

Limita la velocidad de conexiones SSH para frenar ataques de fuerza bruta:

# Permitir máximo 6 conexiones por 30 segundos desde una sola IP
sudo ufw limit 2222/tcp comment 'SSH rate limit'

Consejo: En sistemas RHEL/CentOS, usa firewalld en lugar de UFW. Los conceptos son idénticos: denegar entrante por defecto, permitir explícitamente solo los servicios necesarios.

Paso 10: Deshabilitar IPv6 Si No Se Usa

Si no estás usando IPv6 activamente, deshabilítalo para reducir la superficie de ataque:

# Añadir a /etc/sysctl.d/99-disable-ipv6.conf
sudo tee /etc/sysctl.d/99-disable-ipv6.conf <<EOF
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
EOF

# Aplicar inmediatamente
sudo sysctl --system

Verificar:

cat /proc/sys/net/ipv6/conf/all/disable_ipv6
# Debería mostrar: 1

Nota: Solo deshabilita IPv6 si estás seguro de que ninguno de tus servicios lo requiere. Algunas aplicaciones (como ciertas configuraciones de Docker) pueden fallar sin el loopback de IPv6.

Paso 11: Configurar Fail2Ban

Fail2Ban monitorea archivos de log y bloquea IPs que muestran comportamiento malicioso:

sudo apt install -y fail2ban

Crea una configuración local (nunca edites el archivo principal directamente):

sudo tee /etc/fail2ban/jail.local <<EOF
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
banaction = ufw

[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400

[sshd-ddos]
enabled = true
port = 2222
filter = sshd-ddos
logpath = /var/log/auth.log
maxretry = 5
bantime = 172800
EOF

Inicia y habilita Fail2Ban:

sudo systemctl enable --now fail2ban

# Verificar estado de la jaula
sudo fail2ban-client status
sudo fail2ban-client status sshd

Ver IPs bloqueadas:

sudo fail2ban-client status sshd
# Status for the jail: sshd
# |- Filter
# |  |- Currently failed: 2
# |  |- Total failed:     145
# |  `- File list:        /var/log/auth.log
# `- Actions
#    |- Currently banned:  5
#    |- Total banned:      23
#    `- Banned IP list:    ...

Paso 12: Usar VPN para Acceso Administrativo

Para el nivel más alto de seguridad, restringe el acceso SSH a una red VPN únicamente. WireGuard es una excelente opción:

# Instalar WireGuard
sudo apt install -y wireguard

# Generar claves del servidor
wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key
chmod 600 /etc/wireguard/server_private.key

Configura /etc/wireguard/wg0.conf:

[Interface]
PrivateKey = <server_private_key>
Address = 10.0.0.1/24
ListenPort = 51820

[Peer]
PublicKey = <client_public_key>
AllowedIPs = 10.0.0.2/32

Luego restringe SSH a la interfaz VPN:

# Eliminar acceso SSH público
sudo ufw delete allow 2222/tcp

# Permitir SSH solo desde la subred VPN
sudo ufw allow from 10.0.0.0/24 to any port 2222 proto tcp comment 'SSH via VPN only'

# Permitir WireGuard
sudo ufw allow 51820/udp comment 'WireGuard VPN'

Sección 4: Seguridad del Sistema de Archivos

Paso 13: Establecer Permisos de Archivo Adecuados

Asegúrate de que los archivos y directorios críticos tengan la propiedad y permisos correctos:

# Asegurar la configuración SSH
sudo chmod 600 /etc/ssh/sshd_config
sudo chown root:root /etc/ssh/sshd_config

# Asegurar archivos authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

# Asegurar directorios cron
sudo chmod 700 /etc/cron.d
sudo chmod 700 /etc/cron.daily
sudo chmod 700 /etc/cron.hourly
sudo chmod 700 /etc/cron.weekly
sudo chmod 700 /etc/cron.monthly

# Restringir acceso al comando su
sudo chmod 750 /bin/su
sudo dpkg-statoverride --update --add root adm 4750 /bin/su

# Asegurar que los archivos de contraseñas tengan permisos correctos
sudo chmod 644 /etc/passwd
sudo chmod 640 /etc/shadow
sudo chown root:shadow /etc/shadow

Encontrar archivos con escritura mundial (riesgo potencial de seguridad):

sudo find / -xdev -type f -perm -0002 -ls 2>/dev/null

Encontrar archivos con bits SUID/SGID establecidos (potencial escalada de privilegios):

sudo find / -xdev \( -perm -4000 -o -perm -2000 \) -type f -ls 2>/dev/null

Revisa la salida y elimina SUID/SGID de cualquier binario que no lo necesite:

# Ejemplo: eliminar SUID de un binario
sudo chmod u-s /path/to/unnecessary-suid-binary

Paso 14: Habilitar Cifrado de Disco

Para servidores que manejan datos sensibles, usa cifrado LUKS:

# Verificar si LUKS está disponible
sudo apt install -y cryptsetup

# Cifrar una partición de datos (ADVERTENCIA: destruye datos existentes)
sudo cryptsetup luksFormat /dev/sdb1

# Abrir la partición cifrada
sudo cryptsetup open /dev/sdb1 encrypted_data

# Crear un sistema de archivos
sudo mkfs.ext4 /dev/mapper/encrypted_data

# Montarla
sudo mkdir -p /mnt/secure
sudo mount /dev/mapper/encrypted_data /mnt/secure

Para cifrado de disco completo en nuevas instalaciones, selecciona la opción de cifrado durante el instalador de Ubuntu. Para servidores existentes, cifra las particiones de datos manteniendo la partición de arranque sin cifrar.

Nota: El cifrado de disco completo en un servidor remoto significa que necesitas una forma de introducir la frase de descifrado en el arranque. Las soluciones incluyen dropbear-initramfs (SSH en el initramfs para desbloquear) o acceso remoto KVM/IPMI.

Paso 15: Montar /tmp con noexec

Previene la ejecución de scripts desde /tmp, que es un vector de ataque común:

Edita /etc/fstab:

sudo nano /etc/fstab

Añade o modifica la entrada de /tmp:

tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev,size=2G 0 0

Si /tmp no es un punto de montaje separado, crea un montaje tmpfs:

# Aplicar sin reiniciar
sudo mount -o remount,noexec,nosuid,nodev /tmp

También asegura /dev/shm:

tmpfs /dev/shm tmpfs defaults,noexec,nosuid,nodev 0 0
sudo mount -o remount,noexec,nosuid,nodev /dev/shm

Verifica las opciones de montaje:

mount | grep -E '/tmp|/dev/shm'
# tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noexec,size=2097152k)
# tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,noexec)

Sección 5: Monitoreo y Mantenimiento

Paso 16: Configurar Logging (rsyslog/journald)

Asegúrate de que el logging completo esté habilitado y configurado para retener logs:

# Verificar que rsyslog esté ejecutándose
sudo systemctl status rsyslog

# Configurar journald para almacenamiento persistente
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal

Edita /etc/systemd/journald.conf:

[Journal]
Storage=persistent
Compress=yes
SystemMaxUse=500M
SystemMaxFileSize=50M
MaxRetentionSec=90day

Reinicia journald:

sudo systemctl restart systemd-journald

Configura el logging centralizado reenviando a un servidor syslog remoto. Edita /etc/rsyslog.d/50-remote.conf:

# Reenviar todos los logs a un servidor syslog central
*.* @@syslog.knowledgexchange.xyz:514

Paso 17: Configurar Monitoreo de Logs (Logwatch)

Logwatch proporciona resúmenes diarios por email de la actividad de los logs del sistema:

sudo apt install -y logwatch

Configura /etc/logwatch/conf/logwatch.conf:

Output = mail
MailTo = [email protected]
MailFrom = [email protected]
Detail = Med
Range = yesterday
Service = All

Prueba el reporte:

sudo logwatch --detail Med --mailto [email protected] --range today

Programa reportes diarios vía cron (generalmente se auto-configura en la instalación):

# Verificar que el cron job existe
ls -la /etc/cron.daily/00logwatch

Paso 18: Instalar Detección de Intrusiones

AIDE (Advanced Intrusion Detection Environment)

AIDE monitorea cambios en el sistema de archivos — detecta cuando los archivos son modificados, añadidos o eliminados:

sudo apt install -y aide

# Inicializar la base de datos (toma unos minutos)
sudo aideinit

# Copiar la nueva base de datos a su lugar
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db

Ejecuta una verificación:

sudo aide --check

Programa verificaciones diarias:

sudo tee /etc/cron.daily/aide-check <<'EOF'
#!/bin/bash
/usr/bin/aide --check | mail -s "AIDE Report for $(hostname)" [email protected]
EOF
sudo chmod +x /etc/cron.daily/aide-check

Importante: Después de cambios legítimos en el sistema (actualizaciones, software nuevo), actualiza la base de datos de AIDE: sudo aide --update && sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db

rkhunter (Rootkit Hunter)

rkhunter escanea en busca de rootkits, backdoors y exploits locales:

sudo apt install -y rkhunter

# Actualizar la base de datos
sudo rkhunter --update

# Establecer las propiedades base
sudo rkhunter --propupd

# Ejecutar un escaneo completo
sudo rkhunter --check --skip-keypress

Configura escaneos diarios automáticos en /etc/default/rkhunter:

CRON_DAILY_RUN="yes"
REPORT_EMAIL="[email protected]"
APT_AUTOGEN="yes"

Sección 6: Mantenimiento

Paso 19: Copias de Seguridad Regulares

Un servidor comprometido sin copias de seguridad es un evento catastrófico. Implementa la estrategia de backup 3-2-1: 3 copias, 2 medios diferentes, 1 fuera del sitio.

Copias de Seguridad Automatizadas con rsync

# Crear un script de backup
sudo tee /usr/local/bin/server-backup.sh <<'SCRIPT'
#!/bin/bash
set -euo pipefail

BACKUP_DIR="/backup/$(date +%Y-%m-%d)"
REMOTE="backup@offsite-server:/backups/$(hostname)/"
LOG="/var/log/backup.log"

mkdir -p "$BACKUP_DIR"

echo "$(date): Starting backup" >> "$LOG"

# Respaldar directorios críticos
rsync -az --delete \
  --exclude='/proc/*' \
  --exclude='/sys/*' \
  --exclude='/tmp/*' \
  --exclude='/dev/*' \
  --exclude='/run/*' \
  /etc/ "$BACKUP_DIR/etc/"

rsync -az --delete /home/ "$BACKUP_DIR/home/"
rsync -az --delete /var/www/ "$BACKUP_DIR/www/"

# Respaldo de base de datos (si aplica)
if command -v mysqldump &>/dev/null; then
  mysqldump --all-databases --single-transaction > "$BACKUP_DIR/all-databases.sql"
fi

# Sincronizar a ubicación fuera del sitio
rsync -az --delete "$BACKUP_DIR/" "$REMOTE"

echo "$(date): Backup completed successfully" >> "$LOG"
SCRIPT

sudo chmod +x /usr/local/bin/server-backup.sh

Programa con cron:

# Ejecutar diariamente a las 2:00 AM
echo "0 2 * * * root /usr/local/bin/server-backup.sh" | sudo tee /etc/cron.d/server-backup

Verificar Copias de Seguridad

Las copias de seguridad que nunca se han probado no son copias de seguridad. Programa pruebas de recuperación mensuales:

# Probar la restauración de un backup
rsync -az backup@offsite-server:/backups/$(hostname)/latest/etc/ /tmp/backup-test/etc/
diff -r /etc/ /tmp/backup-test/etc/ | head -20

Paso 20: Programa de Auditoría de Seguridad

La seguridad no es una tarea de una sola vez. Establece un programa de auditoría regular:

Semanal

# Revisar intentos de login fallidos
sudo journalctl -u sshd --since "7 days ago" | grep "Failed"

# Verificar cuentas de usuario no autorizadas
awk -F: '$3 >= 1000 && $3 < 65534 {print $1}' /etc/passwd

# Revisar uso de sudo
sudo journalctl _COMM=sudo --since "7 days ago"

# Verificar puertos en escucha
sudo ss -tlnp

Mensual

# Ejecutar una actualización completa del sistema
sudo apt update && sudo apt upgrade -y

# Ejecutar verificación de integridad con AIDE
sudo aide --check

# Ejecutar escaneo con rkhunter
sudo rkhunter --check --skip-keypress

# Revisar reglas del firewall
sudo ufw status verbose

# Verificar cuentas con contraseñas vacías
sudo awk -F: '($2 == "" ) {print $1}' /etc/shadow

# Revisar cron jobs de todos los usuarios
for user in $(cut -f1 -d: /etc/passwd); do
  crontab -l -u "$user" 2>/dev/null | grep -v '^#' | grep -v '^$' && echo "  -- $user"
done

Trimestral

# Auditoría completa de seguridad con Lynis
sudo apt install -y lynis
sudo lynis audit system

# Revisar y rotar claves SSH
# Verificar la antigüedad de las claves y considerar regenerar claves con más de 1 año

# Revisar y actualizar reglas del firewall
# Eliminar reglas para servicios que ya no están ejecutándose

# Probar el procedimiento de recuperación de backup
# Documentar cualquier cambio en el proceso de recuperación

Lista de Verificación Rápida

Usa esta lista condensada al aprovisionar un nuevo servidor:

LISTA DE VERIFICACIÓN DE SEGURIDAD PARA SERVIDORES LINUX
=========================================================

SISTEMA
[ ] 1.  apt update && apt upgrade -y
[ ] 2.  Habilitar unattended-upgrades
[ ] 3.  Eliminar paquetes innecesarios (apt autoremove)
[ ] 4.  Deshabilitar servicios no utilizados (systemctl disable)

ACCESO
[ ] 5.  Endurecer SSH (solo claves, sin root, cifrados fuertes)
[ ] 6.  Crear usuario admin con sudo, bloquear root
[ ] 7.  Configurar políticas de contraseñas (pwquality)
[ ] 8.  Habilitar 2FA para SSH (google-authenticator)

RED
[ ] 9.  Configurar UFW (denegar por defecto, permitir puertos necesarios)
[ ] 10. Deshabilitar IPv6 si no se usa
[ ] 11. Instalar y configurar Fail2Ban
[ ] 12. Configurar VPN para acceso administrativo (WireGuard)

SISTEMA DE ARCHIVOS
[ ] 13. Auditar permisos de archivos (SUID, escritura mundial)
[ ] 14. Habilitar cifrado de disco (LUKS) para datos sensibles
[ ] 15. Montar /tmp y /dev/shm con noexec

MONITOREO
[ ] 16. Configurar logging persistente (journald)
[ ] 17. Instalar Logwatch para reportes diarios
[ ] 18. Configurar AIDE y rkhunter

MANTENIMIENTO
[ ] 19. Implementar copias de seguridad automatizadas con copia fuera del sitio
[ ] 20. Establecer programa de auditoría semanal/mensual/trimestral

Resumen

La seguridad del servidor es un proceso continuo, no un destino. Esta lista de verificación de 20 pasos cubre las medidas de seguridad fundamentales que todo servidor Linux debería tener implementadas. Los principios clave son:

  • Minimizar la superficie de ataque — Elimina lo que no necesites (paquetes, servicios, puertos abiertos)
  • Aplicar controles de acceso fuertes — Claves SSH, 2FA, sudo, contraseñas fuertes
  • Monitorear todo — Logging, detección de intrusiones, auditorías regulares
  • Prepararse para lo peor — Copias de seguridad probadas, planes de respuesta a incidentes

Ningún paso individual en esta lista hará tu servidor impenetrable, pero juntos crean una estrategia de defensa en profundidad que hace la explotación significativamente más difícil y la detección significativamente más rápida.

Para profundizar en temas específicos cubiertos aquí, consulta nuestros artículos sobre crear conexiones SSH, crear certificados auto-firmados en Ubuntu y configurar swappiness en Ubuntu.