2016-02-26 49 views
0

特別是在Linux/POSIX世界中,需要某些根功能才能進行臨時初始化(例如,讀取根擁有的私鑰文件或打開端口1024或者增加資源限制)的守護程序通常似乎遵循設計模式,他們通過函數調用(如setuid()/setresuid()setgid()/setresgid())更改其憑據,然後調用fork()將實際程序作爲其子項運行。假設fork() -ing完成「以防萬一」,但是這樣做是或實際的安全考慮?在刪除(root)權限後fork()會獲得任何安全性好處嗎?

並跟進上,就是這個原因,仍然具有現實意義的時候(除了setgroups(0, NULL)setresgid(GID_NOBODY, GID_NOBODY, GID_NOBODY)setresuid(UID_NOBODY, UID_NOBODY, UID_NOBODY)),該方案還主動限制Linux的功能,以儘快下探各項性能,因爲它不再需要撥打cap_set_proc()

+0

也許更適合[信息安全](http://security.stackexchange.com/)? –

+0

@SergeBallesta我認爲它同樣適合這裏。理想情況下,我會提出這個問題一次 - 但兩個網站同時!但是,不,StackExchange太笨了,不允許這樣的功能。我的意思是,不要強迫用戶選擇一個SE網站,如果你能向兩個或甚至三個不同的SE網站提出問題,這會有多好? – Will

+0

我沒有將其標記爲遷移,因爲我同意你的意見,這裏不是主題。但恕我直言,你可以在其他網站獲得更好的質量答案,因爲這實際上涉及安全。 –

回答

1

你有什麼特別的例子嗎?

通常,守護程序在「主」進程中分叉並保留root權限。這很有用,因爲這意味着它可以例如重新加載配置並可能綁定到其他端口。分叉的孩子沒有特權,可以處理實際的交通。

我的猜測是你看到一個程序,它丟棄了privs,分叉並退出父項。如果是這樣,這是成爲守護進程的一部分。

+0

啊,是的;我認爲你的最後一段解釋了我的困惑。我正在重溫舊代碼,顯然完全錯誤地記住了分叉的原因。這是爲了從(大)父項目中「分離」,對嗎?你能詳細說明(或鏈接到)該機制的工作原理嗎?我仍然記不清楚... – Will

+0

Nevermind,[這個答案](http://stackoverflow.com/a/16317668/765294)好像涵蓋了守護進程叉舞舞。 – Will

1

那麼在安全方面的最佳實踐建議有許多防線。

如果你確定你的守護進程沒有缺陷,也沒有它使用的庫的任何功能,那麼你可以讓它在沒有任何風險的情況下以完全特權運行。

但是,如果它是由純粹的人寫的,那麼它很可能隱藏了一些可能允許攻擊者執行任意代碼的可能漏洞。在距離今天不遠的SSL庫中發現了一個,不是說Windows ...

這就是爲什麼您應該撤銷處理外部輸入時不需要的所有權限的原因,因爲該部分的風險較高。

這就是爲了放棄權限。 fork部分通常用於將守護進程拆分爲一個從不處理外部輸出(安全性...)並且監視執行真正工作的其他低特權進程[es]的高度特權進程。例如,它允許重新啓動已死亡或被卡住的孩子,但外部輸入數據絕不會被特權代碼處理。

+0

我不明白這是如何回答我的問題; *什麼(確切)是**分叉**的安全性好處?*。也許我的問題是基於一個錯誤的假設(正如其他答案所指出的那樣),但我認爲你仍應該解決實際問題。 – Will

+0

感謝您的編輯! – Will