Я пишу модуль 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, и он будет работать.