我正在尝试配置Apache httpd.conf(在我的CentOS 6.4上)以允许访问我的用户目录(即~me / public_html / index.html)。
我更改了原始 httpd.conf
(即开箱即用),如下所示:
[root@myhost www]# diff /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.orig.out-of-the-box
366c366
< #UserDir disabled
---
> UserDir disabled
373c373
< UserDir public_html
---
> #UserDir public_html
这原则上应该提供对http://myhost/~me
的访问权限,但相反,我遇到了可怕的错误:
You don't have permission to access /~me on this server.
我检查了文件/ var / log / httpd / error_log,确实如下:
(13)Permission denied: access to /~me denied
我注意到的第一个奇怪的事情是/
被添加到~me
。
/
来自哪里? 最重要的是,由于我知道我的~me/public_html
具有全球可读权限,如何解决此类问题?
有没有办法找出为什么&#34;访问/〜我被拒绝&#34;?
更新1 ,回答以下@UlrichSchwarz评论中的2个问题:
主目录似乎确实有&#39; x&#39;权限:
[root @ myhost~] #ls -lad / home / me
drwxr-XR-X。 33 me me 4096 Feb 8 16:30 / home / me
关于public_html的SELinux信息:
[root @ myhost~] #ls -Z -d / home / me / public_html /
drwxrwxr-X。 me me unconfined_u:object_r:file_t:s0 / home / me / public_html /
更新2 ,在我确认这确实是SELinux问题之后(感谢@Scolytus的提示):
我跑了命令:
chcon -R -t httpd_user_content_t / home / me / public_html /
仍然没有。
[root @ myhost~] #ls -Z -d / home / me / public_html /
drwxrwxr-X。 me me unconfined_u:object_r:httpd_user_content_t:s0 / home / me / public_html /
然后我跑了#34;允许HTTPD读取主目录&#34; from the command line:
setsebool -P httpd_enable_homedirs = 1
仍然没有。
/ var / log / httpd / error_log现在显示(除了(13)权限被拒绝错误)以下内容:
[notice] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
[notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[notice] Digest: generating secret for digest authentication ...
[notice] Digest: done
[notice] Apache/2.2.15 (Unix) DAV/2 configured -- resuming normal operations
问题可能在于context_system_u和httpd_user_content_t之间的差异?
我还需要做什么? (没有完全禁用SELinux,即)
更新3 ,感谢@ lserni回答中的信息,我发现了ausearch命令:
ausearch -m avc --start today
提供了以下输出:
time->Fri Jul 4 09:16:44 2014
type=SYSCALL msg=audit(1404479804.256:1312): arch=40000003 syscall=196 success=no exit=-13 a0=12c2c80 a1=bfeb1d00 a2=a34ff4 a3=2008171 items=0 ppid=5880 pid=5886 auid=0 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=193 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1404479804.256:1312): avc: denied { getattr } for pid=5886 comm="httpd" path="/home/me" dev=dm-3 ino=2 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:file_t:s0 tclass=dir
咦?为什么/home/me
而不是/home/me/public_html
?
以下是ls -Zd /home/me/
的输出:
drwxr-xr-x. me me system_u:object_r:file_t:s0 /home/me/
我是否应该在 / home / me 上运行chcon -t httpd_user_content_t
?
继续研究......
更新4 :成功!
我跑了命令:
chcon -t httpd_user_content_t /home/me/
现在一切都很好。
[root@myhost sa]# ls -Z -d /home/me/
drwxr-xr-x. me me system_u:object_r:httpd_user_content_t:s0 /home/me/
答案 0 :(得分:5)
我看到sealert
提供的命令的a slightly different version:
SELinux拒绝访问httpd请求的/ var / www / html / file1。 / var / www / html / file1有一个用于不同共享的上下文 程序。如果你想从httpd分享/ var / www / html / file1 另外,您需要将其文件上下文更改为
public_content_t
。如果 你不打算这种访问,这可能预示着入侵 尝试。允许访问:
您可以通过执行chcon -t public_content_t来更改文件上下文 '/无功/网络/ HTML / file1的'
修复命令:
chcon -t public_content_t '/var/www/html/file1'
如何解决此类问题?
大多数与SELinux相关的信息通常都在审核日志中,但您可能需要某些工具(如sealert
)为您解码。我做了一个简短的搜索,并提出了我不知道的这个工具,但看起来很有趣:SELinux GUI。
答案 1 :(得分:2)
我无法立即查看,但我记得发表评论UserDir disabled
与启用不同!
更具体地说,我认为您需要在https.conf文件中包含一行
Userdir enabled me