Seguridad básica en Linux: guía completa de hardening

📅 Actualizado en febrero 2026 ✍️ Ángel López 📊 Nivel: Avanzado ⏱️ 15 min de lectura

La seguridad en Linux no es un producto que se instala, sino un proceso continuo de configuración, monitorización y actualización. Aunque Linux tiene ventajas estructurales de seguridad respecto a otros sistemas operativos, un servidor mal configurado es un servidor vulnerable. Esta guía cubre desde los fundamentos del modelo de seguridad hasta un checklist profesional de hardening para servidores de producción.

🏗️ El modelo de seguridad de Linux

Linux hereda de Unix un modelo de seguridad basado en tres principios fundamentales: todo es un archivo (y cada archivo tiene permisos), mínimo privilegio (los usuarios solo tienen acceso a lo que necesitan) y separación de privilegios (root es el único superusuario, los demás tienen permisos limitados).

Este diseño crea múltiples capas de defensa. Un atacante que consiga ejecutar código como un usuario normal no puede modificar el sistema, instalar software ni acceder a datos de otros usuarios. Para causar daño real necesitaría escalar privilegios a root, lo que requiere explotar vulnerabilidades adicionales.

Capa de seguridadMecanismoProtege contra
Permisos de archivorwx para usuario/grupo/otrosAcceso no autorizado a datos
Usuarios y gruposAislamiento entre cuentasMovimiento lateral entre usuarios
Firewall (netfilter)Filtrado de paquetesAcceso de red no autorizado
MAC (SELinux/AppArmor)Control de acceso obligatorioEscalada de privilegios, exploit de servicios
ActualizacionesParches de seguridadVulnerabilidades conocidas (CVEs)
AuditoríaLogs del sistemaDetección de intrusiones, forense
💡 Defensa en profundidad
La seguridad eficaz nunca depende de una sola medida. Un servidor bien protegido combina todas las capas: firewall + permisos estrictos + actualizaciones automáticas + monitorización de logs + MAC. Si una capa falla, las demás siguen protegiendo el sistema.

👤 Usuarios, grupos y permisos

La gestión correcta de usuarios es la primera línea de defensa. Cada servicio debería ejecutarse con su propio usuario (con permisos mínimos) y nunca como root.

terminal — Gestión de usuarios y seguridad
# Crear usuario sin shell interactivo (para servicios) sudo useradd -r -s /usr/sbin/nologin webapp # Crear usuario normal con home sudo useradd -m -s /bin/bash -G sudo ana # Verificar qué usuarios tienen shell válido grep -v "nologin\|false" /etc/passwd # Ver qué usuarios pueden usar sudo getent group sudo # Bloquear cuenta temporalmente sudo usermod -L usuario_sospechoso # Verificar intentos de login fallidos sudo lastb | head -20 # Ver últimos logins exitosos last | head -20 # Buscar archivos con permisos peligrosos (world-writable) find / -type f -perm -o+w -not -path "/proc/*" 2>/dev/null # Buscar archivos SUID (ejecutan como root) find / -perm -4000 -type f 2>/dev/null
⚠️ Nunca uses root como usuario diario
Trabajar como root es el error de seguridad más grave. Un simple rm -rf / accidental destruye todo el sistema. Usa siempre un usuario normal con sudo para tareas administrativas puntuales. Configura PermitRootLogin no en SSH.

🔥 Firewall: UFW e iptables

El firewall es la barrera entre tu servidor y el mundo exterior. Linux incluye netfilter en el kernel como sistema de filtrado de paquetes. iptables es la herramienta tradicional para configurarlo, y UFW (Uncomplicated Firewall) es una interfaz simplificada ideal para la mayoría de casos.

