手动执行一下 logrotate 命令,看看是否成功:
[root@logs]# logrotate -f /etc/logrotate.d/nginx[root@logs]# ls -ltotal 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 failedfscreate context set to unconfined_u:object_r:user_home_t:s0renaming /home/nginx/logs/access.log to /home/nginx/logs/access.log-20140312fscreate context set to unconfined_u:object_r:user_home_t:s0renaming /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 logrotatetype=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=dirtype=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]# sestatusSELinux status: enabledSELinuxfs mount: /selinuxCurrent mode: enforcingMode from config file: enforcingPolicy version: 24Policy 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.logdrwxr-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:s0restorecon reset /home/nginx/logs/error.log context unconfined_u:object_r:user_home_t:s0->unconfined_u:object_r:var_log_t:s0restorecon 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]#
具体的行不行,当然还得系统来验证。
没有评论:
发表评论