Linux Compliance-Audit 2026: CIS-Benchmark mit OpenSCAP scannen und mit Ansible automatisiert härten

Praxisleitfaden 2026 zum automatisierten Linux-Compliance-Audit: CIS-Benchmark-Scan mit OpenSCAP, Reports interpretieren und Schwachstellen mit generierten Ansible-Playbooks beheben — als wiederholbarer DevSecOps-Workflow.

CIS-Audit Linux 2026: OpenSCAP & Ansible

Ein gehärtetes System ist nur dann wirklich sicher, wenn man die Härtung auch nachweisen kann. Klingt banal, ist aber genau die Hürde, an der die meisten Audits scheitern: ISO 27001, BSI-Grundschutz, PCI DSS — sie alle verlangen dokumentierte, reproduzierbare Konfigurations-Checks. Nicht „Vertrau uns, wir haben das gemacht", sondern Belege.

In diesem Praxisleitfaden 2026 zeige ich Ihnen Schritt für Schritt, wie Sie einen Linux-Server mit OpenSCAP gegen den CIS-Benchmark scannen, die Ergebnisse interpretieren und mit einem generierten Ansible-Playbook automatisiert remediieren — als wiederholbarer Scan-Fix-Verify-Workflow für DevSecOps-Pipelines. Also los.

Warum automatisiertes Compliance-Auditing 2026 unverzichtbar ist

Ehrlich gesagt: Manuelles Abhaken einer 300-Zeilen-Härtungs-Checkliste ist 2026 schlicht keine Option mehr. Drei Treiber haben das Spielfeld endgültig verschoben:

  • Supply-Chain-Angriffe auf Open-Source-Pakete und CI/CD-Pipelines erfordern eine kontinuierliche Validierung der Soll-Konfiguration — nicht punktuelle Stichproben einmal im Quartal.
  • Cloud-native Skalierung — Hunderte ephemerer VMs, Container und Edge-Knoten lassen sich nur mit maschinenlesbaren Policies sinnvoll auditieren. Per Hand? Vergessen Sie's.
  • Regulatorischer Druck durch NIS2 (seit Oktober 2024 in DE umgesetzt), DORA für Finanzdienstleister und der EU AI Act fordern reproduzierbare, dokumentierte Konfigurations-Nachweise.

Genau hier setzt der SCAP-Stack an: Security Content Automation Protocol ist ein NIST-Standard, der Härtungs-Policies in maschinenlesbarem XML beschreibt — inklusive automatischer Remediation. Klingt sperrig, ist in der Praxis aber überraschend angenehm.

Toolchain im Überblick: OpenSCAP, SSG, CIS und Ansible

Vier Komponenten greifen ineinander:

  • OpenSCAP (oscap) — der Open-Source-Scanner, der SCAP-Inhalte ausführt. Liefert XCCDF-Ergebnisse, OVAL-Schwachstellen-Scans und (sehr nützlich für Reviews) hübsche HTML-Reports.
  • SCAP Security Guide (SSG) — das Paket scap-security-guide mit fertigen Profilen für CIS, STIG, BSI-Grundschutz, ANSSI-BP-028, OSPP und mehr.
  • CIS-Benchmark — der De-facto-Standard für Server-Härtung. Level 1 ist betriebssicher, Level 2 erhöht Schutz auf Kosten von Komfort.
  • Ansible — agentenlose Automatisierung. Das Schöne: oscap erzeugt aus Scan-Resultaten direkt Ansible-Playbooks zur Behebung jedes Fail-Findings.

Der entscheidende Vorteil? Sie schreiben keine Härtungs-Skripte mehr selbst. Sie konsumieren geprüfte, versionierte SCAP-Inhalte und übersetzen sie in idempotente Ansible-Tasks. Das spart nicht nur Zeit — es spart Bugs.

Voraussetzungen

  • RHEL 9, AlmaLinux 9, Rocky Linux 9 oder Ubuntu 24.04 LTS (mit USG)
  • Root-Zugriff oder sudo
  • Mindestens 2 GB freier Speicher unter /var (für Reports — die werden über die Zeit größer als gedacht)
  • Optional, aber empfohlen: Ansible 2.16+ auf einer Steuer-Maschine

