Wazuh SSO mit Microsoft Entra ID in Docker: Richtige Pfade, korrektes OpenSearch-Security config.yml und Fix für securityadmin.sh: Unable to read type from file


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.yml wird gemountet.
  • Das Einspielen mit securityadmin.sh endet 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: false fü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.sh kann Konfigurationsteile überschreiben; deshalb Backup und möglichst gezielte Updates.
  • Änderungen an YAML-Dateien werden nicht automatisch wirksam; sie müssen per securityadmin.sh in 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.yml dem erwarteten Schema (_meta, config.dynamic) folgen.
  • -f immer mit -t verwenden – sonst sind „Type“-Fehler vorprogrammiert.
  • Backups vor jedem Apply: securityadmin.sh kann 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