Chinaunix首页 | 论坛 | 博客
  • 博客访问: 830458
  • 博文数量: 137
  • 博客积分: 3477
  • 博客等级: 中校
  • 技术积分: 1409
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-30 21:53
文章分类

全部博文(137)

文章存档

2024年(8)

2023年(10)

2022年(4)

2021年(10)

2020年(9)

2018年(1)

2017年(1)

2014年(4)

2013年(3)

2012年(12)

2011年(24)

2010年(2)

2009年(8)

2008年(6)

2007年(34)

2006年(1)

分类: 系统运维

2012-02-02 01:17:11

风之舞原创,转载请注明来源。
===============================================

这两天搭建一个基于 apache + php + mysql + ssl 的网站,配置完成后发现在系统主目录下测试,系统访问没有任何问题,但是在虚拟目录下访问或者是访问虚拟主机,均出现如下错误信息:

you don't have permission to access / on this server


经过多方查找资料,翻阅 apache 文档,发现引起此类问题的因素有很多,现在总结如下:

一、虚拟目录或者是虚拟主机目录的用户权限问题。

这个用户应该属于 /etc/httpd/conf/httpd.conf 文件中定义的 User 和 Group 两项的内容,一般而言需要设置成 apache 用户和  apache 用户组。

如果你建立的虚拟目录和虚拟主机目录不属于这个用户和用户组,那么你可能需要更改。

# chown -R apache:apache <你的虚拟目录或者是你的虚拟主机的目录>

# chmod -R u+rx <你的虚拟目录或者是你的虚拟主机的目录>

二、因 Selinux 原因引起的权限问题

在 CentOS 6 版本中,对于 Selinux 的管理更加严格,这一方面带来了很高的系统安全性,另一方面也带来了很多的不便。在搭建 基于 apache 的服务器时,尤其感到了这个方面的严格限制。

以下是一段在网上搜索得到的信息,本人此次出现访问权限的问题,就是本文所说的原因造成的。

SELinux导致Apache 403错误解决方法
将DocumentRoot设在/var/www/html下可以访问但是将DocumentRoot设在其他目录(如:/webroot)下就出现 Forbidden了。在./etc/httpd/conf/httpd.conf中的相关部分是这样的:Alias /query "/home/query"Options Indexes MultiViewsAllowOverride None
Order allow,denyAllow from all
但是在浏览器中输入: 时,出现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 tmpdrwxrwxr-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 未必是一个好方法。




阅读(7119) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~