Limitazione dei controlli agent

Panoramica

È possibile controllare quali chiavi degli item Zabbix agent o agent 2 possono essere utilizzate o devono essere negate durante l'esecuzione dei controlli degli item, dei comandi remoti o degli script.

A tale scopo, utilizzare questi parametri di configurazione dell'agent per definire le regole di autorizzazione o negazione:

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

<pattern> deve contenere una singola chiave dell'item.
Per AllowKey e DenyKey, <pattern> supporta i caratteri jolly (*). Il carattere jolly corrisponde a un numero qualsiasi di caratteri nella posizione in cui viene utilizzato e può essere impiegato per trovare corrispondenze con le chiavi degli item o con i parametri (ad esempio, vfs.file.*[*]).
Per AllowKeyRegexp e DenyKeyRegexp, <pattern> supporta le espressioni regolari. Il pattern dell'espressione regolare può essere utilizzato per trovare corrispondenze con le chiavi degli item e le relative stringhe dei parametri. Vedere anche gli esempi di escape corretto.
Tenere presente che Zabbix agent e Zabbix agent 2 potrebbero supportare sintassi diverse per le espressioni regolari.

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

Note importanti

  • Utilizzare AllowKey o AllowKeyRegexp per consentire solo gli item necessari e DenyKey o DenyKeyRegexp come ultima regola per negare tutti gli altri. Questo è più sicuro che affidarsi esclusivamente alle regole di negazione, perché le nuove versioni dell'agent Zabbix potrebbero introdurre chiavi item non coperte dalle regole DenyKey o DenyKeyRegexp.

  • Rendere le regole di autorizzazione il più specifiche possibile: utilizzare chiavi item esatte invece dei caratteri jolly (*) nelle regole AllowKey e utilizzare i pattern di espressione regolare più specifici nelle regole AllowKeyRegexp.

  • Se si utilizza DenyKey o DenyKeyRegexp, negare intere chiavi item anziché file o comandi specifici. Le regole che hanno come destinazione parametri specifici possono essere aggirate; ad esempio, il path traversal (vfs.file.contents["../../../../etc/passwd"]) può leggere un file che una regola destinata al relativo percorso diretto avrebbe dovuto bloccare. Per i dettagli, vedere Protezione delle regole di autorizzazione/negazione.

  • Tutti gli item system.run sono negati per impostazione predefinita (anche quando DenyKey e DenyKeyRegexp sono vuoti), come se DenyKey=system.run[*] fosse impostato come ultima regola. Per questo motivo, è possibile consentire item system.run specifici senza negare esplicitamente gli altri item system.run. Questa negazione implicita si applica solo a system.run; per tutte le altre chiavi, le regole di autorizzazione non hanno effetto se non sono seguite da una regola di negazione.

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

  • Gli item negati diventano non supportati senza alcuna indicazione del fatto che siano stati negati; hanno lo stesso aspetto delle chiavi item inesistenti. Ad esempio:

    • Il parametro della riga di comando dell'agent Zabbix --print (-p) non mostrerà le chiavi item negate.
    • Il parametro della riga di comando dell'agent Zabbix --test (-t) restituirà Unsupported item key. per le chiavi item negate.
    • Quando la registrazione è attivata (LogRemoteCommands=1), il file di log dell'agent Zabbix 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 vfs.file e due comandi system.run:

utilizzando 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.*[*]

utilizzando AllowKeyRegexp e DenyKeyRegexp:

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

Impostare DenyKey=system.run[*] non è necessario, perché tutti gli altri comandi system.run vengono negati per impostazione predefinita (vedere Note importanti).

Consentire l'esecuzione degli script

Consentire a Zabbix agent di eseguire script sugli host tramite tutti i metodi disponibili:

  • Script globali che possono essere eseguiti nel frontend o tramite API (questo metodo utilizza sempre la chiave system.run[myscript.sh])
  • Comandi remoti dalle operazioni delle azioni (questo metodo utilizza sempre la chiave system.run[myscript.sh,nowait])
  • item dell'agent Zabbix system.run 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=(?s)^system\.run\[myscript\.sh,.*\]$

Per controllare il parametro wait/nowait, è necessario impostare una regola diversa. Ad esempio, è possibile consentire solo gli item 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 le regole AllowKey/AllowKeyRegexp o DenyKey/DenyKeyRegexp eccessivamente permissive.

Considerare le seguenti regole:

utilizzando AllowKey e DenyKey:

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

utilizzando AllowKeyRegexp e DenyKeyRegexp:

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

Su Windows, è necessario eseguire l'escape degli spazi nel percorso utilizzando un accento circonflesso (^) per AllowKey o DenyKey e \s per AllowKeyRegexp o DenyKeyRegexp.

Queste regole contengono un carattere jolly (*), che può essere utilizzato in modo improprio:

  • Lo script test.bat può essere eseguito con qualsiasi argomento, inclusi quelli non previsti.
  • Il pattern vfs.file.* corrisponde alle chiavi degli item senza parametri; tuttavia, tutti gli item vfs.file richiedono parametri.
  • Il pattern system.cpu.load[*] corrisponde solo alle chiavi degli item con parametri; tuttavia, gli item system.cpu.load non richiedono parametri.

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

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

