![为什么 apache 不允许使用 SELinux 的符号链接?](https://linux22.com/image/681736/%E4%B8%BA%E4%BB%80%E4%B9%88%20apache%20%E4%B8%8D%E5%85%81%E8%AE%B8%E4%BD%BF%E7%94%A8%20SELinux%20%E7%9A%84%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5%EF%BC%9F.png)
我有一个简单的场景:我想符号链接/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/