Checkmk
Unsere KI-RichtlinieKI

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.

Tip

Einige der hier vorgestellten Programmierschnittstellen sind gegenwärtig als unstable markiert. Derzeit planen wir, die Programmierschnittstellen in Checkmk 3.0.0 als stabil zu veröffentlichen. Hierfür wird es erforderlich sein, Erweiterungen des Funktionsumfangs vorzunehmen. Möglicherweise sind für einige APIs auch kleinere, die Kompatibilität betreffende Änderungen nötig. Rechnen Sie mit einem weitgehend reibungslosen Wechsel auf die stabile Version, aber dennoch mit der Notwendigkeit von Tests.

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_unstable definierten 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:

OMD[mysite]:~$ mkdir -p ~/local/lib/python3/cmk_addons/plugins/hellopassword/libexec
OMD[mysite]:~$ mkdir -p ~/local/lib/python3/cmk_addons/plugins/hellopassword/rulesets
OMD[mysite]:~$ mkdir -p ~/local/lib/python3/cmk_addons/plugins/hellopassword/server_side_calls
Befehl(e) in die Zwischenablage kopieren
Befehl(e) erfolgreich in die Zwischenablage kopiert!
Schreibzugriff auf die Zwischenablage wurde verweigert!

2.1. Spezialagent

Im Spezialagenten importieren Sie die folgenden drei Dinge:

~/local/lib/python3/cmk_addons/plugins/hellopassword/libexec/agent_hellopassword
#!/usr/bin/env python3
# Shebang needed to find the interpreter!

import argparse
from cmk.password_store.v1_unstable import parser_add_secret_option, resolve_secret_option, Secret

SECRETOPT = "secret"

parser = argparse.ArgumentParser()
parser_add_secret_option(
    parser,
    long=f"--{SECRETOPT}",
    help="Specify the password to use.",
    required=True
)
args = parser.parse_args()

secret = resolve_secret_option(args, SECRETOPT)
print('<<<local>>>')
print('0 "Hello password" - The password you passed: ' + secret.reveal())
Dateiinhalt in die Zwischenablage kopieren
Dateiinhalt erfolgreich in die Zwischenablage kopiert!
Schreibzugriff auf die Zwischenablage wurde verweigert!

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.

Tip

Für die beiden folgenden Tests ist es wichtig, dass Sie mit omd su mysite zum Instanzbenutzer gewechselt haben. Nur so ist sichergestellt, dass die Ausführungsumgebung der entspricht, unter der das Programm später von Checkmk ausgeführt wird.

Der Aufruf auf der Befehlszeile zeigt die beiden erstellten Optionen --secret und --secret-id:

OMD[mysite]:~$ ~/local/lib/python3/cmk_addons/plugins/hellopassword/libexec/agent_hellopassword --help
usage: agent_hellopassword [-h] (--secret SECRET | --secret-id SECRET_ID)

options:
  -h, --help            show this help message and exit
  --secret SECRET       Specify the password to use.
  --secret-id SECRET_ID
                        Same as "--secret", but containing the reference to the password store rather than the actual secret.
Befehl(e) in die Zwischenablage kopieren
Befehl(e) erfolgreich in die Zwischenablage kopiert!
Schreibzugriff auf die Zwischenablage wurde verweigert!

Für Tests auf der Befehlszeile verwenden Sie die Option --secret und übergeben das Passwort im Klartext:

OMD[mysite]:~$ ~/local/lib/python3/cmk_addons/plugins/hellopassword/libexec/agent_hellopassword --secret 7op53cre7
<<<local>>>
0 "Hello password" - The password you passed: 7op53cre7
Befehl(e) in die Zwischenablage kopieren
Befehl(e) erfolgreich in die Zwischenablage kopiert!
Schreibzugriff auf die Zwischenablage wurde verweigert!

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.

~/local/lib/python3/cmk_addons/plugins/hellopassword/rulesets/special_agent.py
#!/usr/bin/env python3
# Shebang needed only for editors

