Playbook de Respuesta a Incidentes en Servidores Linux

Un playbook de respuesta a incidentes define los procedimientos estandarizados que un equipo de seguridad debe seguir cuando se detecta una brecha o evento anómalo en servidores Linux. Contar con estos procedimientos documentados reduce el tiempo de respuesta, minimiza el impacto de los incidentes y garantiza que la recolección de evidencias forenses se realice correctamente para análisis posterior.

Requisitos Previos

  • Acceso root o sudo a los sistemas afectados
  • Herramientas forenses instaladas: tcpdump, ss, lsof, auditd
  • Sistema de almacenamiento externo para evidencias (no en el sistema comprometido)
  • Procedimiento de escalado documentado con contactos del equipo
  • Acceso a los logs de sistemas SIEM o SYSLOG centralizados
  • Copia de los hashes de archivos críticos del sistema (baseline)

Detección y Clasificación

El primer paso es identificar la naturaleza y alcance del incidente:

# FASE 1: Detección inicial
# Revisar logs del sistema en busca de actividad anómala
sudo journalctl -p err --since "1 hour ago" --no-pager

# Verificar intentos de autenticación fallidos
sudo grep "Failed password\|Invalid user" /var/log/auth.log | tail -50
# En CentOS/Rocky:
sudo grep "Failed password\|Invalid user" /var/log/secure | tail -50

# Detectar logins exitosos recientes (potencial acceso no autorizado)
sudo last -F | head -30
sudo lastlog | grep -v "Never logged in" | head -20

# Comprobar usuarios con sesión activa
who
w

# Revisar procesos en ejecución en busca de anomalías
ps auxf | grep -v "\[" | sort -k3 -rn | head -20

# Detectar conexiones de red activas sospechosas
sudo ss -tlnp
sudo ss -tnp | grep ESTABLISHED

Clasificar la severidad del incidente

# Niveles de severidad:
# P1 - CRÍTICO: Brecha confirmada, datos comprometidos, sistema en producción
# P2 - ALTO: Acceso no autorizado detectado, escalada de privilegios
# P3 - MEDIO: Intentos de intrusión repetidos, comportamiento anómalo
# P4 - BAJO: Alertas de IDS/IPS, actividad sospechosa no confirmada

# Documentar el incidente inmediatamente
cat > /tmp/incident-$(date +%Y%m%d-%H%M%S).txt << 'EOF'
REGISTRO DE INCIDENTE
=====================
Fecha/Hora detección: $(date)
Sistema afectado: $(hostname)
IP del sistema: $(hostname -I)
Detectado por: [NOMBRE]
Descripción inicial: [DESCRIPCIÓN]
Severidad inicial: [P1/P2/P3/P4]
EOF

Contención del Incidente

Aislar el sistema comprometido para evitar propagación:

# FASE 2: Contención - ACTUAR RÁPIDO

# Opción A: Bloquear tráfico saliente sospechoso (mantener acceso admin)
# GUARDAR las reglas actuales ANTES de modificar
sudo iptables-save > /tmp/iptables-backup-$(date +%Y%m%d).rules

# Bloquear IP atacante específica
sudo iptables -I INPUT -s IP_ATACANTE -j DROP
sudo iptables -I OUTPUT -d IP_ATACANTE -j DROP

# Opción B: Aislamiento completo de red (solo si es crítico)
# ATENCIÓN: Esto corta el acceso remoto - asegurarse de acceso físico o IPMI
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT DROP
# Mantener solo el acceso SSH desde redes de gestión
sudo iptables -A INPUT -s RED_GESTION/24 -p tcp --dport 22 -j ACCEPT
sudo iptables -A OUTPUT -d RED_GESTION/24 -j ACCEPT

# Terminar sesiones de usuario sospechosas sin matar el sistema
# Obtener PID de la sesión sospechosa
who -a
# Desconectar usuario específico
sudo pkill -KILL -u usuario_sospechoso

# Si hay procesos maliciosos identificados, detenerlos
sudo kill -STOP PID_MALICIOSO  # Pausar (no eliminar - preservar para forense)

Recolección de Evidencias

Recopilar evidencias antes de cualquier modificación del sistema:

# FASE 3: Recolección de evidencias
# NUNCA trabajar directamente en el sistema - copiar a almacenamiento externo

CASO="INC-$(date +%Y%m%d)-$(hostname)"
EVIDENCIAS="/mnt/evidencias-externas/$CASO"
mkdir -p "$EVIDENCIAS"

# Capturar estado actual de procesos (snapshot inmediato)
sudo ps auxf > "$EVIDENCIAS/procesos-$(date +%H%M%S).txt"
sudo lsof -n > "$EVIDENCIAS/archivos-abiertos-$(date +%H%M%S).txt"
sudo ss -tlnp > "$EVIDENCIAS/conexiones-red-$(date +%H%M%S).txt"
sudo netstat -rn > "$EVIDENCIAS/tabla-rutas.txt"

# Recopilar logs del sistema
sudo cp /var/log/auth.log "$EVIDENCIAS/"
sudo cp /var/log/syslog "$EVIDENCIAS/"
sudo journalctl --no-pager > "$EVIDENCIAS/journal-completo.txt"

# Historial de comandos de todos los usuarios
for user_home in /root /home/*; do
    if [ -f "$user_home/.bash_history" ]; then
        username=$(basename $user_home)
        sudo cp "$user_home/.bash_history" "$EVIDENCIAS/history-${username}.txt" 2>/dev/null
    fi
done

# Capturar tráfico de red en tiempo real (si el incidente está activo)
sudo timeout 60 tcpdump -i eth0 -w "$EVIDENCIAS/trafico-red-$(date +%H%M%S).pcap" &

# Listar cronjobs de todos los usuarios
sudo crontab -l > "$EVIDENCIAS/cron-root.txt" 2>/dev/null
ls /var/spool/cron/crontabs/ | while read user; do
    sudo cat "/var/spool/cron/crontabs/$user" > "$EVIDENCIAS/cron-${user}.txt" 2>/dev/null
done
sudo ls /etc/cron.d/ > "$EVIDENCIAS/cron.d-lista.txt"
sudo cat /etc/crontab >> "$EVIDENCIAS/cron.d-lista.txt"

# Verificar integridad de binarios críticos
sudo sha256sum /bin/bash /bin/sh /sbin/init /usr/bin/ssh /usr/bin/sudo \
    > "$EVIDENCIAS/hashes-binarios.txt"

# Calcular hash de todas las evidencias recopiladas
find "$EVIDENCIAS" -type f -exec sha256sum {} \; > "$EVIDENCIAS/HASHES-EVIDENCIAS.txt"

Análisis Forense

Investigar el vector de ataque y el alcance del compromiso:

# FASE 4: Análisis forense

# Buscar archivos modificados recientemente (últimas 24 horas)
sudo find / -newer /var/log/lastlog -type f 2>/dev/null \
    | grep -v -E "^(/proc|/sys|/run|/dev)" \
    | head -100

# Buscar archivos con permisos SUID/SGID (potencialmente backdoors)
sudo find / -perm /4000 -o -perm /2000 2>/dev/null \
    | grep -v -E "^(/proc|/sys)" \
    > /tmp/archivos-suid.txt

# Comparar con lista conocida de SUID legítimos
diff /tmp/archivos-suid.txt /tmp/suid-baseline.txt

# Buscar archivos ocultos en directorios web
sudo find /var/www -name ".*" -type f 2>/dev/null

# Analizar módulos de kernel cargados (rootkits a nivel kernel)
lsmod
sudo cat /proc/modules | sort

# Verificar usuarios y grupos del sistema
sudo grep "0:" /etc/passwd  # Usuarios con UID 0 (root)
sudo awk -F: '($3 == 0) {print}' /etc/passwd
sudo cat /etc/sudoers
sudo cat /etc/sudoers.d/*

# Buscar authorized_keys no autorizados
sudo find / -name "authorized_keys" 2>/dev/null \
    | while read f; do echo "=== $f ==="; cat "$f"; done

# Analizar logs de autenticación SSH en detalle
sudo grep "Accepted" /var/log/auth.log | awk '{print $1,$2,$3,$9,$11}' | sort | uniq -c | sort -rn

Herramientas de análisis avanzado

# Instalar herramientas forenses si no están disponibles
sudo apt-get install -y chkrootkit rkhunter lynis

# Ejecutar chkrootkit para detectar rootkits conocidos
sudo chkrootkit 2>/dev/null | grep -v "not infected"

# Ejecutar rkhunter
sudo rkhunter --check --sk --nocolors 2>/dev/null | grep -E "Warning|Found"

# Auditoría de seguridad con Lynis
sudo lynis audit system --quick 2>/dev/null | tail -30

Recuperación del Sistema

Pasos para restaurar la operación normal de forma segura:

# FASE 5: Recuperación
# Solo iniciar recuperación cuando el análisis esté completo

# Opción A: Restaurar desde backup limpio (RECOMENDADO para compromisos graves)
# 1. Verificar que el backup es anterior al compromiso
# 2. Desplegar nueva instancia
# 3. Restaurar datos verificados

# Opción B: Limpiar el sistema comprometido (solo para compromisos menores)

# Eliminar backdoors identificados
sudo rm -f /ruta/al/archivo-malicioso

# Cambiar todas las contraseñas del sistema
sudo passwd root
sudo passwd usuario1

# Regenerar claves SSH del servidor
sudo rm /etc/ssh/ssh_host_*
sudo dpkg-reconfigure openssh-server  # Ubuntu/Debian
# sudo ssh-keygen -A  # CentOS/Rocky

# Revocar y regenerar todas las claves SSH de usuarios
for user_home in /root /home/*; do
    if [ -d "$user_home/.ssh" ]; then
        sudo mv "$user_home/.ssh/authorized_keys" \
            "$user_home/.ssh/authorized_keys.comprometida" 2>/dev/null
    fi
done

# Actualizar todos los paquetes del sistema
sudo apt-get update && sudo apt-get upgrade -y
# sudo yum update -y  # CentOS/Rocky

# Restaurar reglas de firewall endurecidas
sudo iptables-restore < /tmp/iptables-hardened.rules
sudo netfilter-persistent save

Procedimientos Post-Incidente

# FASE 6: Revisión post-incidente

# Documentar línea de tiempo completa
cat > /tmp/timeline-incidente.md << 'EOF'
# Línea de Tiempo del Incidente

## Resumen
- **Caso**: INC-YYYYMMDD
- **Sistema afectado**: hostname
- **Duración**: X horas
- **Impacto**: descripción del impacto

## Cronología
| Hora | Evento | Actor |
|------|--------|-------|
| HH:MM | Detección del incidente | Sistema SIEM |
| HH:MM | Notificación al equipo | ... |
| HH:MM | Inicio de contención | ... |
| HH:MM | Identificación del vector | ... |
| HH:MM | Inicio de recuperación | ... |
| HH:MM | Sistema restaurado | ... |

## Vector de Ataque
Descripción detallada de cómo ocurrió el compromiso

## Acciones de Mejora
1. [ ] Acción correctiva 1
2. [ ] Acción correctiva 2
EOF

# Implementar mejoras de seguridad preventivas
# Activar auditd para monitorización continua
sudo apt-get install -y auditd
sudo systemctl enable auditd
sudo systemctl start auditd

# Reglas de auditd para detectar cambios críticos
cat >> /etc/audit/rules.d/hardening.rules << 'EOF'
# Monitorizar cambios en archivos de autenticación
-w /etc/passwd -p wa -k auth_changes
-w /etc/shadow -p wa -k auth_changes
-w /etc/sudoers -p wa -k auth_changes
-w /root/.ssh -p wa -k ssh_changes
# Monitorizar ejecución de comandos privilegiados
-a always,exit -F arch=b64 -S execve -F euid=0 -k root_commands
EOF

sudo augenrules --load

Herramientas Esenciales

# Kit de herramientas de respuesta a incidentes
sudo apt-get install -y \
    tcpdump \        # Captura de tráfico de red
    wireshark-common \  # Análisis de capturas pcap
    volatility \     # Análisis de memoria RAM
    foremost \       # Recuperación de archivos
    autopsy \        # Interfaz forense
    chkrootkit \     # Detección de rootkits
    rkhunter \       # Verificación de rootkits
    lynis \          # Auditoría de seguridad
    aide \           # Verificación de integridad de archivos
    fail2ban         # Protección contra ataques de fuerza bruta

# Configurar AIDE para baseline de integridad
sudo aideinit
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# Verificación periódica:
sudo aide --check

Solución de Problemas

No se puede aislar el sistema sin perder acceso:

# Usar console de gestión IPMI/iDRAC/iLO si está disponible
# O implementar aislamiento parcial: solo bloquear IPs sospechosas
sudo iptables -I INPUT -s IP_SOSPECHOSA -j LOG --log-prefix "INCIDENTE: "
sudo iptables -I INPUT -s IP_SOSPECHOSA -j DROP

Los logs han sido modificados o eliminados:

# Recuperar logs del journal binario (más difícil de manipular)
sudo journalctl --since "yesterday" --no-pager > /tmp/journal-recovery.txt

# Si hay syslog centralizado, obtenerlos desde el servidor remoto
ssh syslog-server "grep $(hostname) /var/log/syslog" > /tmp/logs-remotos.txt

Proceso malicioso que se reinicia automáticamente:

# Buscar el mecanismo de persistencia
systemctl list-units --state=enabled | grep -v "standard unit"
ls /etc/systemd/system/
crontab -l; ls /etc/cron*

# Deshabilitar el servicio antes de eliminar el binario
sudo systemctl disable --now nombre-servicio-sospechoso

Conclusión

Un playbook de respuesta a incidentes bien definido es fundamental para minimizar el impacto de compromisos de seguridad en servidores Linux. La clave es actuar de forma metódica siguiendo las fases de detección, contención, recolección de evidencias, análisis y recuperación, sin omitir pasos que puedan invalidad la cadena de custodia forense. Las acciones preventivas implementadas post-incidente, como auditd y AIDE, reducen significativamente la probabilidad y el impacto de futuros incidentes.