PHP + Apache的SUID问题

时间:2011-06-21 22:50:43

标签: php apache exec file-permissions

好的,不知道我在这里缺少什么。我正在尝试使用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脚本作为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再次无法正常工作。现在我尝试相同的东西,但是有一个名为move.sh的新shell脚本是从rename.php执行的。

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

再次它不起作用。如果我将文件move.php或move.sh作为MATT从shell执行,它可以正常工作。不知道为什么这不起作用,或者我如何使它与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

1 个答案:

答案 0 :(得分:0)

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

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

赋予组对此目录的读写访问权限及其内部的所有内容(-R =递归)

chmod -R g+rw .

正如你所看到的,'nux权限方案非常灵活,需要一点点头脑才能习惯。 Many more juicy examples here