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 wennDenyKeyundDenyKeyRegexpleer sind), so als wäreDenyKey=system.run[*]oderDenyKeyRegexp=^system\.run\[.*\]$als letzte Regel gesetzt. Dadurch können Sie bestimmtesystem.run-Datenpunkte zulassen, ohne anderesystem.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 IhreDenyKey/DenyKeyRegexp-Regeln abgedeckt sind. -
Die Konfiguration von
AllowKey,DenyKey,AllowKeyRegexpundDenyKeyRegexpwirkt sich nicht auf die Agent-ParameterHostnameItem,HostMetadataItemoderHostInterfaceItemaus. -
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.
- Der Befehlszeilenparameter
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.runZabbix 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.batkann 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 allevfs.file-Datenpunkte Parameter. - Das Muster
system.cpu.load[*](^system\.cpu\.load\[.*\]$) stimmt nur mit Datenpunkt-Schlüsseln mit Parametern überein; allerdings benötigensystem.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[*undvfs.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.sizevfs.file.contentsvfs.file.contents[]vfs.file.size[/var/log/app.log] |
vfs.*.contents |
Schlüssel beginnt mit vfs.Schlüssel endet mit .contentsKeine Parameter |
Matches: vfs..contentsvfs.mount.point.file.contentsDoes not match: vfs.contentsvfs.file.contents[] |
vfs.file.*[*] |
Schlüssel beginnt mit vfs.file.Beliebige oder leere Parameter |
Matchesvfs.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.contentsKeine Parameter |
Matches:vfs.file.contentsDoes 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.contentsBeliebige 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.contentsErster Parameter ist /etc/passwdBeliebiger 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.contentsBeliebige 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.contentsErster Parameter enthält passwdBeliebiger 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.contentsErster Parameter ist /etc/passwdZweiter 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.sizevfs.file.contentsvfs.file.contents[]vfs.file.size[/var/log/app.log] |
^vfs\..*\.contents$ |
Schlüssel beginnt mit vfs.Schlüssel endet mit .contentsKeine Parameter |
Matches: vfs..contentsvfs.mount.point.file.contentsDoes not match: vfs.contentsvfs.file.contents[] |
^vfs\.file\..*\[.*\]$ |
Schlüssel beginnt mit vfs.file.Beliebige oder leere Parameter |
Matchesvfs.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.contentsKeine Parameter |
Matches:vfs.file.contentsDoes 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.contentsBeliebige 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.contentsErster Parameter ist /etc/passwdBeliebiger 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.contentsBeliebige 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.contentsErster Parameter enthält passwdBeliebiger 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.contentsErster Parameter ist /etc/passwdZweiter 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] |