Restringindo verificações do agent
Visão geral
Você pode controlar quais chaves de item o Zabbix agent ou o agent 2 tem permissão ou é impedido de usar ao executar verificações de item, comandos remotos ou scripts.
Para fazer isso, use estes parâmetros de configuração do agent para definir regras de अनुमति/negação:
AllowKey=<pattern>DenyKey=<pattern>AllowKeyRegexp=<pattern>DenyKeyRegexp=<pattern>
O <pattern> deve conter uma única chave de item.
Para AllowKey e DenyKey, o <pattern> suporta curingas (*).
O curinga corresponde a qualquer número de quaisquer caracteres na sua posição e pode ser usado para corresponder a chaves de item ou parâmetros (por exemplo, vfs.file.*[*]).
Para AllowKeyRegexp e DenyKeyRegexp, o <pattern> suporta expressões regulares.
O padrão de expressão regular pode ser usado para corresponder a chaves de item e suas strings de parâmetros.
Veja também exemplos de escape correto.
Observe que o Zabbix agent e o Zabbix agent 2 podem oferecer suporte a sintaxes diferentes de expressões regulares.
Para melhorar a segurança, é recomendável usar chaves de item exatas em vez de curingas para AllowKey e DenyKey.
Também é recomendável usar os padrões de expressão regular mais específicos possíveis para AllowKeyRegexp e DenyKeyRegexp.
Para detalhes, consulte Protegendo regras de permissão/negação.
Ao contrário de outros parâmetros de configuração do agent, você pode especificar uma quantidade ilimitada de parâmetros AllowKey, DenyKey, AllowKeyRegexp ou DenyKeyRegexp.
Notas importantes
-
Todos os itens
system.runsão desativados por padrão (mesmo quandoDenyKeyeDenyKeyRegexpestão vazios), como seDenyKey=system.run[*]ouDenyKeyRegexp=^system\.run\[.*\]$tivesse sido definido como a última regra. Por isso, você pode permitir itens específicossystem.runsem negar explicitamente outros itenssystem.run. -
Se possível, use
AllowKey/AllowKeyRegexppara permitir apenas os itens necessários e negar todo o restante. Algumas chaves podem ser exploradas para ler arquivos não intencionais por meio de path traversal (por exemplo,vfs.file.contents["../../../../etc/passwd"]), e novas versões do Zabbix agent podem introduzir chaves não cobertas pelas suas regrasDenyKey/DenyKeyRegexp. -
A configuração de
AllowKey,DenyKey,AllowKeyRegexpeDenyKeyRegexpnão afeta os parâmetros do agentHostnameItem,HostMetadataItemouHostInterfaceItem. -
Itens negados tornam-se não suportados sem qualquer indicação ou mensagem de erro; por exemplo:
- O parâmetro de linha de comando
--print (-p)do Zabbix agent não exibirá as chaves de item negadas. - O parâmetro de linha de comando
--test (-t)do Zabbix agent retornará "Unsupported item key." para chaves de item negadas. - Quando o registro em log está ativado (
LogRemoteCommands=1), o arquivo de log do Zabbix agent não registrará os comandos remotos negados.
- O parâmetro de linha de comando
Ordem das regras de अनुमति/negação
Você pode especificar um número ilimitado de regras AllowKey, DenyKey, AllowKeyRegexp ou DenyKeyRegexp, embora a ordem delas seja importante.
- As regras são avaliadas uma a uma, de cima para baixo.
- Quando uma item key corresponde a uma regra, ela é permitida ou negada, e a avaliação das regras é interrompida.
Por exemplo, ao avaliar vfs.file.contents[/etc/passwd], as regras são processadas da seguinte forma:
AllowKey=vfs.file.contents[/tmp/app.log] # O padrão da item key não corresponde; o agent prossegue para a próxima regra.
AllowKey=vfs.file.contents[/etc/passwd] # O padrão da item key corresponde; o agent permite a verificação do item e interrompe a avaliação das regras.
DenyKey=vfs.file.*[*] # O agent ignora a regra, pois a avaliação já foi interrompida.
A seguinte ordem de regras negará a verificação do item:
DenyKey=vfs.file.*[*] # O padrão da item key corresponde; o agent nega a verificação do item e interrompe a avaliação das regras.
AllowKey=vfs.file.contents[/etc/passwd] # O agent ignora a regra, pois a avaliação já foi interrompida.
AllowKey=vfs.file.contents[/tmp/app.log] # O agent ignora a regra, pois a avaliação já foi interrompida.
Exemplos
Os exemplos a seguir mostram padrões comuns de configuração para AllowKey, DenyKey, AllowKeyRegexp e DenyKeyRegexp.
Permitindo verificações e comandos específicos
Permita apenas duas verificações de item vfs.file e dois comandos 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\..*\[.*\]$
Definir DenyKey=system.run[*] ou DenyKeyRegexp=^system\.run\[.*\]$ é desnecessário, porque todos os outros comandos system.run são negados por padrão.
Permitindo scripts
Permita que o Zabbix agent execute scripts em hosts por meio de todos os métodos disponíveis:
- Scripts globais que podem ser executados no frontend ou via API (este método sempre usa a chave
system.run[myscript.sh]) - Comandos remotos de operações de ação (este método sempre usa a chave
system.run[myscript.sh,nowait]) - Itens
system.rundo Zabbix agent com o script, por exemplo:system.run[myscript.sh]system.run[myscript.sh,wait]system.run[myscript.sh,nowait]
AllowKey=system.run[myscript.sh,*]
ou
AllowKeyRegexp=^system\.run\[myscript\.sh,.*\]$
Para controlar o parâmetro wait/nowait, você deve definir uma regra diferente.
Por exemplo, você pode permitir apenas itens system.run[myscript.sh,wait], excluindo assim outros métodos:
AllowKey=system.run[myscript.sh,wait]
ou
AllowKeyRegexp=^system\.run\[myscript\.sh,wait\]$
Protegendo regras allow/deny
Estes exemplos mostram como proteger regras AllowKey/AllowKeyRegexp ou DenyKey/DenyKeyRegexp excessivamente permissivas.
Considere as seguintes regras:
usando AllowKey e DenyKey:
AllowKey=system.run["C:\Program^ Files\Zabbix^ Agent^ 2\scripts\test.bat*"]
DenyKey=vfs.file.*
DenyKey=system.cpu.load[*]
usando AllowKeyRegexp e DenyKeyRegexp:
AllowKeyRegexp=^system\.run\["C:\\Program\sFiles\\Zabbix\sAgent\s2\\scripts\\test\.bat.*"\]$
DenyKeyRegexp=^vfs\.file\..*$
DenyKeyRegexp=^system\.cpu\.load\[.*\]$
No Windows, você deve escapar os espaços no caminho usando um acento circunflexo (^) para AllowKey ou DenyKey e \s para AllowKeyRegexp ou DenyKeyRegexp.
Essas regras contêm um curinga (*) (ou .* para padrões baseados em expressão regular), que pode ser usado indevidamente:
- O script
test.batpode ser executado com quaisquer argumentos, inclusive os não intencionais. - O padrão
vfs.file.*(^vfs\.file\..*$) corresponde a chaves de item com e sem parâmetros; no entanto, todos os itensvfs.fileexigem parâmetros. - O padrão
system.cpu.load[*](^system\.cpu\.load\[.*\]$) corresponde apenas a chaves de item com parâmetros; no entanto, os itenssystem.cpu.loadnão exigem parâmetros.
Para proteger essas regras, permita explicitamente a execução de test.bat apenas com argumentos específicos e negue padrões corretos de chaves de item; por exemplo:
usando 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[*]
usando AllowKeyRegexp e DenyKeyRegexp:
AllowKeyRegexp=^system\.run\["C:\\Program\sFiles\\Zabbix\sAgent\s2\\scripts\\test\.bat (status|version)"\]$
DenyKeyRegexp=^vfs\.file\..+\[.*\]$
DenyKeyRegexp=^system\.cpu\.load(\[.*\])?$
Você pode testar as regras executando os seguintes comandos, que retornarão 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]
Exemplos de padrões
As tabelas a seguir mostram como os padrões de chave de item são correspondidos:
- Uma chave corresponde ao padrão somente se atender a todas as condições na coluna Matches.
- Os parâmetros devem estar totalmente delimitados por colchetes (por exemplo,
vfs.file.contents[*evfs.file.contents*utf8]são padrões inválidos). - Os exemplos ilustram apenas a correspondência de padrões; os itens reais exigem parâmetros.
Para AllowKey e DenyKey:
| Pattern | Matches | Examples |
|---|---|---|
* |
Qualquer chave, com ou sem parâmetros | |
vfs.file.* |
A chave começa com vfs.file.Com ou sem parâmetros |
Matches:vfs.file.sizevfs.file.contentsvfs.file.contents[]vfs.file.size[/var/log/app.log] |
vfs.*.contents |
A chave começa com vfs.A chave termina com .contentsSem parâmetros |
Matches: vfs..contentsvfs.mount.point.file.contentsDoes not match: vfs.contentsvfs.file.contents[] |
vfs.file.*[*] |
A chave começa com vfs.file.Parâmetros quaisquer ou vazios |
Matchesvfs.file.get.custom[]vfs.file.size[/var/log/app.log, utf8]Does not match: vfs.file.get.custom |
vfs.file.contents |
A chave é vfs.file.contentsSem parâmetros |
Matches:vfs.file.contentsDoes not match: vfs.file.contents[/etc/passwd] |
vfs.file.contents[] |
A chave é vfs.file.contents[]Parâmetros vazios |
Matches:vfs.file.contents[]Does not match: vfs.file.contents |
vfs.file.contents[*] |
A chave é vfs.file.contentsParâmetros quaisquer ou vazios |
Matches:vfs.file.contents[/path/to/file]Does not match: vfs.file.contents |
vfs.file.contents[/etc/passwd,*] |
A chave é vfs.file.contentsO primeiro parâmetro é /etc/passwdSegundo parâmetro qualquer ou vazio |
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*] |
A chave é vfs.file.contentsParâmetros quaisquer, com pelo menos um contendo passwd |
Matches:vfs.file.contents[/etc/passwd]vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf8] |
vfs.file.contents[*passwd*,*] |
A chave é vfs.file.contentsO primeiro parâmetro contém passwdSegundo parâmetro qualquer ou vazio |
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] |
A chave é vfs.file.contentsO primeiro parâmetro é /etc/passwdO segundo parâmetro é utf8 |
Matches:vfs.file.contents[/etc/passwd,utf8]Does not match: vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf16] |
Para AllowKeyRegexp e DenyKeyRegexp:
| Pattern | Matches | Examples |
|---|---|---|
^.*$ |
Qualquer chave, com ou sem parâmetros | |
^vfs\.file\..*$ |
A chave começa com vfs.file.Com ou sem parâmetros |
Matches:vfs.file.sizevfs.file.contentsvfs.file.contents[]vfs.file.size[/var/log/app.log] |
^vfs\..*\.contents$ |
A chave começa com vfs.A chave termina com .contentsSem parâmetros |
Matches: vfs..contentsvfs.mount.point.file.contentsDoes not match: vfs.contentsvfs.file.contents[] |
^vfs\.file\..*\[.*\]$ |
A chave começa com vfs.file.Parâmetros quaisquer ou vazios |
Matchesvfs.file.get.custom[]vfs.file.size[/var/log/app.log, utf8]Does not match: vfs.file.get.custom |
^vfs\.file\.contents$ |
A chave é vfs.file.contentsSem parâmetros |
Matches:vfs.file.contentsDoes not match: vfs.file.contents[/etc/passwd] |
^vfs\.file\.contents\[\]$ |
A chave é vfs.file.contents[]Parâmetros vazios |
Matches:vfs.file.contents[]Does not match: vfs.file.contents |
^vfs\.file\.contents\[.*\]$ |
A chave é vfs.file.contentsParâmetros quaisquer ou vazios |
Matches:vfs.file.contents[/path/to/file]Does not match: vfs.file.contents |
^vfs\.file\.contents\[/etc/passwd,.*\]$ |
A chave é vfs.file.contentsO primeiro parâmetro é /etc/passwdSegundo parâmetro qualquer ou vazio |
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.*\]$ |
A chave é vfs.file.contentsParâmetros quaisquer, com pelo menos um contendo passwd |
Matches:vfs.file.contents[/etc/passwd]vfs.file.contents[/etc/passwd,]vfs.file.contents[/etc/passwd,utf8] |
^vfs\.file\.contents\[.*passwd.*,.*\]$ |
A chave é vfs.file.contentsO primeiro parâmetro contém passwdSegundo parâmetro qualquer ou vazio |
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)\]$ |
A chave é vfs.file.contentsO primeiro parâmetro é /etc/passwdO segundo parâmetro é utf8 ou 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] |