OpenSCAP : Audit & Conformité Automatisée
Qu'est-ce que SCAP ?
SCAP (Security Content Automation Protocol) est un ensemble de standards pour automatiser l'audit de sécurité et la vérification de conformité. OpenSCAP est l'implémentation open-source de référence, intégrée nativement à RHEL.
Composants SCAP
- XCCDF (eXtensible Configuration Checklist Description Format) : Format de checklist de sécurité
- OVAL (Open Vulnerability and Assessment Language) : Langage pour décrire les tests techniques
- CPE (Common Platform Enumeration) : Identification des systèmes/applications
- CVE (Common Vulnerabilities and Exposures) : Base de données de vulnérabilités
Workflow OpenSCAP
flowchart LR
A[Policy XCCDF/OVAL<br/>ANSSI / CIS / PCI-DSS] --> B[Scanner oscap]
C[Serveur Cible<br/>RHEL 8/9] --> B
B --> D[Rapport HTML<br/>Pass/Fail/Warn]
B --> E[Remédiation<br/>Ansible Playbook]
B --> F[Remédiation<br/>Bash Script]
E --> G[Appliquer Fixes<br/>ansible-playbook]
F --> H[Appliquer Fixes<br/>bash script.sh]
G --> I[Re-Scan<br/>Vérification]
H --> I
style A fill:#2196F3,stroke:#005a9e,color:#fff
style B fill:#4CAF50,stroke:#0b5a0d,color:#fff
style D fill:#FF9800800800,stroke:#d39300,color:#000
style E fill:#FF9800800800,stroke:#a52a00,color:#fff
style F fill:#FF9800800800,stroke:#a52a00,color:#fff
style I fill:#4CAF50,stroke:#0b5a0d,color:#fff
Installation & Découverte
Paquets Requis
# Installer OpenSCAP et les profils de sécurité
dnf install openscap-scanner scap-security-guide -y
# Vérifier la version
oscap --version
# OpenSCAP command line tool (oscap) 1.3.x
# Vérifier les paquets installés
rpm -qa | grep -E "openscap|scap"
# openscap-scanner-1.3.x
# scap-security-guide-0.1.x
Lister les Profils Disponibles
Les profils sont stockés dans /usr/share/xml/scap/ssg/content/.
# Lister les fichiers de contenu
ls /usr/share/xml/scap/ssg/content/
# ssg-rhel8-ds.xml
# ssg-rhel9-ds.xml
# Afficher les profils pour RHEL 9
oscap info /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml
# Sortie partielle :
# Profiles:
# Title: ANSSI-BP-028 (enhanced)
# Id: xccdf_org.ssgproject.content_profile_anssi_bp28_enhanced
# Title: ANSSI-BP-028 (high)
# Id: xccdf_org.ssgproject.content_profile_anssi_bp28_high
# Title: CIS Red Hat Enterprise Linux 9 Benchmark for Level 1 - Server
# Id: xccdf_org.ssgproject.content_profile_cis_server_l1
# Title: PCI-DSS v4.0 Control Baseline for Red Hat Enterprise Linux 9
# Id: xccdf_org.ssgproject.content_profile_pci-dss
Profils Clés pour SecNumCloud
| Profil | ID | Description | Use Case |
|---|---|---|---|
| ANSSI BP-028 Enhanced | anssi_bp28_enhanced |
Niveau renforcé (recommandé SecNumCloud) | Production sensible |
| ANSSI BP-028 High | anssi_bp28_high |
Niveau élevé (maximal) | Systèmes critiques |
| CIS Level 1 Server | cis_server_l1 |
Baseline CIS (compatible prod) | Serveurs génériques |
| CIS Level 2 Server | cis_server_l2 |
CIS avancé (peut casser apps) | Environnements sécurisés |
| PCI-DSS v4.0 | pci-dss |
Conformité bancaire | Traitement cartes bancaires |
| STIG (DoD) | stig |
Standard US Department of Defense | Contexte militaire/gouvernemental |
Exécuter un Audit (Scan)
Scan Basique avec Rapport HTML
# Définir des variables pour simplifier
CONTENT="/usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml"
PROFILE="anssi_bp28_enhanced"
# Scanner le système (génère rapport HTML)
oscap xccdf eval \
--profile $PROFILE \
--report /tmp/report-$(date +%F).html \
$CONTENT
# Résultat :
# Rule evaluation:
# pass: 234
# fail: 45
# notapplicable: 12
# notchecked: 3
# Score: 83.87%
# Ouvrir le rapport
firefox /tmp/report-$(date +%F).html
# Ou copier vers un serveur web
cp /tmp/report-*.html /var/www/html/security/
Scan avec Résultats Détaillés (XML)
# Générer un rapport XML détaillé
oscap xccdf eval \
--profile anssi_bp28_enhanced \
--results /tmp/results-$(date +%F).xml \
--report /tmp/report-$(date +%F).html \
/usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml
Scan d'un Profil CIS
# Scanner avec le profil CIS Level 1
oscap xccdf eval \
--profile cis_server_l1 \
--report /tmp/cis-report-$(date +%F).html \
/usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml
Interpréter les Résultats
Le rapport HTML contient :
- Pass (✅) : Règle conforme
- Fail (❌) : Non-conformité détectée
- Not Applicable (⚪) : Règle non applicable au système
- Not Checked (⚠️) : Test manuel requis
- Score : Pourcentage de conformité global
# Extraire seulement les règles failed
oscap xccdf eval \
--profile anssi_bp28_enhanced \
--results /tmp/results.xml \
/usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml 2>&1 | grep "^fail"
# Exemple de sortie :
# fail xccdf_org.ssgproject.content_rule_accounts_password_minlen_login_defs
# fail xccdf_org.ssgproject.content_rule_audit_rules_privileged_commands
Remédiation Automatique : La Killer Feature
OpenSCAP peut générer automatiquement des scripts de correction pour les règles non-conformes.
Générer un Playbook Ansible
# Scanner ET générer un playbook Ansible de remédiation
oscap xccdf eval \
--profile anssi_bp28_enhanced \
--results /tmp/results.xml \
--report /tmp/report.html \
/usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml
# Générer le playbook depuis les résultats
oscap xccdf generate fix \
--fix-type ansible \
--result-id "" \
/tmp/results.xml > /tmp/remediation.yml
# Contenu du playbook (exemple partiel) :
# - name: Ensure auditd Collects Information on the Use of Privileged Commands
# lineinfile:
# path: /etc/audit/rules.d/privileged.rules
# line: '-a always,exit -F arch=b64 -S execve -C uid!=euid -F euid=0 -k setuid'
# create: yes
Appliquer la Remédiation Ansible
# Vérifier le playbook (dry-run)
ansible-playbook --check /tmp/remediation.yml
# Appliquer les corrections
ansible-playbook /tmp/remediation.yml
# Re-scanner pour vérifier
oscap xccdf eval \
--profile anssi_bp28_enhanced \
--report /tmp/report-after-fix-$(date +%F).html \
/usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml
Générer un Script Bash
# Générer un script bash de remédiation
oscap xccdf generate fix \
--fix-type bash \
--result-id "" \
/tmp/results.xml > /tmp/remediation.sh
# Vérifier le contenu
head -n 50 /tmp/remediation.sh
# #!/bin/bash
# # Remediation script generated by OpenSCAP
#
# # Ensure auditd is enabled
# systemctl enable auditd.service
#
# # Set password minimum length
# sed -i 's/^PASS_MIN_LEN.*/PASS_MIN_LEN\t12/' /etc/login.defs
# Rendre exécutable
chmod +x /tmp/remediation.sh
# Appliquer (⚠️ ATTENTION : tester en dev d'abord !)
/tmp/remediation.sh
Remédiation Automatique : Risques
Les scripts de remédiation peuvent :
- Casser des applications (ex: désactiver des services requis)
- Modifier des configs critiques (SSH, réseau, SELinux)
- Redémarrer des services (perte de connexion)
Workflow recommandé :
- Scanner en dev :
oscap xccdf eval ... - Générer remédiation :
oscap xccdf generate fix ... - Reviewer le script ligne par ligne (ne jamais exécuter en aveugle)
- Tester en dev/staging avec snapshots
- Appliquer en prod en fenêtre de maintenance
- Re-scanner pour valider
Remédiation Sélective (Cherry-Picking)
# Ne corriger QUE certaines règles (exemple : audit)
oscap xccdf eval \
--profile anssi_bp28_enhanced \
--rule xccdf_org.ssgproject.content_rule_audit_rules_privileged_commands \
--remediate \
/usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml
Automatisation : Scan Hebdomadaire
Créer un Script de Scan Automatisé
# Créer le script
cat > /usr/local/bin/openscap-weekly-scan.sh <<'EOF'
#!/bin/bash
CONTENT="/usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml"
PROFILE="anssi_bp28_enhanced"
REPORT_DIR="/var/www/html/security"
DATE=$(date +%F)
# Créer le répertoire si absent
mkdir -p $REPORT_DIR
# Scanner
oscap xccdf eval \
--profile $PROFILE \
--results $REPORT_DIR/results-$DATE.xml \
--report $REPORT_DIR/report-$DATE.html \
$CONTENT
# Créer un lien symbolique vers le dernier rapport
ln -sf $REPORT_DIR/report-$DATE.html $REPORT_DIR/latest.html
# Nettoyer les rapports de plus de 90 jours
find $REPORT_DIR -name "report-*.html" -mtime +90 -delete
find $REPORT_DIR -name "results-*.xml" -mtime +90 -delete
# Envoyer un email avec le score (optionnel)
SCORE=$(grep -oP 'Score: \K[0-9.]+' $REPORT_DIR/report-$DATE.html | head -1)
echo "OpenSCAP Compliance Scan - Score: $SCORE%" | \
mail -s "OpenSCAP Weekly Report - $(hostname)" admin@example.com \
-a $REPORT_DIR/report-$DATE.html
EOF
# Rendre exécutable
chmod +x /usr/local/bin/openscap-weekly-scan.sh
# Tester manuellement
/usr/local/bin/openscap-weekly-scan.sh
Automatiser avec Systemd Timer
# Créer le service
cat > /etc/systemd/system/openscap-scan.service <<EOF
[Unit]
Description=OpenSCAP Compliance Scan
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/openscap-weekly-scan.sh
User=root
EOF
# Créer le timer (chaque lundi à 2h du matin)
cat > /etc/systemd/system/openscap-scan.timer <<EOF
[Unit]
Description=OpenSCAP Weekly Scan Timer
[Timer]
OnCalendar=Mon *-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
EOF
# Activer et démarrer le timer
systemctl daemon-reload
systemctl enable openscap-scan.timer
systemctl start openscap-scan.timer
# Vérifier le timer
systemctl list-timers openscap-scan.timer
# NEXT LEFT LAST PASSED UNIT ACTIVATES
# Mon 2025-01-20 02:00:00 CET 3d left n/a n/a openscap-scan.timer openscap-scan.service
Alternative : Cron Job
# Éditer la crontab root
crontab -e
# Ajouter (chaque lundi à 2h)
0 2 * * 1 /usr/local/bin/openscap-weekly-scan.sh
Scan à Distance (SSH)
OpenSCAP peut scanner des machines distantes via SSH.
# Scanner un serveur distant
oscap-ssh root@192.168.1.100 22 xccdf eval \
--profile anssi_bp28_enhanced \
--report /tmp/remote-report.html \
/usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml
# Avec clé SSH
oscap-ssh --ssh-options="-i /root/.ssh/id_rsa" \
user@server.example.com 22 xccdf eval \
--profile cis_server_l1 \
--report /tmp/remote-cis-report.html \
/usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml
Intégration avec Satellite/Foreman
Red Hat Satellite (ou Foreman + OpenSCAP plugin) permet de centraliser les scans.
# Installer le plugin Foreman (si Satellite/Foreman)
dnf install ruby-smart-proxy-openscap foreman_scap_client -y
# Configurer le client
foreman_scap_client 1 \
--server https://satellite.example.com \
--policy-id 1
# Ou via Ansible (avec Red Hat Insights)
ansible-playbook -i inventory.yml \
/usr/share/scap-security-guide/ansible/rhel9-playbook-anssi_bp28_enhanced.yml
Customiser les Profils (Tailoring)
Si un profil standard ne convient pas exactement, vous pouvez créer un tailoring file.
# Créer un tailoring file pour désactiver certaines règles
oscap xccdf generate guide \
--profile anssi_bp28_enhanced \
/usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml > /tmp/guide.html
# Éditer manuellement le fichier XCCDF (avancé)
# Ou utiliser SCAP Workbench (GUI)
dnf install scap-workbench -y
scap-workbench
Comparaison des Profils : ANSSI vs CIS vs STIG
| Critère | ANSSI BP-028 | CIS Benchmark | STIG (DoD) |
|---|---|---|---|
| Origine | ANSSI (France) | Center for Internet Security (USA) | US Department of Defense |
| Public cible | Administration FR, SecNumCloud | Entreprises internationales | Militaire/Gouvernement US |
| Sévérité | Enhanced < High | Level 1 < Level 2 | Strict (compliance obligatoire) |
| Flexibilité | Modérée | Élevée | Faible (fixes imposés) |
| Compatibilité | Production générale | Production générale | Peut casser des apps legacy |
| Audit fréquence | Recommandée trimestrielle | Variable | Mensuelle minimum |
Dépannage
Erreur : "No matching profile found"
# Vérifier l'ID exact du profil
oscap info /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml | grep "Id:"
# Utiliser l'ID complet ou le nom court
# Nom court :
oscap xccdf eval --profile anssi_bp28_enhanced ...
# ID complet :
oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_anssi_bp28_enhanced ...
Erreur : "File not found"
# Vérifier que scap-security-guide est installé
rpm -qa | grep scap-security-guide
# Vérifier le contenu
ls -lh /usr/share/xml/scap/ssg/content/
# Réinstaller si corrompu
dnf reinstall scap-security-guide -y
Rapport HTML vide ou corrompu
# Utiliser le flag --oval-results pour plus de détails
oscap xccdf eval \
--profile anssi_bp28_enhanced \
--results /tmp/results.xml \
--oval-results \
--report /tmp/report.html \
/usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml
Checklist SecNumCloud avec OpenSCAP
# 1. OpenSCAP installé
rpm -qa | grep openscap-scanner
# 2. Profil ANSSI présent
oscap info /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml | grep -i anssi
# 3. Scan initial effectué
ls -lh /var/www/html/security/latest.html
# 4. Score de conformité > 85%
grep "Score:" /var/www/html/security/latest.html
# 5. Automatisation configurée (systemd timer ou cron)
systemctl is-enabled openscap-scan.timer
# 6. Rapports historiques conservés (90 jours)
ls -lh /var/www/html/security/*.html | wc -l
# 7. Remédiation testée en dev
test -f /tmp/remediation.yml && echo "Playbook ready"