Escaneo Automatizado de Cumplimiento con OpenSCAP

OpenSCAP es un framework de código abierto que automatiza la verificación de cumplimiento de seguridad en sistemas Linux utilizando el estándar SCAP (Security Content Automation Protocol). Con OpenSCAP puedes aplicar perfiles de seguridad como STIG, CIS Benchmarks o PCI-DSS, generar reportes detallados y automatizar la remediación de vulnerabilidades. Esta guía cubre la instalación, configuración de perfiles de escaneo y automatización de la verificación de cumplimiento.

Requisitos Previos

  • Linux: Ubuntu 20.04+, CentOS 8+, Rocky Linux 8+, RHEL 8+
  • Acceso root o privilegios sudo
  • Al menos 2 GB de espacio libre en disco para contenido SCAP y reportes
  • Acceso a internet para descargar contenido SCAP actualizado

Instalación de OpenSCAP

Ubuntu/Debian

# Instalar herramientas OpenSCAP y contenido SCAP
apt update
apt install -y openscap-scanner libopenscap8 ssg-base ssg-debderived

# Verificar la instalación
oscap --version
oscap info --profiles /usr/share/xml/scap/ssg/content/ssg-ubuntu2004-ds.xml

CentOS/Rocky Linux/RHEL

# Instalar OpenSCAP y contenido SCAP Security Guide
dnf install -y openscap-scanner scap-security-guide

# Verificar instalación
oscap --version

# Listar contenido disponible
ls /usr/share/xml/scap/ssg/content/

Contenido SCAP y Perfiles de Seguridad

Explorar Perfiles Disponibles

# Listar perfiles disponibles en un data stream
oscap info /usr/share/xml/scap/ssg/content/ssg-ubuntu2004-ds.xml

# Para CentOS 8 / Rocky Linux 8
oscap info /usr/share/xml/scap/ssg/content/ssg-rl8-ds.xml

# Para RHEL 8
oscap info /usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml

# Buscar perfiles específicos de CIS
oscap info /usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml | grep -A2 cis

Perfiles Comunes

PerfilIDDescripción
CIS Level 1xccdf_org.ssgproject.content_profile_cis_server_l1Controles básicos de seguridad
CIS Level 2xccdf_org.ssgproject.content_profile_cis_l2_serverControles avanzados
STIGxccdf_org.ssgproject.content_profile_stigGuía técnica de implementación de seguridad
PCI-DSSxccdf_org.ssgproject.content_profile_pci-dssEstándar de seguridad PCI
# Ver todas las reglas de un perfil específico
oscap xccdf generate guide \
    --profile xccdf_org.ssgproject.content_profile_cis_server_l1 \
    /usr/share/xml/scap/ssg/content/ssg-ubuntu2004-ds.xml > /tmp/cis-guide.html

Ejecutar Escaneos de Cumplimiento

Escaneo Básico con Perfil CIS

# Escaneo básico con perfil CIS Level 1 en Ubuntu
oscap xccdf eval \
    --profile xccdf_org.ssgproject.content_profile_cis_server_l1 \
    --results /tmp/scan-results.xml \
    --report /tmp/scan-report.html \
    /usr/share/xml/scap/ssg/content/ssg-ubuntu2004-ds.xml

echo "Escaneo completado. Reporte en /tmp/scan-report.html"

Escaneo con Perfil STIG (RHEL/CentOS)

# Escaneo con perfil STIG en Rocky Linux 8
oscap xccdf eval \
    --profile xccdf_org.ssgproject.content_profile_stig \
    --results /var/log/oscap/stig-results-$(date +%Y%m%d).xml \
    --report /var/www/html/compliance/stig-report-$(date +%Y%m%d).html \
    /usr/share/xml/scap/ssg/content/ssg-rl8-ds.xml

Escaneo con Oval para CVEs

# Descargar definiciones OVAL actualizadas
# Ubuntu
wget -q https://security-metadata.canonical.com/oval/com.ubuntu.focal.usn.oval.xml.bz2
bunzip2 com.ubuntu.focal.usn.oval.xml.bz2

