Auditoría de Seguridad: Lista de Verificación con Comandos

Introducción

Realizar auditorías de seguridad regulares es fundamental para mantener una postura de seguridad robusta para servidores Linux. Ya sea que estés gestionando un solo VPS o una infraestructura empresarial, las evaluaciones de seguridad sistemáticas identifican vulnerabilidades, configuraciones incorrectas y brechas de cumplimiento antes de que los atacantes puedan explotarlas.

Esta lista de verificación completa de auditoría de seguridad proporciona a administradores de sistemas, profesionales de seguridad e ingenieros DevOps comandos y procedimientos prácticos para evaluar exhaustivamente la seguridad de servidores Linux. A diferencia de las herramientas de escaneo automatizado, la auditoría manual desarrolla una comprensión profunda de la seguridad del sistema y descubre problemas que las herramientas automatizadas podrían pasar por alto.

Una auditoría de seguridad exhaustiva abarca múltiples dimensiones: autenticación y autorización de usuarios, seguridad de red, permisos del sistema de archivos, servicios en ejecución, gestión de parches, registro y monitoreo, implementaciones criptográficas y cumplimiento con marcos de seguridad. Esta guía organiza estos elementos en una lista de verificación sistemática con comandos específicos para cada verificación.

Las auditorías de seguridad regulares sirven múltiples propósitos: identificar debilidades de seguridad, validar controles de seguridad, asegurar el cumplimiento con requisitos regulatorios, detectar cambios no autorizados y proporcionar documentación para evaluaciones de seguridad y certificaciones.

Preparación Previa a la Auditoría

Recopilación de Documentación

Antes de comenzar la auditoría, recopila documentación esencial:

# Información del sistema
hostnamectl > /root/audit-$(date +%Y%m%d)/system-info.txt
uname -a >> /root/audit-$(date +%Y%m%d)/system-info.txt
cat /etc/os-release >> /root/audit-$(date +%Y%m%d)/system-info.txt

# Paquetes instalados
dpkg -l > /root/audit-$(date +%Y%m%d)/packages-debian.txt  # Debian/Ubuntu
rpm -qa > /root/audit-$(date +%Y%m%d)/packages-rhel.txt    # RHEL/CentOS

# Configuración de red
ip addr show > /root/audit-$(date +%Y%m%d)/network-config.txt
ip route show >> /root/audit-$(date +%Y%m%d)/network-config.txt
cat /etc/resolv.conf >> /root/audit-$(date +%Y%m%d)/network-config.txt

Crear Estructura de Directorios de Auditoría

# Crear directorio de auditoría organizado
AUDIT_DIR="/root/security-audit-$(date +%Y%m%d-%H%M)"
mkdir -p $AUDIT_DIR/{system,users,network,services,files,logs,compliance}

# Establecer permisos
chmod 700 $AUDIT_DIR

Script de Registro de Auditoría

#!/bin/bash
# Crear función de registro de auditoría
AUDIT_LOG="/root/security-audit-$(date +%Y%m%d).log"

log_audit() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $AUDIT_LOG
}

log_audit "=== Auditoría de Seguridad Iniciada ==="

Auditoría de Endurecimiento del Sistema

Verificación de Parámetros del Kernel

# Verificar parámetros críticos del kernel
log_audit "Verificando parámetros del kernel..."

# Reenvío de IP (debe ser 0 a menos que sea enrutador)
sysctl net.ipv4.ip_forward
[ ] Esperado: 0

# Cookies SYN (debe estar habilitado)
sysctl net.ipv4.tcp_syncookies
[ ] Esperado: 1

# Redirecciones ICMP (debe estar deshabilitado)
sysctl net.ipv4.conf.all.accept_redirects
sysctl net.ipv6.conf.all.accept_redirects
[ ] Esperado: 0 para ambos

# Enrutamiento de origen (debe estar deshabilitado)
sysctl net.ipv4.conf.all.accept_source_route
[ ] Esperado: 0