Schritt 1: OpenSCAP und SCAP Security Guide installieren

Auf RHEL 9 / AlmaLinux 9 / Rocky Linux 9 ist es ein Einzeiler:

sudo dnf install -y openscap-scanner scap-security-guide openscap-utils
oscap --version
# OpenSCAP command line tool (oscap) 1.3.10
rpm -q scap-security-guide
# scap-security-guide-0.1.76-1.el9

Auf Ubuntu 24.04 LTS verwenden Sie das Ubuntu-eigene Ubuntu Security Guide (USG), das auf OpenSCAP basiert:

sudo apt update
sudo apt install -y libopenscap8 ssg-base ssg-debderived
# Pro-Subscription für USG (kostenlos für bis zu 5 Maschinen):
sudo pro attach <TOKEN>
sudo pro enable usg
sudo apt install -y usg

Schritt 2: Verfügbare CIS-Profile auflisten

Die SSG-Inhalte liegen in /usr/share/xml/scap/ssg/content/. Inspizieren Sie das passende Datastream:

ls /usr/share/xml/scap/ssg/content/ | grep rhel9
# ssg-rhel9-ds.xml
# ssg-rhel9-oval.xml
# ssg-rhel9-xccdf.xml

oscap info /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml | grep -E "Profile|Title:"

Typische Ausgabe (gekürzt — die Liste ist länger):

Profile
  Title: CIS Red Hat Enterprise Linux 9 Benchmark for Level 1 - Server
  Id: xccdf_org.ssgproject.content_profile_cis_server_l1
Profile
  Title: CIS Red Hat Enterprise Linux 9 Benchmark for Level 2 - Server
  Id: xccdf_org.ssgproject.content_profile_cis
Profile
  Title: CIS Red Hat Enterprise Linux 9 Benchmark for Level 1 - Workstation
  Id: xccdf_org.ssgproject.content_profile_cis_workstation_l1
Profile
  Title: DISA STIG for Red Hat Enterprise Linux 9
  Id: xccdf_org.ssgproject.content_profile_stig
Profile
  Title: ANSSI-BP-028 (high)
  Id: xccdf_org.ssgproject.content_profile_anssi_bp28_high

Welches Profil wählen?

ProfilZielgruppeAuswirkung
cis_server_l1Produktive Web-/App-ServerNiedrig, kompatibel
cis (L2 Server)Hoch-sensible WorkloadsMittel, ggf. Funktionsverlust
stigBehörden, VerteidigungHoch, sehr restriktiv
anssi_bp28_highFranzösische OIV/OSEHoch

Mein Rat: Für die meisten Unternehmen ist CIS Level 1 Server der richtige Einstieg. Sie können später auf Level 2 oder STIG eskalieren — und glauben Sie mir, das wollen Sie auch erst tun, wenn L1 stabil läuft.

Schritt 3: Den ersten CIS-Scan ausführen

Legen Sie zunächst ein Verzeichnis für Audit-Artefakte an:

sudo mkdir -p /var/log/compliance
sudo chmod 750 /var/log/compliance

Und dann starten Sie den Scan gegen das CIS-Level-1-Server-Profil:

sudo oscap xccdf eval   --profile xccdf_org.ssgproject.content_profile_cis_server_l1   --results   /var/log/compliance/cis-l1-results.xml   --report    /var/log/compliance/cis-l1-report.html   --oval-results   /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml

echo "Exit-Code: $?"
# 0 = alle Regeln bestanden
# 2 = mindestens eine Regel fehlgeschlagen

Der Scan dauert je nach System 1–5 Minuten. Pro Regel sehen Sie live pass, fail, notapplicable oder notchecked. Den Output kann man durchaus laufen lassen und sich nebenbei einen Kaffee holen.

Schritt 4: Ergebnisse interpretieren

Öffnen Sie den HTML-Report im Browser oder transferieren Sie ihn auf Ihre Workstation:

