2011-10-03 107 views
13

我想要從Django(www用戶)調用的python腳本中快速創建一個任務,這將需要root權限。以root身份執行Python腳本(seteuid vs c-wrapper)

起初我以爲我會使用Python的os.seteuid()並在腳本上設置setuid位,但後來我意識到我將不得不在Python本身上設置setuid位,我認爲它是大的沒有。從我所知道的情況來看,如果使用sudo,也是如此,我真的很想避免這種情況。

在這一點上,我正在考慮編寫一個C封裝使用seteuid並以root身份調用我的python腳本,並將必要的參數傳遞給它。

這是正確的事情還是應該看看別的東西?

+2

爲什麼你不執行它使用'subprocess'和'sudo'外部進程,即使這個一切聞起來臭。 – Anders

+0

因爲這將需要給WWW許可跑這裏來Python作爲根:( – kwl34

+1

的主要問題是,當他們將一個二進制setuid和共同須藤操作並不適用於個人的Python腳本,而是Python解釋器本身。 – kwl34

回答

14

sudo不需要Python上的setuid位。您可以啓用sudo的一個命令而已,沒有參數:

www   ALL=(ALL)  NOPASSWD: /root/bin/reload-stuff.py "" 

這將是安全的,如果你的腳本不帶任何參數,無法通過WWW用戶覆蓋,須藤做「env_reset」(默認的最發行版)。

您可以接受參數,但要非常小心 - 不要輸出文件名,請確保您驗證所有輸入。在這種情況下,從sudo行末尾刪除「」。

+0

有趣!那我馬上要去測試一下。但是,我的腳本確實需要參數,雖然簡單。只要我的Python腳本在這些參數上進行嚴格匹配,你認爲我會好嗎? – kwl34

+0

是的。只要你對他們小心,你可以採取積極的措施。 – theamk

+0

'ALL =(root)'可能是首選將腳本限制在只運行root的用戶,而不是任何其他用戶。最好只限於你需要的東西。 – CivFan

1

sudo允許您限制傳遞給程序的參數。 From man sudoers

john   ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root* 

On the ALPHA machines, user john may su to anyone except root but 
he is not allowed to specify any options to the su(1) command. 

所以使用sudo。當然,你需要對根訪問格外小心 - 確保只有root可以修改腳本本身和任何父目錄,並且腳本是安全的,只有絕對最小值需要以root身份運行。

+0

我可能是錯的,但是這仍然需要給Python解釋器本身的WWW用戶sudo的根訪問,和你基本上使用sudo的說法解析器只允許運行腳本。這是正確的嗎?如果是的話,它很容易也佔到參數傳遞給腳本(鍵/值)? – kwl34

+0

是的,這是正確的。是的,它應該很容易,但我會建議通過標準輸入/輸出通信。不幸的是,這是一個安全問題,有真是無可奈何閱讀'男人sudoers'。 –

3

正確的事情被稱爲特權分離:清楚地標識必須在提升的特權上完成的最小任務集。編寫一個單獨的守護進程和儘可能有限的溝通任務的方式。以提升的權限運行該守護程序作爲另一個用戶。多一點工作,但也更安全。編輯:使用setuid能夠包裝也將滿足特權分離的概念,雖然我建議有Web服務器chrooted和掛載chrooted文件系統nosuid(這將打敗)。

+0

這是我使用的是C包裝二進制提出,它提供了有限的界面給SP用戶需要通過seteuid()提升特權來訪問特殊功能。 – kwl34

+0

是的,你說得對,那樣做。我沒有考慮它,因爲我建議使用chrooting Web服務器並將其安裝到Web服務器可訪問的文件系統nosuid。 – knitti

+0

我想推薦sudo over C包裝。忘記清除PYTHONSTARTUP或其他一些env變量是很容易的,但是使用env_reset的sudo會爲你做。 – theamk

相關問題