日志错误统计失败:LogRotation 期间权限被拒绝

日志错误统计失败:LogRotation 期间权限被拒绝

安装新的 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 种状态之一:enforcingpermissivedisabled

不过,我鼓励您花时间了解为什么 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

这是在logrotate_selinux 手册页

您仍然可以使用 来查看消息(您最终应该处理的消息)audit2allow

答案4

我们遇到这个错误是因为在块su group user之外使用{…}。看起来它与 中的其他规则产生了冲突/etc/logrotate.d/

我们通过在用户拥有的文件的规则中使用su root root和 来修复它。create 664 www-data www-datawww-data

这样可以root旋转文件但www-data拥有基本文件。

相关内容