为什么 SELinux 阻止我的 Zabbix 代理的 sudo 调用?

为什么 SELinux 阻止我的 Zabbix 代理的 sudo 调用?

我有一些需要 sudo 的 Zabbix 检查。这些是 /etc/sudoers.d/zabbix 的内容

zabbix ALL=(ALL)    NOPASSWD: /bin/yum history
zabbix ALL=(ALL)    NOPASSWD: /bin/needs-restarting
zabbix ALL=(ALL)    NOPASSWD: /sbin/check31
zabbix ALL=(ALL)    NOPASSWD: /usr/sbin/crm_mon --as-xml

当我从我的 Zabbix 代理强制检查时,我收到以下权限被拒绝错误(pacemaker.status 使用/usr/sbin/crm_mon --as-xml):

bash-5.0$ zabbix_get -s my-server -k pacemaker.status
sudo: PAM account management error: System error
sudo: unable to send audit message: Permission denied

我通过临时将 SELinux 设置为宽容模式,验证了 SELinux 确实阻止了我的呼叫。

然后,我尝试通过以下步骤允许这些呼叫。

首先,我轮换了审计日志,因为它充满了来自以前问题的不相关信息:

service auditd rotate

然后我从策略中删除了所有 dontaudit:

semodule -DB

zabbix_get在 Zabbix 代理上,我通过执行如上所述的调用触发了错误。

根据日志,我创建了一个 SELinux 模块并使用以下命令安装它semodule

cat /var/log/audit/audit.log | audit2allow -M zabbix-agent
semodule -i zabbix-agent.pp

但是,当我执行时,我在发送审计消息时仍然收到相同的权限被拒绝错误zabbix_get。我做了一些研究,关闭 dontaudits 应该可以解决问题,并强制 SELinux 记录其他消息以解决此问题,但我这样做了,这对我的情况不起作用。

这是已构建的zabbix-agent.te文件audit2allow

module zabbix-agent 1.0;

require {
    type zabbix_agent_t;
    type chkpwd_exec_t;
    class unix_dgram_socket create;
    class file execute_no_trans;
    class netlink_audit_socket create;
}

#============= zabbix_agent_t ==============
allow zabbix_agent_t chkpwd_exec_t:file execute_no_trans;
allow zabbix_agent_t self:netlink_audit_socket create;
allow zabbix_agent_t self:unix_dgram_socket create;

答案1

你试过了吗:

setsebool -P zabbix_can_network=1

如果您已经允许上述操作,那么您可以尝试以下操作:

yum install policycoreutils-python
semanage permissive -a zabbix_agent_t

祝你好运

答案2

我遇到了类似的问题(在启用 selinux 的机器上运行 RAID 控制器检查)。

对我来说缺少的环节是:

数据库模块

启用一些非审计策略。然后重新捕获策略。

参考文献为:https://forums.centos.org/viewtopic.php?t=62829 捕获时,首先将 selinux 设置为宽容非常重要。我和你的情况非常类似(在设置为宽容并捕获和应用策略之后):

日志轮换,删除旧日志:

service auditd rotate

semodule -DB(不禁用审计规则)

  • 从 zabbix 运行命令(配置 - 主机 - 执行一次)
  • 运行以下命令获取策略文件

    grep -i avc /var/log/audit/audit.log | audit2allow -M policyx

  • 跑步

    semodule-i policyx.pp

  • 再次在 Zabbix 中运行命令以检查其是否有效

  • 跑步

    序列模块-B

    再次启用无审计规则。

我的 sudoers 规则如下:

zabbix ALL=(root) NOPASSWD: /opt/MegaRAID/storcli/storcli64

我尝试了 zabbix 用户(具有 nologin shell)是否可以运行如下命令:

su -s /bin/bash -c 'sudo /opt/MegaRAID/storcli/storcli64 /c0 /eall /sall show' zabbix

我建议对您的命令尝试相同的操作,以确保以 zabbix 用户身份正确执行。

我还在 sudoers 和 shadow 文件上使用了 restorecon,但不确定是否有帮助。我还在运行的脚本上设置了 zabbix_agent_t 上下文,但这可能没有效果。

最后但同样重要的一点是,这是我应用的策略文件,它对我有用,也许您可​​以编译并应用它,看看它是否有效:

cat mypolz1.te 

module mypolz1 1.0;

require {
    type zabbix_exec_t;
    type zabbix_agent_t;
    type system_dbusd_t;
    class capability { net_admin sys_admin };
    class dbus send_msg;
    class unix_dgram_socket write;
    class file { execute execute_no_trans };
    class netlink_audit_socket { read write };
}

#============= zabbix_agent_t ==============

#!!!! This avc is allowed in the current policy
allow zabbix_agent_t self:capability net_admin;
allow zabbix_agent_t self:capability sys_admin;

#!!!! This avc is allowed in the current policy
allow zabbix_agent_t self:netlink_audit_socket { read write };

#!!!! This avc is allowed in the current policy
allow zabbix_agent_t self:unix_dgram_socket write;

#!!!! This avc is allowed in the current policy
allow zabbix_agent_t system_dbusd_t:dbus send_msg;

#!!!! This avc is allowed in the current policy
allow zabbix_agent_t zabbix_exec_t:file { execute execute_no_trans };

正如您所看到的,我设置了一些策略,也许是系统管理员做了这个伎俩(在我运行命令但没有输出之前)。

我认为迭代是关键,因为每一步之后你都会遇到不同的问题,而应用策略可以缓解这些问题。祝你好运!

相关内容