SELinux导致Apache 403错误解决方法

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

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

Alias /query "/home/query"

<Directory "/home/query">

Options Indexes MultiViews

AllowOverride None

Order allow,deny

Allow from all

</Directory>

但是在浏览器中输入: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 未必是一个好方法。

时间: 2024-10-17 10:45:54

SELinux导致Apache 403错误解决方法的相关文章

Apache 403 错误解决方法-让别人可以访问你的服务器

参考网址:http://www.cnblogs.com/mrlaker/archive/2013/04/29/3050888.html http://www.jb51.net/article/61193.htm 问题描述: 解决方案: 也可以路径为(\xampp\apache\conf\extra\httpd-xampp.conf) 把如下标签中的Require local替换成Require all granted,然后大功告成! 注意:版本不同改法也不同. 以前是将 deny from al

win8安装wampserver报403错误解决方法

看着别人开始体验win8了,前几天我也安装了win8系统,总体来说还不错,但是今天安装完Wampserver后,浏览器输入localhost,竟然报了403错误,我以为我安装出错了,后来研究了半天,发现输入127.0.0.1可以访问.习惯localhost访问的我顿感蛋疼不已.无奈只能打开度娘,各种搜索相关资料,终于找到了解决方案. php错误: Forbidden You don't have permission to access / on this server. 解决方法: 打开htt

django post请求 403错误解决方法

--摘 第一次用Django做项目,遇到了很多问题. 今天遇到的问题是Django在处理post请求时多次出现403错误. 我先描述一下问题出现的环境:我用Django写了一个web服务端,姑且称它为API吧.我在实际测试中发现,通过get方式可以从API中获得数据,但是post方式却无法获取数据,客户端显示服务器端出现403错误. 我找不出什么原因,只好新建了一个表单来测试post请求,我发现通过表单发送post请求时,页面显示403错误:Forbidden CSRF verification

微信小程序访问豆瓣api报403错误解决方法

通过豆瓣API可以获取很多电影.书籍的数据信息,今天在调用豆瓣正在上映电影接口的时候报403错误,原因是豆瓣设置了小程序的访问权限.如下: 解决方法是使用代理,将豆瓣API地址换成 https://douban.uieee.com,但是,悲催的是又报了400(bad request)错误,如下: 接下来,设置请求头,header默认为: "ontent-type": "application/json"; 但是仍然会报400错误,将请求头中json设置改为xml,请

OSX apache vhost 配置多站点时403错误解决方法

到 /etc/apache2/httpd.conf 这个文件修改下面的路径就好了 DocumentRoot "/Users/wujinhang/workspace/"<Directory "/Users/wujinhang/workspace/">  

Apache启动错误解决方法

xampp启动时显示的错误为: 10:40:18 [Apache] Error: Apache shutdown unexpectedly.10:40:18 [Apache] This may be due to a blocked port, missing dependencies, 10:40:18 [Apache] improper privileges, a crash, or a shutdown by another method.10:40:18 [Apache] Press t

ubuntu 使用sudo apt-get update 出现 被配置多次导致无法升级错误解决方法

这个周六周末在考虑升级自己GPU开发机,在琢磨使用docker来按转tensorflow环境,在升级软件的时候爆出了如下错误 在 /etc/apt/sources.list.d/sogoupinyin.list:1 和 /etc/apt/sources.list.d/ubuntukylin.list:1 中被配置了多次 错误发生的原因: 1. 包冲突了,导致了无法配置,我们删除掉sogoupinyin.list文件即可.这样问题就得以解决了.

org.hibernate.id.IdentifierGenerationException错误解决方法

org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): ID主键生成策略为assigned 由应用程序负责生成主键标识符 <id name="id" type="java.lang.String"> <column name="ID" length=&qu

apache AH01630: client denied by server configuration错误解决方法

今天本来是想要在自己本地搭建一个wamp环境用来做一些代码的测试和框架的学习. 鉴于目前工作的时候用到了php5.5,所以就用了wamp-server V2.5版本,安装完成之后配置虚拟主机一直出现403,各种重启N次卸载重装,最后才好到问题的所在,故记录下来,希望其他同学有这样的问题的时候可以快速的解决~~ apache 虚拟主机配置: apache AH01630: client denied by server configuration错误解决方法 出现这个错误的原因是,apache2.