背景

背景

背景

我想模仿的服务器配置

我可以访问安装了 cPanel/WHM 的 CentOS 7 服务器,并使用以下配置运行 EasyApache4:

# /usr/local/cpanel/bin/rebuild_phpconf --current
DEFAULT PHP: ea-php56
ea-php55 SAPI: cgi
ea-php56 SAPI: cgi
ea-php70 SAPI: cgi
# rpm -qa|grep ruid2
# rpm -qa|grep suexec
ea-apache24-mod_suexec-2.4.33-5.5.1.cpanel.x86_64

我相信suEXEC已启用,因为/var/log/apache2/error_log包含类似AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec).

我相信mod_ruid2、 、suPHP、 、PHP-FPMFastCGIDSO(又名mod_php) 均未启用。

该服务器有一个用户,我的用户,其~/public_html/public/目录用作网站的文档根目录mywebsite.com。 (显然,这些不是真实姓名。)

如果我在该目录中放置一个包含whoami.php以下内容的 PHP 文件(请注意缺少舍邦):

<html>
<body>
<p>sapi_name:      <?php print php_sapi_name();    ?></p>
<p>exec whoami:    <?php print exec('whoami');     ?></p>
<p>system whoami:  <?php system('whoami');         ?></p>
<p>system id -a:   <?php system("id -a");          ?></p>
<p>getcurrentuser: <?php print get_current_user(); ?></p>
</body>
</html>

并在浏览器中访问它http://mywebsite.com/whoami.php(请注意,这是不是使用http://mywebsite.com/~myuser/whoami.phpUserDir URL 格式),它呈现为:

sapi_name: cgi-fcgi
exec whoami: myuser
系统 whoami: myuser
系统 id -a: uid=1002(myuser) gid=1003(myuser) groups=1003(myuser)
getcurrentuser: myuser

我想模仿的行为

即使缺少可执行权限也是如此,如下:

$ ls -l /home/myuser/public_html/public/whoami.php | cut -d' ' -f1,3,4,9
-r-------- myuser myuser /home/myuser/public_html/public/whoami.php

通常,CGI模式下的Apache 2.4不能运行这样的非可执行文件,如果我理解的话文档正确:

当然,该文件必须存在,并可执行,并以特定方式返回输出,否则 Apache 将返回错误消息。

然而,cPanel/WHM 似乎可以某物来改变这个事实。根据WHM 文档:

计算机图形图像处理

CGI 处理程序通过mod_cgimod_cgidApache 模块执行 PHP 应用程序。如果安装 suEXEC 模块,系统将以拥有服务请求的 VirtualHost 的用户身份执行 PHP 应用程序。如果卸载suEXEC模块,系统将以nobody系统用户身份执行PHP应用程序。系统默认提供mod_cgi和。mod_ruid2

您可以在 PHP.user.ini 文件中自定义 CGI 处理程序的设置。 […]

重要的:

如果你使能够每用户模块,例如 suEXEC 或 Ruid2,您可以使用0400.如果禁用每用户模块,例如 suEXEC 或 Ruid2,则可以使用0444.

即,即使没有启用 suEXEC 或 Ruid2,EasyApache4 也能够以某种方式使 Apache 将不可执行的 PHP 文件作为 CGI 脚本进行处理,而不仅仅是将它们作为静态文件提供服务。

问题

我有一台不同的 CentOS 7 机器,无法从互联网路由,并且仅用于开发。确实如此不是安装了 cPanel/WHM。安全是不是这台机器的优先级,并且它禁用了 SELinux。模仿 cPanel/WHM 的行为本机的优先级:最高优先级。

  1. 在这台机器上,我如何说服 Apache 2.4 通过 PHP 5.6 作为 CGI 脚本运行权限为04000444且缺少 shebang 的 PHP 文件,而不是仅仅将它们作为静态文件提供?即我将如何实现某物上面提到过?我很高兴用非标准编译 ApachesuEXEC 配置选项, 如果需要的话。
  2. 特别是,我如何在为他们服务时做到这一点没有需要使用 UserDir URL(即没有/~myuserURL 的一部分,例如http://mywebsite.com/~myuser/mypage.php)?
  3. 这段时间我该怎么办确保这些文件由我的用户,通过 suEXEC,而不是通过阿帕奇或者httpd或者没有人用户?

如果您能一次回答所有三个问题,那就更好了,但即使您只能回答第一个问题,那也会非常有帮助!谢谢 :)

答案1

这是实现此目的的一种方法,对于仅用于该目的的私有开发环境来说是可以的,但应该绝不在可路由互联网的机器上使用。

执行这些相当激进的命令:

# chown myuser:myser /usr/bin
# chown myuser:myser /usr/bin/php-cgi

然后:

# chmod 711 /home/myuser
# chmod 755 /home/myuser/public_html
#

另外,(重新)编译 Apache 以具有 suEXEC AP_DOC_ROOT="/",然后(重新)安装它。

/etc/httpd/conf/httpd.conf沿着这些线修改:

ServerRoot "/etc/httpd"
Listen 80
Include conf.modules.d/*.conf
ServerAdmin root@localhost
#ServerName example.local
ServerName localhost    
User apache
Group apache
<Directory />
    AllowOverride none
    Require all granted
</Directory>
<VirtualHost *:80>
  DocumentRoot "/home/myuser/public_html/public"
  SuexecUserGroup myuser myuser
  <IfModule alias_module>
    ScriptAlias /cgi-bin/ /home/myuser/public_html/public/cgi-bin/
  </IfModule>
  <Directory "/home/myuser/public_html/public">
    Options Indexes FollowSymLinks ExecCGI
    AllowOverride None
    Require all granted
    AddHandler cgi-script .cgi .pl
  </Directory>
</VirtualHost>
<IfModule dir_module>
  DirectoryIndex index.php index.cgi index.html index.htm
</IfModule>

/etc/httpd/conf.d/php.conf大致修改如下:

ScriptAlias /local-bin /usr/bin
AddHandler application/x-httpd-php5 php
Action application/x-httpd-php5 /local-bin/php-cgi

最后,(重新)启动 Apache。

这是我在提出上述问题之前发现的最佳方法。然而,几乎肯定有更好的选择,我想了解它们,因此我发布了这个问题。 (例如,php-cgi在用户的主目录中安装二进制文件原则上应该是一种可行的措施,并且比修改系统二进制文件及其目录的所有权要温和一些。)

因此,如果这个答案对您有帮助,请随意投票,如果它对您没有帮助,请随意发表建设性评论,但我会暂时将其标记为“正确”,希望出现更好的答案。

相关内容