12 Restringir comprobaciones del agente

Descripción general

Puede controlar qué claves de item Zabbix agent o agent 2 tiene permitido o denegado usar al ejecutar comprobaciones de item, comandos remotos o scripts.

Para ello, use estos parámetros de configuración del agent para definir reglas de अनुमति/denegación:

  • AllowKey=<pattern>
  • DenyKey=<pattern>
  • AllowKeyRegexp=<pattern>
  • DenyKeyRegexp=<pattern>

El <pattern> debe contener una sola clave de item.
Para AllowKey y DenyKey, el <pattern> admite comodines (*). El comodín coincide con cualquier número de caracteres en su posición y puede usarse para coincidir con claves de item o parámetros (por ejemplo, vfs.file.*[*]).
Para AllowKeyRegexp y DenyKeyRegexp, el <pattern> admite expresiones regulares. El patrón de expresión regular puede usarse para coincidir con claves de item y sus cadenas de parámetros. Consulte también ejemplos de escape correcto.
Tenga en cuenta que Zabbix agent y Zabbix agent 2 pueden admitir una sintaxis de expresiones regulares diferente.

Para mejorar la seguridad, se recomienda usar claves de item exactas en lugar de comodines para AllowKey y DenyKey. También se recomienda usar los patrones de expresión regular más específicos para AllowKeyRegexp y DenyKeyRegexp. Para más detalles, consulte Protección de las reglas de अनुमति/denegación.

A diferencia de otros parámetros de configuración del agent, puede especificar un número ilimitado de parámetros AllowKey, DenyKey, AllowKeyRegexp o DenyKeyRegexp.

Notas importantes

  • Todos los items system.run están deshabilitados de forma predeterminada (incluso cuando DenyKey y DenyKeyRegexp están vacíos), como si se hubiera establecido DenyKey=system.run[*] o DenyKeyRegexp=^system\.run\[.*\]$ como la última regla. Debido a esto, puede permitir items específicos de system.run sin denegar explícitamente otros items de system.run.

  • Si es posible, use AllowKey/AllowKeyRegexp para permitir solo los items necesarios y denegar todo lo demás. Algunas claves pueden aprovecharse para leer archivos no previstos mediante path traversal (por ejemplo, vfs.file.contents["../../../../etc/passwd"]), y las nuevas versiones de Zabbix agent pueden introducir claves no cubiertas por sus reglas DenyKey/DenyKeyRegexp.

  • La configuración AllowKey, DenyKey, AllowKeyRegexp y DenyKeyRegexp no afecta a los parámetros de agent HostnameItem, HostMetadataItem ni HostInterfaceItem.

  • Los items denegados pasan a no ser compatibles sin ninguna indicación ni mensaje de error; por ejemplo:

    • El parámetro de línea de comandos --print (-p) de Zabbix agent no mostrará las claves de item denegadas.
    • El parámetro de línea de comandos --test (-t) de Zabbix agent devolverá "Unsupported item key." para las claves de item denegadas.
    • Cuando la registración está activada (LogRemoteCommands=1), el archivo de registro de Zabbix agent no registrará los comandos remotos denegados.

Orden de reglas allow/deny

Puede especificar un número ilimitado de reglas AllowKey, DenyKey, AllowKeyRegexp o DenyKeyRegexp, aunque su orden importa.

  • Las reglas se evalúan una por una, de arriba hacia abajo.
  • Cuando una clave de item coincide con una regla, se permite o se deniega, y la evaluación de reglas se detiene.

Por ejemplo, al evaluar vfs.file.contents[/etc/passwd], las reglas se procesan de la siguiente manera:

AllowKey=vfs.file.contents[/tmp/app.log]    # El patrón de la clave de item no coincide; el agent pasa a la siguiente regla.
AllowKey=vfs.file.contents[/etc/passwd]     # El patrón de la clave de item coincide; el agent permite la comprobación del item y detiene la evaluación de reglas.
DenyKey=vfs.file.*[*]                       # El agent ignora la regla, ya que la evaluación se ha detenido.

El siguiente orden de reglas denegará la comprobación del item:

DenyKey=vfs.file.*[*]                       # El patrón de la clave de item coincide; el agent deniega la comprobación del item y detiene la evaluación de reglas.
AllowKey=vfs.file.contents[/etc/passwd]     # El agent ignora la regla, ya que la evaluación se ha detenido.
AllowKey=vfs.file.contents[/tmp/app.log]    # El agent ignora la regla, ya que la evaluación se ha detenido.