from cmk.rulesets.v1.form_specs import Dictionary, DictElement, Password, migrate_to_password
from cmk.rulesets.v1.rule_specs import SpecialAgent, Topic, Help, Title

def _formspec():
    return Dictionary(
        title=Title("Hello password!"),
        help_text=Help("This rule is to demonstrate accessing the password store from a special agent."),
        elements={
            "password": DictElement(
                required=True,
                parameter_form=Password(
                    title=Title("Password for this user"),
                ),
            ),
        }
    )

rule_spec_hellopassword = SpecialAgent(
    topic=Topic.GENERAL,
    name="hellopassword",
    title=Title("Hello password!"),
    parameter_form=_formspec
)
Dateiinhalt in die Zwischenablage kopieren
Dateiinhalt erfolgreich in die Zwischenablage kopiert!
Schreibzugriff auf die Zwischenablage wurde verweigert!

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:

~/local/lib/python3/cmk_addons/plugins/hellopassword/server_side_calls/special_agent.py
#!/usr/bin/env python3
# Shebang needed only for editors

from cmk.server_side_calls.v1 import noop_parser, SpecialAgentConfig, SpecialAgentCommand

def _agent_arguments(params, host_config):
    yield SpecialAgentCommand(command_arguments=[ "--secret-id", params['password'] ])

special_agent_hellopassword = SpecialAgentConfig(
    name="hellopassword",
    parameter_parser=noop_parser,
    commands_function=_agent_arguments
)
Dateiinhalt in die Zwischenablage kopieren
Dateiinhalt erfolgreich in die Zwischenablage kopiert!
Schreibzugriff auf die Zwischenablage wurde verweigert!

Wenn Sie sehen wollen, wie die Übergabe der Referenz vonstatten geht, verwenden Sie doch einfach einmal cmk -v -D testhost:

OMD[mysite]:~$ cmk -v -D testhost

testhost
Addresses:              No IP
Tags:                   [address_family:no-ip], [agent:special-agents], [criticality:prod], [networking:lan], [piggyback:auto-piggyback], [site:mysite], [snmp_ds:no-snmp], [tcp:tcp]
Labels:                 [cmk/site:mysite]
Host groups:            check_mk
Contact groups:         all
Agent mode:             No Checkmk agent, all configured special agents
Type of agent:
  Program: /omd/sites/mysite/local/lib/python3/cmk_addons/plugins/hellopassword/libexec/agent_hellopassword \
           --secret-id uuid37481a65-579f-4779-ba50-f303decafbad:/omd/sites/mysite/var/check_mk/passwords_merged
  Process piggyback data
Services:
  checktype item           params description    groups
  --------- -------------- ------ -------------- ------
  local     Hello password {}     Hello password
Befehl(e) in die Zwischenablage kopieren
Befehl(e) erfolgreich in die Zwischenablage kopiert!
Schreibzugriff auf die Zwischenablage wurde verweigert!

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.

Important

Im Klartext übergebene Passwörter sind in der Prozesstabelle sichtbar! Unter Linux kann jedes Programm die Funktion setproctitle() aus der libbsd verwenden, um Passwörter aus dem Prozessnamen zu entfernen. Wrapper für diese Funktion existieren für praktisch alle Programmiersprachen. Aber: Selbst wenn Sie setproctitle() verwenden, ist das Passwort für einen kurzen Moment zwischen Start des Programms und erfolgreichem Aufruf von setproctitle() sichtbar.

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:

OMD[mysite]:~$ mkdir -p ~/local/lib/python3/cmk_addons/plugins/hellopassword_insecure/libexec
OMD[mysite]:~$ mkdir -p ~/local/lib/python3/cmk_addons/plugins/hellopassword_insecure/rulesets
OMD[mysite]:~$ mkdir -p ~/local/lib/python3/cmk_addons/plugins/hellopassword_insecure/server_side_calls
Befehl(e) in die Zwischenablage kopieren
Befehl(e) erfolgreich in die Zwischenablage kopiert!
Schreibzugriff auf die Zwischenablage wurde verweigert!

