背景
我想模仿的服务器配置
我可以访问安装了 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-FPM
、FastCGI
、DSO
(又名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.php
UserDir 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_cgi
或mod_cgid
Apache 模块执行 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 的行为是本机的优先级:最高优先级。
- 在这台机器上,我如何说服 Apache 2.4 通过 PHP 5.6 作为 CGI 脚本运行权限为
0400
或0444
且缺少 shebang 的 PHP 文件,而不是仅仅将它们作为静态文件提供?即我将如何实现某物上面提到过?我很高兴用非标准编译 ApachesuEXEC 配置选项, 如果需要的话。 - 特别是,我如何在为他们服务时做到这一点没有需要使用 UserDir URL(即没有
/~myuser
URL 的一部分,例如http://mywebsite.com/~myuser/mypage.php
)? - 这段时间我该怎么办还确保这些文件由我的用户,通过 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
在用户的主目录中安装二进制文件原则上应该是一种可行的措施,并且比修改系统二进制文件及其目录的所有权要温和一些。)
因此,如果这个答案对您有帮助,请随意投票,如果它对您没有帮助,请随意发表建设性评论,但我会暂时将其标记为“正确”,希望出现更好的答案。