12 Einschränken von Agent-Prüfungen

Übersicht

Sie können steuern, welche Datenpunkt-Schlüssel der Zabbix Agent oder Agent 2 beim Ausführen von Datenpunkt-Prüfungen, Remote-Befehlen oder Skripten verwenden darf oder nicht verwenden darf.

Verwenden Sie dazu diese Parameter der Agent-Konfiguration, um Allow/Deny-Regeln zu definieren:

  • AllowKey=<pattern>
  • DenyKey=<pattern>
  • AllowKeyRegexp=<pattern>
  • DenyKeyRegexp=<pattern>

Das <pattern> muss einen einzelnen Datenpunkt-Schlüssel enthalten.
Für AllowKey und DenyKey unterstützt das <pattern> Platzhalter (*). Der Platzhalter stimmt an seiner Position mit beliebig vielen beliebigen Zeichen überein und kann verwendet werden, um Datenpunkt-Schlüssel oder Parameter abzugleichen (z. B. vfs.file.*[*]).
Für AllowKeyRegexp und DenyKeyRegexp unterstützt das <pattern> reguläre Ausdrücke. Das Muster des regulären Ausdrucks kann verwendet werden, um Datenpunkt-Schlüssel und deren Parameterzeichenfolgen abzugleichen. Siehe auch Beispiele für korrektes Escaping.
Bitte beachten Sie, dass Zabbix Agent und Zabbix Agent 2 möglicherweise unterschiedliche Syntax für reguläre Ausdrücke unterstützen.

Zur Verbesserung der Sicherheit wird empfohlen, für AllowKey und DenyKey exakte Datenpunkt-Schlüssel anstelle von Platzhaltern zu verwenden. Außerdem wird empfohlen, für AllowKeyRegexp und DenyKeyRegexp möglichst spezifische Muster für reguläre Ausdrücke zu verwenden. Weitere Informationen finden Sie unter Allow/Deny-Regeln absichern.

Im Gegensatz zu anderen Agent-Konfigurationsparametern können Sie eine unbegrenzte Anzahl von AllowKey, DenyKey, AllowKeyRegexp oder DenyKeyRegexp-Parametern angeben.

Wichtige Hinweise

  • Alle system.run-Datenpunkte sind standardmäßig deaktiviert (auch wenn DenyKey und DenyKeyRegexp leer sind), so als wäre DenyKey=system.run[*] oder DenyKeyRegexp=^system\.run\[.*\]$ als letzte Regel gesetzt. Dadurch können Sie bestimmte system.run-Datenpunkte zulassen, ohne andere system.run-Datenpunkte ausdrücklich zu verweigern.

  • Verwenden Sie nach Möglichkeit AllowKey/AllowKeyRegexp, um nur die erforderlichen Datenpunkte zuzulassen und alles andere zu verweigern. Einige Schlüssel können missbraucht werden, um über Path Traversal unbeabsichtigte Dateien zu lesen (z. B. vfs.file.contents["../../../../etc/passwd"]), und neue Zabbix-Agent-Versionen können Schlüssel einführen, die nicht durch Ihre DenyKey/DenyKeyRegexp-Regeln abgedeckt sind.

  • Die Konfiguration von AllowKey, DenyKey, AllowKeyRegexp und DenyKeyRegexp wirkt sich nicht auf die Agent-Parameter HostnameItem, HostMetadataItem oder HostInterfaceItem aus.

  • Verweigerte Datenpunkte werden ohne Hinweise oder Fehlermeldungen als nicht unterstützt eingestuft; zum Beispiel:

    • Der Befehlszeilenparameter --print (-p) des Zabbix-Agenten zeigt verweigerte Datenpunktschlüssel nicht an.
    • Der Befehlszeilenparameter --test (-t) des Zabbix-Agenten gibt für verweigerte Datenpunktschlüssel "Unsupported item key." zurück.
    • Wenn die Protokollierung aktiviert ist (LogRemoteCommands=1), protokolliert die Logdatei des Zabbix-Agenten verweigerte Remote-Befehle nicht.

Reihenfolge der Allow-/Deny-Regeln

Sie können eine unbegrenzte Anzahl von AllowKey, DenyKey, AllowKeyRegexp oder DenyKeyRegexp-Regeln angeben, wobei ihre Reihenfolge wichtig ist.

  • Die Regeln werden nacheinander von oben nach unten ausgewertet.
  • Wenn ein Datenpunkt-Schlüssel zu einer Regel passt, wird er entweder erlaubt oder verweigert, und die Auswertung der Regeln wird beendet.

