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
AllowKeyoAllowKeyRegexpper consentire solo gli item necessari eDenyKeyoDenyKeyRegexpcome 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 regoleDenyKeyoDenyKeyRegexp. -
Rendere le regole di autorizzazione il più specifiche possibile: utilizzare chiavi item esatte invece dei caratteri jolly (
*) nelle regoleAllowKeye utilizzare i pattern di espressione regolare più specifici nelle regoleAllowKeyRegexp. -
Se si utilizza
DenyKeyoDenyKeyRegexp, 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.runsono negati per impostazione predefinita (anche quandoDenyKeyeDenyKeyRegexpsono vuoti), come seDenyKey=system.run[*]fosse impostato come ultima regola. Per questo motivo, è possibile consentire itemsystem.runspecifici senza negare esplicitamente gli altri itemsystem.run. Questa negazione implicita si applica solo asystem.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,AllowKeyRegexpeDenyKeyRegexpnon influisce sui parametri dell'agentHostnameItem,HostMetadataItemoHostInterfaceItem. -
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.
- Il parametro della riga di comando dell'agent Zabbix
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.runcon 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.batpuò essere eseguito con qualsiasi argomento, inclusi quelli non previsti. - Il pattern
vfs.file.*corrisponde alle chiavi degli item senza parametri; tuttavia, tutti gli itemvfs.filerichiedono parametri. - Il pattern
system.cpu.load[*]corrisponde solo alle chiavi degli item con parametri; tuttavia, gli itemsystem.cpu.loadnon 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[*evfs.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.sizevfs.file.contentsNon corrisponde a: vfs.file.contents[]vfs.file.size[/var/log/app.log] |
vfs.*.contents |
La chiave inizia con vfs.La chiave termina con .contentsSenza parametri |
Corrisponde a: vfs..contentsvfs.file.contentsvfs.mount.point.file.contentsNon corrisponde a: vfs.contentsvfs.file.contents[] |
vfs.file.*[*] |
La chiave inizia con vfs.file.Parametri qualsiasi o vuoti |
Corrisponde avfs.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.contentsSenza parametri |
Corrisponde a:vfs.file.contentsNon 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.contentsParametri 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.contentsIl primo parametro è /etc/passwdParametri 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.contentsEsattamente 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.contentsIl primo parametro contiene passwdIl 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.contentsIl primo parametro è /etc/passwdIl 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.sizevfs.file.contentsNon corrisponde a: vfs.file.contents[]vfs.file.size[/var/log/app.log] |
^vfs\..*\.contents$ |
La chiave inizia con vfs.La chiave termina con .contentsSenza parametri |
Corrisponde a: vfs..contentsvfs.mount.point.file.contentsNon corrisponde a: vfs.contentsvfs.file.contents[] |
^vfs\.file\..*\[[\s\S]*\]$ |
La chiave inizia con vfs.file.Parametri qualsiasi o vuoti |
Corrisponde avfs.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.contentsSenza parametri |
Corrisponde a:vfs.file.contentsNon 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.contentsParametri 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.contentsIl primo parametro è /etc/passwdIl 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.contentsParametri 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.contentsIl primo parametro contiene passwdIl 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.contentsIl primo parametro è /etc/passwdIl 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] |