12 Ograniczanie kontroli agenta
Omówienie
Możesz kontrolować, których kluczy pozycji Zabbix agent lub agent 2 może używać albo których nie może używać podczas wykonywania sprawdzeń pozycji, zdalnych poleceń lub skryptów.
Aby to zrobić, użyj tych parametrów konfiguracji agenta, aby zdefiniować reguły zezwalania/odmawiania:
AllowKey=<pattern>DenyKey=<pattern>AllowKeyRegexp=<pattern>DenyKeyRegexp=<pattern>
<pattern> musi zawierać pojedynczy klucz pozycji.
W przypadku AllowKey i DenyKey parametr <pattern> obsługuje symbole wieloznaczne (*).
Symbol wieloznaczny dopasowuje dowolną liczbę dowolnych znaków w swojej pozycji i może być używany do dopasowywania kluczy pozycji lub parametrów (np. vfs.file.*[*]).
W przypadku AllowKeyRegexp i DenyKeyRegexp parametr <pattern> obsługuje wyrażenia regularne.
Wzorzec wyrażenia regularnego może być używany do dopasowywania kluczy pozycji i ich ciągów parametrów.
Zobacz też przykłady poprawnego escapowania.
Należy pamiętać, że Zabbix agent i Zabbix agent 2 mogą obsługiwać inną składnię wyrażeń regularnych.
Aby poprawić bezpieczeństwo, zaleca się używanie dokładnych kluczy pozycji zamiast symboli wieloznacznych dla AllowKey i DenyKey.
Zaleca się również używanie możliwie najbardziej precyzyjnych wzorców wyrażeń regularnych dla AllowKeyRegexp i DenyKeyRegexp.
Szczegóły można znaleźć w sekcji Zabezpieczanie reguł zezwalania/odmawiania.
W przeciwieństwie do innych parametrów konfiguracji agenta możesz określić nieograniczoną liczbę parametrów AllowKey, DenyKey, AllowKeyRegexp lub DenyKeyRegexp.
Ważne uwagi
-
Wszystkie pozycje
system.runsą domyślnie wyłączone (nawet gdyDenyKeyiDenyKeyRegexpsą puste), tak jakby ustawionoDenyKey=system.run[*]lubDenyKeyRegexp=^system\.run\[.*\]$jako ostatnią regułę. Z tego powodu można zezwolić na określone pozycjesystem.runbez jawnego blokowania innych pozycjisystem.run. -
Jeśli to możliwe, używaj
AllowKey/AllowKeyRegexp, aby zezwalać tylko na wymagane pozycje i blokować wszystko inne. Niektóre klucze mogą zostać wykorzystane do odczytu niezamierzonych plików poprzez przejście po ścieżce (na przykładvfs.file.contents["../../../../etc/passwd"]), a nowe wersje agenta Zabbix mogą wprowadzać klucze nieobjęte regułamiDenyKey/DenyKeyRegexp. -
Konfiguracja
AllowKey,DenyKey,AllowKeyRegexpiDenyKeyRegexpnie wpływa na parametry agentaHostnameItem,HostMetadataItemaniHostInterfaceItem. -
Zablokowane pozycje stają się nieobsługiwane bez żadnych wskazówek ani komunikatów o błędach; na przykład:
- Parametr wiersza poleceń agenta Zabbix
--print (-p)nie będzie wyświetlał zablokowanych kluczy pozycji. - Parametr wiersza poleceń agenta Zabbix
--test (-t)zwróci dla zablokowanych kluczy pozycji komunikat "Unsupported item key.". - Gdy rejestrowanie jest włączone (
LogRemoteCommands=1), plik dziennika agenta Zabbix nie będzie rejestrował zablokowanych zdalnych poleceń.
- Parametr wiersza poleceń agenta Zabbix
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 dwa sprawdzenia pozycji vfs.file i dwa polecenia system.run:
używając 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.*[*]
używając AllowKeyRegexp i DenyKeyRegexp:
AllowKeyRegexp=^vfs\.file\.(contents|size)\[/tmp/app\.log\]$
AllowKeyRegexp=^system\.run\[/usr/bin/(uptime|df -h /)\]$
DenyKeyRegexp=^vfs\.file\..*\[.*\]$
Ustawienie DenyKey=system.run[*] lub DenyKeyRegexp=^system\.run\[.*\]$ jest niepotrzebne, ponieważ wszystkie pozostałe polecenia system.run są domyślnie odrzucane.
Zezwalanie na skrypty
Zezwól agentowi Zabbix na wykonywanie skryptów na hostach za pomocą wszystkich dostępnych metod:
- Skrypty globalne, które mogą być wykonywane w frontend lub przez API (ta metoda zawsze używa klucza
system.run[myscript.sh]) - Polecenia zdalne z operacji akcji (ta metoda zawsze używa klucza
system.run[myscript.sh,nowait]) - Pozycje
system.runagenta Zabbix ze skryptem, na przykład:system.run[myscript.sh]system.run[myscript.sh,wait]system.run[myscript.sh,nowait]
AllowKey=system.run[myscript.sh,*]
lub
AllowKeyRegexp=^system\.run\[myscript\.sh,.*\]$
Aby kontrolować parametr wait/nowait, musisz ustawić inną regułę.
Na przykład możesz zezwolić tylko na pozycje system.run[myscript.sh,wait], wykluczając w ten sposób 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ć zbyt liberalne reguły AllowKey/AllowKeyRegexp lub DenyKey/DenyKeyRegexp.
Rozważ 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 uciekać spacje w ścieżce za pomocą daszka (^) dla AllowKey lub DenyKey oraz \s dla AllowKeyRegexp lub DenyKeyRegexp.
Te reguły zawierają wieloznacznik (*) (lub .* w przypadku wzorców opartych na wyrażeniach regularnych), który może zostać użyty w niepożądany sposób:
- Skrypt
test.batmoże zostać uruchomiony z dowolnymi argumentami, w tym niezamierzonymi. - Wzorzec
vfs.file.*(^vfs\.file\..*$) dopasowuje klucze pozycji zarówno z parametrami, jak i bez nich; jednak wszystkie pozycjevfs.filewymagają parametrów. - Wzorzec
system.cpu.load[*](^system\.cpu\.load\[.*\]$) dopasowuje tylko klucze pozycji z parametrami; jednak pozycjesystem.cpu.loadnie wymagają parametrów.
Aby zabezpieczyć te reguły, należy jawnie zezwolić na uruchamianie test.bat tylko z określonymi argumentami oraz zablokować poprawne 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\..+\[.*\]$
DenyKeyRegexp=^system\.cpu\.load(\[.*\])?$
Reguły można przetestować, 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ą, jak dopasowywane są wzorce kluczy pozycji:
- Klucz pasuje do wzorca tylko wtedy, gdy spełnia wszystkie warunki w kolumnie Matches.
- 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.
Dla AllowKey i DenyKey:
| Pattern | Matches | Examples |
|---|---|---|
* |
Dowolny klucz z parametrami lub bez | |
vfs.file.* |
Klucz zaczyna się od vfs.file.Z parametrami lub bez |
Matches:vfs.file.sizevfs.file.contentsvfs.file.contents[]vfs.file.size[/var/log/app.log] |
vfs.*.contents |
Klucz zaczyna się od vfs.Klucz kończy się na .contentsBez parametrów |
Matches: vfs..contentsvfs.mount.point.file.contentsDoes not match: vfs.contentsvfs.file.contents[] |
vfs.file.*[*] |
Klucz zaczyna się od vfs.file.Dowolne lub puste parametry |
Matchesvfs.file.get.custom[]vfs.file.size[/var/log/app.log, utf8]Does not match: vfs.file.get.custom |
vfs.file.contents |
Klucz to vfs.file.contentsBez parametrów |
Matches:vfs.file.contentsDoes not match: vfs.file.contents[/etc/passwd] |
vfs.file.contents[] |
Klucz to vfs.file.contents[]Puste parametry |
Matches:vfs.file.contents[]Does not match: vfs.file.contents |
vfs.file.contents[*] |
Klucz to vfs.file.contentsDowolne lub puste parametry |
Matches:vfs.file.contents[/path/to/file]Does not match: vfs.file.contents |
vfs.file.contents[/etc/passwd,*] |
Klucz to vfs.file.contentsPierwszy parametr to /etc/passwdDowolny lub pusty drugi parametr |
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*] |
Klucz to vfs.file.contentsDowolne parametry, co najmniej jeden zawiera passwd |
Matches:vfs.file.contents[/etc/passwd]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 |
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] |
Klucz to vfs.file.contentsPierwszy parametr to /etc/passwdDrugi parametr to utf8 |
Matches:vfs.file.contents[/etc/passwd,utf8]Does not match: vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf16] |
Dla AllowKeyRegexp i DenyKeyRegexp:
| Pattern | Matches | Examples |
|---|---|---|
^.*$ |
Dowolny klucz z parametrami lub bez | |
^vfs\.file\..*$ |
Klucz zaczyna się od vfs.file.Z parametrami lub bez |
Matches:vfs.file.sizevfs.file.contentsvfs.file.contents[]vfs.file.size[/var/log/app.log] |
^vfs\..*\.contents$ |
Klucz zaczyna się od vfs.Klucz kończy się na .contentsBez parametrów |
Matches: vfs..contentsvfs.mount.point.file.contentsDoes not match: vfs.contentsvfs.file.contents[] |
^vfs\.file\..*\[.*\]$ |
Klucz zaczyna się od vfs.file.Dowolne lub puste parametry |
Matchesvfs.file.get.custom[]vfs.file.size[/var/log/app.log, utf8]Does not match: vfs.file.get.custom |
^vfs\.file\.contents$ |
Klucz to vfs.file.contentsBez parametrów |
Matches:vfs.file.contentsDoes not match: vfs.file.contents[/etc/passwd] |
^vfs\.file\.contents\[\]$ |
Klucz to vfs.file.contents[]Puste parametry |
Matches:vfs.file.contents[]Does not match: vfs.file.contents |
^vfs\.file\.contents\[.*\]$ |
Klucz to vfs.file.contentsDowolne lub puste parametry |
Matches:vfs.file.contents[/path/to/file]Does not match: vfs.file.contents |
^vfs\.file\.contents\[/etc/passwd,.*\]$ |
Klucz to vfs.file.contentsPierwszy parametr to /etc/passwdDowolny lub pusty drugi parametr |
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.*\]$ |
Klucz to vfs.file.contentsDowolne parametry, co najmniej jeden zawiera passwd |
Matches:vfs.file.contents[/etc/passwd]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 |
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)\]$ |
Klucz to vfs.file.contentsPierwszy parametr to /etc/passwdDrugi parametr to utf8 lub 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] |