terminal — UFW: configuración básica
# Instalar UFW (preinstalado en Ubuntu) sudo apt install ufw -y # Política por defecto: denegar todo entrante, permitir saliente sudo ufw default deny incoming sudo ufw default allow outgoing # Abrir SSH (SIEMPRE antes de activar el firewall) sudo ufw allow 22/tcp # Abrir puertos para servidor web sudo ufw allow 80/tcp sudo ufw allow 443/tcp # Permitir acceso desde IP específica (ej: oficina) sudo ufw allow from 203.0.113.50 to any port 3306 # Activar el firewall sudo ufw enable # Ver estado y reglas activas sudo ufw status verbose # Eliminar una regla sudo ufw delete allow 80/tcp # Ver reglas numeradas (para eliminar por número) sudo ufw status numbered sudo ufw delete 3
terminal — iptables: ejemplo para servidor web
# Política por defecto: denegar todo sudo iptables -P INPUT DROP sudo iptables -P FORWARD DROP sudo iptables -P OUTPUT ACCEPT # Permitir tráfico en loopback sudo iptables -A INPUT -i lo -j ACCEPT # Permitir conexiones establecidas sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Permitir SSH, HTTP y HTTPS sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT # Limitar intentos SSH (anti brute-force) sudo iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH sudo iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP # Guardar reglas (persisten tras reinicio) sudo apt install iptables-persistent -y sudo netfilter-persistent save

🔄 Actualizaciones de seguridad

Las actualizaciones de seguridad corrigen vulnerabilidades conocidas (CVEs) que los atacantes pueden explotar. Cada día que un servidor no se actualiza es un día más de exposición a ataques automatizados que buscan exactamente esas vulnerabilidades.

terminal — Actualizaciones manuales y automáticas
# Actualización manual completa sudo apt update && sudo apt upgrade -y # Solo actualizaciones de seguridad sudo apt upgrade -y --only-upgrade # Ver actualizaciones pendientes apt list --upgradable # Configurar actualizaciones automáticas de seguridad sudo apt install unattended-upgrades -y sudo dpkg-reconfigure -plow unattended-upgrades # Verificar que está activo cat /etc/apt/apt.conf.d/20auto-upgrades # Debe contener: # APT::Periodic::Update-Package-Lists "1"; # APT::Periodic::Unattended-Upgrade "1"; # Ver log de actualizaciones automáticas cat /var/log/unattended-upgrades/unattended-upgrades.log
✅ Reinicio programado tras actualizaciones de kernel
Las actualizaciones de kernel requieren reinicio. En servidores de producción, programa el reinicio en horas de bajo tráfico. Verifica si hay reinicio pendiente con cat /var/run/reboot-required. Para entornos donde el reinicio no es viable, Ubuntu Pro ofrece livepatch para aplicar parches de kernel sin reiniciar.

🔑 Gestión de contraseñas

Las contraseñas débiles son el vector de ataque más explotado en servidores Linux. Configurar políticas de contraseñas robustas es sencillo y tiene un impacto enorme en la seguridad.

terminal — Políticas de contraseñas
# Instalar módulo de calidad de contraseñas sudo apt install libpam-pwquality -y # Configurar requisitos mínimos sudo nano /etc/security/pwquality.conf # minlen = 12 (mínimo 12 caracteres) # dcredit = -1 (al menos 1 dígito) # ucredit = -1 (al menos 1 mayúscula) # lcredit = -1 (al menos 1 minúscula) # ocredit = -1 (al menos 1 carácter especial) # Configurar caducidad de contraseñas sudo nano /etc/login.defs # PASS_MAX_DAYS 90 (cambio obligatorio cada 90 días) # PASS_MIN_DAYS 1 (no cambiar más de 1 vez al día) # PASS_WARN_AGE 14 (aviso 14 días antes de expirar) # Ver política de un usuario específico sudo chage -l ana # Forzar cambio de contraseña en próximo login sudo chage -d 0 usuario

📋 Auditoría de logs

Los logs del sistema son los ojos y oídos de la seguridad. Si no monitorizas los logs, un atacante puede estar dentro de tu servidor durante semanas sin que lo sepas. Linux registra prácticamente toda la actividad en archivos de log bajo /var/log/.

ArchivoContenidoBuscar
/var/log/auth.logAutenticación: login, sudo, SSHIntentos de acceso fallidos, sudo no autorizado
/var/log/syslogMensajes generales del sistemaErrores de servicios, fallos de hardware
/var/log/kern.logMensajes del kernelErrores de drivers, problemas de memoria
/var/log/fail2ban.logIPs bloqueadas por fail2banAtaques de fuerza bruta, patrones de ataque
/var/log/apache2/Logs de ApacheErrores 403/404, intentos de inyección SQL/XSS
/var/log/ufw.logPaquetes bloqueados por firewallEscaneos de puertos, tráfico sospechoso
terminal — Comandos esenciales de auditoría
# Intentos de login fallidos por SSH (hoy) grep "Failed password" /var/log/auth.log | tail -20 # IPs con más intentos fallidos grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head # Uso de sudo (quién ejecutó qué) grep "sudo:" /var/log/auth.log | grep "COMMAND" | tail -20 # journalctl: logs del sistema con systemd sudo journalctl -u sshd --since "1 hour ago" sudo journalctl -p err --since today # Monitorizar logs en tiempo real sudo tail -f /var/log/auth.log # Archivos modificados en las últimas 24 horas (posible intrusión) find /usr /bin /sbin -mtime -1 -type f 2>/dev/null

