安全地给PHP完全root访问权限?

时间:2018-04-28 09:11:42

标签: php security nginx ssh root

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

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

N.B。我正在使用Plesk Onyx Version 17.5.3(网站主机版,VPS主机和通配符SSL)和使用PHP-FPM 7.1.16的Nginx。我不使用Apache,但在关闭它后它会一直重新启用。

另外,我将在这个问题上提供bounty。如果在我被允许提供赏金之前我得到了一个非常好的答案,我仍然会奖励那个人。

2 个答案:

答案 0 :(得分: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?

答案 1 :(得分:0)

我使用PHPSeclib解决了这个问题,这是我编写的一个类,可以对任何文件进行PHP root访问。我稍后会使用SSH密钥使其更加安全。我现在可以使用chmod进一步保护我的系统,使某些文件只能读/写。

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);
    }
}