Wenn beispielsweise vfs.file.contents[/etc/passwd] ausgewertet wird, werden die Regeln wie folgt verarbeitet:

AllowKey=vfs.file.contents[/tmp/app.log]    # Das Datenpunkt-Schlüssel-Muster passt nicht; der Agent fährt mit der nächsten Regel fort.
AllowKey=vfs.file.contents[/etc/passwd]     # Das Datenpunkt-Schlüssel-Muster passt; der Agent erlaubt die Datenpunktprüfung und beendet die Regelauswertung.
DenyKey=vfs.file.*[*]                       # Der Agent ignoriert die Regel, da die Auswertung bereits beendet wurde.

Die folgende Reihenfolge der Regeln verweigert die Datenpunktprüfung:

DenyKey=vfs.file.*[*]                       # Das Datenpunkt-Schlüssel-Muster passt; der Agent verweigert die Datenpunktprüfung und beendet die Regelauswertung.
AllowKey=vfs.file.contents[/etc/passwd]     # Der Agent ignoriert die Regel, da die Auswertung bereits beendet wurde.
AllowKey=vfs.file.contents[/tmp/app.log]    # Der Agent ignoriert die Regel, da die Auswertung bereits beendet wurde.

Beispiele

Die folgenden Beispiele zeigen gängige Konfigurationsmuster für AllowKey, DenyKey, AllowKeyRegexp und DenyKeyRegexp.

Zulassen bestimmter Prüfungen und Befehle

Erlauben Sie nur zwei vfs.file Datenpunkt-Prüfungen und zwei system.run Befehle:

mit AllowKey und DenyKey:

AllowKey=vfs.file.contents[/tmp/app.log]
AllowKey=vfs.file.size[/tmp/app.log]
AllowKey=system.run[/usr/bin/uptime]
AllowKey=system.run[/usr/bin/df -h /]
DenyKey=vfs.file.*[*]

mit AllowKeyRegexp und DenyKeyRegexp:

AllowKeyRegexp=^vfs\.file\.(contents|size)\[/tmp/app\.log\]$
AllowKeyRegexp=^system\.run\[/usr/bin/(uptime|df -h /)\]$
DenyKeyRegexp=^vfs\.file\..*\[.*\]$

Das Setzen von DenyKey=system.run[*] oder DenyKeyRegexp=^system\.run\[.*\]$ ist nicht erforderlich, da alle anderen system.run Befehle standardmäßig verweigert werden.

Zulassen von Skripten

Erlauben Sie dem Zabbix Agent, Skripte auf Hosts über alle verfügbaren Methoden auszuführen:

  • Globale Skripte, die im Frontend oder über die API ausgeführt werden können (bei dieser Methode wird immer der Schlüssel system.run[myscript.sh] verwendet)
  • Remote-Befehle aus Aktionen-Operationen (bei dieser Methode wird immer der Schlüssel system.run[myscript.sh,nowait] verwendet)
  • system.run Zabbix Agent-Datenpunkte mit dem Skript, zum Beispiel:
    • system.run[myscript.sh]
    • system.run[myscript.sh,wait]
    • system.run[myscript.sh,nowait]
AllowKey=system.run[myscript.sh,*]

oder

AllowKeyRegexp=^system\.run\[myscript\.sh,.*\]$

Um den Parameter wait/nowait zu steuern, müssen Sie eine andere Regel festlegen. Sie können zum Beispiel nur system.run[myscript.sh,wait]-Datenpunkte zulassen und damit andere Methoden ausschließen:

AllowKey=system.run[myscript.sh,wait]

oder

AllowKeyRegexp=^system\.run\[myscript\.sh,wait\]$
Absicherung von Allow-/Deny-Regeln

Diese Beispiele zeigen, wie zu großzügige AllowKey-/AllowKeyRegexp- oder DenyKey-/DenyKeyRegexp-Regeln abgesichert werden können.

Betrachten Sie die folgenden Regeln:

mit AllowKey und DenyKey:

AllowKey=system.run["C:\Program^ Files\Zabbix^ Agent^ 2\scripts\test.bat*"]
DenyKey=vfs.file.*
DenyKey=system.cpu.load[*]

mit AllowKeyRegexp und DenyKeyRegexp:

AllowKeyRegexp=^system\.run\["C:\\Program\sFiles\\Zabbix\sAgent\s2\\scripts\\test\.bat.*"\]$
DenyKeyRegexp=^vfs\.file\..*$
DenyKeyRegexp=^system\.cpu\.load\[.*\]$

Unter Windows müssen Sie Leerzeichen im Pfad mit einem Caret (^) für AllowKey oder DenyKey und mit \s für AllowKeyRegexp oder DenyKeyRegexp maskieren.

Diese Regeln enthalten einen Platzhalter (*) (oder .* bei Mustern auf Basis regulärer Ausdrücke), der missbraucht werden kann:

  • Das Skript test.bat kann mit beliebigen Parametern ausgeführt werden, auch mit unbeabsichtigten.
  • Das Muster vfs.file.* (^vfs\.file\..*$) stimmt sowohl mit Datenpunkt-Schlüsseln mit als auch ohne Parameter überein; allerdings erfordern alle vfs.file-Datenpunkte Parameter.
  • Das Muster system.cpu.load[*] (^system\.cpu\.load\[.*\]$) stimmt nur mit Datenpunkt-Schlüsseln mit Parametern überein; allerdings benötigen system.cpu.load-Datenpunkte keine Parameter.

Um diese Regeln abzusichern, erlauben Sie die Ausführung von test.bat nur mit bestimmten Parametern und verweigern Sie korrekte Datenpunkt-Schlüssel-Muster; zum Beispiel:

mit AllowKey und DenyKey:

AllowKey=system.run["C:\Program^ Files\Zabbix^ Agent^ 2\scripts\test.bat status"]
AllowKey=system.run["C:\Program^ Files\Zabbix^ Agent^ 2\scripts\test.bat version"]
DenyKey=vfs.file.*[*]
DenyKey=system.cpu.load
DenyKey=system.cpu.load[*]

mit AllowKeyRegexp und DenyKeyRegexp:

AllowKeyRegexp=^system\.run\["C:\\Program\sFiles\\Zabbix\sAgent\s2\\scripts\\test\.bat (status|version)"\]$
DenyKeyRegexp=^vfs\.file\..+\[.*\]$
DenyKeyRegexp=^system\.cpu\.load(\[.*\])?$

Sie können die Regeln testen, indem Sie die folgenden Befehle ausführen, die ZBX_NOTSUPPORTED zurückgeben.

cd "C:\Program Files\Zabbix Agent 2"
zabbix_agent2.exe -t system.run["C:\Program^ Files\Zabbix^ Agent^ 2\scripts\test.bat debug"]
zabbix_agent2.exe -t vfs.file.size["C:\ProgramData\MyApp\config.ini"]
zabbix_agent2.exe -t vfs.file.contents["C:\Windows\System32\drivers\etc\hosts"]
zabbix_agent2.exe -t system.cpu.load
zabbix_agent2.exe -t system.cpu.load[all,avg1]
Musterbeispiele

Die folgenden Tabellen zeigen, wie Datenpunkt-Schlüssel-Muster abgeglichen werden:

  • Ein Schlüssel stimmt nur dann mit dem Muster überein, wenn er alle Bedingungen in der Spalte Matches erfüllt.
  • Parameter müssen vollständig in eckige Klammern eingeschlossen sein (z. B. sind vfs.file.contents[* und vfs.file.contents*utf8] ungültige Muster).
  • Die Beispiele veranschaulichen nur den Musterabgleich; tatsächliche Datenpunkte erfordern Parameter.

Für AllowKey und DenyKey:

Pattern Matches Examples
* Beliebiger Schlüssel mit oder ohne Parameter
vfs.file.* Schlüssel beginnt mit vfs.file.
Mit oder ohne Parameter
Matches:
vfs.file.size
vfs.file.contents
vfs.file.contents[]
vfs.file.size[/var/log/app.log]
vfs.*.contents Schlüssel beginnt mit vfs.
Schlüssel endet mit .contents
Keine Parameter
Matches:
vfs..contents
vfs.mount.point.file.contents

Does not match:
vfs.contents
vfs.file.contents[]
vfs.file.*[*] Schlüssel beginnt mit vfs.file.
Beliebige oder leere Parameter
Matches
vfs.file.get.custom[]
vfs.file.size[/var/log/app.log, utf8]

