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.run są domyślnie wyłączone (nawet gdy DenyKey i DenyKeyRegexp są puste), tak jakby ustawiono DenyKey=system.run[*] lub DenyKeyRegexp=^system\.run\[.*\]$ jako ostatnią regułę. Z tego powodu można zezwolić na określone pozycje system.run bez jawnego blokowania innych pozycji system.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ład vfs.file.contents["../../../../etc/passwd"]), a nowe wersje agenta Zabbix mogą wprowadzać klucze nieobjęte regułami DenyKey/DenyKeyRegexp.

  • Konfiguracja AllowKey, DenyKey, AllowKeyRegexp i DenyKeyRegexp nie wpływa na parametry agenta HostnameItem, HostMetadataItem ani HostInterfaceItem.

  • 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ń.

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.run agenta 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.bat moż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 pozycje vfs.file wymagają parametrów.
  • Wzorzec system.cpu.load[*] (^system\.cpu\.load\[.*\]$) dopasowuje tylko klucze pozycji z parametrami; jednak pozycje system.cpu.load nie 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[* i vfs.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.size
vfs.file.contents
vfs.file.contents[]
vfs.file.size[/var/log/app.log]
vfs.*.contents Klucz zaczyna się od vfs.
Klucz kończy się na .contents
Bez parametrów
Matches:
vfs..contents
vfs.mount.point.file.contents

Does not match:
vfs.contents
vfs.file.contents[]
vfs.file.*[*] Klucz zaczyna się od vfs.file.
Dowolne lub puste parametry
Matches
vfs.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.contents
Bez parametrów
Matches:
vfs.file.contents

Does 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.contents
Dowolne 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.contents
Pierwszy parametr to /etc/passwd
Dowolny 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.contents
Dowolne 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.contents
Pierwszy parametr zawiera passwd
Dowolny 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.contents
Pierwszy parametr to /etc/passwd
Drugi 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.size
vfs.file.contents
vfs.file.contents[]
vfs.file.size[/var/log/app.log]
^vfs\..*\.contents$ Klucz zaczyna się od vfs.
Klucz kończy się na .contents
Bez parametrów
Matches:
vfs..contents
vfs.mount.point.file.contents

Does not match:
vfs.contents
vfs.file.contents[]
^vfs\.file\..*\[.*\]$ Klucz zaczyna się od vfs.file.
Dowolne lub puste parametry
Matches
vfs.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.contents
Bez parametrów
Matches:
vfs.file.contents

Does 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.contents
Dowolne 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.contents
Pierwszy parametr to /etc/passwd
Dowolny 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.contents
Dowolne 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.contents
Pierwszy parametr zawiera passwd
Dowolny 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.contents
Pierwszy parametr to /etc/passwd
Drugi 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]