Limitazione dei controlli agent

Panoramica

Puoi controllare quali chiavi item Zabbix agent o agent 2 è autorizzato o vietato usare durante l'esecuzione di controlli item, comandi remoti o script.

Per farlo, usa questi parametri di configurazione dell'agent per definire regole di allow/deny:

  • AllowKey=<pattern>
  • DenyKey=<pattern>
  • AllowKeyRegexp=<pattern>
  • DenyKeyRegexp=<pattern>

Il <pattern> deve contenere una singola chiave item.
Per AllowKey e DenyKey, il <pattern> supporta i caratteri jolly (*). Il carattere jolly corrisponde a qualsiasi numero di caratteri in qualsiasi posizione e può essere usato per corrispondere a chiavi item o parametri (ad esempio, vfs.file.*[*]).
Per AllowKeyRegexp e DenyKeyRegexp, il <pattern> supporta espressioni regolari. Il pattern dell'espressione regolare può essere usato per corrispondere alle chiavi item e alle relative stringhe di parametri. Vedi anche esempi di escaping corretto.
Tieni presente che Zabbix agent e Zabbix agent 2 possono supportare una sintassi di espressioni regolari diversa.

Per migliorare la sicurezza, si consiglia di usare chiavi item esatte invece dei caratteri jolly per AllowKey e DenyKey. Si consiglia inoltre di usare i pattern di espressione regolare più specifici possibili per AllowKeyRegexp e DenyKeyRegexp. Per i dettagli, vedi Protezione delle regole allow/deny.

A differenza degli altri parametri di configurazione dell'agent, puoi specificare un numero illimitato di parametri AllowKey, DenyKey, AllowKeyRegexp o DenyKeyRegexp.

Note importanti

  • Tutti gli item system.run sono disabilitati per impostazione predefinita (anche quando DenyKey e DenyKeyRegexp sono vuoti), come se fosse impostato DenyKey=system.run[*] oppure DenyKeyRegexp=^system\.run\[.*\]$ come ultima regola. Per questo motivo, è possibile consentire specifici item system.run senza negare esplicitamente gli altri item system.run.

  • Se possibile, usa AllowKey/AllowKeyRegexp per consentire solo gli item necessari e negare tutto il resto. Alcune chiavi possono essere sfruttate per leggere file non previsti tramite path traversal (ad esempio, vfs.file.contents["../../../../etc/passwd"]), e le nuove versioni di Zabbix agent possono introdurre chiavi non coperte dalle regole DenyKey/DenyKeyRegexp.

  • La configurazione AllowKey, DenyKey, AllowKeyRegexp e DenyKeyRegexp non influisce sui parametri agent HostnameItem, HostMetadataItem o HostInterfaceItem.

  • Gli item negati diventano non supportati senza alcun suggerimento o messaggio di errore; ad esempio:

    • Il parametro da riga di comando di Zabbix agent --print (-p) non mostrerà le chiavi degli item negati.
    • Il parametro da riga di comando di Zabbix agent --test (-t) restituirà "Unsupported item key." per le chiavi degli item negati.
    • Quando la registrazione è attivata (LogRemoteCommands=1), il file di log di Zabbix agent non registrerà i comandi remoti negati.

Ordine delle regole allow/deny

È possibile specificare un numero illimitato di regole AllowKey, DenyKey, AllowKeyRegexp o DenyKeyRegexp, anche se il loro ordine è importante.

  • Le regole vengono valutate una per una, dall'alto verso il basso.
  • Quando una chiave di item corrisponde a una regola, viene consentita o negata e la valutazione delle regole si interrompe.

Ad esempio, durante la valutazione di vfs.file.contents[/etc/passwd], le regole vengono elaborate come segue:

AllowKey=vfs.file.contents[/tmp/app.log]    # Il pattern della chiave dell'item non corrisponde; l'agent passa alla regola successiva.
AllowKey=vfs.file.contents[/etc/passwd]     # Il pattern della chiave dell'item corrisponde; l'agent consente il controllo dell'item e interrompe la valutazione delle regole.
DenyKey=vfs.file.*[*]                       # L'agent ignora la regola, poiché la valutazione si è già interrotta.

La seguente sequenza di regole negherà il controllo dell'item:

DenyKey=vfs.file.*[*]                       # Il pattern della chiave dell'item corrisponde; l'agent nega il controllo dell'item e interrompe la valutazione delle regole.
AllowKey=vfs.file.contents[/etc/passwd]     # L'agent ignora la regola, poiché la valutazione si è già interrotta.
AllowKey=vfs.file.contents[/tmp/app.log]    # L'agent ignora la regola, poiché la valutazione si è già interrotta.

