4.8 Konfigurationsfehler untersuchen Ein Dienst kann installiert, gestartet und über den vorgesehenen Port erreichbar sein, aber aufgrund einer fehlerhaften oder veralteten Konfiguration trotzdem nicht richtig funktionieren. Grundsatz: Nicht irgendeine Konfigurationsdatei prüfen, sondern zuerst feststellen, welche Konfiguration der laufende Dienst tatsächlich verwendet. Ziele dieser Seite Nach dieser Seite sollst du: Konfigurationsquelle und wirksame Konfiguration unterscheiden können, Syntax- und Inhaltsfehler getrennt untersuchen können, Konfigurationshierarchien und Überschreibungen erkennen können, Dateipfade, Eigentümer und Berechtigungen prüfen können, Umgebungsvariablen und Startparameter berücksichtigen können, Konfigurationsstände sicher vergleichen können, Hashwerte und Änderungszeitpunkte erfassen können, versionsabhängige Konfigurationsfehler erkennen können, Änderungen kontrolliert vorbereiten und rückgängig machen können, Geheimnisse in Konfigurationsdateien schützen können. 1. Arten von Konfigurationsfehlern unterscheiden Fehlerart Beispiel Syntaxfehler Fehlende Klammer oder ungültiges Trennzeichen Tippfehler Falscher Schlüsselname oder Hostname Datentypfehler Text statt Zahl oder true statt erwarteter Zeichenfolge Wertebereichsfehler Port außerhalb des gültigen Bereichs Fehlender Pflichtwert Datenbankadresse nicht angegeben Falscher Dateipfad Zertifikat oder Datenverzeichnis nicht gefunden Falsche Berechtigung Dienstkonto kann Datei nicht lesen Falsche Eigentümerschaft Datei gehört nicht dem vorgesehenen Konto Überschreibung Lokales Drop-in ersetzt den erwarteten Wert Versionskonflikt Option wird von neuer Version nicht mehr unterstützt Formatfehler JSON, XML, YAML oder plist ist formal ungültig Kodierungsfehler Falsche Zeichenkodierung oder Byte Order Mark Zeilenendefehler Windows-Zeilenenden stören ein Unix-Werkzeug Umgebungsfehler Variable ist im Terminal, aber nicht im Dienstkontext vorhanden Geheimnisfehler Kennwort, Token oder Schlüssel fehlt beziehungsweise ist abgelaufen Zielsystemfehler Konfiguration zeigt auf Test- statt Produktivsystem Reihenfolgefehler Spätere Datei überschreibt eine frühere Einstellung Neustart fehlt Datei wurde geändert, Dienst verwendet aber noch alten Zustand Reload ungeeignet Dienst unterstützt kein dynamisches Neuladen Konfiguration nicht eingebunden Bearbeitete Datei wird vom Dienst gar nicht geladen 2. Konfigurationsquelle und wirksame Konfiguration unterscheiden Eine Anwendung kann Einstellungen aus mehreren Quellen beziehen: Programmstandardwerte → Hauptkonfigurationsdatei → eingebundene Zusatzdateien → lokale Überschreibungen → Umgebungsvariablen → Startparameter → zentrale Konfigurationsverwaltung → zur Laufzeit gespeicherte Einstellungen Später ausgewertete Quellen können frühere Werte überschreiben. Die genaue Priorität ist produktspezifisch. Begriff Bedeutung Standardwert Vom Programm verwendeter Wert ohne eigene Konfiguration Quelldatei Datei, in der eine Einstellung gespeichert ist Include Zusätzlich geladene Konfigurationsdatei Drop-in Ergänzende oder überschreibende Konfiguration Startparameter Beim Programmstart übergebener Wert Umgebungsvariable Einstellung aus dem Prozesskontext Wirksame Konfiguration Tatsächlich vom Dienst verwendeter Gesamtzustand Laufzeitkonfiguration Nach dem Start möglicherweise intern veränderter Zustand Eine korrekt aussehende Hauptdatei beweist nicht, dass ihr Wert tatsächlich wirksam ist. 3. Vor jeder Prüfung den Konfigurationspfad belegen Der Konfigurationspfad sollte aus mindestens einer belastbaren Quelle stammen: offizielle Herstellerdokumentation, Dienststartparameter, systemd-Unit beziehungsweise launchd-plist, Windows-Dienstkonfiguration, Anwendungsausgabe zur wirksamen Konfiguration, Installations- oder Deploymentdokumentation, Containerdefinition, Protokollmeldung beim Dienststart. Nicht ausreichend: vermuteter Standardpfad, Dateiname einer anderen Installation, alte Internetanleitung, Konfiguration aus einer anderen Produktversion, gleichnamige Datei im Benutzerverzeichnis. Zu dokumentieren: Dienst: Produkt und Version: Konfigurationsquelle: Tatsächlicher Pfad: Weitere Includes: Umgebungsdateien: Startparameter: Konfigurationspriorität: Zeitpunkt der Prüfung: 4. Konfigurationsquelle unter Windows ermitteln Dienstpfad und Startparameter anzeigen: [RO][SENS] Get-CimInstance Win32_Service -Filter "Name=''" | Select-Object Name, StartName, PathName Alternative mit sc.exe: [RO][SENS] sc.exe qc "" Anschließend sind zu prüfen: enthält PathName einen Konfigurationsparameter? wird ein Arbeitsverzeichnis vorausgesetzt? verweist der Dienst auf einen Wrapper oder Launcher? liest der Wrapper eine weitere Konfiguration? wird eine Java-, .NET- oder Skript-Laufzeit aufgerufen? stammen Einstellungen aus der Registrierung? verwendet die Anwendung ein eigenes Windows-Ereignisprotokoll? existieren lokale und globale Konfigurationsdateien? Programmpfad und Argumente werden in PathName gemeinsam dargestellt. Sie müssen bei der Auswertung sorgfältig getrennt werden. 5. Konfigurationsquelle unter Linux mit systemd ermitteln Wirksame Unit und Drop-ins anzeigen: [RO][FILE][SENS] systemctl cat "" Wichtige Pfade und Startparameter anzeigen: [RO][SENS] systemctl show "" \ --property=FragmentPath,DropInPaths,ExecStart,WorkingDirectory,EnvironmentFiles Umgebungswerte anzeigen: [RO][SENS] systemctl show "" --property=Environment Systemweite Konfigurationsdateien eines systemd-Bestandteils zusammenführen: [RO][FILE] systemd-analyze cat-config "" systemd-analyze cat-config ist für unterstützte Konfigurationshierarchien von systemd-Komponenten gedacht. Es ist kein universeller Parser für beliebige Anwendungen. Zu prüfen: welche Unit-Datei wurde geladen? existieren lokale Drop-ins? wird eine Umgebungsdatei verwendet? überschreibt ExecStart einen Paketstandard? wird ein Wrapper oder Startskript verwendet? enthält der Dienst einen Konfigurationsparameter? wird die Konfiguration über mehrere Dateien zusammengesetzt? 6. Konfigurationsquelle unter macOS ermitteln Systemweiten launchd-Job anzeigen: [RO] launchctl print "system/