# Escanear por vulnerabilidades conocidas
oscap oval eval \
    --results /tmp/oval-results.xml \
    --report /tmp/oval-report.html \
    com.ubuntu.focal.usn.oval.xml

# Contar vulnerabilidades encontradas
grep -c "result=\"true\"" /tmp/oval-results.xml

Tailoring: Personalizar Perfiles

# Crear perfil personalizado basado en CIS (excluir reglas no aplicables)
oscap xccdf generate fix \
    --fix-type bash \
    --result-id "" \
    --profile xccdf_org.ssgproject.content_profile_cis_server_l1 \
    /usr/share/xml/scap/ssg/content/ssg-ubuntu2004-ds.xml > /tmp/cis-fixes.sh

# Ver cuántas reglas tiene el perfil
grep -c "rule-result" /tmp/scan-results.xml

Generación de Reportes

Script de Reporte Completo

# Script para generar reporte completo de cumplimiento
cat > /usr/local/bin/oscap-report.sh << 'EOF'
#!/bin/bash
# Generación de reporte de cumplimiento OpenSCAP

FECHA=$(date +%Y%m%d_%H%M%S)
DIRECTORIO="/var/log/oscap"
OS=$(. /etc/os-release && echo $ID$VERSION_ID)
mkdir -p "$DIRECTORIO"

# Seleccionar el data stream correcto según el OS
case "$OS" in
    ubuntu20.04) DS="/usr/share/xml/scap/ssg/content/ssg-ubuntu2004-ds.xml" ;;
    ubuntu22.04) DS="/usr/share/xml/scap/ssg/content/ssg-ubuntu2204-ds.xml" ;;
    rocky8*|centos8*) DS="/usr/share/xml/scap/ssg/content/ssg-rl8-ds.xml" ;;
    *) echo "OS no reconocido: $OS"; exit 1 ;;
esac

PERFIL="xccdf_org.ssgproject.content_profile_cis_server_l1"

# Ejecutar escaneo
oscap xccdf eval \
    --profile "$PERFIL" \
    --results "$DIRECTORIO/results-$FECHA.xml" \
    --report "$DIRECTORIO/report-$FECHA.html" \
    "$DS" 2>&1

# Calcular puntuación
PASADAS=$(grep -c "result>pass" "$DIRECTORIO/results-$FECHA.xml" 2>/dev/null || echo 0)
FALLIDAS=$(grep -c "result>fail" "$DIRECTORIO/results-$FECHA.xml" 2>/dev/null || echo 0)
TOTAL=$((PASADAS + FALLIDAS))
PORCENTAJE=0
[ $TOTAL -gt 0 ] && PORCENTAJE=$((PASADAS * 100 / TOTAL))

echo "=== Resumen del Escaneo ==="
echo "Fecha: $FECHA"
echo "Sistema: $(hostname)"
echo "Reglas pasadas: $PASADAS"
echo "Reglas fallidas: $FALLIDAS"
echo "Puntuación: $PORCENTAJE%"
echo "Reporte completo: $DIRECTORIO/report-$FECHA.html"
EOF
chmod +x /usr/local/bin/oscap-report.sh

Comparar Resultados entre Escaneos

# Comparar dos escaneos para ver progreso
oscap xccdf resolve \
    -o /tmp/resolved.xml \
    /usr/share/xml/scap/ssg/content/ssg-ubuntu2004-ds.xml

# Generar reporte diferencial entre dos resultados
oscap xccdf generate report \
    --result-id xccdf_org.open-scap_testresult_xccdf_org.ssgproject \
    /var/log/oscap/results-anterior.xml \
    /var/log/oscap/results-actual.xml

Remediación Automatizada

Generar Script de Remediación Bash

# Generar script de remediación desde los resultados del escaneo
oscap xccdf generate fix \
    --fix-type bash \
    --result-id "" \
    --output /tmp/remediation-$(date +%Y%m%d).sh \
    /var/log/oscap/results-$(date +%Y%m%d)*.xml

