【问题标题】:Executing root commands from PHP...Is there a safe way?从 PHP 执行 root 命令...有安全的方法吗?
【发布时间】:2012-05-15 00:37:58
【问题描述】:

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

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

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

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

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

提前感谢您的任何意见。

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

【问题讨论】:

  • 您需要考虑、回避或克服的安全功能有很多。除非您对 Linux 系统安全有深入的广泛了解,否则不要考虑尝试这样做。
  • 每当您想做类似这个的事情时,何不向 Plesk 的人们询问make a "safe" web-based system admin panel 的乐趣。
  • 我正在考虑制作一个基于 Web 的小型 Linux 控制面板(只是为了好玩)——我认为你应该多出去走走,但我还是应该为我的失眠做点什么!跨度>

标签: php command root


【解决方案1】:

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

#! /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

【讨论】:

  • 使用 setuid 运行 PHP,这只是潜在的安全问题,但是是的,这就是 OP 想要的 :)
  • Linux 会忽略解释语言上的 setuid 位,因为它被认为非常不安全。 unix.stackexchange.com/questions/364/…
【解决方案2】:

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

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

取自here的小例子,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 用户将无法直接使用任何命令(当然你可以在读取记录时轻松限制操作)。

【讨论】:

    【解决方案3】:

    我最近发布了一个项目,它允许 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 凭据传递给对象。

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

    【讨论】:

      猜你喜欢
      • 2012-01-21
      • 2015-04-16
      • 1970-01-01
      • 2012-02-10
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多