3.1. Spezialagent

Für dieses Beispiel haben wir einen Spezialagenten als simples Shell-Skript vorbereitet. Es zeigt einfach alle übergebenen Aufrufparameter an:

~/local/lib/python3/cmk_addons/plugins/hellopassword_insecure/libexec/agent_hellopassword_insecure
#!/bin/bash

echo '<<<local>>>'
echo '0 "Hello password insecure" - You called me with: '"$@"
Befehl(e) in die Zwischenablage kopieren
Befehl(e) erfolgreich in die Zwischenablage kopiert!
Schreibzugriff auf die Zwischenablage wurde verweigert!

3.2. Formular und Regeln zur Konfiguration

Formular und Regeln entsprechen bis auf den geänderten Namen der Plugin-Familie dem Beispiel oben:

~/local/lib/python3/cmk_addons/plugins/hellopassword_insecure/rulesets/special_agent.py
#!/usr/bin/env python3
# Shebang needed only for editors

from cmk.rulesets.v1.form_specs import Dictionary, DictElement, Password, migrate_to_password
from cmk.rulesets.v1.rule_specs import SpecialAgent, Topic, Help, Title

def _formspec():
    return Dictionary(
        title=Title("Hello password (insecure)!"),
        help_text=Help("This rule is to demonstrate insecurely accessing the password store from a special agent."),
        elements={
            "password": DictElement(
                required=True,
                parameter_form=Password(
                    title=Title("Password for this user"),
                    migrate=migrate_to_password,
                ),
            ),
        }
    )

rule_spec_hellopassword_insecure = SpecialAgent(
    topic=Topic.GENERAL,
    name="hellopassword_insecure",
    title=Title("Hello password (insecure)!"),
    parameter_form=_formspec
)
Dateiinhalt in die Zwischenablage kopieren
Dateiinhalt erfolgreich in die Zwischenablage kopiert!
Schreibzugriff auf die Zwischenablage wurde verweigert!

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:

~/local/lib/python3/cmk_addons/plugins/hellopassword_insecure/server_side_calls/special_agent.py
#!/usr/bin/env python3
# Shebang needed only for editors

from cmk.server_side_calls.v1 import noop_parser, SpecialAgentConfig, SpecialAgentCommand

def _agent_arguments(params, host_config):
    yield SpecialAgentCommand(command_arguments=[ "--secret", params['password'].unsafe() ])

special_agent_hellopassword_insecure = SpecialAgentConfig(
    name="hellopassword_insecure",
    parameter_parser=noop_parser,
    commands_function=_agent_arguments
)
Dateiinhalt in die Zwischenablage kopieren
Dateiinhalt erfolgreich in die Zwischenablage kopiert!
Schreibzugriff auf die Zwischenablage wurde verweigert!

In der Ausgabe von cmk -v -D testhost maskiert Checkmk das im Klartext übergebene Passwort:

OMD[mysite]:~$ cmk -v -D testhost

testhost
Addresses:              No IP
Tags:                   [address_family:no-ip], [agent:special-agents], [criticality:prod], [networking:lan], [piggyback:auto-piggyback], [site:mysite], [snmp_ds:no-snmp], [tcp:tcp]
Labels:                 [cmk/site:mysite]
Host groups:            check_mk
Contact groups:         all
Agent mode:             No Checkmk agent, all configured special agents
Type of agent:
  Program: /omd/sites/mysite/local/lib/python3/cmk_addons/plugins/hellopassword_insecure/libexec/agent_hellopassword_insecure
           --secret '****'
  Process piggyback data
Services:
  checktype item                    params description             groups
  --------- ----------------------- ------ ----------------------- ------
  local     Hello password insecure {}     Hello password insecure
Befehl(e) in die Zwischenablage kopieren
Befehl(e) erfolgreich in die Zwischenablage kopiert!
Schreibzugriff auf die Zwischenablage wurde verweigert!

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.


Letzte Änderung: Mon, 10 Aug 2026 09:18:18 GMT via Commit 2308ba38c
Auf dieser Seite