# Registrar paquetes marcianos (debe estar habilitado)
sysctl net.ipv4.conf.all.log_martians
[ ] Esperado: 1

# Filtrado de ruta inversa (debe estar habilitado)
sysctl net.ipv4.conf.all.rp_filter
[ ] Esperado: 1

# Aleatorización de distribución del espacio de direcciones
sysctl kernel.randomize_va_space
[ ] Esperado: 2

# Restricciones de puntero del kernel
sysctl kernel.kptr_restrict
[ ] Esperado: 1 o 2

# Restricciones de dmesg
sysctl kernel.dmesg_restrict
[ ] Esperado: 1

# Generar informe
sysctl -a > $AUDIT_DIR/system/sysctl-current.txt

Seguridad de Arranque y GRUB

# Verificar protección de contraseña de GRUB
log_audit "Verificando seguridad del cargador de arranque..."

[ ] Verificar si GRUB está protegido con contraseña
grep "password" /boot/grub/grub.cfg
grep "password" /boot/grub2/grub.cfg

# Verificar permisos de GRUB
ls -l /boot/grub/grub.cfg
ls -l /boot/grub2/grub.cfg
[ ] Esperado: 600 o 400

# Verificar parámetros de arranque
grep "GRUB_CMDLINE_LINUX" /etc/default/grub
[ ] Debe contener: audit=1

Actualizaciones y Parches del Sistema

log_audit "Verificando actualizaciones del sistema..."

# Ubuntu/Debian
apt-get update
apt list --upgradable > $AUDIT_DIR/system/available-updates.txt
[ ] Revisar actualizaciones de seguridad

# Verificar actualizaciones desatendidas
systemctl status unattended-upgrades
[ ] Debe estar activo

# CentOS/RHEL
dnf check-update > $AUDIT_DIR/system/available-updates.txt
[ ] Revisar actualizaciones de seguridad

# Verificar última actualización
ls -lt /var/log/apt/history.log | head -5  # Debian/Ubuntu
ls -lt /var/log/dnf.log | head -5          # RHEL/CentOS
[ ] Verificar actualizaciones recientes

Auditoría de Usuarios y Autenticación

Revisión de Cuentas de Usuario

log_audit "Auditando cuentas de usuario..."

# Listar todos los usuarios
cat /etc/passwd > $AUDIT_DIR/users/passwd.txt
[ ] Revisar todas las cuentas de usuario

# Encontrar usuarios con UID 0 (privilegios de root)
awk -F: '($3 == 0) {print}' /etc/passwd
[ ] Esperado: Solo root debe tener UID 0

# Verificar usuarios sin contraseñas
awk -F: '($2 == "") {print}' /etc/shadow
[ ] Esperado: Ningún usuario sin contraseñas

# Encontrar usuarios sin expiración de contraseña
awk -F: '($5 == "") {print $1}' /etc/shadow
[ ] Revisar y establecer fechas de expiración

# Verificar envejecimiento de contraseñas
cat /etc/login.defs | grep -E "PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_WARN_AGE"
[ ] PASS_MAX_DAYS debe ser ≤ 90
[ ] PASS_MIN_DAYS debe ser ≥ 1
[ ] PASS_WARN_AGE debe ser ≥ 7

# Revisar envejecimiento de contraseñas de usuario
for user in $(cut -d: -f1 /etc/passwd); do
    chage -l $user >> $AUDIT_DIR/users/password-aging.txt
done

Revisión de Acceso Privilegiado

log_audit "Revisando acceso privilegiado..."

# Verificar configuración de sudo
cat /etc/sudoers > $AUDIT_DIR/users/sudoers.txt
ls -la /etc/sudoers.d/ >> $AUDIT_DIR/users/sudoers.txt
[ ] Verificar entradas NOPASSWD están justificadas
[ ] Verificar concesiones ALL=(ALL:ALL) son necesarias

# Encontrar archivos con bits SUID/SGID
find / -xdev \( -perm -4000 -o -perm -2000 \) -type f -exec ls -l {} \; \
    > $AUDIT_DIR/files/suid-sgid.txt 2>/dev/null
