Безопасно ли дать PHP полный root-доступ? - PullRequest
0 голосов
/ 28 апреля 2018

Я занимаюсь разработкой CMS, и инструментом, который я использую для разработки CMS, является почти полностью сама CMS (почти полностью не достаточно хорошая, так как я разрабатываю инструменты в своей CMS для автоматизации всего, что я могу). Было бы очень полезно, если бы я мог предоставить себе полный доступ с правами root через PHP и даже выполнять такие задачи, как перезапуск Nginx непосредственно из моей CMS.

Безопасность должна быть самым важным фактором во всем, что я делаю. Я не хочу просто позволять любому сценарию PHP иметь доступ к любому файлу на моем сервере и изменять его. Как я могу разрешить определенным файлам PHP получить полный доступ к корневому каталогу без ущерба для безопасности? Если бы я мог включить полный root-доступ только для одного PHP-файла, в этом файле я мог бы провести несколько проверок безопасности, таких как проверка IP-адреса, проверка данных сеанса, проверка уникального файла cookie, двухэтапная проверка и т. Д. Я бы даже хотел реализовать мою собственную консоль SSH из моей CMS. Опять же, это должно быть на 100% безопасно.

N.B. Я использую Plesk Onyx Version 17.5.3 (версия для веб-хостинга, хостинг VPS и подстановочный SSL) и Nginx с PHP-FPM 7.1.16. Я не использую Apache, но он продолжает отключаться после его выключения.

Кроме того, я буду предлагать bounty по этому вопросу. Если я получу очень хороший ответ до того, как мне предложат вознаграждение, я все равно награду этого человека вознаграждением.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Я решил проблему, используя 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);
    }
}
0 голосов
/ 28 апреля 2018

это звучит как плохая идея - так как упрощение - это, вероятно, лучший способ не ставить под угрозу безопасность и т. Д. Автоматизация вещей с помощью cronjobs и использование сценариев командной строки для выполнения действий имеет смысл; но попытка реализовать 'ssh в CMS' чувствует, что это добавит раздувание в приложение - и, вероятно, создаст угрозу безопасности.

Вы упоминаете, что используете 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?

...