utilizzando AllowKeyRegexp e DenyKeyRegexp:

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

È possibile 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 degli item:

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

Si consiglia di usare AllowKey o AllowKeyRegexp per consentire esplicitamente l'accesso solo ai file e ai comandi richiesti, e DenyKey o DenyKeyRegexp per negare intere chiavi degli item (vedere Note importanti).

Uso di regole basate sui caratteri jolly:

Pattern Corrisponde Esempi
* Qualsiasi chiave con o senza parametri
vfs.file.* La chiave inizia con vfs.file.
Senza parametri
Corrisponde a:
vfs.file.size
vfs.file.contents

Non corrisponde a:
vfs.file.contents[]
vfs.file.size[/var/log/app.log]
vfs.*.contents La chiave inizia con vfs.
La chiave termina con .contents
Senza parametri
Corrisponde a:
vfs..contents
vfs.file.contents
vfs.mount.point.file.contents

Non corrisponde a:
vfs.contents
vfs.file.contents[]
vfs.file.*[*] La chiave inizia con vfs.file.
Parametri qualsiasi o vuoti
Corrisponde a
vfs.file.get.custom[]
vfs.file.size[/var/log/app.log, utf8]

Non corrisponde a:
vfs.file.get.custom
vfs.file.contents La chiave è vfs.file.contents
Senza parametri
Corrisponde a:
vfs.file.contents

Non corrisponde a:
vfs.file.contents[/etc/passwd]
vfs.file.contents[] La chiave è vfs.file.contents[]
Parametri vuoti
Corrisponde a:
vfs.file.contents[]

Non corrisponde a:
vfs.file.contents
vfs.file.contents[*] La chiave è vfs.file.contents
Parametri qualsiasi o vuoti
Corrisponde a:
vfs.file.contents[/path/to/file]

Non corrisponde a:
vfs.file.contents
vfs.file.contents[/etc/passwd,*] La chiave è vfs.file.contents
Il primo parametro è /etc/passwd
Parametri successivi qualsiasi, vuoti o assenti
Corrisponde a:
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf8]
vfs.file.contents[/etc/passwd]

Non corrisponde a:
vfs.file.contents[]
vfs.file.contents[*passwd*] La chiave è vfs.file.contents
Esattamente un parametro contenente passwd
Corrisponde a:
vfs.file.contents[/etc/passwd]

Non corrisponde a:
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
Corrisponde a:
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf8]
vfs.file.contents[/etc/passwd]

Non corrisponde a:
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
Corrisponde a:
vfs.file.contents[/etc/passwd,utf8]

Non corrisponde a:
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf16]

Uso di regole basate sulle espressioni regolari:

Pattern Corrisponde Esempi
^[\s\S]*$ Qualsiasi chiave con o senza parametri
^vfs\.file\.[^\[]*$ La chiave inizia con vfs.file.
Senza parametri
Corrisponde a:
vfs.file.size
vfs.file.contents

Non corrisponde a:
vfs.file.contents[]
vfs.file.size[/var/log/app.log]
^vfs\..*\.contents$ La chiave inizia con vfs.
La chiave termina con .contents
Senza parametri
Corrisponde a:
vfs..contents
vfs.mount.point.file.contents

Non corrisponde a:
vfs.contents
vfs.file.contents[]
^vfs\.file\..*\[[\s\S]*\]$ La chiave inizia con vfs.file.
Parametri qualsiasi o vuoti
Corrisponde a
vfs.file.get.custom[]
vfs.file.size[/var/log/app.log, utf8]

Non corrisponde a:
vfs.file.get.custom
^vfs\.file\.contents$ La chiave è vfs.file.contents
Senza parametri
Corrisponde a:
vfs.file.contents

Non corrisponde a:
vfs.file.contents[/etc/passwd]
^vfs\.file\.contents\[\]$ La chiave è vfs.file.contents[]
Parametri vuoti
Corrisponde a:
vfs.file.contents[]

Non corrisponde a:
vfs.file.contents
^vfs\.file\.contents\[[\s\S]*\]$ La chiave è vfs.file.contents
Parametri qualsiasi o vuoti
Corrisponde a:
vfs.file.contents[/path/to/file]

Non corrisponde a:
vfs.file.contents
^vfs\.file\.contents\[/etc/passwd,[\s\S]*\]$ La chiave è vfs.file.contents
Il primo parametro è /etc/passwd
Il secondo parametro è qualsiasi o vuoto
Corrisponde a:
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf8]

Non corrisponde a:
vfs.file.contents[]
vfs.file.contents[/etc/passwd]
^vfs\.file\.contents\[[\s\S]*passwd[\s\S]*\]$ La chiave è vfs.file.contents
Parametri qualsiasi, di cui almeno uno contiene passwd
Corrisponde a:
vfs.file.contents[/etc/passwd]
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf8]
^vfs\.file\.contents\[[^,]*passwd[^,]*,[\s\S]*\]$ La chiave è vfs.file.contents
Il primo parametro contiene passwd
Il secondo parametro è qualsiasi o vuoto
Corrisponde a:
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf8]

Non corrisponde a:
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
Corrisponde a:
vfs.file.contents[/etc/passwd,utf8]
vfs.file.contents[/etc/passwd,windows-1252]

Non corrisponde a:
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf16]