scp root@server:/var/log/compliance/cis-l1-report.html ./
# oder:
python3 -m http.server 8000 --directory /var/log/compliance

Der Report ist farbcodiert — was ich tatsächlich für eine der besten UX-Entscheidungen im OpenSCAP-Ökosystem halte:

  • Grün (Pass) — Regel erfüllt
  • Rot (Fail) — Regel verletzt; Remediation nötig
  • Grau (Not Applicable) — Regel trifft auf System nicht zu (z. B. Cloud-Service deaktiviert)
  • Blau (Manual) — Manuelle Prüfung erforderlich (z. B. physische Zugangskontrolle)

Wenn Sie schnell nur die fehlgeschlagenen Regeln per Kommandozeile sehen wollen:

grep -E 'idref|result' /var/log/compliance/cis-l1-results.xml   | grep -B1 'result="fail"'   | grep idref   | sed -E 's/.*idref="([^"]+)".*/^A/'

Realistische Ausgangslage: Ein frisch installiertes RHEL 9 erreicht typischerweise 55–70 % CIS-L1-Compliance. Klingt erstmal mau, aber das ist normal — und nach automatisierter Remediation sind 92–98 % erreichbar. Die letzten Prozente betreffen meist umgebungsspezifische Manual-Checks.

Schritt 5: Ansible-Playbook für die Remediation generieren

Jetzt wird's nett. OpenSCAP erzeugt aus dem Scan-Resultat direkt einen Ansible-Playbook, der nur die fehlgeschlagenen Regeln behebt:

sudo oscap xccdf generate fix   --fix-type ansible   --result-id ""   --output /var/log/compliance/cis-l1-remediation.yml   /var/log/compliance/cis-l1-results.xml

# Alternative: Bash-Skript (wenn Ansible nicht verfügbar)
sudo oscap xccdf generate fix   --fix-type bash   --result-id ""   --output /var/log/compliance/cis-l1-remediation.sh   /var/log/compliance/cis-l1-results.xml

Niemals ungeprüft ausführen. Ich kann das nicht oft genug betonen — sichten Sie den Playbook erst:

head -80 /var/log/compliance/cis-l1-remediation.yml

Ein typischer Auszug sieht so aus:

- hosts: all
  vars:
    var_password_pam_minlen: '14'
    var_password_pam_dcredit: '-1'
  tasks:
    - name: Set Password Minimum Length in login.defs
      lineinfile:
        path: /etc/login.defs
        regexp: '^PASS_MIN_LEN'
        line: 'PASS_MIN_LEN 14'
        state: present
      tags:
        - CCE-90871-9
        - NIST-800-53-IA-5(f)
        - PCI-DSS-Req-8.2.3
        - low_complexity
        - medium_severity

Beachten Sie die Tags — sie mappen jede Regel auf konkrete Compliance-Frameworks (NIST 800-53, PCI DSS, ISO 27001, DISA STIG). Das ist Gold wert für Auditoren. Im Ernst: Ich habe schon erlebt, wie Auditoren mit diesem Tag-Mapping eine ganze Frageliste in zehn Minuten abhaken konnten, statt eine Stunde Diskussion.

Schritt 6: Vorgefertigte SSG-Playbooks für Vollprofile nutzen

Wenn Sie ein komplettes Profil anwenden wollen (statt nur die aktuellen Fails), liefert scap-security-guide bereits geprüfte Playbooks:

ls /usr/share/scap-security-guide/ansible/ | grep cis
# rhel9-playbook-cis_server_l1.yml
# rhel9-playbook-cis.yml
# rhel9-playbook-cis_workstation_l1.yml
# rhel9-playbook-cis_workstation_l2.yml

Lokale Anwendung mit ansible-playbook:

sudo ansible-playbook   -i 'localhost,'   -c local   /usr/share/scap-security-guide/ansible/rhel9-playbook-cis_server_l1.yml

Remote auf eine Server-Flotte:

cat > inventory.ini <<EOF
[webservers]
web01.example.com
web02.example.com
web03.example.com
EOF