[ ] Revisar todos los binarios SUID/SGID

# Verificar acceso sudo no autorizado
grep -r "ALL=(ALL)" /etc/sudoers.d/
[ ] Verificar cada entrada está autorizada

Auditoría de Configuración SSH

log_audit "Auditando configuración SSH..."

# Revisar configuración del demonio SSH
grep -v "^#" /etc/ssh/sshd_config | grep -v "^$" > $AUDIT_DIR/network/sshd-config.txt

# Configuraciones SSH críticas a verificar
grep "PermitRootLogin" /etc/ssh/sshd_config
[ ] Esperado: PermitRootLogin no

grep "PasswordAuthentication" /etc/ssh/sshd_config
[ ] Esperado: PasswordAuthentication no (si usa claves)

grep "PermitEmptyPasswords" /etc/ssh/sshd_config
[ ] Esperado: PermitEmptyPasswords no

grep "Protocol" /etc/ssh/sshd_config
[ ] Esperado: Protocol 2

grep "MaxAuthTries" /etc/ssh/sshd_config
[ ] Esperado: MaxAuthTries 3-6

grep "ClientAliveInterval" /etc/ssh/sshd_config
grep "ClientAliveCountMax" /etc/ssh/sshd_config
[ ] Debe tener timeout configurado

grep "AllowUsers\|AllowGroups" /etc/ssh/sshd_config
[ ] Verificar restricciones de usuario si están presentes

# Verificar claves de host SSH
ls -l /etc/ssh/ssh_host_*
[ ] Verificar algoritmos fuertes (ED25519, RSA 4096)

