Ograniczanie sprawdzeń agentów
Przegląd
Możesz kontrolować, których kluczy pozycji agent Zabbix lub agent 2 może używać albo których używanie jest zabronione podczas wykonywania kontroli pozycji, poleceń zdalnych lub skryptów.
W tym celu użyj następujących parametrów konfiguracji agenta, aby zdefiniować reguły zezwalania i odrzucania:
AllowKey=<pattern>DenyKey=<pattern>AllowKeyRegexp=<pattern>DenyKeyRegexp=<pattern>
Element <pattern> musi zawierać pojedynczy klucz pozycji.
W przypadku AllowKey i DenyKey element <pattern> obsługuje symbole wieloznaczne (*).
Symbol wieloznaczny dopasowuje dowolną liczbę dowolnych znaków w swoim miejscu i może służyć do dopasowywania kluczy pozycji lub parametrów (np. vfs.file.*[*]).
W przypadku AllowKeyRegexp i DenyKeyRegexp element <pattern> obsługuje wyrażenia regularne.
Wzorzec wyrażenia regularnego może służyć do dopasowywania kluczy pozycji i ich ciągów parametrów.
Zobacz także przykłady prawidłowego stosowania znaków ucieczki.
Należy pamiętać, że agent Zabbix i agent Zabbix 2 mogą obsługiwać różną składnię wyrażeń regularnych.
W przeciwieństwie do innych parametrów konfiguracji agenta można określić nieograniczoną liczbę parametrów AllowKey, DenyKey, AllowKeyRegexp lub DenyKeyRegexp.
Ważne uwagi
-
Użyj
AllowKeylubAllowKeyRegexp, aby zezwolić tylko na wymagane pozycje, aDenyKeylubDenyKeyRegexpjako ostatniej reguły, aby odrzucić wszystkie pozostałe. Jest to bezpieczniejsze niż poleganie wyłącznie na regułach odrzucania, ponieważ nowe wersje Zabbix agent mogą wprowadzać klucze pozycji, których nie obejmują regułyDenyKeylubDenyKeyRegexp. -
Reguły zezwalające powinny być jak najbardziej szczegółowe: w regułach
AllowKeyużywaj dokładnych kluczy pozycji zamiast symboli wieloznacznych (*), a w regułachAllowKeyRegexpużywaj najbardziej szczegółowych wzorców wyrażeń regularnych. -
Jeśli używasz
DenyKeylubDenyKeyRegexp, odrzucaj całe klucze pozycji, a nie określone pliki lub polecenia. Reguły dotyczące określonych parametrów można obejść; na przykład przechodzenie przez ścieżki (vfs.file.contents["../../../../etc/passwd"]) może umożliwić odczyt pliku, który reguła blokująca jego bezpośrednią ścieżkę miała zablokować. Szczegółowe informacje zawiera sekcja Zabezpieczanie reguł zezwalania/odrzucania. -
Wszystkie pozycje
system.runsą domyślnie odrzucane (nawet gdyDenyKeyiDenyKeyRegexpsą puste), tak jakbyDenyKey=system.run[*]było ustawione jako ostatnia reguła. Dzięki temu można zezwolić na określone pozycjesystem.runbez jawnego odrzucania innych pozycjisystem.run. To niejawne odrzucanie dotyczy tylkosystem.run; w przypadku wszystkich pozostałych kluczy reguły zezwalające nie mają wpływu, chyba że następuje po nich reguła odrzucająca. -
Konfiguracja
AllowKey,DenyKey,AllowKeyRegexpiDenyKeyRegexpnie wpływa na parametry agentHostnameItem,HostMetadataItemaniHostInterfaceItem. -
Odrzucone pozycje stają się nieobsługiwane bez żadnej informacji o tym, że zostały odrzucone; wyglądają tak samo jak nieistniejące klucze pozycji. Na przykład:
- Parametr wiersza poleceń Zabbix agent
--print (-p)nie wyświetli odrzuconych kluczy pozycji. - Parametr wiersza poleceń Zabbix agent
--test (-t)zwróciUnsupported item key.dla odrzuconych kluczy pozycji. - Po włączeniu rejestrowania (
LogRemoteCommands=1) plik dziennika Zabbix agent nie będzie rejestrować odrzuconych poleceń zdalnych.
- Parametr wiersza poleceń Zabbix agent
Kolejność reguł allow/deny
Możesz określić nieograniczoną liczbę reguł AllowKey, DenyKey, AllowKeyRegexp lub DenyKeyRegexp, jednak ich kolejność ma znaczenie.
- Reguły są oceniane jedna po drugiej, od góry do dołu.
- Gdy klucz pozycji pasuje do reguły, jest ona albo dozwolona, albo odrzucona, a ocena reguł zostaje zatrzymana.
Na przykład podczas oceny vfs.file.contents[/etc/passwd] reguły są przetwarzane w następujący sposób:
AllowKey=vfs.file.contents[/tmp/app.log] # Wzorzec klucza pozycji nie pasuje, agent przechodzi do następnej reguły.
AllowKey=vfs.file.contents[/etc/passwd] # Wzorzec klucza pozycji pasuje; agent zezwala na sprawdzenie pozycji i zatrzymuje ocenę reguł.
DenyKey=vfs.file.*[*] # Agent ignoruje regułę, ponieważ ocena została zatrzymana.
Poniższa kolejność reguł spowoduje odrzucenie sprawdzenia pozycji:
DenyKey=vfs.file.*[*] # Wzorzec klucza pozycji pasuje; agent odrzuca sprawdzenie pozycji i zatrzymuje ocenę reguł.
AllowKey=vfs.file.contents[/etc/passwd] # Agent ignoruje regułę, ponieważ ocena została zatrzymana.
AllowKey=vfs.file.contents[/tmp/app.log] # Agent ignoruje regułę, ponieważ ocena została zatrzymana.
Przykłady
Poniższe przykłady pokazują typowe wzorce konfiguracji dla AllowKey, DenyKey, AllowKeyRegexp i DenyKeyRegexp.
Zezwalanie na określone sprawdzenia i polecenia
Zezwalaj tylko na dwie pozycje sprawdzające vfs.file i dwa polecenia system.run:
za pomocą AllowKey i 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.*[*]
za pomocą AllowKeyRegexp i DenyKeyRegexp:
AllowKeyRegexp=^vfs\.file\.(contents|size)\[/tmp/app\.log\]$
AllowKeyRegexp=^system\.run\[/usr/bin/(uptime|df -h /)\]$
DenyKeyRegexp=^vfs\.file\..*\[[\s\S]*\]$
Ustawienie DenyKey=system.run[*] jest niepotrzebne, ponieważ wszystkie pozostałe polecenia system.run są domyślnie odrzucane (zobacz Ważne uwagi).
Zezwalanie na wykonywanie skryptów
Zezwól agentowi Zabbix na wykonywanie skryptów na hostach za pomocą wszystkich dostępnych metod:
- Skrypty globalne, które można wykonywać w frontendzie lub za pośrednictwem API (ta metoda zawsze używa klucza
system.run[myscript.sh]) - Zdalne polecenia z operacji działań (ta metoda zawsze używa klucza
system.run[myscript.sh,nowait]) - Pozycje agenta Zabbix
system.runzawierające skrypt, na przykład:system.run[myscript.sh]system.run[myscript.sh,wait]system.run[myscript.sh,nowait]
AllowKey=system.run[myscript.sh,*]
lub
AllowKeyRegexp=(?s)^system\.run\[myscript\.sh,.*\]$
Aby kontrolować parametr wait/nowait, należy ustawić inną regułę.
Na przykład można zezwolić tylko na pozycje system.run[myscript.sh,wait], wykluczając tym samym inne metody:
AllowKey=system.run[myscript.sh,wait]
lub
AllowKeyRegexp=^system\.run\[myscript\.sh,wait\]$
Zabezpieczanie reguł allow/deny
Te przykłady pokazują, jak zabezpieczyć nadmiernie liberalne reguły AllowKey/AllowKeyRegexp lub DenyKey/DenyKeyRegexp.
Rozważmy następujące reguły:
z użyciem AllowKey i DenyKey:
AllowKey=system.run["C:\Program^ Files\Zabbix^ Agent^ 2\scripts\test.bat*"]
DenyKey=vfs.file.*
DenyKey=system.cpu.load[*]
z użyciem AllowKeyRegexp i DenyKeyRegexp:
AllowKeyRegexp=^system\.run\["C:\\Program\sFiles\\Zabbix\sAgent\s2\\scripts\\test\.bat.*"\]$
DenyKeyRegexp=^vfs\.file\..*$
DenyKeyRegexp=^system\.cpu\.load\[.*\]$
W systemie Windows należy poprzedzić spacje w ścieżce znakiem daszka (^) w przypadku AllowKey lub DenyKey oraz użyć \s w przypadku AllowKeyRegexp lub DenyKeyRegexp.
Te reguły zawierają symbol wieloznaczny (*), który może zostać niewłaściwie wykorzystany:
- Skrypt
test.batmoże zostać wykonany z dowolnymi argumentami, w tym z niezamierzonymi. - Wzorzec
vfs.file.*pasuje do kluczy pozycji bez parametrów, jednak wszystkie pozycjevfs.filewymagają parametrów. - Wzorzec
system.cpu.load[*]pasuje tylko do kluczy pozycji z parametrami, jednak pozycjesystem.cpu.loadnie wymagają parametrów.
Aby zabezpieczyć te reguły, jawnie zezwól na wykonywanie test.bat tylko z określonymi argumentami oraz zablokuj prawidłowe wzorce kluczy pozycji, na przykład:
z użyciem AllowKey i 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[*]
z użyciem AllowKeyRegexp i DenyKeyRegexp:
AllowKeyRegexp=^system\.run\["C:\\Program\sFiles\\Zabbix\sAgent\s2\\scripts\\test\.bat (status|version)"\]$
DenyKeyRegexp=^vfs\.file\..+\[[\s\S]*\]$
DenyKeyRegexp=^system\.cpu\.load(\[.*\])?$
Możesz przetestować reguły, uruchamiając następujące polecenia, które zwrócą ZBX_NOTSUPPORTED.
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]
Przykłady wzorców
Poniższe tabele pokazują sposób dopasowywania wzorców kluczy pozycji:
- Klucz pasuje do wzorca tylko wtedy, gdy spełnia wszystkie warunki w kolumnie Pasuje.
- Parametry muszą być w całości ujęte w nawiasy kwadratowe (np.
vfs.file.contents[*ivfs.file.contents*utf8]są nieprawidłowymi wzorcami). - Przykłady ilustrują wyłącznie dopasowywanie wzorców; rzeczywiste pozycje wymagają parametrów.
Zaleca się używanie AllowKey lub AllowKeyRegexp w celu jawnego zezwalania na dostęp wyłącznie do wymaganych plików i poleceń oraz DenyKey lub DenyKeyRegexp w celu blokowania całych kluczy pozycji (zobacz Ważne uwagi).
Używanie reguł opartych na symbolach wieloznacznych:
| Wzorzec | Pasuje | Przykłady |
|---|---|---|
* |
Dowolny klucz z parametrami lub bez parametrów | |
vfs.file.* |
Klucz zaczyna się od vfs.file.Bez parametrów |
Pasuje:vfs.file.sizevfs.file.contentsNie pasuje: vfs.file.contents[]vfs.file.size[/var/log/app.log] |
vfs.*.contents |
Klucz zaczyna się od vfs.Klucz kończy się na .contentsBez parametrów |
Pasuje: vfs..contentsvfs.file.contentsvfs.mount.point.file.contentsNie pasuje: vfs.contentsvfs.file.contents[] |
vfs.file.*[*] |
Klucz zaczyna się od vfs.file.Dowolne lub puste parametry |
Pasujevfs.file.get.custom[]vfs.file.size[/var/log/app.log, utf8]Nie pasuje: vfs.file.get.custom |
vfs.file.contents |
Klucz to vfs.file.contentsBez parametrów |
Pasuje:vfs.file.contentsNie pasuje: vfs.file.contents[/etc/passwd] |
vfs.file.contents[] |
Klucz to vfs.file.contents[]Puste parametry |
Pasuje:vfs.file.contents[]Nie pasuje: vfs.file.contents |
vfs.file.contents[*] |
Klucz to vfs.file.contentsDowolne lub puste parametry |
Pasuje:vfs.file.contents[/path/to/file]Nie pasuje: vfs.file.contents |
vfs.file.contents[/etc/passwd,*] |
Klucz to vfs.file.contentsPierwszy parametr to /etc/passwdDowolny, pusty lub brak kolejnych parametrów |
Pasuje:vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf8]vfs.file.contents[/etc/passwd]Nie pasuje: vfs.file.contents[] |
vfs.file.contents[*passwd*] |
Klucz to vfs.file.contentsDokładnie jeden parametr zawierający passwd |
Pasuje:vfs.file.contents[/etc/passwd]Nie pasuje: vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf8] |
vfs.file.contents[*passwd*,*] |
Klucz to vfs.file.contentsPierwszy parametr zawiera passwdDowolny lub pusty drugi parametr |
Pasuje:vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf8]vfs.file.contents[/etc/passwd]Nie pasuje: vfs.file.contents[/tmp/test] |
vfs.file.contents[/etc/passwd,utf8] |
Klucz to vfs.file.contentsPierwszy parametr to /etc/passwdDrugi parametr to utf8 |
Pasuje:vfs.file.contents[/etc/passwd,utf8]Nie pasuje: vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf16] |
Używanie reguł opartych na wyrażeniach regularnych:
| Wzorzec | Pasuje | Przykłady |
|---|---|---|
^[\s\S]*$ |
Dowolny klucz z parametrami lub bez parametrów | |
^vfs\.file\.[^\[]*$ |
Klucz zaczyna się od vfs.file.Bez parametrów |
Pasuje:vfs.file.sizevfs.file.contentsNie pasuje: vfs.file.contents[]vfs.file.size[/var/log/app.log] |
^vfs\..*\.contents$ |
Klucz zaczyna się od vfs.Klucz kończy się na .contentsBez parametrów |
Pasuje: vfs..contentsvfs.mount.point.file.contentsNie pasuje: vfs.contentsvfs.file.contents[] |
^vfs\.file\..*\[[\s\S]*\]$ |
Klucz zaczyna się od vfs.file.Dowolne lub puste parametry |
Pasujevfs.file.get.custom[]vfs.file.size[/var/log/app.log, utf8]Nie pasuje: vfs.file.get.custom |
^vfs\.file\.contents$ |
Klucz to vfs.file.contentsBez parametrów |
Pasuje:vfs.file.contentsNie pasuje: vfs.file.contents[/etc/passwd] |
^vfs\.file\.contents\[\]$ |
Klucz to vfs.file.contents[]Puste parametry |
Pasuje:vfs.file.contents[]Nie pasuje: vfs.file.contents |
^vfs\.file\.contents\[[\s\S]*\]$ |
Klucz to vfs.file.contentsDowolne lub puste parametry |
Pasuje:vfs.file.contents[/path/to/file]Nie pasuje: vfs.file.contents |
^vfs\.file\.contents\[/etc/passwd,[\s\S]*\]$ |
Klucz to vfs.file.contentsPierwszy parametr to /etc/passwdDowolny lub pusty drugi parametr |
Pasuje:vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf8]Nie pasuje: vfs.file.contents[]vfs.file.contents[/etc/passwd] |
^vfs\.file\.contents\[[\s\S]*passwd[\s\S]*\]$ |
Klucz to vfs.file.contentsDowolne parametry, z których co najmniej jeden zawiera passwd |
Pasuje:vfs.file.contents[/etc/passwd]vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf8] |
^vfs\.file\.contents\[[^,]*passwd[^,]*,[\s\S]*\]$ |
Klucz to vfs.file.contentsPierwszy parametr zawiera passwdDowolny lub pusty drugi parametr |
Pasuje:vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf8]Nie pasuje: vfs.file.contents[/etc/passwd]vfs.file.contents[/tmp/test] |
^vfs\.file\.contents\[/etc/passwd,(utf8|windows-1252)\]$ |
Klucz to vfs.file.contentsPierwszy parametr to /etc/passwdDrugi parametr to utf8 lub windows-1252 |
Pasuje:vfs.file.contents[/etc/passwd,utf8]vfs.file.contents[/etc/passwd,windows-1252]Nie pasuje: vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf16] |