redhat Apache fast-cgi selinux 权限

redhat Apache fast-cgi selinux 权限

我的 apache 安装以 fastcgi 形式运行 php,并且虚拟
主机指向 /home//public_html.
和 fastcgi 是主页/
/cgi-bin/php.fcgi

使用 selinux 的 public_html 设置是:

/usr/sbin/setsebool -P httpd_enable_homedirs 1  
chcon -R -t httpd_sys_content_t /home/someuser/public_html

所有者和组是用户,例如用户“someuser”:

ls -all /home/someuser/cgi-bin/

drwxr-xr-x 2 someuser someuser 4096 Sep  7 13:14 .  
drwx--x--x 6 someuser someuser 4096 Sep  6 18:17 ..  
-rwxr-xr-x 1 someuser someuser  308 Sep  7 13:14 php.fcgi  

ls -all /home/someuser/public_html/ | greep info.php  
-rw-r--r--  1 someuser someuser     24 Sep  3 16:24 info.php

当我访问该网站时,我收到“禁止......”并且日志显示:

[2012 年 9 月 7 日星期五 12:02:51] [错误] [客户端 xxxx] (13)权限被拒绝:访问 /cgi-bin/php.fcgi/info.php 被拒绝

我的 selinux 配置是:

SELINUX=enforcing  
SELINUXTYPE=targeted  
SETLOCALDEFS=0

所以我关闭 Selinux(SELINUX=disabled),重新启动系统,一切正常!!!!

问题出在 Selinux 上,我不想禁用 Selinux。我尝试了以下方法,但没有成功:

setsebool -P httpd_enable_cgi 1  
chcon -t httpd_sys_script_exec_t /home/someuser/cgi-bin/php.fcgi  
chcon -R -t httpd_sys_content_t /home/someuser/cgi-bin

或者最好将 Selinux
SELINUX=enforting 更改为 SELINUX=permissive

并禁用 httpd 的 selinux?
(我想我最好找到正确的配置)

感谢您对此事的任何建议


我的环境:

Red Hat Enterprise Linux 服务器版本 5.8 (Tikanga)

服务器版本:Apache/2.2.3

PHP 5.1.6 (cli)(构建于:2012 年 6 月 22 日 06:20:25)版权所有 (c) 1997-2006 The PHP Group
Zend Engine v2.1.0,版权所有 (c) 1998-2006 Zend Technologies

一些日志:

ps -ZC httpd

LABEL                             PID TTY          TIME CMD 
system_u:system_r:httpd_t        2822 ?        00:00:00 httpd 
system_u:system_r:httpd_t        2823 ?        00:00:00 httpd  
system_u:system_r:httpd_t        2824 ?        00:00:00 httpd  
system_u:system_r:httpd_t        2825 ?        00:00:00 httpd  
system_u:system_r:httpd_t        2826 ?        00:00:00 httpd  
system_u:system_r:httpd_t        2836 ?        00:00:00 httpd  
system_u:system_r:httpd_t        2837 ?        00:00:00 httpd  
system_u:system_r:httpd_t        2838 ?        00:00:00 httpd  
system_u:system_r:httpd_t        2839 ?        00:00:00 httpd  
system_u:system_r:httpd_t        2840 ?        00:00:00 httpd

 getsebool -a | grep httpd  

allow_httpd_anon_write --> off  
allow_httpd_bugzilla_script_anon_write --> off  
allow_httpd_cvs_script_anon_write --> off  
allow_httpd_mod_auth_pam --> off  
allow_httpd_nagios_script_anon_write --> off  
allow_httpd_prewikka_script_anon_write --> off  
allow_httpd_squid_script_anon_write --> off  
allow_httpd_sys_script_anon_write --> off  
httpd_builtin_scripting --> on  
httpd_can_network_connect --> off  
httpd_can_network_connect_db --> off  
httpd_can_network_relay --> off  
httpd_can_sendmail --> on  
httpd_disable_trans --> off  
httpd_enable_cgi --> on  
httpd_enable_ftp_server --> off  
httpd_enable_homedirs --> on  
httpd_execmem --> off  
httpd_read_user_content --> off  
httpd_rotatelogs_disable_trans --> off  
httpd_setrlimit --> off  
httpd_ssi_exec --> off  
httpd_suexec_disable_trans --> off  
httpd_tty_comm --> on  
httpd_unified --> on  
httpd_use_cifs --> off  
httpd_use_nfs --> off

有审计日志

/var/log/audit/audit.log

类型 = SYSCALL msg = audit(1345834208.027:963):arch = c000003e syscall = 4 成功 = 否退出 = -13 a0 = 2aaf1543e390 a1 = 7fff393c9510 a2 = 7fff393c9510 a3 = 2aaf1543bd58 items = 0 ppid = 27519 pid = 27523 auid = 517 uid = 48 gid = 48 euid = 48 suid = 48 fsuid = 48 egid = 48 sgid = 48 fsgid = 48 tty =(无)ses = 4 comm =“httpd”exe =“/usr/sbin/httpd”subj = user_u:system_r:httpd_t:s0 key =(null)
类型 = AVC msg=audit(1345834208.027:964): avc: 拒绝 pid=27523 的 { getattr } comm="httpd" path="/home/loemsera/public_html/index.php" dev=sda2 ino=4593912 scontext=user_u:system_r:httpd_t:s0 tcontext=user_u:object_r:user_home_t:s0 tclass=file
type=SYSCALL msg=audit(1345834208.027:964): arch=c000003e syscall=6 成功=否 退出=-13 a0=2aaf1543e470 a1=7fff393c9510 a2=7fff393c9510 a3=0 items=0 ppid=27519 pid=27523 auid=517 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4 comm="httpd" exe="/usr/sbin/httpd" subj=user_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1345834208.028:965): avc: 拒绝 pid=27523 的 { getattr } comm="httpd" path="/home/loemsera/public_html/index.php" dev=sda2 ino=4593912 scontext=user_u:system_r:httpd_t:s0 tcontext=user_u:object_r:user_home_t:s0 tclass=file

答案1

以您自己的方式运行 FastCGI 会留下一个很大的安全漏洞:PHP 解释器以用户“httpd”的身份运行(至少我在这里看不到有关 suexec 的任何信息)。

我们在 CentOS 6 上有一个使用 SELinux 和 PHP 作为 FastCGI 的工作设置,但它真的让一切正常运转起来很棘手。

以下是一些入门建议:

  • 您不需要重新启动来禁用/启用 selinux - 只需使用命令“setenforce 0”或“setenforce 1”:)
  • 总是尝试让一切与 SELinux 一起工作已禁用,然后启用它并查看 audit.log

开始了:

  • 启用 suexec
  • 将 php.fcgi 的 SELinux 类型更改为httpd_fastcgi_script_exec_t
  • 您的 FastCGI 启动器 (php.fcgi) 不应由拥有它的用户写入(否则他可以调整许多设置和限制)。给它添加“不可变”标志:chattr +i php.fcgi
  • suexec 与 FastCGI 之间存在一些问题,因此我们必须使其宽容:

    yum install policycoreutils-python
    semanage permissive -a httpd_suexec_t
    

祝你好运!

相关内容