ansible-playbook -i inventory.ini --become   --check --diff   /usr/share/scap-security-guide/ansible/rhel9-playbook-cis_server_l1.yml

Das --check --diff-Paar ist Pflicht für den ersten Lauf: kein Schreibzugriff, aber Diff aller geplanten Änderungen. Dieser Schritt hat mir schon mehr als einmal den Hintern gerettet.

Schritt 7: Tailoring — Ausnahmen sauber dokumentieren

Nicht jede CIS-Regel passt zu jeder Umgebung, das ist eine simple Wahrheit. Beispiel: CIS verlangt das Deaktivieren von chronyd-Clients ohne authentifizierten NTP-Server — in einer Air-Gapped-Umgebung ist das schlicht unsinnig. Statt die Regel ungelöst zu lassen oder den Playbook zu hacken (was übrigens die schlechteste aller Optionen ist), erstellen Sie eine Tailoring-Datei:

sudo dnf install -y scap-workbench
scap-workbench &

SCAP Workbench (GUI) lädt das Profil, erlaubt das Ab-/Anwählen einzelner Regeln und exportiert eine tailoring.xml. Beim Scan wird sie ergänzend übergeben:

sudo oscap xccdf eval   --profile xccdf_org.ssgproject.content_profile_cis_server_l1_customized   --tailoring-file /etc/compliance/tailoring.xml   --results /var/log/compliance/cis-l1-results.xml   --report  /var/log/compliance/cis-l1-report.html   /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml

Jede Ausnahme erhält in der Tailoring-Datei eine Begründung — auditfähig und versionierbar in Git. Das ist genau der Unterschied zwischen „wir haben halt eine Ausnahme gemacht" und „hier ist die dokumentierte, geprüfte Risikoabwägung".

Schritt 8: Wiederkehrender Scan-Fix-Verify-Workflow per Cron

Audits sind kein einmaliges Event. (Wäre schön, ist aber so.) Automatisieren Sie wöchentliche Scans mit einem systemd-Timer:

sudo tee /etc/systemd/system/oscap-scan.service >/dev/null <<'EOF'
[Unit]
Description=Weekly OpenSCAP CIS Compliance Scan

[Service]
Type=oneshot
ExecStart=/usr/local/bin/oscap-scan.sh
EOF

sudo tee /etc/systemd/system/oscap-scan.timer >/dev/null <<'EOF'
[Unit]
Description=Run OpenSCAP scan weekly

[Timer]
OnCalendar=Mon *-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now oscap-scan.timer

Und das passende Skript:

sudo tee /usr/local/bin/oscap-scan.sh >/dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

DATE=$(date +%Y-%m-%d)
OUTDIR=/var/log/compliance/${DATE}
mkdir -p "${OUTDIR}"

oscap xccdf eval   --profile xccdf_org.ssgproject.content_profile_cis_server_l1   --results "${OUTDIR}/results.xml"   --report  "${OUTDIR}/report.html"   /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml || true

PASS=$(grep -c 'result="pass"'  "${OUTDIR}/results.xml" || echo 0)
FAIL=$(grep -c 'result="fail"' "${OUTDIR}/results.xml" || echo 0)

logger -t oscap "CIS L1 scan: ${PASS} pass, ${FAIL} fail"
echo "Compliance: $(hostname) — pass=${PASS} fail=${FAIL}"   | mail -s "OpenSCAP weekly report" [email protected]
EOF
sudo chmod 750 /usr/local/bin/oscap-scan.sh

Schritt 9: Integration in DevSecOps-Pipelines

Für CI/CD lässt sich der Scan als Pipeline-Stage betreiben — Commits, die die Compliance unterhalb eines Schwellwerts drücken, werden geblockt. Das ist die Stelle, an der Compliance plötzlich operativ wird.

GitLab-CI-Beispiel

