Apache-2.2

使用非 root 將 git repo 部署到 web 根

  • January 16, 2021

為使用 git 部署到伺服器的生產 Web 伺服器設置使用者和權限的最佳方法是什麼?

背景

執行 Ubuntu 12.04,我有 apache 在/var/wwwas下提供文件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。

或者可能將回購留在根使用者下是較小的邪惡,我做這一切都是徒勞的。

有沒有更好的解決方案我沒有嘗試過?

創建一個新組,並將gitwww-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用於執行檢查/修復所需的所有命令。

引用自:https://serverfault.com/questions/527095