Controles de Seguridad ISO 27001 en Servidores Linux

ISO 27001 es el estándar internacional para los Sistemas de Gestión de Seguridad de la Información (SGSI), y su Anexo A define 93 controles de seguridad organizados en cuatro categorías: organizacionales, de personas, físicos y tecnológicos. En el contexto de servidores Linux, los controles tecnológicos del Anexo A son los más relevantes, abarcando gestión de acceso, criptografía, seguridad en operaciones y gestión de incidentes. Esta guía implementa los controles ISO 27001 más críticos para servidores Linux.

Requisitos Previos

  • Ubuntu 20.04+, CentOS 8+, Rocky Linux 8+ con acceso root
  • Herramientas: auditd, OpenSSL, fail2ban, AIDE, rsyslog
  • Documentación del SGSI existente (política de seguridad, alcance)
  • Inventario de activos de información identificado

Control de Acceso

A.8.2 - Derechos de Acceso Privilegiado

ISO 27001 A.8.2 exige controlar y restringir los accesos privilegiados:

# Auditar todos los usuarios con privilegios sudo
getent group sudo wheel
# Listar reglas sudo actuales
cat /etc/sudoers
ls /etc/sudoers.d/

# Implementar sudo con registro detallado
cat > /etc/sudoers.d/iso27001-logging << 'EOF'
# ISO 27001 A.8.2: Registro de accesos privilegiados
Defaults    log_output
Defaults    logfile=/var/log/sudo.log
Defaults    log_host
Defaults    log_year
Defaults    timestamp_timeout=5
EOF

# Configurar rotación del log de sudo
cat > /etc/logrotate.d/sudo << 'EOF'
/var/log/sudo.log {
    weekly
    rotate 52
    compress
    missingok
    notifempty
    create 640 root adm
}
EOF

A.8.3 - Restricción de Acceso a Información

# Configurar permisos basados en el principio de mínimo privilegio
# Crear grupos funcionales por rol
groupadd -r app-developer
groupadd -r app-operator
groupadd -r sys-admin

# Configurar directorios con permisos por grupo
mkdir -p /srv/app/{logs,data,config}
chown -R root:app-developer /srv/app/config
chown -R root:app-operator /srv/app/logs
chmod 2750 /srv/app/config
chmod 2770 /srv/app/logs

# Implementar ACLs para control granular
setfacl -m g:app-developer:r-x /srv/app/config
setfacl -m g:app-operator:rwx /srv/app/logs
setfacl -d -m g:app-operator:rwx /srv/app/logs  # Permisos por defecto para nuevos archivos

A.8.5 - Autenticación Segura

# Configurar PAM con política de contraseñas ISO 27001
cat > /etc/security/pwquality.conf << 'EOF'
# ISO 27001 A.8.5: Requisitos de autenticación segura
minlen = 12
minclass = 3
maxrepeat = 2
maxsequence = 3
gecoscheck = 1
dictcheck = 1
EOF

# Configurar expiración de contraseñas
cat >> /etc/login.defs << 'EOF'
# ISO 27001 A.8.5: Gestión de contraseñas
PASS_MAX_DAYS   90
PASS_MIN_DAYS   1
PASS_WARN_AGE   14
PASS_MIN_LEN    12
EOF

# Aplicar a todos los usuarios existentes
for usuario in $(awk -F: '$3 >= 1000 && $3 < 65534 {print $1}' /etc/passwd); do
    chage -M 90 -m 1 -W 14 "$usuario"
done

Criptografía

A.8.24 - Uso de Criptografía

ISO 27001 A.8.24 requiere política de uso de criptografía y gestión de claves:

# Verificar y documentar algoritmos criptográficos en uso
# Para certificados SSL/TLS
openssl x509 -in /etc/ssl/certs/server.crt -text -noout | \
    grep -E "Signature Algorithm|Public Key Algorithm|RSA Public-Key"

# Configurar política criptográfica del sistema (CentOS/Rocky)
# update-crypto-policies --set DEFAULT:NO-SHA1
update-crypto-policies --show

