8

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

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

为系统安装专用的 Web 服务器并不是一个真正的选择。

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

那么,你们怎么看?我在这里最好的选择是什么?

提前感谢您的任何意见。

编辑:好的,谢谢大家的建议,我会记住的。

4

3 回答 3

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
于 2012-05-05T21:54:44.367 回答
3

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

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

取自这里的小例子,sudo config:

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

在 php 中:

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

请务必正确转义所有参数,依此类推。

或者您可以像这样构建数据库表:

commands (
    action,
    serialized_parameters.
    result,
    return_code
)

使用 php 将命令插入此表和另一个脚本,该脚本将由不同的用户在 cron 中运行。你不会有实时结果(但你可以让他们有 30 秒的时间)但是 apache 用户将不能直接使用任何命令(当然你可以在读取记录时轻松地限制操作)。

于 2012-05-05T21:59:15.047 回答
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 bash shell:

1)您允许apache有权sudo python。

或者

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

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

于 2016-05-20T10:01:49.353 回答