compliance_scan:
  stage: test
  image: registry.access.redhat.com/ubi9/ubi:latest
  before_script:
    - dnf install -y openscap-scanner scap-security-guide
  script:
    - oscap xccdf eval
        --profile xccdf_org.ssgproject.content_profile_cis_server_l1
        --results results.xml
        --report  report.html
        /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml || true
    - PASS=$(grep -c 'result="pass"' results.xml)
    - FAIL=$(grep -c 'result="fail"' results.xml)
    - SCORE=$(awk "BEGIN { printf "%.1f", ${PASS}*100/(${PASS}+${FAIL}) }")
    - echo "Compliance score $SCORE %"
    - test "$(echo "$SCORE >= 90" | bc)" -eq 1
  artifacts:
    when: always
    paths: [results.xml, report.html]
    expire_in: 90 days

Mit einem Schwellwert von 90 % wird der Build rot, wenn jemand eine kritische CIS-Regel verletzt — z. B. durch ein versehentliches sshd_config-Diff. Das fängt Fehler ab, bevor sie in Produktion landen.

Container-Images scannen

OpenSCAP scannet auch OCI-Images offline:

sudo oscap-podman   registry.access.redhat.com/ubi9/ubi:latest   xccdf eval   --profile xccdf_org.ssgproject.content_profile_cis_server_l1   --report ubi9-cis-report.html   /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml

Schritt 10: Re-Scan und Compliance-Score messen

Nach jedem Remediation-Lauf scannen Sie erneut und vergleichen die Scores. Hier ein einfaches Beispielskript:

#!/usr/bin/env bash
RES=$1
PASS=$(grep -c 'result="pass"' "$RES")
FAIL=$(grep -c 'result="fail"' "$RES")
NA=$(grep -c 'result="notapplicable"' "$RES")
TOTAL=$((PASS + FAIL))
SCORE=$(awk "BEGIN { printf "%.2f", ${PASS}*100/${TOTAL} }")
printf "Score:   %s%%
Pass:    %d
Fail:    %d
N/A:     %d
"   "$SCORE" "$PASS" "$FAIL" "$NA"

Halten Sie die Scores in einer Zeitreihe — Prometheus mit node_exporter-Textfile-Collector ist die übliche Wahl. So sehen Sie sofort, wenn ein Drift den Score nach unten zieht. Und ein Drift kommt — meistens dann, wenn Sie es am wenigsten erwarten.

Häufige Stolpersteine

  • "Permissive Trap": SELinux/AppArmor-Regeln werden zwar überprüft, aber das System läuft im permissive-Modus. CIS L1 erkennt das, wenn Sie das richtige Profil verwenden.
  • SSH-Lockout: Aggressive Remediation kann PermitRootLogin deaktivieren, bevor ein Service-User existiert. Immer mit Konsole-Zugang testen — ich spreche aus schmerzlicher Erfahrung.
  • Kernel-Module-Blacklist: CIS deaktiviert cramfs, squashfs, udf. Squashfs ist aber für snap-Pakete und Live-Boot zwingend — Tailoring nötig.
  • FIPS-Mode-Konflikt: STIG aktiviert FIPS, was nicht-FIPS-fähige Crypto-Bibliotheken bricht. Vorab Kompatibilität testen, sonst hagelt es Tickets.

Best Practices 2026

  1. Niemals zuerst auf Produktion remediieren. Staging zuerst, dann Canary, dann Rollout. Klingt selbstverständlich — wird trotzdem regelmäßig ignoriert.
  2. Versionieren Sie Tailoring-Dateien in Git. Jede Ausnahme braucht einen Pull-Request mit Begründung.
  3. Mappen Sie CIS-Tags auf Ihr Compliance-Framework. Auditoren lieben es, wenn ein Finding direkt PCI-DSS-Req-2.2.4 zeigt.
  4. Behandeln Sie Compliance-Score wie ein SLO. Ein Drift unter 95 % ist ein Incident, kein Backlog-Item.
  5. Kombinieren Sie OpenSCAP mit Wazuh oder auditd. SCAP zeigt Konfigurations-Drift, SIEM zeigt aktive Angriffe — beides braucht es.
  6. Auditieren Sie auch CI/CD-Runner. Build-Maschinen werden gern vergessen — sind aber ein klassischer Supply-Chain-Eintrittspunkt.

FAQ — Häufig gestellte Fragen