# Para Ubuntu, verificar configuración de OpenSSL
cat /etc/ssl/openssl.cnf | grep -E "MinProtocol|CipherString"

# Generar claves RSA de mínimo 2048 bits para servicios internos
openssl genrsa -out /etc/ssl/private/servidor.key 4096
chmod 400 /etc/ssl/private/servidor.key

# Documentar inventario de certificados
cat > /usr/local/bin/iso27001-cert-inventory.sh << 'EOF'
#!/bin/bash
# ISO 27001 A.8.24: Inventario de certificados criptográficos
echo "=== Inventario de Certificados SSL/TLS ==="
find /etc/ssl /etc/nginx/ssl /etc/apache2/ssl 2>/dev/null -name "*.crt" -o -name "*.pem" | \
while read CERT; do
    echo "Archivo: $CERT"
    openssl x509 -in "$CERT" -noout -subject -dates 2>/dev/null
    echo "---"
done
EOF
chmod +x /usr/local/bin/iso27001-cert-inventory.sh

Seguridad en Operaciones

A.8.8 - Gestión de Vulnerabilidades Técnicas

# Configurar escaneo automático de vulnerabilidades
cat > /usr/local/bin/iso27001-vuln-scan.sh << 'EOF'
#!/bin/bash
# ISO 27001 A.8.8: Gestión de vulnerabilidades técnicas
REPORTE="/var/log/iso27001/vuln-scan-$(date +%Y%m%d).txt"
mkdir -p /var/log/iso27001

echo "=== Escaneo de Vulnerabilidades ISO 27001 A.8.8 ===" > "$REPORTE"
echo "Fecha: $(date)" >> "$REPORTE"
echo "Sistema: $(hostname)" >> "$REPORTE"

# Paquetes con actualizaciones de seguridad pendientes
echo -e "\n--- Actualizaciones de Seguridad Pendientes ---" >> "$REPORTE"
apt list --upgradable 2>/dev/null | grep -i security >> "$REPORTE"

# Verificar permisos SUID/SGID (posibles vectores de escalada)
echo -e "\n--- Archivos SUID/SGID ---" >> "$REPORTE"
find / -perm /6000 -type f 2>/dev/null | grep -v proc >> "$REPORTE"

# Verificar archivos world-writable
echo -e "\n--- Archivos World-Writable en rutas críticas ---" >> "$REPORTE"
find /etc /usr /bin /sbin -perm -002 -type f 2>/dev/null >> "$REPORTE"

echo "Reporte guardado: $REPORTE"
EOF
chmod +x /usr/local/bin/iso27001-vuln-scan.sh

# Programar escaneo semanal
echo "0 3 * * 1 root /usr/local/bin/iso27001-vuln-scan.sh" > /etc/cron.d/iso27001-vuln

A.8.9 - Gestión de la Configuración

# Establecer baseline de configuración segura
cat > /usr/local/bin/iso27001-config-baseline.sh << 'EOF'
#!/bin/bash
# ISO 27001 A.8.9: Gestión de configuración - captura de baseline
BASELINE="/opt/iso27001/config-baseline-$(date +%Y%m%d).tar.gz"
mkdir -p /opt/iso27001

# Capturar configuraciones críticas
tar czf "$BASELINE" \
    /etc/ssh/sshd_config \
    /etc/pam.d/ \
    /etc/security/ \
    /etc/audit/rules.d/ \
    /etc/nginx/ \
    /etc/fail2ban/ \
    2>/dev/null

echo "Baseline guardado: $BASELINE"
sha256sum "$BASELINE" >> /opt/iso27001/baseline-checksums.txt
EOF
chmod +x /usr/local/bin/iso27001-config-baseline.sh

Seguridad en Comunicaciones

A.8.20 - Seguridad de Redes

# Configurar separación de red y control de tráfico
# Reglas de firewall según ISO 27001 A.8.20

# UFW (Ubuntu/Debian)
ufw --force reset
ufw default deny incoming
ufw default allow outgoing
ufw default deny forward

