【问题标题】:SUID issues with PHP + ApachePHP + Apache 的 SUID 问题
【发布时间】:2011-09-19 22:45:56
【问题描述】:

好的,不确定我在这里缺少什么。我正在尝试使用 Web 可访问的 PHP 脚本重命名一些文件,但不授予对这些文件的世界写入权限。所以我尝试在 PHP 脚本上使用 SUID(也尝试了 shell 脚本)。

其中有三个用户,我们称他们为 APACHE、MATT 和 BRIAN。 还有一个叫WEBDEV的组,MATT和BRIAN都在里面。 有两个文件需要重命名。一个由 MATT 所有,另一个由 BRIAN 所有。两个文件组的所有者都是 WEBDEV。

-rw-rw-r-- 1 MATT  WEBDEV 126179 Jun 20 12:03 g5g55.jpg
-rw-rw-r-- 1 BRIAN WEBDEV  41588 Jul 14  2006 g2g22.jpg

所以我要在浏览器中访问的 PHP 脚本称为 rename.php,以 APACHE 运行。它不能重命名这些文件中的任何一个。自然。所以我尝试的第一件事就是将 PHP 脚本 SUID 为 MATT。

su MATT
chmod u+s /path/to/rename.php //also tried g+s

正如我所料,没有骰子。所以我写了第二个脚本,叫做 move.php。

#!/usr/bin/php
//code to move file

然后 SUID 那个脚本。

su MATT
chmod u+s /path/to/move.php //also tried g+s

然后从原来的web访问脚本rename.php,我调用:

shell_exec('/path/to/move.php');

我对这个抱有更高的期望,再也没有骰子了。所以我认为由于 PHP 解释器或 Apache 再次无法正常工作。现在我尝试同样的事情,但是从 rename.php 中执行了一个名为 move.sh 的新 shell 脚本。

#!/bin/bash
//code to move file

再一次,它不起作用。如果我从 shell 执行文件 move.php 或 move.sh 作为 MATT,它工作正常。不知道为什么这不起作用,或者我如何使它与 SUID 一起工作,而不是使用 sudo 或设置某种可以从适当特权用户的 cron 调用的 que。处理这个问题的最佳方法是什么?提前致谢。

更新

为以后偶然发现此问题的任何人弄清楚。 SUID 不适用于我的发行版(或大多数情况下)上的 shell 脚本。从 shell 脚本调用的任何后续命令都将以启动它的原始用户身份运行,而不是以设置 SUID 位的用户身份运行。这也适用于 PHP 和您进行的任何 exec 调用,您必须在 /usr/bin/php 上设置 SUID 位,这显然是一个非常糟糕的主意。或者,您可以使用系统调用将您的 shell 脚本包装在 C 二进制文件中。我将使用 SUDO。

相关信息: https://serverfault.com/questions/282835/apache-mod-php-ignores-suid

【问题讨论】:

  • 这与 PHP 解释器无关。 PHP 仅以用户身份访问文件,并且它是操作系统赋予 PHP 的权利。检查您的服务器配置,了解 SUID 和权限如何工作,然后再尝试三遍,只更改名称。检查脚本实际在哪个用户下执行,然后相应地反映文件权限:echo shell_exec('whoami');
  • @hakre 不同之处不仅在于重命名文件。它们都被不同地调用。尽管这一切都源于 apache + mod_php 这很可能是问题所在。 whoami 报告用户运行脚本,而不管设置了 SUID 位。我不想只允许 apache 写入这些文件,我希望这是受控的,并且只有在强制执行非常具体的参数时才可行。

标签: php apache exec file-permissions


【解决方案1】:

让所有 3 个用户都属于 WEBDEV 组,然后将所有文件更改为 APACHE、WEBDEV 组拥有:

// From your project topmost directory:
chown -R APACHE:WEBDEV . 

授予组对该目录以及其中所有内容的读写权限(-R = 递归)

chmod -R g+rw .

如您所见,'nux 权限方案非常灵活,需要花点时间才能习惯。 Many more juicy examples here.

【讨论】:

  • 我不想让 apache 对文件进行全部写访问。站点上的每个文件都是 webdev 组的一部分,我还不如以 root 身份运行 apache,或者 chmod 777 整个 webroot。我试图让 apache 能够写入这些文件,但只能从一个受控脚本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 2017-09-16
  • 2012-07-07
  • 2015-04-17
  • 2011-01-02
  • 2010-11-30
相关资源
最近更新 更多