为什么 apache 不允许使用 SELinux 的符号链接?

为什么 apache 不允许使用 SELinux 的符号链接?

我有一个简单的场景:我想符号链接/home/leonard/apache/sandbox/markdown/home/leonard/github/markdown-editor,以便markdown-editor可以从我的浏览器中查看。

我设置了链接ln -s /home/leonard/github/markdown-editor /home/leonard/apache/sandbox/public/markdown并且它显示了出来并且可以正常导航。

但是,当我在浏览器中查看时,我得到了403 Forbidden。我的audit.log显示内容如下:

type=AVC msg=audit(1461759062.021:1232192): avc:  denied  { read } for  pid=30107 comm="httpd" name="markdown" dev=md2 ino=25300345 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=lnk_file
type=SYSCALL msg=audit(1461759062.021:1232192): arch=c000003e syscall=4 success=no exit=-13 a0=7f88e34cff28 a1=7ffc036e2dd0 a2=7ffc036e2dd0 a3=7f88dec032e0 items=0 ppid=36009 pid=30107 auid=0 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=88286 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1461759062.022:1232193): avc:  denied  { getattr } for  pid=30107 comm="httpd" path="/home/leonard/apache/sandbox/public/markdown" dev=md2 ino=25300345 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=lnk_file
type=SYSCALL msg=audit(1461759062.022:1232193): arch=c000003e syscall=6 success=no exit=-13 a0=7f88e34d0018 a1=7ffc036e2dd0 a2=7ffc036e2dd0 a3=1 items=0 ppid=36009 pid=30107 auid=0 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=88286 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)

我在这里看到过其他问题,询问如何设置符号链接的上下文,但我不确定它们是否相关,因为该链接与其他(在浏览器中完全可见)相邻目录相同:

[leonard@ombrelle public]$ ls -alZ
drwxr-xr-x. leonard developers unconfined_u:object_r:user_home_t:s0 .
drwxr-xr-x. leonard developers unconfined_u:object_r:user_home_t:s0 ..
-rw-r--r--. leonard developers unconfined_u:object_r:user_home_t:s0 .htaccess
-rw-r--r--. leonard developers unconfined_u:object_r:user_home_t:s0 index.php
lrwxrwxrwx. leonard developers unconfined_u:object_r:user_home_t:s0 markdown -> /home/leonard/github/markdown-editor
drwxr-xr-x. leonard developers unconfined_u:object_r:user_home_t:s0 notes

我怎样才能让符号链接以这种方式工作?

更新

使用伊恩的回答,我运行audit2why < /var/log/audit/audit.log并得到以下结果:

type=AVC msg=audit(1461761590.750:1232443): avc:  denied  { getattr } for  pid=37683 comm="httpd" path="/home/leonard/apache/sandbox/public/markdown" dev=md2 ino=25300345 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=lnk_file

        Was caused by:
        The boolean httpd_enable_homedirs was set incorrectly.
        Description:
        Allow httpd to read home directories

        Allow access by executing:
        # setsebool -P httpd_enable_homedirs 1

运行该setsebool命令后,奇迹般地成功了。我只是不确定,/home/*/apache/sitename.tld如果没有启用该命令,我们拥有的所有其他网站()是如何工作的?

答案1

您没有说明您使用的是哪个发行版/版本,这可能与此有关。我手头只有 Centos 6 和 7,但要使用的工具应该在其他发行版上可用。

你应该熟悉的工具是审计为什么audit2allow

通过这些工具运行你的拒绝信息将会为你指明正确的方向。

在 CentOS 6 系统上,我必须手动使用工具建议当前策略应该允许这样做(所以我猜你没有使用这个)但设置特定的 SELinux 布尔值将有助于解决问题。

在 CentOS 7 系统上,我手头的工具建议设置特定的 SELinux 布尔值将有助于解决问题。

答案2

根据我找到的信息,允许例外的方法如下:

跑步:

sealert -a /var/log/audit/audit.log

然后按照给出的说明进行操作。来源:https://wiki.centos.org/HowTos/SELinux/

相关内容