# Permitir solo servicios necesarios
ufw allow 22/tcp   # SSH
ufw allow 80/tcp   # HTTP (redirige a HTTPS)
ufw allow 443/tcp  # HTTPS

# Limitar intentos de conexión SSH
ufw limit 22/tcp

ufw enable

# Configurar sysctl para endurecimiento de red
cat > /etc/sysctl.d/99-iso27001-network.conf << 'EOF'
# ISO 27001 A.8.20: Seguridad de red
# Deshabilitar IP forwarding (si no es router)
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0

# Protección contra SYN flood
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048

# Ignorar ICMP broadcast
net.ipv4.icmp_echo_ignore_broadcasts = 1

# Protección contra IP spoofing
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# Deshabilitar aceptación de paquetes ICMP redirect
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0

# Deshabilitar envío de ICMP redirect
net.ipv4.conf.all.send_redirects = 0
EOF

sysctl -p /etc/sysctl.d/99-iso27001-network.conf

Registro y Monitoreo

A.8.15 - Registro de Eventos

# Configurar auditd completo para ISO 27001
cat > /etc/audit/rules.d/iso27001.rules << 'EOF'
# ISO 27001 A.8.15: Registro de eventos de seguridad

# Autenticación y autorización
-w /etc/passwd -p wa -k iso27001-identity
-w /etc/shadow -p wa -k iso27001-identity
-w /etc/group -p wa -k iso27001-identity
-w /etc/sudoers -p wa -k iso27001-privilege

# Cambios en configuración del sistema
-w /etc/ssh/ -p wa -k iso27001-ssh
-w /etc/pam.d/ -p wa -k iso27001-pam
-w /etc/security/ -p wa -k iso27001-security

# Acceso privilegiado
-a always,exit -F arch=b64 -S execve -C uid!=euid -F euid=0 -k iso27001-privilege-escalation

# Actividad de cron (posible persistencia de atacante)
-w /etc/cron.d/ -p wa -k iso27001-cron
-w /var/spool/cron/ -p wa -k iso27001-cron

# Uso de herramientas de red (posible reconocimiento)
-w /usr/bin/nmap -p x -k iso27001-network-recon
-w /usr/bin/nc -p x -k iso27001-network-recon
-w /usr/bin/tcpdump -p x -k iso27001-network-recon
EOF

augenrules --load
systemctl restart auditd

A.8.16 - Monitoreo de Actividades

# Script de monitoreo de seguridad diario
cat > /usr/local/bin/iso27001-daily-monitor.sh << 'EOF'
#!/bin/bash
# ISO 27001 A.8.16: Monitoreo de actividades de seguridad
REPORTE="/var/log/iso27001/monitor-$(date +%Y%m%d).txt"
mkdir -p /var/log/iso27001

echo "=== Reporte de Monitoreo ISO 27001 - $(date) ===" > "$REPORTE"

echo -e "\n[Logins del día]" >> "$REPORTE"
last -s today >> "$REPORTE" 2>/dev/null

echo -e "\n[Fallos de autenticación]" >> "$REPORTE"
grep "Failed password\|authentication failure" /var/log/auth.log 2>/dev/null | \
    tail -20 >> "$REPORTE"

echo -e "\n[Escaladas de privilegio]" >> "$REPORTE"
ausearch -k iso27001-privilege-escalation -ts today 2>/dev/null | tail -20 >> "$REPORTE"

echo -e "\n[Cambios de configuración]" >> "$REPORTE"
ausearch -k iso27001-ssh -k iso27001-pam -ts today 2>/dev/null | tail -20 >> "$REPORTE"

echo -e "\n[Servicios caídos]" >> "$REPORTE"
systemctl list-units --type=service --state=failed >> "$REPORTE"

echo "Reporte: $REPORTE"
EOF
chmod +x /usr/local/bin/iso27001-daily-monitor.sh
echo "0 6 * * * root /usr/local/bin/iso27001-daily-monitor.sh" > /etc/cron.d/iso27001-monitor

Gestión de Vulnerabilidades

A.8.8 - Ciclo de Gestión de Parches

