Cumplimiento SOC 2 en Infraestructura Linux
SOC 2 es un estándar de auditoría desarrollado por el AICPA que evalúa los controles de una organización en cinco criterios de servicios de confianza: seguridad, disponibilidad, integridad del procesamiento, confidencialidad y privacidad. Implementar SOC 2 en servidores Linux requiere establecer controles técnicos sólidos, registros de auditoría completos y procedimientos documentados. Esta guía cubre los controles clave para preparar tu infraestructura Linux para una auditoría SOC 2 de tipo I o tipo II.
Requisitos Previos
- Servidores Linux (Ubuntu 20.04+, CentOS 8+, Rocky Linux 8+)
- Acceso root o privilegios sudo
- Documentación de políticas de seguridad existentes
- Herramientas: auditd, rsyslog, OpenSSL, fail2ban
- Comprensión básica de los cinco criterios de servicios de confianza (TSC)
Criterios de Servicios de Confianza
SOC 2 se basa en cinco criterios (TSC). Para la mayoría de los proveedores de infraestructura en la nube, los más relevantes son:
- CC - Common Criteria (Seguridad): Obligatorio para todos los reportes SOC 2
- A - Availability (Disponibilidad): Uptime, SLAs, recuperación ante desastres
- PI - Processing Integrity: Procesamiento completo y preciso
- C - Confidentiality: Protección de información confidencial
- P - Privacy: Manejo de información personal
Para cada criterio debes mapear controles existentes y documentar evidencia:
# Crear estructura de directorios para evidencia SOC 2
mkdir -p /opt/soc2-evidence/{access-logs,change-management,vulnerability-scans,backups,configurations}
# Generar inventario inicial del sistema
uname -a > /opt/soc2-evidence/configurations/system-info.txt
cat /etc/os-release >> /opt/soc2-evidence/configurations/system-info.txt
dpkg -l >> /opt/soc2-evidence/configurations/packages.txt # Debian/Ubuntu
# rpm -qa >> /opt/soc2-evidence/configurations/packages.txt # CentOS/Rocky
Control de Acceso y Autenticación
Gestión de Usuarios y Privilegios Mínimos
SOC 2 CC6.1 requiere acceso basado en el principio de mínimo privilegio:
# Listar todos los usuarios con acceso de shell
grep -E '/bin/(bash|sh|zsh)$' /etc/passwd
# Auditar membresía del grupo sudo
getent group sudo wheel
# Revisar usuarios con UID 0 (solo root debería tenerlo)
awk -F: '($3 == "0") {print}' /etc/passwd
# Deshabilitar cuentas de usuarios inactivos
passwd -l nombre_usuario
# Configurar expiración de contraseñas (máximo 90 días)
chage -M 90 -W 14 nombre_usuario
chage -l nombre_usuario # Verificar configuración
Configuración SSH Segura
# Editar /etc/ssh/sshd_config con las siguientes directivas
cat >> /etc/ssh/sshd_config << 'EOF'
# Deshabilitar autenticación por contraseña
PasswordAuthentication no
# Solo permitir autenticación con clave pública
PubkeyAuthentication yes
# Deshabilitar login root directo
PermitRootLogin no
# Deshabilitar reenvío X11
X11Forwarding no
# Establecer timeout de sesión inactiva
ClientAliveInterval 300
ClientAliveCountMax 2
# Permitir solo usuarios específicos
AllowUsers usuario1 usuario2
# Protocolo SSH
Protocol 2
EOF
systemctl restart sshd
Autenticación Multifactor (MFA)
# Instalar Google Authenticator PAM
apt install libpam-google-authenticator # Ubuntu/Debian
# dnf install google-authenticator-libpam # CentOS/Rocky
# Configurar PAM para SSH con MFA
# Añadir al archivo /etc/pam.d/sshd
echo "auth required pam_google_authenticator.so nullok" >> /etc/pam.d/sshd
# En sshd_config, habilitar challenge-response
sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/' /etc/ssh/sshd_config
systemctl restart sshd
Registro de Auditoría y Monitoreo
Configuración de auditd (CC7.2)
El daemon de auditoría registra eventos del sistema requeridos por SOC 2:
# Instalar auditd
apt install auditd audispd-plugins # Ubuntu/Debian
# dnf install audit # CentOS/Rocky
# Configurar reglas de auditoría críticas
cat > /etc/audit/rules.d/soc2.rules << 'EOF'
# Registrar cambios en archivos de autenticación
-w /etc/passwd -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/sudoers -p wa -k identity
-w /etc/sudoers.d/ -p wa -k identity
# Registrar accesos con privilegios elevados
-a always,exit -F arch=b64 -S execve -F euid=0 -F auid>=1000 -F auid!=-1 -k privileged
# Registrar cambios en configuración SSH
-w /etc/ssh/sshd_config -p wa -k sshd
# Registrar montaje de sistemas de archivos
-a always,exit -F arch=b64 -S mount -F auid>=1000 -F auid!=-1 -k mounts
# Registrar eliminación de archivos
-a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=-1 -k delete
# Registrar cambios en políticas de auditoría
-e 2
EOF
# Recargar reglas
augenrules --load
systemctl enable --now auditd
Configuración de rsyslog para Logs Centralizados
# Configurar reenvío de logs a servidor SIEM centralizado
cat > /etc/rsyslog.d/soc2-forwarding.conf << 'EOF'
# Enviar todos los logs al servidor central de logs
*.* @siem-server.ejemplo.com:514
# Guardar logs de autenticación localmente también
auth,authpriv.* /var/log/auth.log
EOF
systemctl restart rsyslog
# Verificar que los logs se están enviando
logger -t soc2-test "Prueba de configuración SOC 2"
tail -f /var/log/syslog
Monitoreo de Integridad de Archivos (CC6.8)
# Instalar y configurar AIDE
apt install aide # Ubuntu/Debian
# dnf install aide # CentOS/Rocky
# Inicializar base de datos de AIDE
aide --init
mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# Configurar verificación diaria automática
cat > /etc/cron.daily/aide-check << 'EOF'
#!/bin/bash
# Verificación diaria de integridad de archivos para SOC 2
REPORT="/var/log/aide/aide-$(date +%Y%m%d).log"
/usr/bin/aide --check > "$REPORT" 2>&1
# Enviar alerta si hay cambios
if grep -q "changed\|removed\|added" "$REPORT"; then
mail -s "AIDE: Cambios detectados en $(hostname)" [email protected] < "$REPORT"
fi
EOF
chmod +x /etc/cron.daily/aide-check
Cifrado y Protección de Datos
Cifrado en Tránsito (CC6.7)
# Verificar que TLS 1.2+ está habilitado en servicios web
openssl s_client -connect localhost:443 -tls1_2
# Configurar Nginx con cifrado fuerte
cat > /etc/nginx/snippets/ssl-params.conf << 'EOF'
# Protocolos TLS seguros
ssl_protocols TLSv1.2 TLSv1.3;
# Ciphers fuertes
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# HSTS
add_header Strict-Transport-Security "max-age=63072000" always;
EOF
Cifrado en Reposo
# Verificar cifrado de disco con LUKS
lsblk -f | grep -E 'TYPE|crypto'
cryptsetup status /dev/mapper/sda3_crypt
# Para nuevas particiones, configurar LUKS
# cryptsetup luksFormat /dev/sdb1
# cryptsetup luksOpen /dev/sdb1 datos_cifrados
# Cifrar archivos sensibles con GPG
gpg --symmetric --cipher-algo AES256 archivo-sensible.txt
Gestión de Cambios
Procedimiento de Control de Cambios (CC8.1)
# Script para registrar cambios del sistema
cat > /usr/local/bin/registrar-cambio.sh << 'EOF'
#!/bin/bash
# Registrar cambio del sistema para SOC 2 CC8.1
FECHA=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
USUARIO=$(whoami)
HOSTNAME=$(hostname)
CAMBIO_ID="CHG-$(date +%Y%m%d-%H%M%S)"
echo "[$FECHA] CAMBIO_ID=$CAMBIO_ID USUARIO=$USUARIO HOST=$HOSTNAME DESCRIPCION=$1" \
>> /var/log/change-management.log
echo "Cambio registrado: $CAMBIO_ID"
EOF
chmod +x /usr/local/bin/registrar-cambio.sh
# Uso: registrar-cambio.sh "Actualización de paquetes de seguridad - CVE-2024-XXXX"
Gestión de Vulnerabilidades
# Configurar actualizaciones automáticas de seguridad
apt install unattended-upgrades # Ubuntu/Debian
dpkg-reconfigure --priority=low unattended-upgrades
# Para CentOS/Rocky
# dnf install dnf-automatic
# systemctl enable --now dnf-automatic-install.timer
# Generar reporte de vulnerabilidades
apt list --upgradable 2>/dev/null | grep -i security > /opt/soc2-evidence/vulnerability-scans/pending-$(date +%Y%m%d).txt
Disponibilidad y Recuperación
Monitoreo de Disponibilidad (A1.1)
# Script de verificación de disponibilidad para evidencia SOC 2
cat > /usr/local/bin/availability-check.sh << 'EOF'
#!/bin/bash
# Verificación de disponibilidad de servicios críticos
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
LOG="/var/log/availability.log"
# Verificar servicios críticos
for SERVICE in nginx mysql postgresql redis; do
STATUS=$(systemctl is-active $SERVICE 2>/dev/null || echo "no instalado")
echo "$TIMESTAMP SERVICE=$SERVICE STATUS=$STATUS" >> $LOG
done
# Verificar espacio en disco
DISK_USAGE=$(df / | awk 'NR==2{print $5}')
echo "$TIMESTAMP METRIC=disk_usage VALUE=$DISK_USAGE" >> $LOG
EOF
chmod +x /usr/local/bin/availability-check.sh
# Programar ejecución cada 5 minutos
echo "*/5 * * * * root /usr/local/bin/availability-check.sh" > /etc/cron.d/soc2-availability
Recopilación de Evidencia
Automatización de Evidencia Mensual
# Script para recopilar evidencia mensual para auditores
cat > /usr/local/bin/collect-soc2-evidence.sh << 'EOF'
#!/bin/bash
# Recopilación de evidencia SOC 2 para auditores
FECHA=$(date +%Y%m)
DIR="/opt/soc2-evidence/monthly-$FECHA"
mkdir -p "$DIR"
# Usuarios y accesos
getent passwd | awk -F: '$3 >= 1000' > "$DIR/users.txt"
getent group sudo wheel > "$DIR/privileged-groups.txt"
last -n 100 > "$DIR/recent-logins.txt"
lastb -n 50 > "$DIR/failed-logins.txt" 2>&1
# Configuración de seguridad
sshd -T > "$DIR/sshd-config.txt"
ufw status verbose > "$DIR/firewall-status.txt" 2>/dev/null
iptables -L -n > "$DIR/iptables.txt" 2>/dev/null
# Actualizaciones de seguridad
apt list --installed 2>/dev/null > "$DIR/installed-packages.txt"
# Logs de auditoría del mes
ausearch --start this-month --key identity > "$DIR/identity-changes.txt" 2>/dev/null
echo "Evidencia recopilada en: $DIR"
EOF
chmod +x /usr/local/bin/collect-soc2-evidence.sh
Solución de Problemas
Los logs de auditd no se están generando:
systemctl status auditd
auditctl -s # Verificar estado del subsistema
journalctl -u auditd -n 50
Faltan registros de autenticación:
# Verificar configuración de PAM
cat /etc/pam.d/sshd | grep pam_unix
# Verificar que rsyslog está activo
systemctl status rsyslog
tail -50 /var/log/auth.log
AIDE reporta demasiados falsos positivos:
# Excluir directorios que cambian frecuentemente
echo "!/var/log" >> /etc/aide/aide.conf
echo "!/tmp" >> /etc/aide/aide.conf
# Reinicializar base de datos después de cambios legítimos
aide --init && mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db
Error al generar reporte de cambios:
ls -la /var/log/change-management.log
chmod 640 /var/log/change-management.log
Conclusión
Implementar SOC 2 en infraestructura Linux requiere un enfoque sistemático que combine controles técnicos, registros de auditoría y documentación de evidencia. Los controles cubiertos en esta guía—acceso, auditoría, cifrado, gestión de cambios y disponibilidad—forman la base para superar una auditoría SOC 2 Tipo II. Mantén los registros actualizados y ejecuta revisiones periódicas de los controles para asegurar el cumplimiento continuo.