🛡️ SELinux y AppArmor

Los permisos tradicionales de Linux (rwx) son un sistema de control de acceso discrecional (DAC): el propietario del archivo decide quién accede. SELinux y AppArmor añaden una capa superior: control de acceso obligatorio (MAC), donde las políticas las define el administrador y ni siquiera root puede saltárselas.

terminal — AppArmor (Ubuntu/Debian)
# Ver estado de AppArmor sudo aa-status # Ver perfiles cargados sudo aa-status | grep "profiles" # Poner un perfil en modo enforce (bloquea violaciones) sudo aa-enforce /etc/apparmor.d/usr.sbin.mysqld # Poner un perfil en modo complain (solo registra, no bloquea) sudo aa-complain /etc/apparmor.d/usr.sbin.mysqld # Ver violaciones en logs sudo journalctl | grep "apparmor" | tail -20
AspectoAppArmorSELinux
DistribuciónUbuntu, Debian, SUSEFedora, RHEL, CentOS
EnfoquePerfiles por aplicación (path-based)Etiquetas de seguridad en todo el sistema
ComplejidadBaja-mediaAlta
ConfiguraciónPerfiles en /etc/apparmor.d/Políticas en /etc/selinux/
Modo aprendizajeSí (complain mode)Sí (permissive mode)

🔍 Detección de intrusiones

Además de la prevención, es fundamental poder detectar si un sistema ha sido comprometido. Linux dispone de varias herramientas especializadas en detectar rootkits, cambios en archivos del sistema y comportamientos anómalos.

terminal — Herramientas de detección
# rkhunter: detectar rootkits sudo apt install rkhunter -y sudo rkhunter --update sudo rkhunter --check # chkrootkit: segundo escáner de rootkits sudo apt install chkrootkit -y sudo chkrootkit # AIDE: detectar cambios en archivos del sistema sudo apt install aide -y sudo aideinit # Crear base de datos inicial sudo aide --check # Comparar estado actual vs base # Conexiones de red activas (buscar conexiones sospechosas) ss -tulnp # Procesos con más consumo (buscar procesos desconocidos) ps aux --sort=-%cpu | head -15 # Crontabs sospechosos (de todos los usuarios) for user in $(cut -d: -f1 /etc/passwd); do crontab -u "$user" -l 2>/dev/null && echo "=== $user ===" done

📋 Checklist de seguridad para servidores

Este checklist resume todas las medidas esenciales para asegurar un servidor Linux de producción. Úsalo como guía al configurar cualquier servidor nuevo o al auditar uno existente.

CategoríaMedidaComando / Acción
SSHDesactivar login rootPermitRootLogin no
SSHSolo autenticación por clavePasswordAuthentication no
SSHCambiar puerto por defectoPort 2222 (o similar)
SSHInstalar fail2banapt install fail2ban
FirewallDenegar todo por defectoufw default deny incoming
FirewallAbrir solo puertos necesariosufw allow 22,80,443/tcp
SistemaActualizaciones automáticasapt install unattended-upgrades
SistemaEliminar paquetes innecesariosapt autoremove
UsuariosContraseñas robustas obligatoriasConfigurar pwquality.conf
UsuariosSin cuentas sin contraseñaawk -F: '$2==""' /etc/shadow
PermisosSin archivos world-writable innecesariosfind / -perm -o+w -type f
MonitorizaciónRevisar logs periódicamentejournalctl -p err --since today

✏️ Ejercicios prácticos

Ejercicio 1: Configurar firewall para servidor web

Enunciado: Configura UFW en un servidor que aloja Apache y MySQL. SSH debe estar en el puerto 2222, Apache en 80 y 443, y MySQL solo accesible desde la IP 10.0.0.5. Verifica con ufw status.

▶ Ver solución
terminal — Solución
sudo ufw reset sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow 2222/tcp comment "SSH" sudo ufw allow 80/tcp comment "HTTP" sudo ufw allow 443/tcp comment "HTTPS" sudo ufw allow from 10.0.0.5 to any port 3306 comment "MySQL desde app" sudo ufw enable sudo ufw status verbose

