2010-10-26 73 views
3

我想使用SVN存儲庫(Unfuddle)的回調功能來在我的服務器上ping任何提交時的URL。我有一個PHP腳本接受消息並試圖調用一個shell腳本來執行'svn update'。設置SVN二進制文件的SUID/SGID位是否存在安全風險?

我面臨的問題是Apache在用戶'www-data'下運行,並且無法訪問本地存儲庫:'.svn/lock'權限被拒絕。我已閱讀了關於在shell腳本上設置SUID/SGID以及大多數* NIX OS根本不支持它的原因,因爲涉及到安全風險。

但是我可以在位於/ usr/bin/svn的SVN二進制文件中設置SUID/SGID位。這可以通過允許任何用戶在任何存儲庫上發出SVN命令來緩解這個問題;不是最理想的...

我的問題是什麼是最邏輯/理智/安全的方式來實現這種類型的設置,如果我確實離開svn二進制設置的位,這會造成一個重大的安全風險,我沒有意識到?

對不起,這個冗長的帖子;這是我的第一個問題,我想徹底。

感謝

回答

2

有2種類型的這類問題,輪詢或事件驅動的解決方案。

輪詢解決方案的一個例子是在您的服務器上運行一個cronjob,每N分鐘更新一次。如果它適合你,這可能是最容易維護的。您可以通過從正確的帳戶運行cron來回避整個權限問題。

您所涉及的解決方案是一個事件驅動的解決方案。他們通常資源密集程度較低,但可能難以建立。另一個事件驅動解決方案的例子是將www數據歸屬於svn組。設置SGID位並將存儲庫目錄設置爲svn組。這應該允許該組中的任何人登記/登出。

如果您需要限制更新,可以升級權限或臨時更改用戶。您可以使用ssh單一用途密鑰(aka命令密鑰)以具有正確權限的用戶身份登錄。然後可以使用單一用途的密鑰進行更新。

提高權限的另一種方法是使用sudo -u [user] [command]。更新/etc/sudoers文件以允許www數據升級/將用戶更改爲可執行更新的用戶。

無論哪種方式,我不會使用SUID/SGID腳本。

+0

如果可能的話,我寧願採用均勻驅動的解決方案。您使用'svn'組的想法跟在本文之後:svnbook.red-bean.com/en/1.0/ch06s05.html但是正如您所看到的,還有其他一些事情需要考慮,這使得它有點混亂。我需要進一步研究「命令鍵」選項。我猜,現在,如果爲svn二進制文件(而不是shell腳本)設置SGID,我的問題仍然存在,我應該知道這個問題有什麼明顯的安全問題。謝謝您的意見。 – coderich 2010-10-26 06:53:26

0

正如CodeRich已經說過的那樣,您可以設置一個cron作業來頻繁更新tue工作副本(這也是我將使用的解決方案)。

設置svn SUID/SGID是不好的,因爲svn可以在文件系統中的任何地方寫入文件(想象一個包含passwd和shadow文件的公共可訪問存儲庫,簽出到/ etc中)。你可以使用一個小的suid包裝程序(這是SUID到你的用戶帳戶,而不是root),chdir到你的工作副本,並在那裏執行svn和正確的參數。你可以看看ikiwiki這是什麼時候用作cgi的。

另一種方法是更改​​工作副本的權限,以便www-data用戶可以在其中創建和寫入文件。

+0

感謝Rudi,作爲一般規則,我想最好避免任何二進制文件(尤其是那些由root擁有的文件)上的SUID/SGID,除非你真的知道發生了什麼。我可能最終會用你的第一個建議,並且只是CRON它:也許有Apache寫一個CRON每分鐘輪詢的文件,如果該文件存在svn update和remove file。感謝您的輸入。 – coderich 2010-10-26 14:28:15

0

更改您的工作副本的權限,以便Apache可以寫入它。你有一個你想改變的目錄,你需要權限才能這樣做。它很簡單:)

然後你面對的問題是允許任何Apache用戶(或被黑客入侵的頁面)寫滿你的回購,而不是一件好事。所以 - 你只需要讓系統的一部分寫入它,最好的方法就是以已經擁有該回購的用戶身份運行你的php腳本。

這很容易通過將php腳本作爲cgi或fastcgi進程運行來實現。您可以指定用戶使用,它不必是www-data,儘管它需要更多的設置,您可以獲得最好的事件驅動和安全性。

下面是對此的快速說明phpSuexec

+0

我可以更改每個存儲庫的權限,但它只是感覺髒:)我喜歡將PHP作爲CGI執行並在該腳本上設置SUID位的想法 - 但我的服務器目前尚未設置,需要進一步安裝 - 以及...我是極簡主義者:)我認爲一個簡單的CRON是這裏的方式;儘管我想知道共享主機帳戶如何管理這個問題,因爲我從來沒有遇到過這個問題。謝謝。 – coderich 2010-10-26 14:34:24

+0

共享主機可以工作,因爲PHP可以設置爲以您的用戶身份運行,並且您的主目錄(顯然)也由您的用戶擁有。使用phpSuexec(或CGI),你會達到與他們相同的結果。忘記suid bits等類似的東西,只需運行該腳本作爲擁有您要更新的目錄的用戶。設置它非常簡單 - 請參閱鏈接。 – gbjbaanb 2010-10-27 08:25:05

相關問題