今天调试hanban北京的服务器,偷了点懒让远程的工程师装了一个完整的AS4,把需要的apache、php、mysql默认情况下都安装了,当我把web的php教本远程传上去,httpd.conf设定完成之后,访问却发生403 Forbidden禁止访问错误,百思不得其解。
系统默认的Document Root是/var/www/html,把网站的php教本copy到这个目录后发现403禁止访问。改变Document Root目录和新建alias目录,或者虚拟主机错误依旧。
感觉还是文件权限问题,但是把文件权限设定到777仍然错误依旧。
google了一下,发现问题。AS4默认安装的时候可能激活了SELinux选项,SELinux比普通的Linux内核提供了更高的安全性,理论上说,在系统因为未知漏洞溢出的时候,普通用户是不可能得到超级用户的权限了。但是,就是因为SELinux安全性的提高,导致我们在使用时,会发生一些我们以前从没遇到的问题。
检查 avc message,查看 /var/log/messages文件,发现有类似以下内容的这样一段:
Dec 24 17:54:59 hostname kernel: audit(1098222899.827:0): avc: \
denied { getattr } for pid=19029 exe=/usr/sbin/httpd \
path=/var/www/html/about.html dev=dm-0 ino=373900 \
scontext=root:system_r:httpd_t tcontext=user_u:object_r:user_home_t \
tclass=file
问题找到了,果然是SELinux的新特性搞的鬼。我把目录或文件设成了user_home_t类型,因此apache的进程没有权限,无法访问。针对Apache的进程所使用的SELinux target policy规定了apache的进程只能访问httpd_sys_content_t类型的目录或文件。
解决办法:很简单,把目录或文件的策略类型改成 httpd_sys_content_t 就可以了。
使用root用户
# chcon -t httpd_sys_content_t 目录名或文件名
可以用 ls -laZ 命令查看文件目录的策略类型。
做了修改之后就可以正常访问了,晕呼呼,这个事情耽误了hanban网站开通2个小时的时间,本来下午2点钟要给hanban搞好的,拖到了4点钟,把北京那边害得不浅。