LogRotate 和 Apache 的 SELinux 权限

LogRotate 和 Apache 的 SELinux 权限

目录结构如下:

/www/live/website1/app/
/www/live/website1/files/
/www/live/website1/logs/

Apache 至少需要以下访问权限:

app: read-only access, but read-write is fine (files already chmod 0644)
files: read-write access
logs: read-write access

已通过以下两个规则设置:

/usr/sbin/semanage fcontext -a -t httpd_sys_content_t "/www/live/.*/.*";
/usr/sbin/semanage fcontext -a -t httpd_log_t "/www/live/.*/logs(/.*)?";

/sbin/restorecon -vr "/www";

已经应用并且看起来运行良好...然而 LogRotate 并不高兴。

LogRotate 配置当前为:

/www/live/*/logs/*access_log /www/live/*/logs/*access_log_443 {
    weekly
    rotate 52
    missingok
    notifempty
    nodateext
    sharedscripts
    postrotate
        /usr/sbin/apachectl graceful > /dev/null
    endscript
}

然而,这似乎被 SELinux 阻止了,当它试图命中与文件夹相关的 inode /www/live(在下面的例子中为 262146)时,audit.log 中会出现条目......因为它大概试图列出 /www/live/ 中的文件夹。

type=AVC msg=audit(1396579563.324:316060): avc:  denied  { read } for  pid=12336 comm="logrotate" name="live" dev=dm-0 ino=262146 scontext=system_u:system_r:logrotate_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:default_t:s0 tclass=dir
type=SYSCALL msg=audit(1396579563.324:316060): arch=c000003e syscall=2 success=no exit=-13 a0=7fff2cef68b0 a1=90800 a2=7fff2cef6b5a a3=8 items=0 ppid=12334 pid=12336 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=35531 comm="logrotate" exe="/usr/sbin/logrotate" subj=system_u:system_r:logrotate_t:s0-s0:c0.c1023 key=(null)

那么我应该在什么上下文中设置这个父目录?

/usr/sbin/semanage fcontext -a -t default_t "/www(/.*)";

我知道的地方default_t不起作用,也不起作用var_t......并且作为参考,我并不真正关心什么可以看到这些文件夹,因为它们已经是 chmod 0755。


另外,还有一点需要说明... 有没有一种简单的方法可以查看程序拥有的完整权限列表?我知道 LogRotate 必须能够访问httpd_log_tvar_log_t

令人讨厌的是,手动运行 LogRotate 似乎可以绕过这些限制,因为我认为它继承了用户权限(与通过 cron 运行时不同)。

答案1

尚未确认这是否是正确答案...

/usr/sbin/semanage fcontext -a -t sysfs_t "/www(/.*)";
/usr/sbin/semanage fcontext -a -t httpd_sys_content_t "/www/live/.*/.*";
/usr/sbin/semanage fcontext -a -t httpd_log_t "/www/live/.*/logs(/.*)?";
/sbin/restorecon -vr "/www";

sysfs_t是最重要的一点。

我可以找到 LogRotate 可以使用的域:

sesearch -s logrotate_t -SA

快速搜索“dir”的“读取”(而不仅仅是“打开”)权限:

sesearch -s logrotate_t -SA -c dir -p read | sort

然后浏览该列表,我会说那sysfs_t是最合适的。


我确实发现的一个问题是,如果我/usr/sbin/logrotate自己运行,它会继承根帐户上下文:

id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

因此它会自动获得“不受限制”的访问权限(即完全访问权限)...因此,为了进行测试,我发现使用以下命令虽然并不完美,但确实有效:

sandbox /usr/sbin/logrotate -d /etc/logrotate.conf

我还发现了newroleruncon,它们都需要通过以下方式在 RedHat/CentOS 系统上单独安装:

yum install policycoreutils-newrole

newrole -r system_r -t logrotate_t
runcon -r system_r -t logrotate_t /usr/sbin/logrotate -d /etc/logrotate.conf

但是这两个都给了我权限被拒绝的错误(可能是由于不允许转换):

http://wiki.gentoo.org/wiki/SELinux/Tutorials/How_does_a_process_get_into_a_certain_context


我发现其他有用的东西:

yum install setools-console

seinfo -usystem_u -x
seinfo -rsystem_r -x
seinfo -tlogrotate_t -x

seinfo -tsysfs_t -x

检查我在系统上创建的规则列表:

cat /etc/selinux/targeted/contexts/files/file_contexts.local

有关 SELinux 的更多信息,我发现这 17 个教程非常有用:

http://wiki.gentoo.org/wiki/SELinux/Tutorials


我个人认为所有这些程序都非常不一致,并且可以理解为什么大多数人默认禁用 SELinux...例如

  • seinfo 选项 -u/r/t 后不能有空格
  • 您需要安装额外的软件包才能获得seinfonewrole
  • 您无法轻松地在给定的上下文中手动运行程序(出于测试目的)。
  • audit.log文件使用时间戳,因此请尝试ausearch -m avc --start today
  • 许多使用的程序没有命名约定(例如matchpathcon)。
  • 我不会说的输出(或操作)是audit2allow显而易见的。

这很遗憾,因为总体而言它似乎是一个非常强大的系统。

相关内容