Apache 403 Permission denied 的解决 【综合网上资料及个人心得】_华陌飞尘_新浪博客...

对于使用Redhat Enterprise Linux 或Fedora Core /CentOS 的用户,一定会为Apache经常无法正常运转,报以"Permission denied"等错误而大为不解,甚至大为恼火。
一般来说,问题是:

1、httpd.conf 设置错误,比如是不是设定的访问限制了、设定不允许列表目录而目录没有设定首页的时候去访问首页了;

 

2、权限问题,文件和目录的权限是不是对了,一般来说设定为apache的专用访问用户,比如apache,是很好的办法;而设定文件和目录的权限到755也是可以解决问题的手段;

 

如果以上都做了,就是访问不了,或者老是莫名其妙的403,那或许就是因为系统里激活了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 未必是一个好方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值