# Revisar el script antes de ejecutarlo
head -100 /tmp/remediation-*.sh

# Ejecutar remediación (con precaución en producción)
# chmod +x /tmp/remediation-*.sh
# bash /tmp/remediation-*.sh 2>&1 | tee /var/log/oscap/remediation.log

Generar Playbook de Ansible para Remediación

# Generar playbook de Ansible para remediación
oscap xccdf generate fix \
    --fix-type ansible \
    --profile xccdf_org.ssgproject.content_profile_cis_server_l1 \
    --output /tmp/remediation-playbook.yml \
    /usr/share/xml/scap/ssg/content/ssg-ubuntu2004-ds.xml

# Verificar el playbook generado
head -50 /tmp/remediation-playbook.yml

# Ejecutar con Ansible (en entorno de prueba primero)
# ansible-playbook -i localhost, /tmp/remediation-playbook.yml --check

Automatización con Cron

Escaneos Programados

# Crear directorio para resultados
mkdir -p /var/log/oscap/reports

# Configurar escaneo semanal automático
cat > /etc/cron.d/oscap-compliance << 'EOF'
# Escaneo de cumplimiento OpenSCAP - todos los domingos a las 2:00 AM
0 2 * * 0 root /usr/local/bin/oscap-report.sh >> /var/log/oscap/cron.log 2>&1
EOF

# Rotar logs de OpenSCAP
cat > /etc/logrotate.d/oscap << 'EOF'
/var/log/oscap/cron.log {
    weekly
    rotate 52
    compress
    missingok
    notifempty
}
EOF

Alertas por Correo

# Script de escaneo con alertas
cat > /usr/local/bin/oscap-alert.sh << 'EOF'
#!/bin/bash
# Escaneo con alerta si la puntuación baja del umbral

UMBRAL=80
/usr/local/bin/oscap-report.sh > /tmp/oscap-output.txt 2>&1
PUNTUACION=$(grep "Puntuación:" /tmp/oscap-output.txt | awk '{print $2}' | tr -d '%')

if [ -n "$PUNTUACION" ] && [ "$PUNTUACION" -lt "$UMBRAL" ]; then
    mail -s "ALERTA: Cumplimiento OpenSCAP bajo en $(hostname): ${PUNTUACION}%" \
        [email protected] < /tmp/oscap-output.txt
fi
EOF
chmod +x /usr/local/bin/oscap-alert.sh

Solución de Problemas

Error: "No se puede cargar el data stream":

# Verificar que el archivo SCAP existe
ls -la /usr/share/xml/scap/ssg/content/
# Reinstalar el contenido SCAP
apt install --reinstall ssg-base ssg-debderived  # Ubuntu
# dnf reinstall scap-security-guide  # CentOS/Rocky

El escaneo tarda demasiado:

# Ejecutar con solo reglas de una categoría
oscap xccdf eval \
    --profile xccdf_org.ssgproject.content_profile_cis_server_l1 \
    --rule xccdf_org.ssgproject.content_rule_sshd_disable_root_login \
    /usr/share/xml/scap/ssg/content/ssg-ubuntu2004-ds.xml

Errores de permisos en el escaneo:

# OpenSCAP requiere root para algunos controles
sudo oscap xccdf eval --profile ... /path/to/ds.xml
# Verificar que auditd está activo para reglas de auditoría
systemctl status auditd

Reporte HTML vacío o incompleto:

# Verificar que libxml2 está instalado
dpkg -l libxml2 libxslt1.1  # Ubuntu
# Regenerar reporte desde resultados existentes
oscap xccdf generate report /var/log/oscap/results-*.xml

Conclusión

OpenSCAP proporciona una solución robusta y automatizable para verificar el cumplimiento de seguridad en infraestructura Linux, con soporte para los principales estándares como CIS, STIG y PCI-DSS. La combinación de escaneos programados, generación automática de reportes y remediación mediante scripts bash o playbooks de Ansible permite mantener un estado de cumplimiento continuo. Ejecuta escaneos regulares, documenta las excepciones aceptadas y prioriza la remediación de hallazgos de alta severidad.