安装新的 CentOS 6.0 服务器后,logrotate 工作得非常正常。然后有一天,由于内核崩溃,服务器必须硬启动,并且自从日志轮换不再轮换日志后。
因此,我做了一个单独的 cron 条目来手动强制轮换日志,并将输出重定向到日志文件,并为每个文件获取以下行:
rotating pattern: /home/mail3/log/popMailProcessing.log forced from command line (60 rotations)
empty log files are rotated, old logs are removed
considering log /home/mail3/log/popMailProcessing.log
error: stat of /home/mail3/log/popMailProcessing.log failed: Permission denied
但是,如果我从命令行手动执行日志旋转,它可以完美地工作。我在命令行上使用的命令是:
logrotate -v -f /etc/logrotate.d/mail3-logs
我的 logrotate.conf 文件是:
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
dateext
# uncomment this if you want your log files compressed
compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
logrotate 通过 cron 作业使用的日志轮换文件是:
dateext
/home/mail3/log/pop.log {
daily
rotate 60
copytruncate
compress
}
/home/mail3/log/oc4j.log {
daily
rotate 60
copytruncate
compress
}
/home/mail3/log/incoming.log {
daily
rotate 60
copytruncate
compress
}
/home/mail3/log/mailpro.log {
daily
rotate 60
copytruncate
compress
}
/home/mail3/log/imap.log {
daily
rotate 60
copytruncate
compress
}
/home/mail3/log/outgoing.log {
daily
rotate 60
copytruncate
compress
}
/home/mail3/log/smtpout.log {
daily
rotate 60
copytruncate
compress
}
/home/mail3/log/retry.log {
daily
rotate 60
copytruncate
compress
}
/home/mail3/log/mailinglist.log {
daily
rotate 60
copytruncate
compress
}
/home/mail3/log/migrate.log {
daily
rotate 60
copytruncate
compress
}
我的 crontab 条目是:
03 00 * * * root /usr/sbin/logrotate -f -v /etc/logrotate.d/mail3-logs &>> /var/log/logrotate/rotate.log
SELinux 正在强制执行,而且它也在硬启动之前强制执行。保存日志的目录的所有者为root,目录具有完整的权限。
有什么线索导致权限被拒绝错误吗?
答案1
您原来的错误消息与您为运行logrotate
.
rotating pattern: /home/mail3/log/popMailProcessing.log forced from command line (60 rotations)
empty log files are rotated, old logs are removed
considering log /home//log/popMailProcessing.log
error: stat of /home/mail3/log/popMailProcessing.log failed: Permission denied
这些路径要做什么/home/mail3/log/*
?另外,该行还缺少什么/home//log/popMailProcessing.log
?看来你的问题只是展示了一些实际情况。
调试问题
将此行放入 shell 脚本中logrotate.sh
:
#!/bin/bash
/usr/sbin/logrotate -f -v /etc/logrotate.d/mail3-logs &>> /var/log/logrotate/rotate.log
使其可执行并从 cron 中运行它:
03 00 * * * root strace -s 2000 -o /tmp/strace.log /path/to/logrotate.bash
在查看输出时,您应该看到权限问题导致了哪些问题。
编辑#1
在与 OP 交谈后,他提到上述调试技术发现 SELinux 已启用。他很困惑为什么会出现这种情况,因为他之前已经用命令禁用了它setenforce 0
。
以这种方式禁用 SELinux 只会保持这种状态,直到下次重新启动。 SELinux 的默认模式由 Fedora/CentOS 上的此文件指定:
$ cat /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
SELINUX=disabled
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Only targeted network daemons are protected.
# strict - Full SELinux protection.
SELINUXTYPE=targeted
要永久禁用 SELinux,您需要将该行更改SELINUX=..
为 3 种状态之一:enforcing
、permissive
、disabled
。
不过,我鼓励您花时间了解为什么 SELinux 不允许访问这些日志文件所在的目录,并添加适当的上下文以便 SELinux 允许此访问。 SELinux 是分层安全模型的重要组成部分,在使用它的 Linux 发行版上得到了促进,盲目地禁用它会剥夺其中一个关键层。
参考
答案2
我认为禁用 SELinux 不是最好的选择。我认为更好的解决方案是制定和应用政策。以下是如何针对其他策略执行此操作的示例http://www.greenvalleyconsulting.org/2015/01/28/installing-coldfusion-11-on-centos-6-6-with-selinux-enforcing/。相同的概念将适用于 logrotate_t 策略,而不是链接中概述的 httpd_t 。
请参阅链接中安装policycoreutils-python的步骤。然后运行
grep logrotate /var/log/audit/audit.log | audit2why
audit2allow -a
寻找 logrotate_t,它更有可能看起来像这样
#============= logrotate_t ==============
allow logrotate_t file_t:file getattr;
然后运行
audit2allow -a -M logrotate_t
semodule -i logrotate_t.pp
chcon -R -t logrotate_t /[your log file location]/*.log
答案3
在紧要关头,您可以通过以下方法解决此问题:
semanage permissive -a logrotate_t
您仍然可以使用 来查看消息(您最终应该处理的消息)audit2allow
。
答案4
我们遇到这个错误是因为在块su group user
之外使用{…}
。看起来它与 中的其他规则产生了冲突/etc/logrotate.d/
。
我们通过在用户拥有的文件的规则中使用su root root
和 来修复它。create 664 www-data www-data
www-data
这样可以root
旋转文件但www-data
拥有基本文件。