# Configurar actualizaciones automáticas de seguridad
# Ubuntu/Debian
apt install unattended-upgrades apt-listchanges

cat > /etc/apt/apt.conf.d/50unattended-upgrades << 'EOF'
Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
};
Unattended-Upgrade::AutoFixInterruptedDpkg "true";
Unattended-Upgrade::MinimalSteps "true";
Unattended-Upgrade::Mail "[email protected]";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "false";
EOF

# Habilitar actualizaciones automáticas
echo 'APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";' > /etc/apt/apt.conf.d/20auto-upgrades

# CentOS/Rocky Linux
# dnf install dnf-automatic
# sed -i 's/upgrade_type = default/upgrade_type = security/' /etc/dnf/automatic.conf
# systemctl enable --now dnf-automatic-install.timer

Gestión de Incidentes

A.5.26 - Respuesta a Incidentes de Seguridad

# Plantilla de gestión de incidentes ISO 27001
cat > /usr/local/bin/iso27001-incident.sh << 'EOF'
#!/bin/bash
# ISO 27001 A.5.26: Registro de incidente de seguridad de la información
INCIDENTE_ID="ISO-INC-$(date +%Y%m%d-%H%M%S)"
LOG_INCIDENTE="/var/log/iso27001/incidents/$INCIDENTE_ID.txt"
mkdir -p /var/log/iso27001/incidents

cat > "$LOG_INCIDENTE" << INCIDENT_EOF
=== REGISTRO DE INCIDENTE ISO 27001 A.5.26 ===
ID: $INCIDENTE_ID
Fecha/Hora de detección: $(date)
Sistema afectado: $(hostname) [$(hostname -I)]
Reportado por: $(whoami)

--- Estado del sistema al detectar el incidente ---
Conexiones de red activas:
$(ss -tn state established)

Procesos inusuales:
$(ps aux --sort=-%cpu | head -10)

Últimos logins:
$(last -n 10)

Entradas recientes en syslog:
$(journalctl -n 50 --no-pager)

--- Acciones tomadas ---
(Documentar aquí las acciones de respuesta)

--- Clasificación ---
Severidad: [ALTA/MEDIA/BAJA]
Tipo: [Acceso no autorizado / Malware / DoS / Fuga de datos / Otro]
INCIDENT_EOF

echo "Incidente registrado: $LOG_INCIDENTE"
echo "ID de incidente: $INCIDENTE_ID"
EOF
chmod +x /usr/local/bin/iso27001-incident.sh

Solución de Problemas

Las reglas de auditoría no persisten tras reinicio:

systemctl status auditd
augenrules --check && augenrules --load
# Verificar que las reglas están en /etc/audit/rules.d/ no en /etc/audit/audit.rules directamente
ls -la /etc/audit/rules.d/

unattended-upgrades no aplica actualizaciones:

# Verificar configuración
unattended-upgrades --dry-run --debug 2>&1 | head -30
# Forzar ejecución manual
unattended-upgrades --verbose
# Ver log de actualizaciones
tail -50 /var/log/unattended-upgrades/unattended-upgrades.log

ACLs no funcionan en el sistema de archivos:

# Verificar que el sistema de archivos tiene soporte ACL
tune2fs -l /dev/sda1 | grep "Default mount options"
# Remontar con soporte ACL si es necesario
mount -o remount,acl /
# Para que sea permanente, añadir 'acl' en /etc/fstab

pwquality rechaza todas las contraseñas:

# Verificar la configuración
cat /etc/security/pwquality.conf
# Probar validación de contraseña
echo "NuevaContraseña123!" | pwscore
# Ajustar parámetros si son demasiado restrictivos

Conclusión

Los controles del Anexo A de ISO 27001 proporcionan un marco completo para proteger la infraestructura Linux de amenazas técnicas. La implementación de controles de acceso, criptografía, monitoreo y gestión de vulnerabilidades crea una defensa en profundidad alineada con el estándar internacional. Documenta cada control implementado, sus responsables y la evidencia de funcionamiento para facilitar auditorías formales de certificación ISO 27001.