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 像其他用户一样运行命令的主要内容,如果未能解决你的问题,请参考以下文章
如何让来自 Firebase 控制台的通知像 Facebook 和其他应用一样弹出?
如何由哪个用户在 crontab 中指定运行脚本? [关闭]