2011-06-03 73 views
6

我看到許多開源項目這樣的邏輯:爲什麼很多服務器改變它的uid和gid,有什麼好處?

if (setuid() == 0) { 
    if (setgid(ccf->group) == -1) { 
    ... 
    if (initgroups(ccf->username, ccf->group) == -1) { 

我對此有2個問題:

  1. 什麼的benifit切換到其它GID和UID?
  2. 什麼是initgroups?海事組織,改變gid和uid,setuid()setgid()就足夠了。

回答

4

大多數情況下,系統守護進程都是由init腳本產生的,因此運行時爲root。調用setuid()setgid()可以讓他們放棄其超級用戶權限並冒充系統上的其他用戶(通常遠低於root)。這樣,錯誤和安全漏洞對系統的致命性就會降低。

關於您的問題的第二部分,initgroups()被調用來重新初始化組訪問列表並將ccf->group添加到ccf->username所屬的組列表中。這可能是因爲調用setgid()不足以將與新組關聯的訪問權傳播到進程。

+0

@FrédéricHamidi,initgroups呢,爲什麼這裏需要? – cpuer 2011-06-03 06:02:48

+0

@cpuer,如果還不是這樣的話,可能會將該用戶設置爲該組的成員。看到我更新的答案。 – 2011-06-03 06:07:33

+0

但是當'setgid()'成功時,nginx調用'initgroups' .. – cpuer 2011-06-03 06:08:58

2

通常,您需要具有管理權限才能在端口1023和以下進行偵聽。 (還有其他一些原因是以管理員身份開始的,但這是最重要的原因。)但事情是這樣的:您可以以管理員身份啓動,綁定套接字,然後下載成爲用戶。

現在,你爲什麼要成爲一個用戶?那麼,如果你使用盡可能少的權限運行,並且你的程序受到了損害,那麼這個損害將被包含在內。

+0

任何關於什麼時候應該使用'initgroups'的說法? – cpuer 2011-06-03 06:11:49

+0

沒有。對不起,我不是要問的人。 – 2011-06-03 06:13:13

0

對某些OS setgid()敬酒補充組。因此在setgid()之前調用initgroups()是無效的。

相關問題