我正在编写一个 Puppet 模块,用于将 Zabbix 安装到 Puppet 代理上。一切工作正常,但 SELinux 与 Zabbix 配合不佳。我在审计日志中收到来自 SELinux 的以下错误:
type=AVC msg=audit(% audit_id): avc: denied { connect } for pid=2383 comm="zabbix_agentd" scontext=system_u:system_r:zabbix_agent_t:s0 tcontext=system_u:system_r:zabbix_agent_t:s0 tclass=unix_dgram_socket permissive=0
我把我的 Puppet 类改成这样本网站作为参考:
class { 'zabbix::agent':
server => '<server_ip>',
tlsaccept => 'psk',
tlsconnect => 'psk',
tlspskfile => $pskfilepath,
tlspskidentity => $pskidentity,
manage_selinux => true,
selinux_require => [
'type kernel_t',
'type devlog_t',
'type zabbix_agent_t',
'class sock_file write',
'class process setrlimit',
'class unix_dgram_socket {connect create sendto}',
],
selinux_rules => { 'zabbix_agent_t' => [
'allow zabbix_agent_t kernel_t:unix_dgram_socket sendto',
'allow zabbix_agent_t self:process setrlimit',
'allow zabbix_agent_t self:unix_dgram_socket { connect create }',
]
}
现在,我得到的是这个:
type=AVC msg=audit($audit_id): avc: denied { write } for pid=4293 comm="zabbix_agentd" name="log" dev="devtmpfs" ino=8160 scontext=system_u:system_r:zabbix_agent_t:s0 tcontext=system_u:object_r:devlog_t:s0 tclass=sock_file permissive=0
它从 变为{ connect }
,{ write }
有人能告诉我为什么 SELinux 不能与 Zabbix 很好地协同工作吗?
答案1
MichaelHampton 帮我解决了这个问题,我使用了这里创建 4 个 exec 语句来实现目标。我将其放在 if 语句中,以检查 Zabbix 代理是否已在运行,因为在 Zabbix 代理已启动时运行它会导致错误。可能有更好的方法,但这就是我所做的,而且效果很好。如果有人在使用 exec 语句时遇到错误,请确保为每个 exec 语句正确设置路径属性,这样它就会起作用。