Linux AS4 Apache troube

    技术2022-05-11  17

    Apache/2.0.52 (Red Hat) Server at 192.168.0.3 Port 80 提问者: 1000ask 秀才 三级 (767) 问题答复  (1) 答案1:对于刚使用Redhat Enterprise Linux4 或Fedora Core 2以上/CentOS 4的用户,一定会为Apache经常无法正常运转,报以"Permission denied"等错误而大为不解,甚至大为恼火。其实这是因为这些系统里激活了SELinux,而用户的apache配置与SELinux的配置策略有抵触产生的,只有通过适当调整,使apache的配置和访问符合策略才能正常使用。什么是SELinux?SELinux全称是Security Enhanced Linux,由美国国家安全部(National Security Agency)领导开发的GPL项目,它拥有一个灵活而强制性的访问控制结构,旨在提高Linux系统的安全性,提供强健的安全保证,可防御未知攻击,据称相当于B1级的军事安全性能。比MS NT所谓的C2等高得多。应用SELinux后,可以减轻恶意攻击或恶意软件带来的灾难,并提供对机密性和完整性有很高要求的信息很高的安全保障。SELinux on Redhat Linux在RHEL4.0或FC3以上的版本中,可以在安装时就选择是否激活SELinux,系统自动会安装相应的内核、工具、程序等。由于SELinux的MAC机制将极大的影响了现有引用,因此RHEL4/FC3中已预配置了大量兼容现有应用的安全策略。SELinux的配置相关文件都在/etc/selinux下,其中/etc/selinux/targeted目录里就包含了策略的详细配置和context定义,以下是主要文件及功用:/etc/selinux/targeted/contexts/*_context 默认的context设置/etc/selinux/targeted/contexts/files/* 精确的context类型划分/etc/selinux/targeted/policy/* 策略文件使用Redhat 默认的策略对正常应用带来的影响比较小,兼容性相对比较好。对于需要提供虚拟主机或大量应用的用户而言,则会带来不小的麻烦,需要仔细阅读SELinux的手册进行调整。现在下面来分析一下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/webchcon -t user_home_dir_t /home/abc3.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)