我有一台 Centos 7 服务器,在我们的 UAT 环境中运行 Nagios Core 4.3.4 和 Apache 2.4.6。我在 PROD 中有第二台服务器,它是使用相同的 Ansible playbook 设置的。 Nagios 是从源代码构建的。当尝试使用 Nagios 命令时, UAT 服务器会给出该消息Error: Could not stat() command file '/usr/local/nagios/var/rw/nagios.cmd'!
,但 PROD 服务器不会。我在下面给出的所有配置列表在 UAT 和 PROD 服务器之间都是相同的。
我已经确认该错误是由 SELinux 引起的:这是我的审核日志的输出:
类型=AVC msg=audit(1525250190.011:1114376): avc: 被拒绝{ getattr } for pid=12182 comm="cmd.cgi" path="/usr/local/nagios/var/rw/nagios.cmd" dev=" dm-0" ino=201456984 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:httpd_sys_rw_content_t:s0 tclass=fifo_file
以下是一些相关的目录列表:
$ ls -Z /usr/local/nagios/var
drwxrwxr-x. nagios nagios unconfined_u:object_r:usr_t:s0 archives
-rw-r--r--. nagios users system_u:object_r:usr_t:s0 nagios.configtest
-rw-r--r--. nagios nagios system_u:object_r:usr_t:s0 nagios.log
-rw-r--r--. nagios nagios system_u:object_r:usr_t:s0 objects.cache
-rw-r--r--. nagios nagios system_u:object_r:usr_t:s0 objects.precache
-rw-------. nagios nagios system_u:object_r:usr_t:s0 retention.dat
drwxrwsr-x. nagios nagcmd unconfined_u:object_r:httpd_sys_rw_content_t:s0 rw
drwxr-xr-x. root root unconfined_u:object_r:usr_t:s0 spool
-rw-rw-r--. nagios nagios system_u:object_r:usr_t:s0 status.dat
$ ls -Z /usr/local/nagios/var/rw
prw-rw----. nagios nagcmd system_u:object_r:httpd_sys_rw_content_t:s0 nagios.cmd
srw-rw----. nagios nagcmd system_u:object_r:httpd_sys_rw_content_t:s0 nagios.qh
rw
当 Nagios 服务停止和启动时,该目录的内容将被删除并重新创建。我看到的所有信息都表明将httpd_sys_rw_content_t
类型应用于目录并且应该可以工作。它在 PROD 服务器上起作用,但在 UAT 服务器上不起作用。据我了解,下一个命令应该确认它应该工作:
$ sudo sesearch --allow --source httpd_t --target httpd_sys_rw_content_t --class file
Found 6 semantic av rules:
allow httpd_t httpd_content_type : file { ioctl read getattr lock open } ;
allow httpd_t httpd_sys_rw_content_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ;
allow httpd_t httpd_sys_rw_content_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ;
allow httpd_t httpdcontent : file { ioctl read write create getattr setattr lock append unlink link rename open } ;
allow httpd_t httpdcontent : file { read getattr execute open } ;
allow httpd_t httpd_content_type : file { ioctl read getattr lock open } ;
答案1
尽管我对我的解决方案并不完全满意,但我得到了它的工作。我曾经audit2allow
创建一个自定义策略(必须运行它三次才能允许所有正确的权限)。
$ sudo grep nagios.cmd /var/log/audit/audit.log | tail -3 | sudo audit2allow -M httpdnagioscmd
$ sudo semodule -i httpdnagioscmd.pp
这可能与文件的类别有关fifo_file
,但file
我对 SELinux 的了解还不够,无法真正找出根本原因。