Apache-2.2

在 Apache 伺服器上通過 cgi 啟動根級程序的最安全方法是什麼?

  • October 27, 2012

問題:我有一個腳本,它以 root 身份通過 cron 作業定期執行,但我想通過網頁為人們提供一種非同步啟動它的方法。(將編寫腳本以確保它不會執行重疊實例等。)

我不需要使用者登錄或擁有帳戶,他們只需點擊一個按鈕,如果腳本準備好執行,它就會執行。使用者可以為腳本選擇參數(經過大量過濾作為輸入),但為簡單起見,我們會說他們只有按鈕可以選擇按下。

作為一個簡單的測試,我在 cgi-bin 中創建了一個 Python 腳本。chown-ing 到 root:root 然後對它應用“chmod ug+”沒有得到想要的結果:它仍然認為它有有效的網路伺服器帳戶組……據我所知,這不是允許。

我讀到用編譯的 cgi 程序包裝它就可以完成這項工作,所以我創建了一個 C 包裝器,它呼叫我的腳本(它的權限恢復正常)並為執行檔提供 root 權限和 setuid 位。行得通……腳本執行就像root執行它一樣。

我的主要問題是,這是否正常(需要二進制包裝器來完成工作),這是安全的方法嗎?它不是面向世界的,但我仍然想學習最佳實踐。

更廣泛地說,我經常想知道為什麼編譯的二進製文件在實踐中比腳本更“可信”?我認為您會信任一個人類可讀的文件,而不是一個神秘的二進製文件。如果攻擊者可以編輯文件,那麼您已經遇到了麻煩,如果它是您無法輕鬆檢查的文件,則更是如此。簡而言之,我希望它在此基礎上是相反的。你的意見?

首先:不要這樣做,或者至少不要讓任何參數從網路傳遞到你的根執行應用程序。

現在回到您的實際問題:當您編寫腳本(在您的情況下為 Python)時,它會由解釋器執行。所以為了能夠以root身份執行腳本,你需要設置python解釋器suid-root,但你真的不想這樣做。這是因為您的腳本本身不是執行檔,而只是解釋器的一組規則。當您使用二進制執行檔包裝腳本時,您現在再次擁有一個獲得 root 權限的執行檔,並且從執行檔呼叫的 python 解釋器也具有 root 權限。有關這方面的更多資訊,請參閱無法在 Shell 腳本上設置 UIDhttp://www.diablotin.com/librairie/networking/puis/ch05_05.htm

也就是說,按照@SvenW 的建議通過 sudo 呼叫腳本應該可以正常工作。

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