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.runsono disabilitati per impostazione predefinita (anche quandoDenyKeyeDenyKeyRegexpsono vuoti), come se fosse impostatoDenyKey=system.run[*]oppureDenyKeyRegexp=^system\.run\[.*\]$come ultima regola. Per questo motivo, è possibile consentire specifici itemsystem.runsenza negare esplicitamente gli altri itemsystem.run. -
Se possibile, usa
AllowKey/AllowKeyRegexpper 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 regoleDenyKey/DenyKeyRegexp. -
La configurazione
AllowKey,DenyKey,AllowKeyRegexpeDenyKeyRegexpnon influisce sui parametri agentHostnameItem,HostMetadataItemoHostInterfaceItem. -
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.
- Il parametro da riga di comando di Zabbix agent
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.rundi 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.batpuò 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 itemvfs.filerichiedono parametri. - Il pattern
system.cpu.load[*](^system\.cpu\.load\[.*\]$) corrisponde solo a chiavi item con parametri; tuttavia gli itemsystem.cpu.loadnon 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[*evfs.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.sizevfs.file.contentsvfs.file.contents[]vfs.file.size[/var/log/app.log] |
vfs.*.contents |
La chiave inizia con vfs.La chiave termina con .contentsNessun parametro |
Matches: vfs..contentsvfs.mount.point.file.contentsDoes not match: vfs.contentsvfs.file.contents[] |
vfs.file.*[*] |
La chiave inizia con vfs.file.Parametri qualsiasi o vuoti |
Matchesvfs.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.contentsNessun parametro |
Matches:vfs.file.contentsDoes 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.contentsParametri 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.contentsIl primo parametro è /etc/passwdIl 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.contentsParametri 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.contentsIl primo parametro contiene passwdIl 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.contentsIl primo parametro è /etc/passwdIl 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.sizevfs.file.contentsvfs.file.contents[]vfs.file.size[/var/log/app.log] |
^vfs\..*\.contents$ |
La chiave inizia con vfs.La chiave termina con .contentsNessun parametro |
Matches: vfs..contentsvfs.mount.point.file.contentsDoes not match: vfs.contentsvfs.file.contents[] |
^vfs\.file\..*\[.*\]$ |
La chiave inizia con vfs.file.Parametri qualsiasi o vuoti |
Matchesvfs.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.contentsNessun parametro |
Matches:vfs.file.contentsDoes 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.contentsParametri 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.contentsIl primo parametro è /etc/passwdIl 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.contentsParametri 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.contentsIl primo parametro contiene passwdIl 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.contentsIl primo parametro è /etc/passwdIl 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] |