PHP 让 www-data 像其他用户一样运行命令

Posted

技术标签:

【中文标题】PHP 让 www-data 像其他用户一样运行命令【英文标题】:PHP let www-data run a command as if it were a different user 【发布时间】:2013-11-20 09:45:23 【问题描述】:

所以我想在我的 php 脚本中执行以下命令:

exec("/path/to/command");

因为是 www-data 用户运行 php 脚本,我目前无法运行这个命令。 我读过一些关于 suexec 能够像其他用户一样运行命令的内容。我发现很难理解这是如何工作的。

我已经安装了 suexec 并编辑了 /etc/apache2/suexec/www-data 文件并添加了:

/home/user_to_run_command/script.php

我还编辑了 /etc/apache2/sites-enabled/000-default 并添加了:

SuexecUserGroup user_to_run_command user_to_run_command

我错过了什么吗?

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,最后找到了一个我认为既安全又简单的解决方案。这种方法的一个缺点是您必须在发布安全更新时注意它们。

我们要做的是制作我们自己的特殊外壳,我们将其 chown 和 SUID 提供给我们希望执行任务的用户。为了保持安全,这个用户应该只是一个没有广泛系统权限的普通用户,并将脚本放在其他不允许的地方。现在我们让 php 执行一个使用这个特殊 shell 的脚本,并且这个脚本中的所有命令都将作为选择的用户执行。

在实践中:

sudo mkdir /usr/lib/specialshell
sudo chown user_who_may_run_command:root /usr/lib/specialshell
sudo chmod 700 /usr/lib/specialshell
sudo cp /bin/perl specialperl
sudo chown user_to_run_command:usergroup_to_run_command specialperl
sudo u+s specialperl
sudo mv specialperl /usr/lib/specialshell

现在我们创建一个名为 command.script 的脚本,其中包含:

#!/usr/lib/specialshell/specialperl
$ENV"PATH" = "/usr/bin";
system("/path/to/command");

我们使用的 php 代码:

exec("/path/to/command.script");

瞧,没有代码变化,只是 php 中的命令名称。

编辑:仅适用于 perl 作为 shell,因此将 bash 更改为 perl 并将 shell 放在安全的地方

【讨论】:

【参考方案2】:

suEXEC 仅在 PHP 以 CGI 模式执行时有效,但当 PHP 作为 apache2 运行时无效 模块。我猜你是把它作为一个模块来运行的。


另一种方法可能是将所有权转移给所需的用户,然后设置suid 位:

chown desired_user your.program
chmod u+s your.program

现在在执行your.program 时,它具有权限,就好像它由它的所有者执行一样。请关注我链接的 wiki 文章以获取更多信息。

旁注:这仅适用于二进制文件(不适用于 shell 脚本,因为它们由未设置 suid 位的 shell 二进制文件执行)

【讨论】:

是的,我认为 php 是作为 www-data 的 apache2 用户运行的,对吗?这就是我在 php 脚本中执行 exec('whoami') 时得到的结果。 您使用的是 CGI 还是 libapache2-mod-php5? suexec 仅适用于 cgi。我建议的解决方法对您有用吗? (取决于你的需要)如果没有,你必须设置一个 cgi 环境 对,我到目前为止所做的是 chown www-data /path/to/command 然后 chmod u+s /path/to/command,这就是你的意思吧?还没给我做。 正如我所说,它只适用于二进制文件。最简单的解决方法是用 C 编写一个包装器

以上是关于PHP 让 www-data 像其他用户一样运行命令的主要内容,如果未能解决你的问题,请参考以下文章

php-fpm的更改组

nginx php7.2 环境搭建权限问题

如何让来自 Firebase 控制台的通知像 Facebook 和其他应用一样弹出?

如何由哪个用户在 crontab 中指定运行脚本? [关闭]

用户 ubuntu 的权限被拒绝,但 .csv 文件上的用户 www-data 却没有

像UDP一样广播,具有TCP的可靠性