我正在尝试配置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
我注意到的第一个奇怪的事情是a /
先于~me
.
这个领先者/
来自哪里?
它只是一个"红鲱鱼"吗?
或者这是否指向问题的根本原因(即我需要在httpd.conf中修改其他内容)?
最重要的是,既然我知道我的 ~me/public_html
权限具有世界可读性,那么如何解决这样的问题呢?
有没有办法找出为什么 "访问/〜我被拒绝"?
SELinux的?
httpd.conf文件?
目录权限?
上述所有的?
更新1,回答以下@UlrichSchwarz评论中的2个问题:
主目录似乎具有'x'权限:
[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 /
然后我从命令行运行"允许HTTPD读取主目录" :
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/
我也应该运行chcon -t httpd_user_content_t
on / home/me吗?
继续研究......
更新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/
LSerni.. 5
我看到你给出的命令略有不同的版本,由sealert
以下提供:
SELinux拒绝访问httpd请求的/ var/www/html/file1./ var/www/html/file1具有用于由不同程序共享的上下文.如果您还想从httpd共享/ var/www/html/file1,则需要将其文件上下文更改为
public_content_t
.如果您不打算进行此访问,则可能表示入侵尝试.允许访问:
您可以通过执行chcon -t public_content_t'/ var/www/html/file1'来更改文件上下文
修复命令:
chcon -t public_content_t '/var/www/html/file1'
我如何解决这样的问题?
大多数与SELinux相关的信息通常都在审计日志中,但您可能需要一些工具,例如为sealert
您解码.我做了一个简短的搜索,并提出了我不知道的这个工具,但看起来很有趣:SELinux GUI.
附录:一些例子semanage
我看到你给出的命令略有不同的版本,由sealert
以下提供:
SELinux拒绝访问httpd请求的/ var/www/html/file1./ var/www/html/file1具有用于由不同程序共享的上下文.如果您还想从httpd共享/ var/www/html/file1,则需要将其文件上下文更改为
public_content_t
.如果您不打算进行此访问,则可能表示入侵尝试.允许访问:
您可以通过执行chcon -t public_content_t'/ var/www/html/file1'来更改文件上下文
修复命令:
chcon -t public_content_t '/var/www/html/file1'
我如何解决这样的问题?
大多数与SELinux相关的信息通常都在审计日志中,但您可能需要一些工具,例如为sealert
您解码.我做了一个简短的搜索,并提出了我不知道的这个工具,但看起来很有趣:SELinux GUI.
附录:一些例子semanage