2012-03-01 21 views
2

我有一個用git,gitosis,nginx和php-fpm設置的CentOS 6服務器。在nginx和php-fpm環境下使用git post-receive hook

隨着我們的設置,通過nginx的PHP-FPM,這是在每個站點的基礎配置爲安全起見,特定用戶運行的執行PHP腳本(即不是所有的下nginx的:nginx的),因爲我們不希望在一個網站遭到破壞的情況下,所有網站都會受到影響。

我們的環境很好,但是,當涉及到git時,php-fpm創建了一個基本問題。

在成功地在本地運行以下命令:

$ git push origin 

我的後收到鉤運行:

#!/bin/sh 
GIT_WORK_TREE=/var/www/vhosts/example.com/httpdocs git checkout -f 

通常情況下,這將然而回購的內容複製到httpdocs資料夾,由於安裝了php-fpm並且目錄+文件歸特定用戶所有,gitosis(或任何其他非root用戶)無法寫入目錄。這是由以下錯誤明顯:

remote: error: git checkout-index: unable to create file index.php (Permission denied) 

它是有道理的,這就是我所期望的。但是,我想知道在這個特定情況下是否有辦法解決這個問題?有沒有一種方法可以修改post-receive鉤子以root身份運行(它目前由gitosis用戶運行)或以某種其他方式運行以便它成功?

只是要清楚:設置沒有其他問題,git工作正常,nginx/php-fpm工作正常,但這是一個權限問題,我不太清楚如何解決。

回答

2

你可以使用sudo獲得鉤運行的user1user2user3,或任何你的系統需求。您需要考慮讓gitosis用戶能夠僞裝成您的網絡用戶的安全隱患,即使程度有限。

製法實例

鑑於post-receive掛鉤會爲用戶gitorious,並假設你的網絡用戶被稱爲user1user2user3等等

移動當前的後收到鉤到/usr/local/sbin/update-user1.sh或其他合適的地方,並確保它是可執行的。

添加類似這些行/etc/sudoers

gitosis localhost = (user1) NOPASSWD: /usr/local/sbin/update-user1.sh 
gitosis localhost = (user2) NOPASSWD: /usr/local/sbin/update-user2.sh 
gitosis localhost = (user3) NOPASSWD: /usr/local/sbin/update-user3.sh 
... etc ... 

然後你的後收到鉤user1可能會成爲類似:

#!/bin/sh 
sudo -u user1 /usr/local/sbin/update-user1.sh 

同樣,對於其它用戶。

未經測試,所以請在實施前測試!

+0

這樣做的問題是我必須將gitosis添加到每個網站的用戶組。這反過來會否定以權限的立場讓每個用戶都離開彼此的理由。我開始認爲如果不損害我們設立的系統的完整性,這是不可能的。 – Brendan 2012-03-05 21:04:29

+0

我不明白你爲什麼必須使用這種技術爲每個網站的用戶組添加'gitosis'? 'sudo'會以'www-data'(或任何實際的網絡用戶)的身份運行結帳腳本。你需要一個單獨的結帳腳本,在每個用戶的'/ etc/sudoers'裏有一個匹配的條目,但是如果真的需要的話,可以對它進行參數化。 – msandiford 2012-03-06 09:59:06

+0

沒有單個Web用戶,因此www數據不適用。我們的服務器設置時考慮了相當嚴格的安全性 - 每個網站都有自己的用戶。這些用戶不屬於任何組,但他們自己的,因此不能修改eachothers文件,這在使用php-fpm運行php時很重要(因爲php以用戶身份運行)。 – Brendan 2012-03-06 16:45:23