2014年6月4日星期三

一个 logrotate 不执行的分析


手动执行一下 logrotate 命令,看看是否成功:
[root@logs]# logrotate  -f /etc/logrotate.d/nginx
[root@logs]# ls -l
total 3064
-rw-r--r--. 1 nobody root   18391 Mar 12 14:43 access.log
-rw-r--r--. 1 root   root 3040520 Mar 12 14:43 access.log-20140312.bz2
-rw-r--r--. 1 nobody root     420 Mar 12 14:43 error.log
-rw-r--r--. 1 root   root   56056 Mar 12 14:43 error.log-20140312.bz2

debug 看一下具体的输出:
[root@logs]# logrotate -v -d -f /etc/logrotate.d/nginx
.........................
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
fscreate context set to unconfined_u:object_r:user_home_t:s0
renaming /home/nginx/logs/access.log to /home/nginx/logs/access.log-20140312
fscreate context set to unconfined_u:object_r:user_home_t:s0
renaming /home/nginx/logs/error.log to /home/nginx/logs/error.log-20140312
........................

fscreate 那行 发现有 selinux 的迹象,直接跑是没有问题的。有 selinux ,查一下 selinux 的日志 /var/log/audit/audit.log :
[root@audit]# cat audit.log |grep logrotate
type=AVC msg=audit(1394467201.627:1089499): avc:  denied  { read } for  pid=15146 comm="logrotate" name="logs" dev=sda2 ino=486722 scontext=system_u:system_r:logrotate_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=dir
type=SYSCALL msg=audit(1394467201.627:1089499): arch=c000003e syscall=2 success=no exit=-13 a0=7fffe254e8d0 a1=90800 a2=d8e2d1 a3=fffffffffffffff0 items=0 ppid=15144 pid=15146 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=170110 comm="logrotate" exe="/usr/sbin/logrotate" subj=system_u:system_r:logrotate_t:s0-s0:c0.c1023 key=(null)
type=AVC msg=audit(1394480282.021:1090340): avc:  denied  { read } for  pid=35936 comm="logrotate" name="logs" dev=sda2 ino=486722 scontext=system_u:system_r:logrotate_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=dir
........................

上面过滤的结果看,果然有发现。logrotate 的执行确实是被 deny 了。查看 selinux 的状态,是 enforcing 模式:
[root@logs]# sestatus 
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   enforcing
Mode from config file:          enforcing
Policy version:                 24
Policy from config file:        targeted

解决方法:
方法一: 关闭 selinux ,临时修改  setenforce 0; 修改 /etc/selinux/config 启动禁用,还可修改 grub 选项禁启动,google 无忧。 
方法二:  学习一下 selinux 配置;怎么做。 我们可以回归到系统上,/var/log 看这个目录下的日志是可以轮询的,ls -Z |grep log* 来看 selinux 配置:
[root@log]# ls -Z /var/log/
drwxr-xr-x. root   root   system_u:object_r:consolekit_log_t:s0 ConsoleKit
-rw-------. root   root   system_u:object_r:var_log_t:s0   anaconda.ifcfg.log
-rw-------. root   root   system_u:object_r:var_log_t:s0   anaconda.log
-rw-------. root   root   system_u:object_r:var_log_t:s0   anaconda.program.log
-rw-------. root   root   system_u:object_r:var_log_t:s0   anaconda.storage.log
-rw-------. root   root   system_u:object_r:var_log_t:s0   anaconda.syslog
-rw-------. root   root   system_u:object_r:var_log_t:s0   anaconda.xlog
-rw-------. root   root   system_u:object_r:var_log_t:s0   anaconda.yum.log
drwxr-x---. root   root   system_u:object_r:auditd_log_t:s0 audit
-rw-r--r--. root   root   system_u:object_r:var_log_t:s0   boot.log
-rw-r--r--. root   root   system_u:object_r:var_log_t:s0   boot.log-20140223
........................

接下来,就是把 user_home_t 修改为 var_log_t , 也可以回到上面的 audit.log 部分 , 发现最后 t 的属性是 logrotate_t
[root@logs]# ls -Z
-rw-r--r--. nobody root unconfined_u:object_r:user_home_t:s0 access.log
-rw-r--r--. nobody root unconfined_u:object_r:user_home_t:s0 error.log
-rw-r--r--. root   root unconfined_u:object_r:user_home_t:s0 nginx.pid
[root@logs]# semanage fcontext -a -t var_log_t '/home/nginx/logs/(.*)?'
[root@logs]# restorecon -R -v /home/nginx/logs/
restorecon reset /home/nginx/logs/access.log context unconfined_u:object_r:user_home_t:s0->unconfined_u:object_r:var_log_t:s0
restorecon reset /home/nginx/logs/error.log context unconfined_u:object_r:user_home_t:s0->unconfined_u:object_r:var_log_t:s0
restorecon reset /home/nginx/logs/nginx.pid context unconfined_u:object_r:user_home_t:s0->unconfined_u:object_r:var_log_t:s0
[root@logs]# ls -Z
-rw-r--r--. nobody root unconfined_u:object_r:var_log_t:s0 access.log
-rw-r--r--. nobody root unconfined_u:object_r:var_log_t:s0 error.log
-rw-r--r--. root   root unconfined_u:object_r:var_log_t:s0 nginx.pid
[root@logs]#

具体的行不行,当然还得系统来验证。

没有评论:

发表评论