我正在使用名为 UrBackup 的备份软件,我已将其配置为每天通过 cron.daily 轮换一次日志。轮换日志后,该软件使用 postrotate 脚本通过“systemctl kill”向正在运行的进程发送 HUP 信号。但是,SELinux 拒绝此操作,我不知道如何修复它。
这是来自 /etc/logrotate.d 的 UrBackup 的完整 logrotate 配置文件:
"/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 拒绝是当 logrotate 被每日 Anacron 进程触发时。
SELinux 是否明确不允许“systemctl kill”命令?如果是,为什么我可以以交互方式运行它,但通过 cron 启动时却不行?我有没有办法为这种情况添加例外,或者我可以用另一种方式向进程发送 HUP 信号,以便它写入正确的日志文件?
非常感谢您的帮助。
答案1
具体来说,logrotate_t
不允许上下文systemd_unit_file_t
。您的交互式运行是在不同的上下文中。
奇怪的是它没有通过 pid 文件测试。如果服务运行时该 pid 文件不存在,请尝试将其添加PIDFile=/var/run/urbackupsrv.pid
到urbackup-server.service
单元中。
有多种方法可以在 SELinux 中定义域转换,但首先尝试一下 pid 文件。