Warning: Unexpected character in input: ' in D:\php186\www.php186.com\index.php on line 38
 SELinux导致Apache 403错误解决方法-WEB开发网
您的位置:网站主页> Apache > SELinux导致Apache 403错误解决方法

SELinux导致Apache 403错误解决方法

时间:2015-03-29 11:28:30   编辑:王连龙   文章来源:php教学网 已阅读:4015 次

   将DocumentRoot设在/var/www/html下可以访问 

      但是将DocumentRoot设在其他目录(如:/webroot)下就出现Forbidden了。在./etc/httpd/conf/httpd.conf中的相关部分是这样的:

 

  Alias /query "/home/query"

  Options Indexes MultiViews

  AllowOverride None

  Order allow,deny

  Allow from all

 

  但是在浏览器中输入:http://localhost/query/ 时,出现Forbidden:

 

  Forbidden

  You don't have permission to access /query on this server.

  Additionally, a 403 Forbidden error was encountered while trying to use an ErrorDocument to handle the request.

  Apache/2.0.52 (Red Hat) Server at localhost Port 80

  对于刚使用Redhat Enterprise Linux4 或Fedora Core 2以上/CentOS 4的用户,一定会为Apache经常无法正常运转,报以"Permission denied"等错误而大为不解,甚至大为恼火。

  其实这是因为这些系统里激活了SELinux,而用户的apache配置与SELinux的配置策略有抵触产生的,只有通过适当调整,使apache的配置和访问符合策略才能正常使用。

 

  现在下面来分析一下SELinux中有关httpd(apache)的context定义(略有删节)

 

  /home/[^/]+/((www)|(web)|(public_html))(/.+)? system_u:object_r:httpd_user_content_t

  /var/www(/.*)? system_u:object_r:httpd_sys_content_t

  /var/www/cgi-bin(/.*)? system_u:object_r:httpd_sys_script_exec_t

  /usr/lib/cgi-bin(/.*)? system_u:object_r:httpd_sys_script_exec_t

  /var/www/perl(/.*)? system_u:object_r:httpd_sys_script_exec_t

  /var/www/icons(/.*)? system_u:object_r:httpd_sys_content_t

  /var/cache/httpd(/.*)? system_u:object_r:httpd_cache_t

  /etc/vhosts -- system_u:object_r:httpd_config_t

  /usr/sbin/httpd -- system_u:object_r:httpd_exec_t

  /usr/sbin/apache(2)? -- system_u:object_r:httpd_exec_t

  /usr/sbin/suexec -- system_u:object_r:httpd_suexec_exec_t

  /var/log/httpd(/.*)? system_u:object_r:httpd_log_t

  /var/log/apache(2)?(/.*)? system_u:object_r:httpd_log_t

  /var/log/cgiwrap.log.* -- system_u:object_r:httpd_log_t

  /var/cache/ssl.*.sem -- system_u:object_r:httpd_cache_t

  /var/cache/mod_ssl(/.*)? system_u:object_r:httpd_cache_t

  /var/run/apache(2)?.pid.* -- system_u:object_r:httpd_var_run_t

  /var/lib/httpd(/.*)? system_u:object_r:httpd_var_lib_t

  /var/lib/php/session(/.*)? system_u:object_r:httpd_var_run_t

  /etc/apache-ssl(2)?(/.*)? system_u:object_r:httpd_config_t

  /usr/lib/apache-ssl(/.*)? -- system_u:object_r:httpd_exec_t

  /usr/sbin/apache-ssl(2)? -- system_u:object_r:httpd_exec_t

  /var/log/apache-ssl(2)?(/.*)? system_u:object_r:httpd_log_t

  /var/run/apache-ssl(2)?.pid.* -- system_u:object_r:httpd_var_run_t

  /var/run/gcache_port -s system_u:object_r:httpd_var_run_t

  /var/lib/squirrelmail/prefs(/.*)? system_u:object_r:httpd_squirrelmail_t

  /usr/bin/htsslpass -- system_u:object_r:httpd_helper_exec_t

  /usr/share/htdig(/.*)? system_u:object_r:httpd_sys_content_t

  /var/lib/htdig(/.*)? system_u:object_r:httpd_sys_content_t

  针对上述的内容,可以对如下的几个常见问题进行简单处理:

 

  1.phpmyadmin在非默认/var/www/html目录下无法运转

 

  通常类似的情况都是在配置了虚拟主机时,访问/phpmyadmin等提示403访问拒绝,日志里也提示Permission denied,这是因为phpmyadmin防止的目录及文件本身属性不符合context要求。

  假设phpmyadmin放在/web目录下,那么执行:

  chcon -R -t httpd_user_content_t /web

  则会令/web及其下所有子目录/文件,包括phpmyadmin文件都获得了httpd_user_content_t的属性,如果其传统的Unix属性对httpd来说是可读的话,再重新访问一下就应该可以了。

 

  2./home目录下的虚拟主机无法运转

 

  与 问题1也是类似的,不过根据上文中context的定义,/home目录下必须是用户的$HOME/www或public_html或web目录才是 httpd_user_content_t类型,因此建议将要作为web页面的内容放置在用户的$HOME/www或web或public_html里, 并确保其属性是httpd_user_content_t,使用如下命令查看:

  ls -Z /home/abc/

  drwxr-xr-x abc abc user_u:object_r:user_home_dir_t tmp

  drwxrwxr-x abc abc user_u:object_r:httpd_user_content www

  如不是,则可通过chcon来逐级目录及文件更改,直至最后能访问:

  chcon -R -t httpd_user_content_t /home/abc/web

  chcon -t user_home_dir_t /home/abc

 

  3.CGI程序无法运行

 

  如 果cgi程序放在/var/www/cgi-bin/里也无法执行,遇到403或500错误的话,可以检查cgi 程序的属性,按SELinux contexts文件里定义的,/var/www/cgi-bin/里必须是httpd_sys_script_exec_t 属性。通过ls -Z查看,如果不是则通过如下命令更改:

  chcon -t httpd_sys_script_exec_t /var/www/cgi-bin/*.cgi

  如果是虚拟主机里的cgi,则参考问题2使之能正常使用普通的功能后,再通过chcon设置cgi文件的context为httpd_sys_script_exec_t即可。

 

  4.Setuid/gid 程序无法运行

 

  例如早期的SqWebMail及qmailadmin等,需要setuid/gid的支持,但在SELinux下这将受到严格限制。第一种方法是比较彻底的办法,能保留系统的安全性,通过:

  audit2allow -l -i /var/log/messages

  将SELinux拒绝的信息转换为相应的policy allow指令,将这些指令添加到SELinux policy 的src里相应的配置文件,重新生成policy并加载。但这样做相对比较麻烦。

  另一个方法最简单,但将使apache得不到保护。首先确定SELinux 类型是targeted的:

  cat /etc/selinux/config|grep SELINUXTYPE

 

  然后,使apache脱离SELinux保护:

 

  setsebool -P httpd_disable_trans 1

  然后重启动apache:

  /etc/init.d/httpd restart

  这样所有apache强制的检查都失效,需要setuid/gid的程序可以正常使用。但这样带来了增加漏洞的危险,对于迫切需要运行而又很急的情况,本方法是一个最大限度减少系统安全缺失的最后办法。对于取消SELinux 未必是一个好方法。

本文地址:http://www.php186.com/content/article/apache/24611.html(转载请保留)

相关关键词搜索:SELinux导致Apache 403错误解决方法

查看评论更多>>
4楼 liujian 2015-04-21 17:34发表
好网站,值得收藏,以后会多多来看,很多文章内容都挺好的!
3楼 niulang 2015-04-21 17:33发表
不论国外,单是我们中国,各种各样的网站数不胜数。打开页面第一个看到的不是你的网站有什么,而是你的整体布局,一个清爽、干净、整洁的页面是一个赢得人心的法宝,大站有大站的气势,小站有小站的风格,好的视觉效果可以告诉人们这个站点有实力,这个站点值得信赖,给人很强的亲和力,有一种发现新宝地,希望赶紧收藏的冲动。
2楼 leenons 2015-04-21 17:28发表
现在看php学习网都会在百度上面找找看评分怎么样,值不值得一看;同时也会将看过的php教程网站记录,有时候留下一些自己的感想的评论,有很多逗比的评论,还有很多专业的评论,建议大家可以在web开发网上面寻找相关文章、api,大部分的内容都还合理。
1楼 xiaobudian 2015-04-21 17:25发表
网站文章挺不错的,值得学习,希望站长多多努力!
发表评论
      
* 以上用户言论只代表其个人观点,不代表www.php186.com网站的观点或立场
推荐文档更多

WEB开发网 | PHP教程 | Mysql教程 | Apache教程 | 最新文章 | PHP面试题| 网站地图 | Google地图 | Baidu地图 | 在线WEB论坛| 中纪委反腐最新消息

WEB技术QQ交流群:151888886 站长Q号:547218888
版权所有者:WEB开发网 地址:云南省文山州砚山县盘龙乡 滇ICP备12002707号-1
特别声明:本站内容仅供参考,不作为设计及确切依据!想了解更多,可立即进入Bbs提问