Esempi

I seguenti esempi mostrano i modelli di configurazione comuni per AllowKey, DenyKey, AllowKeyRegexp e DenyKeyRegexp.

Consentire controlli e comandi specifici

Consentire solo due controlli item vfs.file e due comandi system.run:

usando AllowKey e 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.*[*]

usando AllowKeyRegexp e DenyKeyRegexp:

AllowKeyRegexp=^vfs\.file\.(contents|size)\[/tmp/app\.log\]$
AllowKeyRegexp=^system\.run\[/usr/bin/(uptime|df -h /)\]$
DenyKeyRegexp=^vfs\.file\..*\[.*\]$

Impostare DenyKey=system.run[*] o DenyKeyRegexp=^system\.run\[.*\]$ non è necessario, perché tutti gli altri comandi system.run sono negati per impostazione predefinita.

Consentire gli script

Consenti all'agent Zabbix di eseguire script sugli host tramite tutti i metodi disponibili:

  • Script globali che possono essere eseguiti nel frontend o tramite API (questo metodo usa sempre la chiave system.run[myscript.sh])
  • Comandi remoti dalle operazioni delle azioni (questo metodo usa sempre la chiave system.run[myscript.sh,nowait])
  • Elementi system.run di Zabbix agent con lo script, ad esempio:
    • system.run[myscript.sh]
    • system.run[myscript.sh,wait]
    • system.run[myscript.sh,nowait]
AllowKey=system.run[myscript.sh,*]

oppure

AllowKeyRegexp=^system\.run\[myscript\.sh,.*\]$

Per controllare il parametro wait/nowait, devi impostare una regola diversa. Ad esempio, puoi consentire solo gli elementi system.run[myscript.sh,wait], escludendo così gli altri metodi:

AllowKey=system.run[myscript.sh,wait]

oppure

AllowKeyRegexp=^system\.run\[myscript\.sh,wait\]$
Protezione delle regole allow/deny

Questi esempi mostrano come proteggere regole AllowKey/AllowKeyRegexp o DenyKey/DenyKeyRegexp troppo permissive.

Considera le seguenti regole:

using AllowKey and DenyKey:

AllowKey=system.run["C:\Program^ Files\Zabbix^ Agent^ 2\scripts\test.bat*"]
DenyKey=vfs.file.*
DenyKey=system.cpu.load[*]

using AllowKeyRegexp and DenyKeyRegexp:

AllowKeyRegexp=^system\.run\["C:\\Program\sFiles\\Zabbix\sAgent\s2\\scripts\\test\.bat.*"\]$
DenyKeyRegexp=^vfs\.file\..*$
DenyKeyRegexp=^system\.cpu\.load\[.*\]$

Su Windows, devi eseguire l'escape degli spazi nel percorso usando un caret (^) per AllowKey o DenyKey e \s per AllowKeyRegexp o DenyKeyRegexp.

Queste regole contengono un wildcard (*) (o .* per i pattern basati su espressioni regolari), che può essere usato in modo improprio:

  • Lo script test.bat può essere eseguito con qualsiasi argomento, inclusi quelli non intenzionali.
  • Il pattern vfs.file.* (^vfs\.file\..*$) corrisponde a chiavi item sia con sia senza parametri; tuttavia, tutti gli item vfs.file richiedono parametri.
  • Il pattern system.cpu.load[*] (^system\.cpu\.load\[.*\]$) corrisponde solo a chiavi item con parametri; tuttavia gli item system.cpu.load non richiedono parametri.

Per proteggere queste regole, consenti esplicitamente l'esecuzione di test.bat solo con argomenti specifici e nega i pattern corretti delle chiavi item; ad esempio:

using AllowKey and 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[*]

using AllowKeyRegexp and DenyKeyRegexp:

AllowKeyRegexp=^system\.run\["C:\\Program\sFiles\\Zabbix\sAgent\s2\\scripts\\test\.bat (status|version)"\]$
DenyKeyRegexp=^vfs\.file\..+\[.*\]$
DenyKeyRegexp=^system\.cpu\.load(\[.*\])?$

Puoi testare le regole eseguendo i seguenti comandi, che restituiranno 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]
Esempi di pattern

