(13)权限被拒绝:访问/〜我被拒绝

时间:2014-06-20 01:21:20

标签: apache httpd.conf

我正在尝试配置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

  • 领先/来自哪里?
  • 它只是一个红鲱鱼&#34;?
  • 或者这是否指向问题的根本原因(即我需要在httpd.conf中修改其他内容)?

最重要的是,由于我知道我的~me/public_html具有全球可读权限,如何解决此类问题?

有没有办法找出为什么&#34;访问/〜我被拒绝&#34;?

  • SELinux的?
  • 的httpd.conf?
  • 目录权限?
  • 以上所有?

更新1 ,回答以下@UlrichSchwarz评论中的2个问题:

  1. 主目录似乎确实有&#39; x&#39;权限:

    [root @ myhost~] #ls -lad / home / me

    drwxr-XR-X。 33 me me 4096 Feb 8 16:30 / home / me

  2. 关于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 /


  3. 更新2 ,在我确认这确实是SELinux问题之后(感谢@Scolytus的提示):

    1. 我跑了命令:

      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 /

    2. 然后我跑了#34;允许HTTPD读取主目录&#34; from the command line

      setsebool -P httpd_enable_homedirs = 1

      仍然没有。

    3. / 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/
      

2 个答案:

答案 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

附录Some examples with semanage

答案 1 :(得分:2)

我无法立即查看,但我记得发表评论UserDir disabled与启用不同!

更具体地说,我认为您需要在https.conf文件中包含一行

Userdir enabled me