SELinux在CentOS 7上的Anacron postrotate脚本中使用时,拒绝“systemctl kill”

我正在使用名为UrBackup的备份软件,我configuration为通过cron.daily每天轮换一次日志。 日志旋转后,软件使用postrotate脚本来向运行进程发送一个带有“systemctl kill”的HUP信号。 然而,SELinux拒绝这个操作,我不知道如何解决这个问题。

这是来自/etc/logrotate.d的UrBackup的整个logrotateconfiguration文件:

"/var/log/urbackup.log" { daily rotate 30 missingok create 640 urbackup urbackup compress postrotate test -e /var/run/urbackupsrv.pid && kill -HUP 'cat /var/run/urbackupsrv.pid' || /bin/systemctl kill -s HUP urbackup-server.service endscript } 

正如我所发现的那样,系统上正在执行以下有问题的postrotate脚本:

 /bin/systemctl kill -s HUP urbackup-server.service 

SELinux阻止了这一点。 以下是/ var / log / messages中的相关日志条目:

 Nov 14 03:33:33 backup4 kernel: type=1107 audit(1510648413.518:4407695): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='avc: denied { stop } for auid=0 uid=0 gid=0 path="/usr/lib/systemd/system/urbackup-server.service" cmdline="/bin/systemctl kill -s HUP urbackup-server.service" scontext=system_u:system_r:logrotate_t:s0-s0:c0.c1023 tcontext=system_u:object_r:systemd_unit_file_t:s0 tclass=service#012 exe="/usr/lib/systemd/systemd" sauid=0 hostname=? addr=? terminal=?' Nov 14 03:33:33 backup4 logrotate: ALERT exited abnormally with [1] 

由于HUP信号没有被发送到服务,所以它不知道日志文件已经被旋转,并且它将无限地写入旧的(旋转的)日志中。

我尝试使用sealert实用程序对此进行故障排除,以提供对/var/log/audit/audit.log中所有错误的解释。 但是,即使日志条目出现在audit.log中,它似乎也会忽略此错误。

我也尝试以root身份交互地运行“systemctl kill”命令。 它完成没有任何错误。 这同样适用于logrotate的手动运行:

 logrotate -f /etc/logrotate.d/urbackup-server 

该命令也运行没有问题。 唯一一次我看到SELinux拒绝是由日常Anacron进程触发logrotate的时候。

SELinux是否明确禁止“systemctl kill”命令? 如果是这样,为什么我可以交互地运行它,但不是当通过cron启动? 有什么办法可以为这种情况添加一个exception,或者我可以发送HUP信号到进程的另一种方式,以便将它写入正确的日志文件?

非常感谢您的帮助。

具体而言,上下文logrotate_t是不允许的systemd_unit_file_t 。 您的交互式运行是在不同的上下文中。

好奇它通过了pid文件testing。 如果该服务运行时该pid文件不存在,请尝试将PIDFile=/var/run/urbackupsrv.pidurbackup-server.service单元。

有一些方法可以在SELinux中定义域转换,但先给pid文件一个东西。