1. Einleitung
Mit dem Passwortspeicher (Password Store) kann Checkmk die Verwaltung von Passwörtern von ihrem Einsatz trennen.
Vor Version 2.5.0 konnten dort gespeicherte Passwörter im Klartext an Spezialagenten oder aktive Checks weitergegeben werden.
Zudem stand eine nicht-öffentliche API zur Verfügung.
Diese wird nun durch einen ersten Entwurf (v1_unstable) einer öffentlichen API ergänzt.
Damit steht die Möglichkeit, dass ein Spezialagent oder aktiver Check selbst Passwörter aus dem Store ausliest, allen Entwickelnden von Erweiterungen zur Verfügung.
Der Passwortspeicher kommt ab Checkmk 2.5.0 übrigens auch im Hintergrund zum Einsatz, wenn Sie ein Passwort als Explicit markieren. Sie können demnach mit denselben Programmierschnittstellen arbeiten, ohne wissen zu müssen, wie das verwendete Passwort verwaltet wird.
Einige der hier vorgestellten Programmierschnittstellen sind gegenwärtig als |
1.1. Umfang der gezeigten Beispiele
In diesem Artikel lernen Sie anhand von zwei Beispielen die Verwendung von im Password Store gespeicherten Geheimnissen:
Im Idealfall entwickeln Sie selbst Spezialagenten oder aktive Checks, für welche die Performance von Python 3 ausreicht und die unter Checkmk ab Version 2.5.0 ausgeführt werden. In diesem Fall verwenden Sie im Spezialagenten/aktiven Check die in
cmk.password_store.v1_unstabledefinierten Programmierschnittstellen. Mit diesen wird eine Referenz auf den Password Store und die ID des nachzuschlagenden Passwortes übergeben.In manchen Fällen ist es nicht möglich, Python 3 zu verwenden. Oder ein Spezialagent oder aktiver Check muss unter anderen Monitoring-Systemen oder älteren Versionen von Checkmk ausführbar sein Oder aber, ein aktiver Check ist bereits vorhanden und soll lediglich mit einer Aufrufkonfiguration versehen werden. In solchen Fällen können Sie das Passwort im Klartext als Kommandozeilenargument übergeben. Hier sind gegebenenfalls weitere Maßnahmen erforderlich, um zu verhindern, dass das Passwort aus der Prozessliste ausgelesen wird.
Beide Beispiele verwenden zur Veranschaulichung einen simplen lokalen Check, der in der Service-Beschreibung das übergebene Passwort ausgibt. Der lokale Check hat den Vorteil, dass nicht noch ein Check-Plugin geschrieben werden muss. Beide Beispiele kommen so mit drei Dateien aus.
Auf eine detaillierte Beschreibung, wie nach welchen Anpassungen Checkmk-Dienste neu gestartet werden müssen, verzichten wir in diesem Artikel. Schlagen Sie diese im Artikel zur Entwicklung von Spezialagenten nach.
2. Sichere Übergabe von Referenzen
Wenn Ihr Spezialagent oder aktiver Check ausschließlich unter Checkmk (2.5.0 oder höher) funktionieren muss, ist die sichere Übergabe einer Referenz auf ein Objekt im Password Store möglich.
Dann stehen Ihrem Programm die in cmk.password_store.v1_unstable definierten Programmierschnittstellen zur Verfügung.
Mit der Referenz auf das Objekt im Password Store kann das Passwort dann von Ihrem Programm selbst ausgelesen werden.
In diesem Beispiel zeigen wir einen minimalen Spezialagenten, der drei Beispieldateien benötigt. Wenn Sie das Beispiel nachspielen wollen, legen Sie zunächst drei Ordner an:
2.1. Spezialagent
Im Spezialagenten importieren Sie die folgenden drei Dinge:
eine Erweiterung für
argparse, nämlichparser_add_secret_option,die Funktion
resolve_secret_option, welche zum Auslesen des Passwortes dient,und schließlich die Klasse
Secret, welche als Container für die vertraulichen Daten dient.
Hier erstellen Sie zunächst den Parser für Befehlszeilenargumente.
Mit parser_add_secret_option fügen Sie die Checkmk-spezifische Erweiterung für die Übergabe der Referenz zum Password Store hinzu.
Der Clou:
Diese erstellt zwei mögliche Argumente, nämlich nicht nur das erwartete — hier --secret zur Übergabe eines Passworts — , sondern auch ein zweites (--secret-id) mit Bezug auf die Referenz.
Für die beiden folgenden Tests ist es wichtig, dass Sie mit |
Der Aufruf auf der Befehlszeile zeigt die beiden erstellten Optionen --secret und --secret-id:
Für Tests auf der Befehlszeile verwenden Sie die Option --secret und übergeben das Passwort im Klartext:
In den nächsten beiden Abschnitten zeigen wir die Übergabe von Referenzen.
2.2. Formular und Regeln zur Konfiguration
Via cmk.rulesets.v1.form_specs und cmk.rulesets.v1.rule_specs definieren Sie das im Setup sichtbare Formular und die dazu passende Regelkonfiguration.
Nachdem Sie diese Datei abgelegt und Checkmk neu gestartet haben, können Sie die Regel für Hello password! mit genau einem Feld konfigurieren: entweder einem im Password Store hinterlegten Passwort oder einem explizit angegebenen Passwort.
Für diesen Artikel ist die Unterscheidung irrelevant, der Weg der später gezeigten Übergabe ist immer derselbe.
Für die weiteren Tests sollten Sie einen eigenen Host anlegen, dem Sie nur den Hello password!-Spezialagenten zuordnen und sonst nichts.
Im weiteren Verlauf des Artikels wird für diesen Host der Name testhost verwendet.
2.3. Aufrufkonfiguration
Mit der Aufrufkonfiguration kommt alles zusammen.
Bei der Erzeugung der Parameter für die Befehlszeile wird --secret-id verwendet.
Der Parameter params['password'] wird dabei implizit zu einer Referenz auf den Password Store umgewandelt:
Wenn Sie sehen wollen, wie die Übergabe der Referenz vonstatten geht, verwenden Sie doch einfach einmal cmk -v -D testhost:
In der hervorgehobenen Aufrufzeile sehen Sie die durch einen Doppelpunkt verbundene Referenz.
Der erste Parameter ist die UUID des auszulesenden Passwortes, der zweite der Pfad zum zu verwendenden Password Store.
Wenn Sie schließlich die Servicedetails des Dienstes Hello password Ihres Hosts testhost ansehen, sehen Sie das im Password Store gespeicherte und mit secret.reveal() offengelegte Passwort.
3. Unsichere Übergabe von Passwörtern
Wählen Sie diesen Weg nur, wenn Sie beispielsweise andere Monitoring-Systeme oder ältere Versionen von Checkmk unterstützen müssen.
Im Klartext übergebene Passwörter sind in der Prozesstabelle sichtbar!
Unter Linux kann jedes Programm die Funktion |
Auch in diesem Beispiel zeigen wir einen minimalen Spezialagenten, der drei Beispieldateien benötigt. Wenn Sie das Beispiel nachspielen wollen, legen Sie zunächst drei Ordner an:
3.1. Spezialagent
Für dieses Beispiel haben wir einen Spezialagenten als simples Shell-Skript vorbereitet. Es zeigt einfach alle übergebenen Aufrufparameter an:
3.2. Formular und Regeln zur Konfiguration
Formular und Regeln entsprechen bis auf den geänderten Namen der Plugin-Familie dem Beispiel oben:
3.3. Aufrufkonfiguration
Die Aufrufkonfiguration unterscheidet sich in einigen wichtigen Details vom oben gezeigten Beispiel.
Gemäß Konvention wird bei der Erzeugung der Parameter für die Befehlszeile --secret (oder --password, jedenfalls ohne angehängtes id) verwendet.
Die Funktion unsafe() des Secret-Objekts (in params['password'].unsafe()) sorgt jetzt dafür, dass das Passwort bereits für den Programmaufruf im Klartext ausgelesen wird:
In der Ausgabe von cmk -v -D testhost maskiert Checkmk das im Klartext übergebene Passwort:
Wenn Sie einen aktiven Check von Dritten verwenden (beispielsweise aus der Monitoring-Plugins-Sammlung), sollten Sie überprüfen, ob dieser setproctitle() verwendet.
Bei für Checkmk vor 2.5.0 entwickelten aktiven Checks oder Spezialagenten, die in Python implementiert sind, lohnt sich oft der Umbau auf den oben beschriebenen sicheren Weg.
Ist beides nicht möglich, stellen Sie sicher, dass nur ein kleiner Personenkreis die Prozessliste einsehen kann und dass mit abgefangenen Passwörtern kein Missbrauch möglich ist.