Ejemplos

Los siguientes ejemplos muestran patrones de configuración comunes para AllowKey, DenyKey, AllowKeyRegexp y DenyKeyRegexp.

Permitir comprobaciones y comandos específicos

Permita solo dos comprobaciones de item vfs.file y dos comandos system.run:

usando AllowKey y 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 y DenyKeyRegexp:

AllowKeyRegexp=^vfs\.file\.(contents|size)\[/tmp/app\.log\]$
AllowKeyRegexp=^system\.run\[/usr/bin/(uptime|df -h /)\]$
DenyKeyRegexp=^vfs\.file\..*\[.*\]$

No es necesario establecer DenyKey=system.run[*] ni DenyKeyRegexp=^system\.run\[.*\]$, porque todos los demás comandos system.run se deniegan de forma predeterminada.

Permitir scripts

Permita que Zabbix agent ejecute scripts en los hosts mediante todos los métodos disponibles:

  • Scripts globales que pueden ejecutarse en el frontend o mediante API (este método siempre usa la clave system.run[myscript.sh])
  • Comandos remotos de operaciones de acción (este método siempre usa la clave system.run[myscript.sh,nowait])
  • Elementos system.run de Zabbix agent con el script, por ejemplo:
    • system.run[myscript.sh]
    • system.run[myscript.sh,wait]
    • system.run[myscript.sh,nowait]
AllowKey=system.run[myscript.sh,*]

o

AllowKeyRegexp=^system\.run\[myscript\.sh,.*\]$

Para controlar el parámetro wait/nowait, debe establecer una regla diferente. Por ejemplo, puede permitir solo elementos system.run[myscript.sh,wait], excluyendo así otros métodos:

AllowKey=system.run[myscript.sh,wait]

o

AllowKeyRegexp=^system\.run\[myscript\.sh,wait\]$
Protección de reglas allow/deny

Estos ejemplos muestran cómo proteger reglas AllowKey/AllowKeyRegexp o DenyKey/DenyKeyRegexp demasiado permisivas.

Considere las siguientes reglas:

usando AllowKey y DenyKey:

AllowKey=system.run["C:\Program^ Files\Zabbix^ Agent^ 2\scripts\test.bat*"]
DenyKey=vfs.file.*
DenyKey=system.cpu.load[*]

usando AllowKeyRegexp y DenyKeyRegexp:

AllowKeyRegexp=^system\.run\["C:\\Program\sFiles\\Zabbix\sAgent\s2\\scripts\\test\.bat.*"\]$
DenyKeyRegexp=^vfs\.file\..*$
DenyKeyRegexp=^system\.cpu\.load\[.*\]$

En Windows, debe escapar los espacios en la ruta usando un caret (^) para AllowKey o DenyKey y \s para AllowKeyRegexp o DenyKeyRegexp.

Estas reglas contienen un comodín (*) (o .* para patrones basados en expresiones regulares), que puede ser mal utilizado:

  • El script test.bat puede ejecutarse con cualquier argumento, incluidos los no deseados.
  • El patrón vfs.file.* (^vfs\.file\..*$) coincide con claves de item tanto con parámetros como sin ellos; sin embargo, todos los items vfs.file requieren parámetros.
  • El patrón system.cpu.load[*] (^system\.cpu\.load\[.*\]$) coincide solo con claves de item con parámetros; sin embargo, los items system.cpu.load no requieren parámetros.

Para proteger estas reglas, permita explícitamente la ejecución de test.bat solo con argumentos específicos y deniegue patrones correctos de claves de item; por ejemplo:

usando AllowKey y 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 y DenyKeyRegexp:

AllowKeyRegexp=^system\.run\["C:\\Program\sFiles\\Zabbix\sAgent\s2\\scripts\\test\.bat (status|version)"\]$
DenyKeyRegexp=^vfs\.file\..+\[.*\]$
DenyKeyRegexp=^system\.cpu\.load(\[.*\])?$

Puede probar las reglas ejecutando los siguientes comandos, que devolverán 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]
Ejemplos de patrones

Las siguientes tablas muestran cómo se comparan los patrones de clave de item:

  • Una clave coincide con el patrón solo si cumple todas las condiciones de la columna Matches.
  • Los parámetros deben estar completamente encerrados entre corchetes (por ejemplo, vfs.file.contents[* y vfs.file.contents*utf8] son patrones no válidos).
  • Los ejemplos ilustran solo la coincidencia de patrones; los items reales requieren parámetros.

