AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 586673
Accepted
Craig Francis
Craig Francis
Asked: 2014-04-05 03:11:16 +0800 CST2014-04-05 03:11:16 +0800 CST 2014-04-05 03:11:16 +0800 CST

LogRotate 和 Apache 的 SELinux 权限

  • 772

使用目录结构:

/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 阻止了,当它试图点击与/www/live文件夹相关的 inode 时,条目出现在 audit.log 中(在下面的示例中为 262146)......因为它可能试图列出 /www 中的文件夹/居住/。

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_t和var_log_t.

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

linux
  • 1 1 个回答
  • 11176 Views

1 个回答

  • Voted
  1. Best Answer
    Craig Francis
    2014-04-08T07:56:37+08:002014-04-08T07:56:37+08:00

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

    /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”的“read”(不仅仅是“open”)权限:

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

    然后扫描列表,我会说这sysfs_t是最合适的。


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

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

    所以它会自动获得“不受限制”的访问权限(即完全访问权限)......所以为了测试,我发现使用以下内容虽然不完美,但确实起到了作用:

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

    我还发现了newroleand runcon,两者都需要通过以下方式分别安装在 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
    • 你需要安装额外的包来获取seinfo和newrole
    • 您不能在给定的上下文(出于测试目的)下轻松地手动运行程序。
    • 该audit.log文件使用时间戳,因此请改为尝试ausearch -m avc --start today.
    • 使用的许多程序没有命名约定(例如matchpathcon)。
    • 我不会说的输出(或操作)audit2allow是显而易见的。

    真可惜,因为它总体上似乎是一个非常强大的系统。

    • 11

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve