SELinux 阻止来自 zabbix_agentd 的 sudo

lmz*_*lmz 4 selinux centos sudo zabbix

我有一个用于 Zabbix 的自定义用户参数,它调用硬件 RAID CLI 工具(arcconf / megacli)并检查是否有任何阵列降级。由于这些工具都是root权限的,我配置了sudoers允许zabbix用户无需密码即可访问:

Defaults:zabbix !requiretty
Cmnd_Alias ZABBIX_MEGACLI_CMDS = /opt/MegaRAID/MegaCli/MegaCli64 -LDInfo -Lall -aALL
zabbix  ALL     = (ALL) NOPASSWD: ZABBIX_MEGACLI_CMDS
Run Code Online (Sandbox Code Playgroud)

在 CentOS 5 上,zabbix_agentd 不受限制地运行,一切正常。在 CentOS 6 上,代理现在在单独的 zabbix_agent_t 域中运行。这引起了问题。最初无法执行 sudo 二进制文件本身,但我添加了此策略:

sudo_exec(zabbix_agent_t)
Run Code Online (Sandbox Code Playgroud)

现在它以不同的方式消亡:

type=AVC msg=audit(1407137597.193:157): avc:  denied  { create } for  pid=3145 comm="sudo" scontext=unconfined_u:system_r:zabbix_agent_t:s0 tcontext=unconfined_u:system_r:zabbix_agent_t:s0 tclass=unix_dgram_socket
type=SYSCALL msg=audit(1407137597.193:157): arch=c000003e syscall=41 success=no exit=-13 a0=1 a1=80002 a2=0 a3=1 items=0 ppid=3121 pid=3145 auid=0 uid=496 gid=495 euid=0 suid=0 fsuid=0 egid=495 sgid=495 fsgid=495 tty=(none) ses=3 comm="sudo" exe="/usr/bin/sudo" subj=unconfined_u:system_r:zabbix_agent_t:s0 key=(null)
type=AVC msg=audit(1407137597.193:158): avc:  denied  { create } for  pid=3145 comm="sudo" scontext=unconfined_u:system_r:zabbix_agent_t:s0 tcontext=unconfined_u:system_r:zabbix_agent_t:s0 tclass=netlink_audit_socket
type=SYSCALL msg=audit(1407137597.193:158): arch=c000003e syscall=41 success=no exit=-13 a0=10 a1=3 a2=9 a3=7fffce049a20 items=0 ppid=3121 pid=3145 auid=0 uid=496 gid=495 euid=0 suid=0 fsuid=0 egid=495 sgid=495 fsgid=495 tty=(none) ses=3 comm="sudo" exe="/usr/bin/sudo" subj=unconfined_u:system_r:zabbix_agent_t:s0 key=(null)
Run Code Online (Sandbox Code Playgroud)

这是做事的正确方法吗?我可以添加哪些其他策略以便 zabbix_agent_t 可以运行 sudo?如果 sudo 工作,它仍然会被限制在 zabbix_agent_t 域内还是应该添加TYPE=unconfined_t到 sudoers 行?我应该采用https://bugzilla.redhat.com/show_bug.cgi?id=917157和 s/nrpe_t/zabbix_agent_t/ 吗?

编辑:

不确定这是否是最好的主意,但是...

sudo_exec(zabbix_agent_t)
domtrans_pattern(zabbix_agent_t, sudo_exec_t, unconfined_t)
Run Code Online (Sandbox Code Playgroud)

似乎工作。我想最坏的情况是它依赖于 sudo 和 sudoers 文件的安全性。

Mic*_*ton 9

处理此问题的方法是收集有关程序需要什么访问权限的所有信息,然后在自定义策略模块中明确仅允许该访问权限。

这很容易做到。

首先,您设置域 permissive,以便 SELinux 暂时不执行其规则。它仍然会记录拒绝,稍后您将使用这些日志。

semanage permissive -a zabbix_agent_t
Run Code Online (Sandbox Code Playgroud)

接下来,让程序运行,让它做它需要做的任何事情。该审计日志将填补了什么会被拒绝,而这些日志也显示权限将需要加以批准。然后使用ausearch.

ausearch -r -m avc -ts today
Run Code Online (Sandbox Code Playgroud)

我们将生成一个包含必要权限的本地策略模块。(您需要在此处使用该-r选项,ausearch以便其他脚本可以处理输出。)

如果您清楚地看到不相关的条目,请将输出重定向到一个文件,然后对其进行编辑以将其删除。然后在此处使用该文件。

ausearch -r -m avc -ts today | audit2allow -M zabbix_megacli
Run Code Online (Sandbox Code Playgroud)

最后,我们安装新的本地策略模块并重新启用 SELinux 强制执行。

semodule -i zabbix_megacli.pp
semanage permissive -d zabbix_agent_t
Run Code Online (Sandbox Code Playgroud)