使用非 root 將 git repo 部署到 web 根
為使用 git 部署到伺服器的生產 Web 伺服器設置使用者和權限的最佳方法是什麼?
背景
執行 Ubuntu 12.04,我有 apache 在
/var/www
as下提供文件www-data
。我還在根使用者目錄下有一個裸 git repo,它將/var/www/example.com
在 post-receive 掛鉤中結帳。這工作得很好,但考慮到它是一個生產伺服器,我想加強一些安全性並從 root 使用者中刪除 repo。所以我創建了一個 git 使用者並在
/home/git
. 但是現在我對一個使用者擁有 repo 而另一個使用者擁有 web 根這一事實存在權限問題。我在網上閱讀了許多論壇和教程。大多數似乎只使用 root 使用者,其他人似乎有更嚴重的安全問題(例如
www-data
授予對 repo 的讀取權限)。我正在尋找來自現實世界經驗的見解,因為有很多方法可以做到這一點。需要注意的是,接收後掛鉤不僅僅是結帳。它還執行一些建構過程,例如執行 Composer 和其他一些可能需要幾分鐘的 php 腳本。
我嘗試了幾種解決方案:
我嘗試將 git 使用者添加到
www-data group
,然後將 web 根返回到www-data
鉤子的末尾。這有兩個問題。首先,我必須修改 sudoers 文件,我從中得到的結果是命中註定的。其次,在鉤子執行的幾分鐘內,簽出的文件歸 git 所有,而不是www-data
,因此網站上的使用者可能會收到讀取錯誤。我嘗試將 post-receive 的內容放在另一個文件中,並使用 sudo 執行它。同樣,這需要編輯 sudoers 文件,以便 git 使用者無需密碼即可 sudo。
或者可能將回購留在根使用者下是較小的邪惡,我做這一切都是徒勞的。
有沒有更好的解決方案我沒有嘗試過?
創建一個新組,並將
git
和www-data
使用者添加到其中。然後將您的裸 Git 儲存庫設置為始終使用您創建的組作為儲存庫文件的 gid。使用新的裸儲存庫,您可以使用git init --shared=group
. ( Ref ) 這將允許www-data
帳戶讀取儲存庫。更新您的 sudoers 以允許該帳戶在沒有密碼的情況下
git
執行命令。www-data
# file: /etc/sudoers.d/gitpush # permissions should be 0440 # git user is allowed to basically do anything as the www-data user git ALL=(www-data) NOPASSWD: ALL
然後只需將
post-receive
腳本sudo -u www-data
用於執行檢查/修復所需的所有命令。