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.run são desativados por padrão (mesmo quando DenyKey e DenyKeyRegexp estão vazios), como se DenyKey=system.run[*] ou DenyKeyRegexp=^system\.run\[.*\]$ tivesse sido definido como a última regra. Por isso, você pode permitir itens específicos system.run sem negar explicitamente outros itens system.run.

  • Se possível, use AllowKey/AllowKeyRegexp para 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 regras DenyKey/DenyKeyRegexp.

  • A configuração de AllowKey, DenyKey, AllowKeyRegexp e DenyKeyRegexp não afeta os parâmetros do agent HostnameItem, HostMetadataItem ou HostInterfaceItem.

  • 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.

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.run do 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.bat pode 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 itens vfs.file exigem parâmetros.
  • O padrão system.cpu.load[*] (^system\.cpu\.load\[.*\]$) corresponde apenas a chaves de item com parâmetros; no entanto, os itens system.cpu.load nã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[* e vfs.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.size
vfs.file.contents
vfs.file.contents[]
vfs.file.size[/var/log/app.log]
vfs.*.contents A chave começa com vfs.
A chave termina com .contents
Sem parâmetros
Matches:
vfs..contents
vfs.mount.point.file.contents

Does not match:
vfs.contents
vfs.file.contents[]
vfs.file.*[*] A chave começa com vfs.file.
Parâmetros quaisquer ou vazios
Matches
vfs.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.contents
Sem parâmetros
Matches:
vfs.file.contents

Does 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.contents
Parâ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.contents
O primeiro parâmetro é /etc/passwd
Segundo 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.contents
Parâ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.contents
O primeiro parâmetro contém passwd
Segundo 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.contents
O primeiro parâmetro é /etc/passwd
O 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.size
vfs.file.contents
vfs.file.contents[]
vfs.file.size[/var/log/app.log]
^vfs\..*\.contents$ A chave começa com vfs.
A chave termina com .contents
Sem parâmetros
Matches:
vfs..contents
vfs.mount.point.file.contents

Does not match:
vfs.contents
vfs.file.contents[]
^vfs\.file\..*\[.*\]$ A chave começa com vfs.file.
Parâmetros quaisquer ou vazios
Matches
vfs.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.contents
Sem parâmetros
Matches:
vfs.file.contents

Does 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.contents
Parâ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.contents
O primeiro parâmetro é /etc/passwd
Segundo 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.contents
Parâ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.contents
O primeiro parâmetro contém passwd
Segundo 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.contents
O primeiro parâmetro é /etc/passwd
O 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]