Einleitung (Einordnung, Relevanz für Security/SIEM/Wazuh)
Single Sign-on (SSO) über Microsoft Entra ID ist in vielen SIEM-Umgebungen ein Muss: zentrale Identitäten, MFA, kontrollierte Rollenvergabe und nachvollziehbare Zugriffe auf Dashboards. In Wazuh basiert SSO (SAML) im Kern auf der OpenSearch-Security-Konfiguration des Wazuh Indexers und erfordert ein sauberes Zusammenspiel aus YAML-Struktur, Dateipfaden und dem korrekten Einsatz von securityadmin.sh.
Gerade bei Docker-Deployments entstehen dabei typische Stolpersteine: Dokumentationspfade passen nicht, Konfigurationsdateien werden „best guess“ erstellt, und das Einspielen scheitert mit kryptischen Fehlern wie ERR: Unable to read type from file.
Ausgangslage / Problemstellung (Zusammenfassung, Symptome, Umgebung)
- Wazuh wurde via docker-compose installiert.
- Die offizielle Anleitung für Entra ID SSO verweist auf Pfade unter
/etc/wazuh-indexer/opensearch-security/…, die in Container-Deployments so nicht existieren. - Im Indexer-Container liegen die Security-Dateien typischerweise unter
/usr/share/wazuh-indexer/config/opensearch-security/(Container-intern). - Ein manuell erstelltes/angepasstes
config.ymlwird gemountet. - Das Einspielen mit
securityadmin.shendet mit:
ERR: Unable to read type from file
Technische Analyse (Ursachen, betroffene Komponenten, Architekturbezug, Stolpersteine)
1) Pfad- und Deployment-Unterschiede (Bare Metal vs. Docker)
Die Wazuh SSO-Doku ist funktional korrekt, geht aber implizit von klassischen Installationen aus, in denen Konfigurationen unter /etc/wazuh-indexer/opensearch-security/ liegen. In Docker ist die relevante Stelle dagegen innerhalb des Containers unter …/config/opensearch-security/ zu finden. Das ist ein generelles Muster bei OpenSearch-Docker-Layouts und wird auch in OpenSearch-Beispielen so beschrieben.
2) securityadmin.sh wurde mit -f ohne -t verwendet
OpenSearch Security unterscheidet beim Import:
-cd <dir>: lädt alle YAML-Dateien aus dem Verzeichnis.-f <file>: lädt eine YAML-Datei, erfordert aber zusätzlich-t <type>, damit das Tool weiß, welcher Konfigurationsteil überschrieben werden soll. Das wird in den offiziellen Beispielen explizit gezeigt (-f … internal_users.yml -t internalusers).
Wird -f ohne -t genutzt, passt das exakt zum beobachteten Symptom: das Tool kann keinen „Type“ ableiten → „Unable to read type from file“.
3) Falsche YAML-Struktur: OpenSearch Security erwartet _meta.type: "config" und config.dynamic
Für SAML muss die config.yml nicht nur „irgendwie YAML“ sein, sondern die OpenSearch-Security-Struktur verwenden. In der OpenSearch-Doku ist das klar: config.yml enthält _meta (inkl. type: "config") und die eigentlichen Auth-Domains liegen unter config.dynamic.authc.
Ein häufiges „Docker-SSO“-Problem ist daher eine Datei, die nur authc: am Root hat (wie in vielen Quick-Examples), aber ohne _meta und ohne config.dynamic – dann ist sie nicht kompatibel zur erwarteten OpenSearch-Security-Konfiguration.
4) Risiko: securityadmin.sh überschreibt Konfiguration in .opendistro_security
securityadmin.sh lädt YAML in den Security-Index (historisch .opendistro_security) und kann dabei Teile überschreiben. OpenSearch warnt ausdrücklich davor und empfiehlt Backups, um unabsichtlich Ressourcen zu verlieren.
Lösung / Best Practices (konkrete Schritte, Konfigurationen, Reihenfolge, Side-Effects)
Schritt 1: Korrekte Pfade im Container prüfen
Im Indexer-Container:
ls -l /usr/share/wazuh-indexer/config/opensearch-security/
Das ist die Arbeitsbasis für Templates/SSO in Docker-Setups, analog zu OpenSearch-Docker-Pfaden.
Schritt 2: config.yml in korrekter OpenSearch-Security-Struktur pflegen
Statt Root-authc: direkt muss die Datei dem Muster entsprechen:
_meta.type: "config"config.dynamic.authc.<domain>…
Für SAML gilt außerdem: authentication_backend: noop ist korrekt, weil SAML HTTP-only arbeitet.
Wichtig in Multi-Auth-Setups:
- Ein Basic/Internal-Domain bleibt i. d. R. erhalten (für API-Zugriffe und Service-User).
- Diese Domain steht vor SAML.
challenge: falsefür Basic-Domain ist üblich, damit der Browser-Flow nicht „kaputt challenged“ wird.
Schritt 3: securityadmin.sh korrekt ausführen (und vorher Backup)
Backup (empfohlen):
/usr/share/wazuh-indexer/plugins/opensearch-security/tools/securityadmin.sh \
-backup /usr/share/wazuh-indexer/config/opensearch-security-backup \
-icl -nhnv \
-cacert /usr/share/wazuh-indexer/config/certs/root-ca.pem \
-cert /usr/share/wazuh-indexer/config/certs/admin.pem \
-key /usr/share/wazuh-indexer/config/certs/admin-key.pem
(OpenSearch empfiehlt Backups ausdrücklich, weil securityadmin.sh Konfiguration überschreibt.)
Variante A (robust): Alle YAML-Dateien aus dem Verzeichnis laden
export JAVA_HOME=/usr/share/wazuh-indexer/jdk/
bash /usr/share/wazuh-indexer/plugins/opensearch-security/tools/securityadmin.sh \
-cd /usr/share/wazuh-indexer/config/opensearch-security/ \
-icl -nhnv \
-cacert /usr/share/wazuh-indexer/config/certs/root-ca.pem \
-cert /usr/share/wazuh-indexer/config/certs/admin.pem \
-key /usr/share/wazuh-indexer/config/certs/admin-key.pem \
-h 127.0.0.1
-cd ist die Standardmethode zum Initialisieren/Neu-Laden der Security-Konfiguration.
Variante B (gezielt): Nur config.yml laden – aber mit -t
export JAVA_HOME=/usr/share/wazuh-indexer/jdk/
bash /usr/share/wazuh-indexer/plugins/opensearch-security/tools/securityadmin.sh \
-f /usr/share/wazuh-indexer/config/opensearch-security/config.yml \
-t config \
-icl -nhnv \
-cacert /usr/share/wazuh-indexer/config/certs/root-ca.pem \
-cert /usr/share/wazuh-indexer/config/certs/admin.pem \
-key /usr/share/wazuh-indexer/config/certs/admin-key.pem \
-h 127.0.0.1
Dass -f zusammen mit -t genutzt werden muss, ist in den OpenSearch-Beispielen explizit dokumentiert.
Schritt 4: Diagnose nutzen, wenn es weiterhin klemmt
OpenSearch empfiehlt für nicht selbsterklärende Fehler den Diagnosemodus von securityadmin.sh.
.../securityadmin.sh --diagnose -cd ... (restliche Parameter)
Side-Effects / Betriebshinweise
securityadmin.shkann Konfigurationsteile überschreiben; deshalb Backup und möglichst gezielte Updates.- Änderungen an YAML-Dateien werden nicht automatisch wirksam; sie müssen per
securityadmin.shin den Security-Index geladen werden. - Die offizielle Wazuh Entra-ID-Anleitung ist die Referenz für die IdP- und Wazuh-Seite der SSO-Integration, erfordert in Docker aber korrekte Pfad-Adaption.
Lessons Learned / Best Practices (präventive Maßnahmen, Betrieb, Skalierung)
- Nie „best guess“ YAML ohne OpenSearch-Security-Struktur: Für SSO muss
config.ymldem erwarteten Schema (_meta,config.dynamic) folgen. -fimmer mit-tverwenden – sonst sind „Type“-Fehler vorprogrammiert.- Backups vor jedem Apply:
securityadmin.shkann Ressourcen im Security-Index überschreiben. - Multi-Auth sauber designen: Basic/Internal für Service/API zuerst, SAML danach;
challenge-Verhalten bewusst setzen, um Browser-SSO nicht zu blockieren. - Docker-spezifische Pfade dokumentieren: Runbooks sollten Containerpfade als „Source of Truth“ festhalten, damit Änderungen reproduzierbar bleiben.
Fazit (knappe Zusammenfassung mit Mehrwert)
SSO mit Microsoft Entra ID funktioniert in Wazuh auch in Docker-Deployments zuverlässig – wenn drei Dinge stimmen: korrekter Containerpfad, valide OpenSearch-Security-YAML-Struktur und richtige securityadmin.sh-Parameter. Der konkrete Fehler ERR: Unable to read type from file ist in der Praxis meist ein Kombinationsproblem aus -f ohne -t und/oder einer nicht kompatiblen config.yml. Wer stattdessen -cd nutzt oder -f sauber mit -t config ausführt und die _meta/config.dynamic-Struktur einhält, bekommt SAML-SSO stabil ans Laufen – ohne Trial-and-Error und ohne unkontrollierte Überschreibungen im Security-Index.
Mehr zu Wazuh …
https://wazuh.com/?utm_source=ambassadors&utm_medium=referral&utm_campaign=ambassadors+program
Mehr zum Wazuh Ambassador Program …
https://wazuh.com/ambassadors-program/?utm_source=ambassadors&utm_medium=referral&utm_campaign=ambassadors+program
https://wazuh.slack.com/archives/C0A933R8E/p1768575426229349