2012-05-05 60 views
8

我正在考慮製作一個基於網絡的小型Linux控制面板(只是爲了好玩)。從PHP執行根命令...有沒有安全的方法?

我想到的第一個潛在問題是,我需要爲Apache的用戶提供root權限才能運行這些命令,這會危及整個系統的安全。

爲系統安裝專用Web服務器並不是真正的選擇。

也許我可以運行第二個Apache實例(爲常規用戶保留第一個實例),但如果可能的話,甚至不能確定。

那麼,你們覺得呢? 這裏我最好的選擇是什麼?

在此先感謝您的任何意見。

編輯:好的傢伙謝謝所有的建議,我會記住他們。

+6

您需要考慮的安全功能,迴避或克服的方法很多。除非您對Linux系統安全性有深入的瞭解,否則不要考慮嘗試此操作。 –

+0

任何時候你都想做**這樣的事情**,爲什麼不問Plesk的人是多麼有趣[做一個「安全的」基於網絡的系統管理面板](http://arstechnica.com/企業/新聞/ 2012/02 /的Plesk控制面板的錯誤 - 左 - FTC的網站,和成千上萬,更暴露到anon.ars)。 – rdlowrey

+0

我在考慮製作一個基於網絡的小型Linux控制面板(只是爲了好玩) - 我想你應該多出去一些,但是我又應該對失眠做點事情! –

回答

5

編寫可作爲root運行的特定腳本,並使用setuid位執行此操作,以便Apache可以僅以root身份運行這些腳本。 IE

#! /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用戶group'd爲:

chown root:www-data myscript.php 

然後使其運行作爲所有者:

chmod u+s myscript.php 

並確保Apache可以執行它:

chmod g+x myscript.php 
+0

使用setuid運行PHP,這只是潛在的安全問題,但是,這就是OP想要的:) – Tibor

+0

Linux忽略解釋語言上的setuid位,因爲它被認爲是非常不安全的。 http://unix.stackexchange.com/questions/364/allow-setuid-on-shell-scripts/2910#2910 –

3

通過網絡服務器執行根命令對我來說似乎是一個瘋狂的想法,但無論如何。

您可以使用sudo這將確保您不會運行任何不需要的命令。從here採取

小例子,sudo的配置:

peter, %operator ALL= /sbin/, /usr/sbin, /usr/local/apps/check.pl 

而且在PHP中:

exec('sudo /usr/local/apps/check.pl ...'); 

請務必正確等逃避所有參數。

或者你可以建立,而db表是這樣的:

commands (
    action, 
    serialized_parameters. 
    result, 
    return_code 
) 

使用PHP命令插入到這個表,這將在cron由不同的用戶運行的另一個腳本。你不會有實時的結果(但你可以讓他們有30秒的時間),但apache用戶將不能直接使用任何命令(當然你可以在讀取記錄時輕鬆限制動作)。

1

我最近發佈了一個項目,它允許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; 

在安全性方面它遠遠比運行Apache作爲根更好。但讓PHP靠近根目錄總是很棘手。

我建造這個項目實現了2種方式之一根的bash shell:

1)您允許Apache在sudo的蟒蛇的權利。

OR

2)您傳遞根證書對象每次你需要以root設置shell的時候。

挑你的毒藥。 :)閱讀文檔。

相關問題