Does not match:
vfs.file.get.custom
vfs.file.contents Schlüssel ist vfs.file.contents
Keine Parameter
Matches:
vfs.file.contents

Does not match:
vfs.file.contents[/etc/passwd]
vfs.file.contents[] Schlüssel ist vfs.file.contents[]
Leere Parameter
Matches:
vfs.file.contents[]

Does not match:
vfs.file.contents
vfs.file.contents[*] Schlüssel ist vfs.file.contents
Beliebige oder leere Parameter
Matches:
vfs.file.contents[/path/to/file]

Does not match:
vfs.file.contents
vfs.file.contents[/etc/passwd,*] Schlüssel ist vfs.file.contents
Erster Parameter ist /etc/passwd
Beliebiger oder leerer zweiter Parameter
Matches:
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf8]

Does not match:
vfs.file.contents[]
vfs.file.contents[/etc/passwd]
vfs.file.contents[*passwd*] Schlüssel ist vfs.file.contents
Beliebige Parameter, mindestens einer enthält passwd
Matches:
vfs.file.contents[/etc/passwd]
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf8]
vfs.file.contents[*passwd*,*] Schlüssel ist vfs.file.contents
Erster Parameter enthält passwd
Beliebiger oder leerer zweiter Parameter
Matches:
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf8]

Does not match:
vfs.file.contents[/etc/passwd]
vfs.file.contents[/tmp/test]
vfs.file.contents[/etc/passwd,utf8] Schlüssel ist vfs.file.contents
Erster Parameter ist /etc/passwd
Zweiter Parameter ist utf8
Matches:
vfs.file.contents[/etc/passwd,utf8]

Does not match:
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf16]

Für AllowKeyRegexp und DenyKeyRegexp:

Pattern Matches Examples
^.*$ Beliebiger Schlüssel mit oder ohne Parameter
^vfs\.file\..*$ Schlüssel beginnt mit vfs.file.
Mit oder ohne Parameter
Matches:
vfs.file.size
vfs.file.contents
vfs.file.contents[]
vfs.file.size[/var/log/app.log]
^vfs\..*\.contents$ Schlüssel beginnt mit vfs.
Schlüssel endet mit .contents
Keine Parameter
Matches:
vfs..contents
vfs.mount.point.file.contents

Does not match:
vfs.contents
vfs.file.contents[]
^vfs\.file\..*\[.*\]$ Schlüssel beginnt mit vfs.file.
Beliebige oder leere Parameter
Matches
vfs.file.get.custom[]
vfs.file.size[/var/log/app.log, utf8]

Does not match:
vfs.file.get.custom
^vfs\.file\.contents$ Schlüssel ist vfs.file.contents
Keine Parameter
Matches:
vfs.file.contents

Does not match:
vfs.file.contents[/etc/passwd]
^vfs\.file\.contents\[\]$ Schlüssel ist vfs.file.contents[]
Leere Parameter
Matches:
vfs.file.contents[]

Does not match:
vfs.file.contents
^vfs\.file\.contents\[.*\]$ Schlüssel ist vfs.file.contents
Beliebige oder leere Parameter
Matches:
vfs.file.contents[/path/to/file]

Does not match:
vfs.file.contents
^vfs\.file\.contents\[/etc/passwd,.*\]$ Schlüssel ist vfs.file.contents
Erster Parameter ist /etc/passwd
Beliebiger oder leerer zweiter Parameter
Matches:
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf8]

Does not match:
vfs.file.contents[]
vfs.file.contents[/etc/passwd]
^vfs\.file\.contents\[.*passwd.*\]$ Schlüssel ist vfs.file.contents
Beliebige Parameter, mindestens einer enthält passwd
Matches:
vfs.file.contents[/etc/passwd]
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf8]
^vfs\.file\.contents\[.*passwd.*,.*\]$ Schlüssel ist vfs.file.contents
Erster Parameter enthält passwd
Beliebiger oder leerer zweiter Parameter
Matches:
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf8]

Does not match:
vfs.file.contents[/etc/passwd]
vfs.file.contents[/tmp/test]
^vfs\.file\.contents\[/etc/passwd,(utf8|windows-1252)\]$ Schlüssel ist vfs.file.contents
Erster Parameter ist /etc/passwd
Zweiter Parameter ist utf8 oder windows-1252
Matches:
vfs.file.contents[/etc/passwd,utf8]
vfs.file.contents[/etc/passwd,windows-1252]

Does not match:
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf16]