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 AllowKey lub AllowKeyRegexp, aby zezwolić tylko na wymagane pozycje, a DenyKey lub DenyKeyRegexp jako 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ły DenyKey lub DenyKeyRegexp.

  • Reguły zezwalające powinny być jak najbardziej szczegółowe: w regułach AllowKey używaj dokładnych kluczy pozycji zamiast symboli wieloznacznych (*), a w regułach AllowKeyRegexp używaj najbardziej szczegółowych wzorców wyrażeń regularnych.

  • Jeśli używasz DenyKey lub DenyKeyRegexp, 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.run są domyślnie odrzucane (nawet gdy DenyKey i DenyKeyRegexp są puste), tak jakby DenyKey=system.run[*] było ustawione jako ostatnia reguła. Dzięki temu można zezwolić na określone pozycje system.run bez jawnego odrzucania innych pozycji system.run. To niejawne odrzucanie dotyczy tylko system.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, AllowKeyRegexp i DenyKeyRegexp nie wpływa na parametry agent HostnameItem, HostMetadataItem ani HostInterfaceItem.

  • 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óci Unsupported item key. dla odrzuconych kluczy pozycji.
    • Po włączeniu rejestrowania (LogRemoteCommands=1) plik dziennika Zabbix agent nie będzie rejestrować odrzuconych poleceń zdalnych.

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.run zawierają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.bat może zostać wykonany z dowolnymi argumentami, w tym z niezamierzonymi.
  • Wzorzec vfs.file.* pasuje do kluczy pozycji bez parametrów, jednak wszystkie pozycje vfs.file wymagają parametrów.
  • Wzorzec system.cpu.load[*] pasuje tylko do kluczy pozycji z parametrami, jednak pozycje system.cpu.load nie 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[* i vfs.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.size
vfs.file.contents

Nie pasuje:
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
Pasuje:
vfs..contents
vfs.file.contents
vfs.mount.point.file.contents

Nie pasuje:
vfs.contents
vfs.file.contents[]
vfs.file.*[*] Klucz zaczyna się od vfs.file.
Dowolne lub puste parametry
Pasuje
vfs.file.get.custom[]
vfs.file.size[/var/log/app.log, utf8]

Nie pasuje:
vfs.file.get.custom
vfs.file.contents Klucz to vfs.file.contents
Bez parametrów
Pasuje:
vfs.file.contents

Nie 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.contents
Dowolne lub puste parametry
Pasuje:
vfs.file.contents[/path/to/file]

Nie pasuje:
vfs.file.contents
vfs.file.contents[/etc/passwd,*] Klucz to vfs.file.contents
Pierwszy parametr to /etc/passwd
Dowolny, 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.contents
Dokł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.contents
Pierwszy parametr zawiera passwd
Dowolny 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.contents
Pierwszy parametr to /etc/passwd
Drugi 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.size
vfs.file.contents

Nie pasuje:
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
Pasuje:
vfs..contents
vfs.mount.point.file.contents

Nie pasuje:
vfs.contents
vfs.file.contents[]
^vfs\.file\..*\[[\s\S]*\]$ Klucz zaczyna się od vfs.file.
Dowolne lub puste parametry
Pasuje
vfs.file.get.custom[]
vfs.file.size[/var/log/app.log, utf8]

Nie pasuje:
vfs.file.get.custom
^vfs\.file\.contents$ Klucz to vfs.file.contents
Bez parametrów
Pasuje:
vfs.file.contents

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