【问题标题】:Securely give PHP entire root access?安全地为 PHP 提供整个根访问权限?
【发布时间】:2018-10-09 00:47:41
【问题描述】:

我正在开发 CMS,而我用于开发 CMS 的工具几乎完全是 CMS 本身(几乎完全不够好,因为我正在我的 CMS 中开发工具来自动化我所能做的一切)。如果我可以通过 PHP 为自己提供完整的 root 访问权限,甚至执行诸如直接从我的 CMS 重新启动 Nginx 之类的任务,那将有很大帮助。

对于我所做的一切,安全性必须是最重要的考虑因素。我不想简单地允许任何 PHP 脚本能够访问和修改我服务器上的任何文件。如何在不影响安全性的情况下允许某些 PHP 文件完成 root 访问?如果我可以为一个 PHP 文件启用整个根访问权限,那么在该文件中,我可以进行多项安全检查,例如检查 IP 地址、会话数据检查、检查唯一 cookie、两步验证等。我什至想要从我的 CMS 中实现我自己的 SSH 控制台。同样,这必须是 100% 安全的。

注意我正在使用 Plesk Onyx 版本 17.5.3(网络主机版、VPS 托管和通配符 SSL)和带有 PHP-FPM 7.1.16 的 Nginx。我不使用 Apache,但在我关闭它后它会一直重新启用。

【问题讨论】:

  • 再说一遍,这必须是 100% 安全的。 没有什么能比得上 100% 安全的系统了。
  • @Dominik 也许是这样,但我仍然需要将安全作为我的首要任务。如果我在解决上述问题时不非常小心,我很容易削弱我的安全性并可能打开漏洞。但是,如果我能在不影响安全性的情况下解决上述问题,我已经可以想办法让我的系统比现在更安全。
  • 如果安全是您最关心的问题,我根本不会使用 PHP。此外,您似乎在重新发明轮子,因为您正在自己开发一个完整的 CMS 并希望实现您的自己的 SSH 控制台。也许您应该寻找现有的解决方案来解决您面临的类似问题。例如,Webmin 项目会根据用户在 Web 界面中的操作以root 的形式执行命令。
  • @Dominik 我的网站依赖于PHP,因为它是完全动态的。但是,我的客户将无法直接编写或上传 PHP。我创建了一个名为JHP Framework™ 的框架,它将JHP 代码解析为安全的PHP 代码并使用我的JavaScript 库。这将允许我的客户编写完全动态的代码。可以安全地完成我计划做的所有事情,并且我已经取得了很大进展,但是如果我不非常小心,我可能会打开很多潜在的漏洞。这就是为什么安全必须是我的首要任务。

标签: php security nginx ssh root


【解决方案1】:

我使用PHPSeclib 解决了这个问题,这是我编写的一个类,用于授予 PHP 对任何文件的 root 访问权限。稍后我将使用 SSH 密钥使其更加安全。我现在可以通过使用chmod 使某些文件仅以root 权限读/写来进一步保护我的系统。

class Ssh
{
    private $ssh;
    private function connectTOSsh()
    {
        if (!self::$ssh)
        {
            $path = $pathTo/phpseclib/';
            require $path.'vendor/autoload.php';
            require $path.'phpseclib/Net/SSH2.php';
            self::$ssh = new \phpseclib\Net\SSH2('www.mysite.com');
        }
        if (!self::$ssh->isConnected())
        {
            self::$ssh->setTimeout(10);
            self::$ssh->login('username', 'password');
        }
    }

    public function restartNginx()
    {
        self::connectTOSsh();
        // TODO
    }

    public function getFileContents($path)
    {
        self::connectTOSsh();
        return self::$ssh->exec('cd /'.PHP_EOL.'cat '.$path);
    }

    public function writeToFile($path, $contents)
    {
        self::connectTOSsh();
        $tempFile = $pathTo.'temp/'.basename($path);
        file_put_contents($tempFile, $contents);
        self::$ssh->exec('cd /'.PHP_EOL.'mv '.$tempFile.' '.$path);
    }
}

【讨论】:

    【解决方案2】:

    这听起来是个坏主意——因为保持简单可能是不损害安全性等的最佳方法。使用 cronjobs 自动化事情并使用命令行脚本来做事情是有意义的;但尝试在 CMS 中实施“ssh”感觉会增加应用程序的膨胀 - 并且可能会带来安全风险。

    您提到您正在使用 PLESK - plesk 确实有一个 XML api - https://docs.plesk.com/en-US/onyx/api-rpc/about-xml-api/reference/managing-plesk-services.36910/https://github.com/plesk/api-examples

    还有https://github.com/plesk/ext-ssh-terminal

    您能否不利用一些现有的 plesk 功能来实现您的目标并专注于 CMS?

    【讨论】:

    • 我可以利用一些现有的 Plesk 功能,但这并不能真正解决我的问题。我已经复制了一些 Nginx 文件,以便 Plesk 不会覆盖更改,然后将 nginx.conf 替换为 am include。我的下一个任务是在我的 CMS 上创建一个仅限超级用户的页面来搜索和查看日志文件。我想我可以通过将日志文件存储在根目录上方的目录中来解决这个问题,但这并不理想,我还有其他原因想要为我的超级用户帐户提供根访问权限。
    • TBH,如果我的超级用户帐户被盗用,我的整个系统无论如何都会被盗用。如果我可以只允许我的超级用户帐户对我的系统具有完全的 root 访问权限并通过我的 CMS 访问 SSH 控制台,我实际上可以让我的超级用户帐户比现在更安全,只需让我的超级用户帐户需要访问 PHP 无法正常访问的 PHP 脚本。这意味着如果黑客能够以某种方式执行恶意 PHP 代码,他们将无法访问我的超级用户帐户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 2020-08-26
    • 1970-01-01
    • 2020-09-06
    • 2014-06-01
    • 1970-01-01
    • 2019-05-27
    相关资源
    最近更新 更多