我有一个 Apache 网络服务器。我有一些 PHP 脚本。脚本以用户 www-data 的身份运行 - 它是作为运行 Apache 的用户。我想配置 Apache,以便 PHP 脚本以脚本所有者的权限运行。过去我可以使用suphp,但现在它是孤立的并且死在上游,所以Debian决定删除它(为什么我在 debian 测试中没有 suphp)。在这种情况下,我应该用什么来代替?是否有任何未死的 Apache 模块做同样的事情?
答案1
我没有使用过 PHP,但我使用 FastCGI 用其他语言完成了类似的事情,这就是我推荐的方法,特别是因为 php 5.3.3 和更新版本有内置的实现 PHP-FPM。您可以在 PHP 官方网站上找到有关如何使用它的文档:FastCGI 进程管理器 (FPM)。
它有很多功能,但最相关的是工作人员可以拥有不同的用户和组 ID(以及不同的php.ini
s)。
答案2
你不能。 Apache 有意在低权限帐户(通常称为apache
或httpd
)下运行。可以按照您的建议配置 Apache 的唯一方法是如果它运行为root
,这将使 Apache 面临巨大的安全风险。
您必须使用操作系统的苏德位位功能以获得您想要的效果。
你没有说你正在使用哪个操作系统;这很重要。
一些操作系统知道如何运行脚本(意味着任何带有舍邦线在这种情况下的顶部)安全地设置了 suid 位。这包括现代 BSD 和一些 SVR4 变体。
在这种情况下,解决方案很简单。首先将需要以其他用户身份运行的命令移至单独的脚本中,顶部有 PHP shebang 行:
#!/usr/bin/php
your commands here
然后将其设置为以其他用户身份运行:
$ sudo chown otheruser myscript.php
$ sudo chmod u+s otheruser myscript.php
如果您运行的是 Linux,那么操作系统很有可能会阻止 suid 脚本。您可能会找到诸如 之类的解决方法的参考perl -wT
,但某些操作系统或这些操作系统上的配置模式也会阻止这种情况。这里不是列出所有变通办法以及阻止这些变通办法的所有方式的地方。可以这么说,如果您的操作系统没有专门提供允许安全执行 suid 脚本的核心功能,您就无法做到这一点。
标准解决方案是用 C 创建一个 suid 包装器,如下所示:
int main(int argc, char* argv[])
{
execv("/full/path/to/my-script.php", argv);
}
然后执行这些命令按这个顺序构建包装器并设置其权限以允许其以其他用户身份运行:
$ make my-script-wrapper
$ sudo chown otheruser my-script-wrapper
$ sudo chmod u+s my-script-wrapper
(顺序很重要,因为每次更改带有 suid 位的文件时,大多数操作系统都会清除 suid 位。这三个命令没有替代顺序来执行您想要的操作。)
现在,当您运行时my-script-wrapper
,它将作为 运行otheruser
,因此当它启动时my-script.php
,该脚本将以 的权限运行otheruser
。
包装器故意非常简单,以避免引入安全缺陷。我可以想出几种方法让它变得更复杂和有用,但要注意这会给你带来一大堆问题。
您可能只想使用sudo
它。可以将其配置为以 以外的其他用户身份运行脚本root
,并跳过对密码的需要。