É possível restringir verificações no lado do agent criando uma blacklist de item, uma whitelist ou uma combinação de whitelist/blacklist.
Para isso, use uma combinação de dois parâmetros de configuração do agent:
AllowKey=<pattern> - quais verificações são permitidas; <pattern> é especificado usando uma expressão curinga (*)DenyKey=<pattern> - quais verificações são negadas; <pattern> é especificado usando uma expressão curinga (*)Observe que:
Portanto, para permitir comandos remotos, especifique um AllowKey=system.run[<comando>,*] para cada comando permitido, * representa os modos wait e nowait. Também é possível especificar AllowKey=system.run[*] para permitir todos os comandos com os modos wait e nowait. Para negar comandos remotos específicos, adicione parâmetros DenyKey com comandos system.run[] antes do parâmetro AllowKey=system.run[*].
Por exemplo:
Uma lista negra pode não ser uma boa escolha, pois uma nova versão do Zabbix pode ter novas keys que não estão explicitamente restritas pela configuração existente. Isso pode causar uma falha de segurança.
# Negar comando específico
DenyKey=system.run[ls -l /]
# Permitir outros scripts
AllowKey=system.run[*]DenyKey=*Por exemplo:
# Permitir leitura de logs:
AllowKey=vfs.file.*[/var/log/*]
# Permitir verificações de localtime
AllowKey=system.localtime[*]
# Negar todas as outras keys
DenyKey=*^ ao especificar o caminho.Por exemplo:
# Permitir a execução de test.bat com ou sem argumentos
AllowKey=system.run["C:\Program^ Files\Zabbix^ Agent^ 2\scripts\test.bat*"]Para testar:
PS C:\Program Files\Zabbix Agent 2> .\zabbix_get.exe -s 127.0.0.1 -k system.run["C:\Program^ Files\Zabbix^ Agent^ 2\scripts\test.bat caret"]Esta configuração permite a execução do script independentemente de argumentos serem passados (como caret) e garante que system.run seja permitido mesmo que o caminho do script contenha espaços.
| Padrão | Descrição | Corresponde | Não corresponde |
|---|---|---|---|
| * | Corresponde a todas as possíveis keys com ou sem parâmetros. | Qualquer | Nenhuma |
| vfs.file.contents | Corresponde a vfs.file.contents sem parâmetros. |
vfs.file.contents | vfs.file.contents[/etc/passwd] |
| vfs.file.contents[] | Corresponde a vfs.file.contents com parâmetros vazios. |
vfs.file.contents[] | vfs.file.contents |
| vfs.file.contents[*] | Corresponde a vfs.file.contents com quaisquer parâmetros; não corresponderá a vfs.file.contents sem colchetes. |
vfs.file.contents[] vfs.file.contents[/path/to/file] |
vfs.file.contents |
| vfs.file.contents[/etc/passwd,*] | Corresponde a vfs.file.contents com o primeiro parâmetro igual a /etc/passwd e todos os outros parâmetros com qualquer valor (inclusive vazio). |
vfs.file.contents[/etc/passwd,] vfs.file.contents[/etc/passwd,utf8] |
vfs.file.contents[/etc/passwd] vfs.file.contents[/var/log/zabbix_server.log] vfs.file.contents[] |
| vfs.file.contents[*passwd*] | Corresponde a vfs.file.contents com o primeiro parâmetro igual a *passwd* e nenhum outro parâmetro. |
vfs.file.contents[/etc/passwd] | vfs.file.contents[/etc/passwd,] vfs.file.contents[/etc/passwd, utf8] |
| vfs.file.contents[*passwd*,*] | Corresponde a vfs.file.contents com apenas o primeiro parâmetro igual a *passwd* e todos os parâmetros seguintes com qualquer valor (inclusive vazio). |
vfs.file.contents[/etc/passwd,] vfs.file.contents[/etc/passwd, utf8] |
vfs.file.contents[/etc/passwd] vfs.file.contents[/tmp/test] |
| vfs.file.contents[/var/log/zabbix_server.log,*,abc] | Corresponde a vfs.file.contents com o primeiro parâmetro igual a /var/log/zabbix_server.log, o terceiro parâmetro igual a 'abc' e qualquer (inclusive vazio) segundo parâmetro. |
vfs.file.contents[/var/log/zabbix_server.log,,abc] vfs.file.contents[/var/log/zabbix_server.log,utf8,abc] |
vfs.file.contents[/var/log/zabbix_server.log,,abc,def] |
| vfs.file.contents[/etc/passwd,utf8] | Corresponde a vfs.file.contents com o primeiro parâmetro igual a /etc/passwd, o segundo parâmetro igual a 'utf8' e nenhum outro argumento. |
vfs.file.contents[/etc/passwd,utf8] | vfs.file.contents[/etc/passwd,] vfs.file.contents[/etc/passwd,utf16] |
| vfs.file.* | Corresponde a qualquer key começando com vfs.file. sem quaisquer parâmetros. |
vfs.file.contents vfs.file.size |
vfs.file.contents[] vfs.file.size[/var/log/zabbix_server.log] |
| vfs.file.*[*] | Corresponde a qualquer key começando com vfs.file. com quaisquer parâmetros. |
vfs.file.size.bytes[] vfs.file.size[/var/log/zabbix_server.log, utf8] |
vfs.file.size.bytes |
| vfs.*.contents | Corresponde a qualquer key começando com vfs. e terminando com .contents sem quaisquer parâmetros. |
vfs.mount.point.file.contents vfs..contents |
vfs.contents |
Um script hipotético como 'myscript.sh' pode ser executado em um host via Zabbix agent de várias maneiras:
1. Como uma chave de item em uma verificação passiva ou ativa, por exemplo:
Aqui o usuário pode adicionar "wait", "nowait" ou omitir o 2º argumento para usar seu valor padrão em system.run[].
2. Como um script global (iniciado pelo usuário no frontend ou API).
Um usuário configura este script em Alertas → Scripts, define "Executar em: Zabbix agent" e coloca "myscript.sh" no campo de entrada "Comandos" do script. Quando invocado pelo frontend ou API, o Zabbix server envia para o agent:
Aqui o usuário não controla os parâmetros "wait"/"nowait".
3. Como um comando remoto de uma ação. O Zabbix server envia para o agent:
Aqui novamente o usuário não controla os parâmetros "wait"/"nowait".
O que isso significa é que se definirmos AllowKey como:
então
Para permitir todas as variantes descritas, você pode adicionar:
aos parâmetros do agent/agent2.