Le tabelle seguenti mostrano come vengono confrontati i pattern delle chiavi item:

  • Una chiave corrisponde al pattern solo se soddisfa tutte le condizioni nella colonna Matches.
  • I parametri devono essere racchiusi completamente tra parentesi quadre (ad esempio, vfs.file.contents[* e vfs.file.contents*utf8] sono pattern non validi).
  • Gli esempi illustrano solo la corrispondenza dei pattern; gli item effettivi richiedono parametri.

Per AllowKey e DenyKey:

Pattern Matches Examples
* Qualsiasi chiave con o senza parametri
vfs.file.* La chiave inizia con vfs.file.
Con o senza parametri
Matches:
vfs.file.size
vfs.file.contents
vfs.file.contents[]
vfs.file.size[/var/log/app.log]
vfs.*.contents La chiave inizia con vfs.
La chiave termina con .contents
Nessun parametro
Matches:
vfs..contents
vfs.mount.point.file.contents

Does not match:
vfs.contents
vfs.file.contents[]
vfs.file.*[*] La chiave inizia con vfs.file.
Parametri qualsiasi o vuoti
Matches
vfs.file.get.custom[]
vfs.file.size[/var/log/app.log, utf8]

Does not match:
vfs.file.get.custom
vfs.file.contents La chiave è vfs.file.contents
Nessun parametro
Matches:
vfs.file.contents

Does not match:
vfs.file.contents[/etc/passwd]
vfs.file.contents[] La chiave è vfs.file.contents[]
Parametri vuoti
Matches:
vfs.file.contents[]

Does not match:
vfs.file.contents
vfs.file.contents[*] La chiave è vfs.file.contents
Parametri qualsiasi o vuoti
Matches:
vfs.file.contents[/path/to/file]

Does not match:
vfs.file.contents
vfs.file.contents[/etc/passwd,*] La chiave è vfs.file.contents
Il primo parametro è /etc/passwd
Il secondo parametro è qualsiasi o vuoto
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*] La chiave è vfs.file.contents
Parametri qualsiasi, almeno uno contenente passwd
Matches:
vfs.file.contents[/etc/passwd]
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf8]
vfs.file.contents[*passwd*,*] La chiave è vfs.file.contents
Il primo parametro contiene passwd
Il secondo parametro è qualsiasi o vuoto
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] La chiave è vfs.file.contents
Il primo parametro è /etc/passwd
Il secondo parametro è utf8
Matches:
vfs.file.contents[/etc/passwd,utf8]

Does not match:
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf16]

Per AllowKeyRegexp e DenyKeyRegexp:

Pattern Matches Examples
^.*$ Qualsiasi chiave con o senza parametri
^vfs\.file\..*$ La chiave inizia con vfs.file.
Con o senza parametri
Matches:
vfs.file.size
vfs.file.contents
vfs.file.contents[]
vfs.file.size[/var/log/app.log]
^vfs\..*\.contents$ La chiave inizia con vfs.
La chiave termina con .contents
Nessun parametro
Matches:
vfs..contents
vfs.mount.point.file.contents

Does not match:
vfs.contents
vfs.file.contents[]
^vfs\.file\..*\[.*\]$ La chiave inizia con vfs.file.
Parametri qualsiasi o vuoti
Matches
vfs.file.get.custom[]
vfs.file.size[/var/log/app.log, utf8]

Does not match:
vfs.file.get.custom
^vfs\.file\.contents$ La chiave è vfs.file.contents
Nessun parametro
Matches:
vfs.file.contents

Does not match:
vfs.file.contents[/etc/passwd]
^vfs\.file\.contents\[\]$ La chiave è vfs.file.contents[]
Parametri vuoti
Matches:
vfs.file.contents[]

Does not match:
vfs.file.contents
^vfs\.file\.contents\[.*\]$ La chiave è vfs.file.contents
Parametri qualsiasi o vuoti
Matches:
vfs.file.contents[/path/to/file]

Does not match:
vfs.file.contents
^vfs\.file\.contents\[/etc/passwd,.*\]$ La chiave è vfs.file.contents
Il primo parametro è /etc/passwd
Il secondo parametro è qualsiasi o vuoto
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.*\]$ La chiave è vfs.file.contents
Parametri qualsiasi, almeno uno contenente passwd
Matches:
vfs.file.contents[/etc/passwd]
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf8]
^vfs\.file\.contents\[.*passwd.*,.*\]$ La chiave è vfs.file.contents
Il primo parametro contiene passwd
Il secondo parametro è qualsiasi o vuoto
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)\]$ La chiave è vfs.file.contents
Il primo parametro è /etc/passwd
Il secondo parametro è utf8 o 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]