# Verificar claves autorizadas SSH
for user_home in /home/*; do
    if [ -f "$user_home/.ssh/authorized_keys" ]; then
        echo "=== $user_home/.ssh/authorized_keys ===" >> $AUDIT_DIR/users/authorized-keys.txt
        cat "$user_home/.ssh/authorized_keys" >> $AUDIT_DIR/users/authorized-keys.txt
    fi
done
[ ] Revisar todas las claves SSH autorizadas

Configuración PAM

log_audit "Revisando configuración PAM..."

# Verificar requisitos de calidad de contraseña
cat /etc/security/pwquality.conf | grep -v "^#" | grep -v "^$"
[ ] minlen debe ser ≥ 14
[ ] dcredit, ucredit, lcredit, ocredit deben estar configurados

# Verificar configuración de faillock
cat /etc/security/faillock.conf | grep -v "^#" | grep -v "^$"
[ ] deny debe ser ≤ 5
[ ] unlock_time debe estar configurado

# Revisar archivos PAM
ls -l /etc/pam.d/ > $AUDIT_DIR/users/pam-files.txt

Auditoría de Seguridad de Red

Configuración de Firewall

log_audit "Auditando configuración de firewall..."

# UFW (Ubuntu/Debian)
ufw status verbose > $AUDIT_DIR/network/firewall-ufw.txt
[ ] Verificar denegar predeterminado entrante
[ ] Revisar servicios permitidos

# Firewalld (CentOS/RHEL)
firewall-cmd --list-all > $AUDIT_DIR/network/firewall-firewalld.txt
[ ] Verificar puertos abiertos mínimos
[ ] Revisar zonas activas

# iptables (todos los sistemas)
iptables -L -n -v > $AUDIT_DIR/network/firewall-iptables.txt
ip6tables -L -n -v > $AUDIT_DIR/network/firewall-ip6tables.txt
[ ] Revisar todas las reglas
[ ] Verificar política DROP predeterminada

# nftables
nft list ruleset > $AUDIT_DIR/network/firewall-nftables.txt

Puertos Abiertos y Servicios Escuchando

log_audit "Verificando puertos abiertos y servicios escuchando..."

# Listar todos los puertos TCP/UDP escuchando
ss -tuln > $AUDIT_DIR/network/listening-ports.txt
netstat -tuln >> $AUDIT_DIR/network/listening-ports.txt

# Identificar procesos en puertos abiertos
ss -tulpn > $AUDIT_DIR/network/listening-processes.txt
[ ] Verificar cada servicio escuchando es necesario
[ ] Verificar servicios se vinculan a interfaces apropiadas

# Verificar servicios escuchando en todas las interfaces
ss -tuln | grep "0.0.0.0\|:::"
[ ] Verificar estos servicios deben ser accesibles públicamente

# Escaneo de puerto externo (si nmap disponible)
nmap -sT -p- localhost > $AUDIT_DIR/network/nmap-localhost.txt
[ ] Comparar con servicios esperados

Conexiones de Red

log_audit "Revisando conexiones activas..."

# Conexiones actuales
ss -tupn > $AUDIT_DIR/network/active-connections.txt
[ ] Revisar conexiones sospechosas

# Tabla de enrutamiento
ip route show > $AUDIT_DIR/network/routing-table.txt
[ ] Verificar configuración de enrutamiento

# Configuración DNS
cat /etc/resolv.conf > $AUDIT_DIR/network/dns-config.txt
[ ] Verificar servidores DNS son confiables

# Interfaces de red
ip link show > $AUDIT_DIR/network/interfaces.txt
[ ] Documentar todas las interfaces

Auditoría de Servicios y Procesos

Servicios en Ejecución

log_audit "Auditando servicios en ejecución..."

# Listar todos los servicios habilitados
systemctl list-unit-files --type=service --state=enabled \
    > $AUDIT_DIR/services/enabled-services.txt
[ ] Revisar cada servicio habilitado

# Listar todos los servicios activos
systemctl list-units --type=service --state=running \
    > $AUDIT_DIR/services/running-services.txt
[ ] Verificar cada servicio es necesario

# Servicios innecesarios comunes a verificar
services_to_check="cups avahi-daemon bluetooth rpcbind nfs-server"
for service in $services_to_check; do
    systemctl is-active $service 2>/dev/null && \
        echo "ADVERTENCIA: $service está ejecutándose" | tee -a $AUDIT_LOG
done

Análisis de Procesos

log_audit "Analizando procesos en ejecución..."

# Todos los procesos
ps aux > $AUDIT_DIR/services/processes.txt
[ ] Revisar procesos inesperados

# Procesos ejecutándose como root
ps aux | grep "^root" > $AUDIT_DIR/services/root-processes.txt
[ ] Verificar necesidad de procesos root

# Procesos con alto CPU/Memoria
ps aux --sort=-%cpu | head -20 > $AUDIT_DIR/services/high-cpu.txt
ps aux --sort=-%mem | head -20 > $AUDIT_DIR/services/high-memory.txt
[ ] Investigar procesos intensivos en recursos

# Verificar procesos zombie
ps aux | grep "<defunct>" > $AUDIT_DIR/services/zombie-processes.txt
[ ] Debe ser mínimo o ninguno

Auditoría de Sistema de Archivos y Permisos

Montajes del Sistema de Archivos

log_audit "Auditando montajes del sistema de archivos..."

# Revisar opciones de montaje
mount > $AUDIT_DIR/files/current-mounts.txt
cat /etc/fstab > $AUDIT_DIR/files/fstab.txt

# Verificar opciones de montaje inseguras
mount | grep -E "nodev|nosuid|noexec"
[ ] /tmp debe tener: nodev,nosuid,noexec
[ ] /var/tmp debe tener: nodev,nosuid,noexec
[ ] /home debe tener: nodev,nosuid
[ ] /dev/shm debe tener: nodev,nosuid,noexec

# Verificar particiones separadas
df -h > $AUDIT_DIR/files/disk-usage.txt
[ ] /var debería idealmente ser partición separada
[ ] /tmp debería idealmente ser partición separada
[ ] /home debería idealmente ser partición separada

Permisos de Archivos Críticos

log_audit "Verificando permisos de archivos críticos..."

# Archivos del sistema
ls -l /etc/passwd
[ ] Esperado: 644

ls -l /etc/shadow
[ ] Esperado: 640 o 000

ls -l /etc/group
[ ] Esperado: 644

ls -l /etc/gshadow
[ ] Esperado: 640 o 000

ls -l /etc/ssh/sshd_config
[ ] Esperado: 600

ls -l /boot/grub/grub.cfg
[ ] Esperado: 600 o 400

# Archivos de registro
ls -ld /var/log
[ ] Esperado: 755 o 750

ls -l /var/log/auth.log
ls -l /var/log/secure
[ ] Esperado: 640 o 600

Archivos con Escritura Universal

log_audit "Encontrando archivos con escritura universal..."

# Encontrar archivos con escritura universal
find / -xdev -type f -perm -0002 -ls 2>/dev/null \
    > $AUDIT_DIR/files/world-writable-files.txt
[ ] Revisar y justificar cada archivo

# Encontrar directorios con escritura universal
find / -xdev -type d -perm -0002 -ls 2>/dev/null \
    > $AUDIT_DIR/files/world-writable-dirs.txt
[ ] Revisar y justificar cada directorio

# Verificar sticky bit en /tmp
ls -ld /tmp
[ ] Debe tener sticky bit (drwxrwxrwt)

Archivos Huérfanos

log_audit "Encontrando archivos huérfanos..."

# Archivos sin propietario
find / -xdev -nouser -ls 2>/dev/null \
    > $AUDIT_DIR/files/no-owner.txt
[ ] Investigar archivos huérfanos

# Archivos sin grupo
find / -xdev -nogroup -ls 2>/dev/null \
    > $AUDIT_DIR/files/no-group.txt
[ ] Investigar archivos huérfanos

Auditoría de Registro y Monitoreo

Configuración de Registro

log_audit "Auditando configuración de registro..."

# Verificar rsyslog/syslog-ng
systemctl status rsyslog || systemctl status syslog-ng
[ ] Demonio de registro debe estar activo

# Revisar configuración de rsyslog
cat /etc/rsyslog.conf > $AUDIT_DIR/logs/rsyslog-config.txt
ls -l /etc/rsyslog.d/ >> $AUDIT_DIR/logs/rsyslog-config.txt
[ ] Verificar reglas de registro apropiadas

# Verificar rotación de registros
cat /etc/logrotate.conf > $AUDIT_DIR/logs/logrotate-config.txt
ls -l /etc/logrotate.d/ >> $AUDIT_DIR/logs/logrotate-config.txt
[ ] Verificar registros se rotan apropiadamente

Revisión de Registros Críticos

log_audit "Revisando registros críticos..."

# Registros de autenticación
tail -100 /var/log/auth.log > $AUDIT_DIR/logs/recent-auth.txt
tail -100 /var/log/secure >> $AUDIT_DIR/logs/recent-auth.txt
[ ] Revisar intentos de inicio de sesión fallidos

# Verificar intentos SSH fallidos
grep "Failed password" /var/log/auth.log | tail -50
[ ] Investigar patrones sospechosos

# Registros del sistema
tail -100 /var/log/syslog > $AUDIT_DIR/logs/recent-syslog.txt
tail -100 /var/log/messages >> $AUDIT_DIR/logs/recent-syslog.txt
[ ] Revisar errores y advertencias

# Mensajes del kernel
dmesg > $AUDIT_DIR/logs/dmesg.txt
[ ] Revisar problemas de hardware o kernel

Demonio de Auditoría (auditd)

log_audit "Verificando demonio de auditoría..."

# Verificar auditd está ejecutándose
systemctl status auditd
[ ] Debe estar activo y habilitado

# Revisar reglas de auditoría
auditctl -l > $AUDIT_DIR/logs/audit-rules.txt
[ ] Verificar reglas de auditoría completas

# Verificar registros de auditoría
ausearch -m USER_LOGIN -sv no | tail -20
[ ] Revisar intentos de inicio de sesión fallidos

# Espacio de registro de auditoría
df -h /var/log/audit
[ ] Asegurar espacio suficiente

Auditoría de Criptografía y SSL/TLS

Certificados SSL/TLS

log_audit "Auditando certificados SSL/TLS..."

# Encontrar todos los certificados
find / -name "*.crt" -o -name "*.pem" 2>/dev/null \
    > $AUDIT_DIR/compliance/certificates.txt

# Verificar expiración de certificados
for cert in /etc/ssl/certs/*.pem; do
    echo "=== $cert ===" >> $AUDIT_DIR/compliance/cert-expiry.txt
    openssl x509 -in $cert -noout -dates 2>/dev/null \
        >> $AUDIT_DIR/compliance/cert-expiry.txt
done
[ ] Verificar certificados no están expirados
[ ] Verificar fechas de expiración (advertencia 30-90 días)

# Configuración SSL del servidor web
if [ -f /etc/nginx/nginx.conf ]; then
    grep -r "ssl_" /etc/nginx/ > $AUDIT_DIR/network/nginx-ssl.txt
fi

if [ -f /etc/apache2/apache2.conf ]; then
    grep -r "SSLProtocol\|SSLCipherSuite" /etc/apache2/ \
        > $AUDIT_DIR/network/apache-ssl.txt
fi
[ ] Verificar solo TLS 1.2 y 1.3
[ ] Verificar suites de cifrado fuertes

Análisis de Claves SSH

log_audit "Analizando claves SSH..."

# Verificar algoritmos de claves SSH
for keyfile in /etc/ssh/ssh_host_*_key.pub; do
    echo "=== $keyfile ===" >> $AUDIT_DIR/network/ssh-keys.txt
    ssh-keygen -lf $keyfile >> $AUDIT_DIR/network/ssh-keys.txt
done
[ ] Claves RSA deben ser ≥ 3072 bits
[ ] Preferir claves ED25519

# Verificar claves SSH de usuario
for user_home in /home/*; do
    if [ -d "$user_home/.ssh" ]; then
        echo "=== $user_home ===" >> $AUDIT_DIR/users/user-ssh-keys.txt
        find "$user_home/.ssh" -name "*.pub" -exec cat {} \; \
            >> $AUDIT_DIR/users/user-ssh-keys.txt 2>/dev/null
    fi
done

Detección de Malware e Intrusiones

Detección de Rootkits

log_audit "Escaneando rootkits..."

# chkrootkit (si está instalado)
if command -v chkrootkit &> /dev/null; then
    chkrootkit > $AUDIT_DIR/compliance/chkrootkit.txt
    [ ] Revisar hallazgos
fi

# rkhunter (si está instalado)
if command -v rkhunter &> /dev/null; then
    rkhunter --check --skip-keypress --report-warnings-only \
        > $AUDIT_DIR/compliance/rkhunter.txt
    [ ] Revisar hallazgos
fi

Integridad de Archivos

log_audit "Verificando integridad de archivos..."

# AIDE (si está instalado)
if command -v aide &> /dev/null; then
    aide --check > $AUDIT_DIR/compliance/aide-check.txt
    [ ] Revisar cambios
fi

# Verificar modificaciones recientes en directorios críticos
find /bin /sbin /usr/bin /usr/sbin -type f -mtime -7 \
    > $AUDIT_DIR/files/recent-binary-changes.txt
[ ] Verificar cambios legítimos

Verificaciones de Cumplimiento

Requisitos PCI-DSS

log_audit "Verificaciones de cumplimiento PCI-DSS..."

# Requisito 2: Contraseñas fuertes
grep "PASS_MIN_LENGTH\|minlen" /etc/login.defs /etc/security/pwquality.conf
[ ] Mínimo 7 caracteres (recomendado 14+)

# Requisito 8: IDs únicos
[ ] Verificar sin cuentas compartidas

# Requisito 10: Rastrear y monitorear acceso
[ ] Verificar auditd está ejecutándose
[ ] Verificar retención de registros ≥ 90 días

# Requisito 5: Anti-virus
systemctl status clamav-daemon 2>/dev/null
[ ] Verificar anti-virus está ejecutándose

# Requisito 1: Firewall
[ ] Verificar firewall está activo
[ ] Documentar todos los puertos abiertos

Requisitos HIPAA

log_audit "Verificaciones de cumplimiento HIPAA..."

# Controles de acceso (164.312(a)(1))
[ ] Verificar IDs de usuario únicos
[ ] Verificar cierre de sesión automático (timeout de pantalla)

# Controles de auditoría (164.312(b))
[ ] Verificar registro completo
[ ] Verificar procedimientos de revisión de registros

# Integridad (164.312(c)(1))
[ ] Verificar monitoreo de integridad de archivos

# Seguridad de transmisión (164.312(e)(1))
[ ] Verificar cifrado en tránsito (TLS)
[ ] Verificar VPN para acceso remoto

Requisitos GDPR

log_audit "Verificaciones de cumplimiento GDPR..."

# Cifrado de datos
[ ] Verificar cifrado de disco (LUKS)
[ ] Verificar cifrado de respaldo

# Registro de acceso
[ ] Verificar acceso a datos está registrado
[ ] Verificar política de retención de registros

# Retención de datos
[ ] Documentar períodos de retención de datos
[ ] Verificar procedimientos de eliminación automática

Script de Auditoría Automatizado

#!/bin/bash
# Script de Auditoría de Seguridad Completo

AUDIT_DATE=$(date +%Y%m%d-%H%M%S)
AUDIT_DIR="/root/security-audit-$AUDIT_DATE"
AUDIT_LOG="$AUDIT_DIR/audit.log"

# Crear estructura de directorios
mkdir -p $AUDIT_DIR/{system,users,network,services,files,logs,compliance}

# Función de registro
log_audit() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $AUDIT_LOG
}

log_audit "===== AUDITORÍA DE SEGURIDAD INICIADA ====="

# Información del sistema
log_audit "Recopilando información del sistema..."
hostnamectl > $AUDIT_DIR/system/system-info.txt
uname -a >> $AUDIT_DIR/system/system-info.txt

# Auditoría de usuarios
log_audit "Auditando usuarios..."
awk -F: '($3 == 0) {print}' /etc/passwd > $AUDIT_DIR/users/uid-zero.txt
awk -F: '($2 == "") {print}' /etc/shadow > $AUDIT_DIR/users/no-password.txt

# Auditoría de red
log_audit "Auditando red..."
ss -tuln > $AUDIT_DIR/network/listening-ports.txt
iptables -L -n -v > $AUDIT_DIR/network/firewall.txt

# Auditoría de servicios
log_audit "Auditando servicios..."
systemctl list-unit-files --type=service --state=enabled \
    > $AUDIT_DIR/services/enabled-services.txt

# Auditoría de sistema de archivos
log_audit "Auditando sistema de archivos..."
find / -xdev -type f -perm -0002 -ls 2>/dev/null \
    > $AUDIT_DIR/files/world-writable.txt
find / -xdev \( -perm -4000 -o -perm -2000 \) -type f -ls 2>/dev/null \
    > $AUDIT_DIR/files/suid-sgid.txt

# Auditoría de registros
log_audit "Auditando registros..."
tail -100 /var/log/auth.log > $AUDIT_DIR/logs/recent-auth.txt 2>/dev/null
tail -100 /var/log/secure >> $AUDIT_DIR/logs/recent-auth.txt 2>/dev/null

# Generar resumen
log_audit "Generando resumen..."
{
    echo "Resumen de Auditoría de Seguridad - $AUDIT_DATE"
    echo "======================================"
    echo ""
    echo "Usuarios con UID 0: $(wc -l < $AUDIT_DIR/users/uid-zero.txt)"
    echo "Usuarios sin contraseña: $(wc -l < $AUDIT_DIR/users/no-password.txt)"
    echo "Puertos escuchando: $(wc -l < $AUDIT_DIR/network/listening-ports.txt)"
    echo "Archivos con escritura universal: $(wc -l < $AUDIT_DIR/files/world-writable.txt)"
    echo "Archivos SUID/SGID: $(wc -l < $AUDIT_DIR/files/suid-sgid.txt)"
    echo ""
    echo "Resultados detallados en: $AUDIT_DIR"
} > $AUDIT_DIR/SUMMARY.txt

log_audit "===== AUDITORÍA DE SEGURIDAD COMPLETADA ====="

# Mostrar resumen
cat $AUDIT_DIR/SUMMARY.txt

# Enviar resultados por correo
if command -v mail &> /dev/null; then
    mail -s "Auditoría de Seguridad: $(hostname) - $AUDIT_DATE" [email protected] \
        < $AUDIT_DIR/SUMMARY.txt
fi

Acciones Post-Auditoría

Priorización de Hallazgos

# Crear plan de remediación priorizado
PRIORIDAD_ALTA="
- Usuarios con UID 0 (distintos de root)
- Usuarios sin contraseñas
- Inicio de sesión SSH de root habilitado
- Políticas de contraseña débiles
- Actualizaciones de seguridad faltantes
"

PRIORIDAD_MEDIA="
- Servicios innecesarios ejecutándose
- Opciones de montaje inseguras
- Monitoreo de integridad de archivos faltante
- Configuración SSL/TLS débil
"

PRIORIDAD_BAJA="
- Configuración de rotación de registros
- Actualizaciones de documentación
- Mejoras de monitoreo
"

Seguimiento de Remediación

# Crear hoja de cálculo de seguimiento de remediación
cat > /root/remediation-plan.csv << EOF
Hallazgo,Prioridad,Estado,Asignado,Fecha Límite,Completado
Usuarios UID 0,Alta,Abierto,Admin,$(date -d '+7 days' +%Y-%m-%d),
SSH Root,Alta,Abierto,Admin,$(date -d '+7 days' +%Y-%m-%d),
Actualizaciones seguridad,Alta,Abierto,Admin,$(date -d '+3 days' +%Y-%m-%d),
EOF

Mejores Prácticas

Calendario Regular de Auditoría

  • Semanal: Auditoría básica automatizada
  • Mensual: Auditoría manual completa
  • Trimestral: Auditoría completa de cumplimiento
  • Anual: Evaluación de seguridad externa

Documentación

  • Mantener registros de auditoría para cumplimiento
  • Documentar todos los hallazgos y remediación
  • Rastrear métricas de seguridad a lo largo del tiempo
  • Control de versiones de scripts de auditoría

Mejora Continua

  • Refinar lista de verificación de auditoría basada en hallazgos
  • Automatizar verificaciones repetitivas
  • Integrar con sistemas de monitoreo
  • Capacitación regular de seguridad

Conclusión

Las auditorías de seguridad regulares son esenciales para mantener una seguridad robusta de servidores Linux. Esta lista de verificación completa proporciona un enfoque sistemático para identificar vulnerabilidades, configuraciones incorrectas y brechas de cumplimiento.

Puntos clave:

Enfoque Sistemático: Sigue la lista de verificación metódicamente para asegurar cobertura completa de todos los dominios de seguridad.

Documentación: Mantén registros detallados de hallazgos, acciones de remediación e historial de auditoría para cumplimiento y análisis de tendencias.

Automatización: Automatiza verificaciones rutinarias mientras mantienes revisión manual de controles de seguridad críticos.

Proceso Continuo: La auditoría de seguridad es continua, no un evento único. Las evaluaciones regulares detectan deriva de configuración y vulnerabilidades emergentes.

Prioridad de Remediación: Atiende hallazgos críticos inmediatamente mientras programas elementos de menor prioridad apropiadamente.

Al implementar esta lista de verificación de auditoría de seguridad y mantener calendarios de evaluación regulares, estableces monitoreo de seguridad proactivo que identifica y aborda vulnerabilidades antes de que puedan ser explotadas, asegurando el cumplimiento con requisitos regulatorios y manteniendo una postura de seguridad robusta.