Para AllowKey y DenyKey:

Pattern Matches Examples
* Cualquier clave con o sin parámetros
vfs.file.* La clave comienza con vfs.file.
Con o sin parámetros
Matches:
vfs.file.size
vfs.file.contents
vfs.file.contents[]
vfs.file.size[/var/log/app.log]
vfs.*.contents La clave comienza con vfs.
La clave termina con .contents
Sin parámetros
Matches:
vfs..contents
vfs.mount.point.file.contents

Does not match:
vfs.contents
vfs.file.contents[]
vfs.file.*[*] La clave comienza con vfs.file.
Parámetros cualesquiera o vacíos
Matches
vfs.file.get.custom[]
vfs.file.size[/var/log/app.log, utf8]

Does not match:
vfs.file.get.custom
vfs.file.contents La clave es vfs.file.contents
Sin parámetros
Matches:
vfs.file.contents

Does not match:
vfs.file.contents[/etc/passwd]
vfs.file.contents[] La clave es vfs.file.contents[]
Parámetros vacíos
Matches:
vfs.file.contents[]

Does not match:
vfs.file.contents
vfs.file.contents[*] La clave es vfs.file.contents
Parámetros cualesquiera o vacíos
Matches:
vfs.file.contents[/path/to/file]

Does not match:
vfs.file.contents
vfs.file.contents[/etc/passwd,*] La clave es vfs.file.contents
El primer parámetro es /etc/passwd
El segundo parámetro es cualquiera o vacío
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 clave es vfs.file.contents
Parámetros cualesquiera, al menos uno contiene passwd
Matches:
vfs.file.contents[/etc/passwd]
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf8]
vfs.file.contents[*passwd*,*] La clave es vfs.file.contents
El primer parámetro contiene passwd
El segundo parámetro es cualquiera o vacío
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 clave es vfs.file.contents
El primer parámetro es /etc/passwd
El segundo parámetro es utf8
Matches:
vfs.file.contents[/etc/passwd,utf8]

Does not match:
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf16]

Para AllowKeyRegexp y DenyKeyRegexp:

Pattern Matches Examples
^.*$ Cualquier clave con o sin parámetros
^vfs\.file\..*$ La clave comienza con vfs.file.
Con o sin parámetros
Matches:
vfs.file.size
vfs.file.contents
vfs.file.contents[]
vfs.file.size[/var/log/app.log]
^vfs\..*\.contents$ La clave comienza con vfs.
La clave termina con .contents
Sin parámetros
Matches:
vfs..contents
vfs.mount.point.file.contents

Does not match:
vfs.contents
vfs.file.contents[]
^vfs\.file\..*\[.*\]$ La clave comienza con vfs.file.
Parámetros cualesquiera o vacíos
Matches
vfs.file.get.custom[]
vfs.file.size[/var/log/app.log, utf8]

Does not match:
vfs.file.get.custom
^vfs\.file\.contents$ La clave es vfs.file.contents
Sin parámetros
Matches:
vfs.file.contents

Does not match:
vfs.file.contents[/etc/passwd]
^vfs\.file\.contents\[\]$ La clave es vfs.file.contents[]
Parámetros vacíos
Matches:
vfs.file.contents[]

Does not match:
vfs.file.contents
^vfs\.file\.contents\[.*\]$ La clave es vfs.file.contents
Parámetros cualesquiera o vacíos
Matches:
vfs.file.contents[/path/to/file]

Does not match:
vfs.file.contents
^vfs\.file\.contents\[/etc/passwd,.*\]$ La clave es vfs.file.contents
El primer parámetro es /etc/passwd
El segundo parámetro es cualquiera o vacío
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 clave es vfs.file.contents
Parámetros cualesquiera, al menos uno contiene passwd
Matches:
vfs.file.contents[/etc/passwd]
vfs.file.contents[/etc/passwd,]
vfs.file.contents[/etc/passwd,utf8]
^vfs\.file\.contents\[.*passwd.*,.*\]$ La clave es vfs.file.contents
El primer parámetro contiene passwd
El segundo parámetro es cualquiera o vacío
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 clave es vfs.file.contents
El primer parámetro es /etc/passwd
El segundo parámetro es 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]