Я пишу модуль 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?»
Майкл Хэмптон помог мне разобраться, я использовал инструкции из здесь создать 4 оператора exec, которые достигли бы цели. Я заключил его в оператор if, чтобы проверить, запущен ли уже агент Zabbix, поскольку его запуск, когда агент Zabbix уже запущен, вызывает ошибку. Может быть, есть лучший способ сделать это, но я так и сделал, и он хорошо работает. Если у кого-то возникают ошибки с операторами exec, не забудьте правильно установить атрибут path для каждого оператора exec, и он будет работать.