Was ist der Unterschied zwischen OpenSCAP und Lynis?

Lynis ist ein Bash-basiertes Audit-Tool ohne formales Policy-Modell — schnell, aber ohne standardisierte Rule-IDs oder Remediation-Generierung. OpenSCAP implementiert dagegen den NIST-SCAP-Standard mit XCCDF-Profilen, OVAL-Checks, automatischer Ansible-/Bash-Remediation und Compliance-Framework-Mapping (CIS, STIG, PCI DSS, ISO 27001). Für Audit-Nachweise und reproduzierbare DevSecOps-Pipelines ist OpenSCAP klar die professionellere Wahl; Lynis eignet sich für schnelle Erst-Bewertungen.

Welches CIS-Level sollte ich für einen produktiven Webserver wählen?

In der Regel CIS Level 1 Server. Level 1 ist explizit so designt, dass es ohne Funktionsverluste anwendbar ist. Level 2 erhöht die Sicherheit auf Kosten von Komfort und Kompatibilität (z. B. striktere Filesystem-Mount-Optionen, eingeschränkte Kernel-Module) und ist für hoch-sensible Workloads wie Datenbanken mit PII, Tresore oder PKI-Server gedacht. Mein Rat: Beginnen Sie mit L1, erreichen Sie 95 %+ Score und eskalieren Sie pro Workload-Klasse auf L2.

Funktioniert OpenSCAP auch mit Ubuntu und Debian?

Ja. Ubuntu liefert seit 22.04 das Ubuntu Security Guide (USG), das auf OpenSCAP basiert und CIS-Profile sowie DISA-STIG für Ubuntu enthält. Debian wird durch das Community-Projekt ssg-debderived abgedeckt, wenngleich die Profil-Reife geringer ist als auf RHEL. Auf Ubuntu 24.04 LTS aktivieren Sie USG via sudo pro enable usg; das CLI-Werkzeug usg audit cis_level1_server ist im Grunde ein Wrapper um oscap.

Kann ich OpenSCAP-Berichte für ISO-27001- oder BSI-Audits verwenden?

Direkt nutzbar sind die HTML-/ARF-Reports in jedem Audit, da sie zeitgestempelt, signiert (mit --validate) und mit Rule-IDs auf NIST 800-53, ISO 27001 A.12, PCI DSS, DISA STIG und CCE-Kennungen gemappt sind. Für BSI-Grundschutz existieren keine offiziellen SSG-Profile, aber CIS-L1+L2 deckt >80 % der Bausteine SYS.1.1 (Allgemeiner Server) und SYS.1.3 (Linux/Unix-Server) ab — viele Auditoren akzeptieren CIS-Reports plus dokumentiertes Mapping als Nachweis.

Wie lange dauert ein vollständiger CIS-Scan?

Auf einem typischen 4-vCPU-VM-Server liegt ein CIS-L1-Scan bei 60–180 Sekunden, ein L2-Scan bei 180–300 Sekunden. Der OVAL-Vulnerability-Scan kann zusätzlich 60–120 Sekunden brauchen. Auf Container-Images via oscap-podman sind 30–60 Sekunden realistisch. Für eine Flotte von 100 VMs in paralleler Ansible-Ausführung rechnen Sie mit ~10 Minuten End-to-End — schnell genug für nächtliche Pipeline-Läufe.

Fazit

Compliance-Auditing 2026 funktioniert nur als Code: SCAP-Profile als Single Source of Truth, OpenSCAP als Scanner, Ansible als Remediation-Engine. Die Kombination liefert Auditoren maschinenlesbare Nachweise, dem Ops-Team idempotente Härtungs-Playbooks und der Pipeline ein hartes Compliance-Gate.

Wenn Sie unsere bisherigen Härtungs-Leitfäden zu SSH, Boot-Chain, Container und nftables bereits umgesetzt haben, ist OpenSCAP der logische nächste Baustein — und macht aus einem gehärteten System ein nachweisbar gehärtetes System. Das ist der Unterschied, der im Audit zählt.

Über den Autor Editorial Team

Our team of expert writers and editors.