Linux

以超級使用者身份啟動 FPM 池/反映 root 訪問權限

  • August 23, 2012

我正在用 PHP 建構一個 NAS 控制應用程序,它只能從本地網路訪問。

我將從 PHP-FPM 不允許使用 user 啟動它的池開始root,並且我還沒有找到強制它的方法。

是的,是的,以 root 身份執行 PHP 並不安全(並且還建構了一個作業系統配置應用程序),但我不知道如何/etc/rc.conf直接從 PHP 中使用file_put_contents()和之後編輯 Arch Linux rc.d restart network

我已經open_basedir = /進去了php.ini

我已閱讀此內容,因此,我設置了一個 sudoer,使用相應的使用者和組啟動 PHP-FPM 池。

我的 sudoer 是系統使用者,添加了:

useradd -r -s /bin/bash -g wheel -d /srv/http/ systemphp

在 sudoer 配置中,我添加了以下條目:

systemphp stone=NOPASSWD: ALL

stone是系統的實際主機名。

問題是我必須這樣sudo <everything>做,但我不想將所有內容都基於shell_exec()/ exec()

因為,這裡的任何選項都是一個選項,我仍然嘗試:

var_dump(shell_exec('sudo fdisk -l'));

那回來了null。在 PuTTY 中su systemphpsudo fdisk -l返回實際列表的位置。

沒有shell_exec(),以下程式碼將導致fopen(/etc/rc.conf): failed to open stream: Permission denied

$handle = fopen('/etc/rc.conf', 'r+');

if ( $handle )
{
   while( ($buffer = fgets($handle)) !== false)
   {
       echo $buffer;
   }

   if ( !feof($handle) )
   {
   echo 'Error: fgets() unexpectedly failed' . PHP_EOF;
}

   fclose($handle);
}

我將如何設置這樣的環境或至少反映它?

請不要建構編輯關鍵配置文件的 Web 界面。

相反,您可以建構一個 Web 應用程序,讓使用者修改此配置文件的副本或模板。然後代理或調度腳本實際上可以修改這個配置文件。

這是大多數scm的工作方式。看看puppetbcfg2看看它是如何用其他語言完成的。

雖然我強烈同意這是一個壞主意,實際上你應該編輯一個臨時副本並讓其他東西複製它,如果你決定rc.conf直接編輯,創建一個組,systemphp加入它,改變該組的組所有權rc.conf並授予rc.conf組寫入權限。

這至少比NOPASSWD: all通過 sudoers 授予使用者權限要少得多。

而且,這仍然是一個糟糕的主意。您可能看不到對系統造成傷害的方法,但要確保這一點非常困難。我什至可以說你不能。rc.conf是一個 bash 腳本,它的來源,祝你好運,照顧潛在的邊緣情況。

順便說一句,我什至想不出任何對rc.conf這樣的改變有用的東西,特別是因為它是最新系統上的一個非常小的文件——基本上任何東西都可能在其他地方更合適地改變,或者改變在另一個文件中並告訴rc.conf該文件的來源,如果它確實需要存在的話。

引用自:https://serverfault.com/questions/419965