Ejercicio 2: Script de auditoría de seguridad

Enunciado: Escribe un script de Bash que genere un informe de seguridad con: usuarios con shell válido, archivos SUID, puertos abiertos, intentos de login fallidos en las últimas 24h y estado del firewall.

▶ Ver solución
auditoria.sh
#!/bin/bash set -euo pipefail echo "========================================" echo " AUDITORÍA DE SEGURIDAD — $(date)" echo "========================================" echo "" echo "[1] Usuarios con shell válido:" grep -v "nologin\|false\|sync" /etc/passwd | awk -F: '{print " " $1 " → " $7}' echo "" echo "[2] Archivos SUID:" find / -perm -4000 -type f 2>/dev/null | while read f; do echo " $f" done echo "" echo "[3] Puertos abiertos:" ss -tulnp | grep LISTEN echo "" echo "[4] Intentos fallidos (últimas 24h):" grep "Failed password" /var/log/auth.log 2>/dev/null | wc -l | xargs -I{} echo " {} intentos" echo "" echo "[5] Estado del firewall:" sudo ufw status | head -15 echo "" echo "Auditoría completada."

❓ Preguntas frecuentes sobre Seguridad básica en Linux: guía completa de hardening

Las dudas más comunes respondidas de forma clara y directa.

Linux tiene ventajas estructurales: un modelo de permisos más estricto, código abierto auditable, menor superficie de ataque y prácticamente sin malware de escritorio. Sin embargo, ningún sistema es seguro por defecto. Un Linux mal configurado puede ser tan vulnerable como cualquier otro sistema. La seguridad depende de la configuración y el mantenimiento.
Para uso de escritorio, generalmente no. El malware para Linux de escritorio es extremadamente raro. En servidores, se recomienda ClamAV para escanear archivos que se sirven a clientes Windows. Lo más importante en Linux no es el antivirus, sino mantener el sistema actualizado, configurar el firewall y gestionar bien los permisos.
UFW (Uncomplicated Firewall) es una interfaz simplificada para gestionar iptables, el firewall del kernel de Linux. Permite abrir y cerrar puertos con comandos simples como 'sudo ufw allow 22/tcp'. Es la herramienta recomendada para administradores que necesitan un firewall funcional sin la complejidad de iptables puro.
Ambos son sistemas de control de acceso obligatorio (MAC). SELinux, desarrollado por la NSA y Red Hat, es más completo pero más complejo; se usa en Fedora, RHEL y CentOS. AppArmor, de Canonical, es más simple y se configura por perfiles de aplicación; viene en Ubuntu y SUSE. Para la mayoría de casos, AppArmor es suficiente y más fácil de gestionar.
Las actualizaciones de seguridad deben aplicarse lo antes posible, idealmente en las primeras 24-48 horas tras su publicación. Configura actualizaciones automáticas de seguridad con unattended-upgrades en Debian/Ubuntu. Las actualizaciones de kernel requieren reinicio, pero herramientas como livepatch pueden aplicarlas sin reiniciar.
Señales de alerta: procesos desconocidos consumiendo CPU, conexiones de red sospechosas, archivos modificados recientemente en /usr o /bin, usuarios nuevos en /etc/passwd, entradas extrañas en crontab, y logs con accesos desde IPs desconocidas. Herramientas como rkhunter, chkrootkit y AIDE ayudan a detectar intrusiones.
Solo los estrictamente necesarios: 22 (SSH, idealmente en puerto alternativo), 80 (HTTP) y 443 (HTTPS). Si usas bases de datos, el puerto (3306 para MySQL, 5432 para PostgreSQL) solo debe ser accesible desde localhost o IPs específicas, nunca abierto al público. La regla es: deniega todo por defecto y abre solo lo que necesites.
Valora este artículo

💬 Foro de discusión

¿Tienes dudas sobre Seguridad básica en Linux: guía completa de hardening? Comparte tu pregunta con la comunidad.

¿Tienes cuenta? o comenta como invitado ↓

Todavía no hay mensajes. ¡Sé el primero en participar!

🚀 ¿Quieres dominar Linux profesionalmente?
Cursos bonificados por FUNDAE para empresas — formación 100% subvencionada
Ver cursos de Linux →