从PHP执行root命令......有安全的方法吗?

时间:2012-05-05 21:47:48

标签: php command root

我正在考虑制作一个基于Web的小型Linux控制面板(只是为了好玩)。

我想到的第一个潜在问题是我需要授予Apache用户root级权限来运行这些命令,这会危及整个系统的安全性。

为系统安装专用的Web服务器实际上不是一种选择。

也许我可以运行第二个Apache实例(为普通用户保留第一个)但是如果可能的话甚至不确定。

那么,你们想的是什么? 我最好的选择是什么?

提前感谢任何输入。

编辑:好的,感谢所有的建议,我会记住它们。

3 个答案:

答案 0 :(得分:5)

编写可以作为root运行的特定脚本并使用setuid位来执行此操作,以便Apache可以只以root身份运行这些脚本。 IE

#! /usr/bin/php (or wherever your php binary is)
<?php
   // Some PHP code that takes in very limited user input,
   // validates it carefully, and does a sequence of actions
   // that you need to run as root.

   // This could easily be a shell script (or whatever else you want)
   // instead of PHP. That might be preferable in many situations.
?>

然后确保该脚本由root用户拥有并由Apache运行的用户分组:

chown root:www-data myscript.php

然后让它作为所有者运行:

chmod u+s myscript.php

确保Apache可以执行它:

chmod g+x myscript.php

答案 1 :(得分:3)

通过网络服务器执行root命令对我来说似乎是一个疯狂的想法,但无论如何。

您可以使用sudo来确保您不会运行任何不需要的命令。

here取得的一些例子,sudo config:

peter, %operator ALL= /sbin/, /usr/sbin, /usr/local/apps/check.pl

在php中:

exec( 'sudo /usr/local/apps/check.pl ...');

请务必正确地转义所有参数等等。

或者您可以像这样构建db表:

commands (
    action,
    serialized_parameters.
    result,
    return_code
)

使用php向此表插入命令,并使用另一个脚本,该脚本将由不同的用户在cron中运行。您将无法获得实时结果(但是您可以将它们保留30秒)但是apache用户将无法直接使用任何命令(当然,您可以在阅读记录时轻松限制操作)。

答案 2 :(得分:2)

我最近发布了一个项目,允许PHP获取真正的Bash shell并与之交互(如果需要,可以作为root),它解决了exec()和shell_exec()的限制。在此处获取:https://github.com/merlinthemagic/MTS

下载后,您只需使用以下代码:

$shell    = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
$return1  = $shell->exeCmd('yourFirstCommand');
//the return will be a string containing the return of the command
echo $return1;

就安全性而言,它比以root身份运行apache要好得多。但让PHP靠近root的任何地方总是很棘手。

我构建的项目以两种方式之一实现了root bash shell:

1)你允许apache权限sudo python。

OR

2)每次需要具有root设置的shell时,都会将根凭据传递给对象。

选择你的毒药。 :)阅读文档。