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.
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)sudouseradd-r -s /usr/sbin/nologin webapp
# Crear usuario normal con homesudouseradd-m -s /bin/bash -G sudo ana
# Verificar qué usuarios tienen shell válidogrep-v "nologin\|false" /etc/passwd
# Ver qué usuarios pueden usar sudogetent group sudo
# Bloquear cuenta temporalmentesudousermod-L usuario_sospechoso
# Verificar intentos de login fallidossudolastb | head-20# Ver últimos logins exitososlast | 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)sudoapt install ufw -y
# Política por defecto: denegar todo entrante, permitir salientesudoufw default deny incoming
sudoufw default allow outgoing
# Abrir SSH (SIEMPRE antes de activar el firewall)sudoufw allow 22/tcp
# Abrir puertos para servidor websudoufw allow 80/tcp
sudoufw allow 443/tcp
# Permitir acceso desde IP específica (ej: oficina)sudoufw allow from 203.0.113.50 to any port 3306# Activar el firewallsudoufw enable
# Ver estado y reglas activassudoufw status verbose
# Eliminar una reglasudoufw delete allow 80/tcp
# Ver reglas numeradas (para eliminar por número)sudoufw status numbered
sudoufw delete 3
terminal — iptables: ejemplo para servidor web
# Política por defecto: denegar todosudoiptables-P INPUT DROP
sudoiptables-P FORWARD DROP
sudoiptables-P OUTPUT ACCEPT
# Permitir tráfico en loopbacksudoiptables-A INPUT -i lo -j ACCEPT
# Permitir conexiones establecidassudoiptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Permitir SSH, HTTP y HTTPSsudoiptables-A INPUT -p tcp --dport 22-j ACCEPT
sudoiptables-A INPUT -p tcp --dport 80-j ACCEPT
sudoiptables-A INPUT -p tcp --dport 443-j ACCEPT
# Limitar intentos SSH (anti brute-force)sudoiptables-A INPUT -p tcp --dport 22-m recent --set --name SSH
sudoiptables-A INPUT -p tcp --dport 22-m recent --update --seconds 60--hitcount 4--name SSH -j DROP
# Guardar reglas (persisten tras reinicio)sudoapt install iptables-persistent -y
sudonetfilter-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 completasudoapt update && sudoapt upgrade -y
# Solo actualizaciones de seguridadsudoapt upgrade -y --only-upgrade
# Ver actualizaciones pendientesapt list --upgradable
# Configurar actualizaciones automáticas de seguridadsudoapt install unattended-upgrades -y
sudodpkg-reconfigure-plow unattended-upgrades
# Verificar que está activocat /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áticascat /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ñassudoapt install libpam-pwquality -y
# Configurar requisitos mínimossudonano /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ñassudonano /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íficosudochage-l ana
# Forzar cambio de contraseña en próximo loginsudochage-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/.
Archivo
Contenido
Buscar
/var/log/auth.log
Autenticación: login, sudo, SSH
Intentos de acceso fallidos, sudo no autorizado
/var/log/syslog
Mensajes generales del sistema
Errores de servicios, fallos de hardware
/var/log/kern.log
Mensajes del kernel
Errores de drivers, problemas de memoria
/var/log/fail2ban.log
IPs bloqueadas por fail2ban
Ataques de fuerza bruta, patrones de ataque
/var/log/apache2/
Logs de Apache
Errores 403/404, intentos de inyección SQL/XSS
/var/log/ufw.log
Paquetes bloqueados por firewall
Escaneos 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 fallidosgrep"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 systemdsudojournalctl-u sshd --since "1 hour ago"sudojournalctl-p err --since today
# Monitorizar logs en tiempo realsudotail-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 AppArmorsudoaa-status# Ver perfiles cargadossudoaa-status | grep"profiles"# Poner un perfil en modo enforce (bloquea violaciones)sudoaa-enforce /etc/apparmor.d/usr.sbin.mysqld
# Poner un perfil en modo complain (solo registra, no bloquea)sudoaa-complain /etc/apparmor.d/usr.sbin.mysqld
# Ver violaciones en logssudojournalctl | grep"apparmor" | tail-20
Aspecto
AppArmor
SELinux
Distribución
Ubuntu, Debian, SUSE
Fedora, RHEL, CentOS
Enfoque
Perfiles por aplicación (path-based)
Etiquetas de seguridad en todo el sistema
Complejidad
Baja-media
Alta
Configuración
Perfiles en /etc/apparmor.d/
Políticas en /etc/selinux/
Modo aprendizaje
Sí (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 rootkitssudoapt install rkhunter -y
sudorkhunter--update
sudorkhunter--check
# chkrootkit: segundo escáner de rootkitssudoapt install chkrootkit -y
sudochkrootkit# AIDE: detectar cambios en archivos del sistemasudoapt install aide -y
sudoaideinit# Crear base de datos inicialsudoaide--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); docrontab-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ía
Medida
Comando / Acción
SSH
Desactivar login root
PermitRootLogin no
SSH
Solo autenticación por clave
PasswordAuthentication no
SSH
Cambiar puerto por defecto
Port 2222 (o similar)
SSH
Instalar fail2ban
apt install fail2ban
Firewall
Denegar todo por defecto
ufw default deny incoming
Firewall
Abrir solo puertos necesarios
ufw allow 22,80,443/tcp
Sistema
Actualizaciones automáticas
apt install unattended-upgrades
Sistema
Eliminar paquetes innecesarios
apt autoremove
Usuarios
Contraseñas robustas obligatorias
Configurar pwquality.conf
Usuarios
Sin cuentas sin contraseña
awk -F: '$2==""' /etc/shadow
Permisos
Sin archivos world-writable innecesarios
find / -perm -o+w -type f
Monitorización
Revisar logs periódicamente
journalctl -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
sudoufw reset
sudoufw default deny incoming
sudoufw default allow outgoing
sudoufw allow 2222/tcp comment "SSH"sudoufw allow 80/tcp comment "HTTP"sudoufw allow 443/tcp comment "HTTPS"sudoufw allow from 10.0.0.5 to any port 3306 comment "MySQL desde app"sudoufw enable
sudoufw 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.
❓ 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
¿Útil?
💬 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 ↓
Iniciar sesión
🔑 Recuperar contraseña
Introduce el email con el que te registraste. Te enviaremos un enlace para crear una nueva contraseña.
Crear cuenta
Solo necesitas nombre, email y contraseña. Sin verificación por email.
Todavía no hay mensajes. ¡Sé el primero en participar!
🚀 ¿Quieres dominar Linux profesionalmente?
Cursos bonificados por FUNDAE para empresas — formación 100% subvencionada
Usamos cookies propias para mejorar tu experiencia de navegación y analizar
el uso del sitio. No compartimos datos con terceros ni usamos cookies de
publicidad. Puedes aceptar todas, aceptar solo las necesarias o configurar
tus preferencias.
Política de privacidad
Imprescindibles para el funcionamiento del sitio: preferencias de interfaz,
gestión de sesiones y este mismo aviso de cookies. No recogen datos
identificativos.
Nos permiten entender cómo navegas por el contenido para mejorar la
experiencia de aprendizaje. Utilizan identificadores anónimos (UUID) sin
vinculación a datos personales. Retención máxima: 6 meses.
¿Cómo valorarías tu experiencia aprendiendo en esta sección?