使用非 root 将 git repo 部署到 web root

Mat*_*son 2 ubuntu permissions sudo git apache-2.2

为使用 git 部署到服务器的生产 Web 服务器设置用户和权限的最佳方法是什么?

背景

运行Ubuntu 12.04,我有apache下提供文件服务/var/wwwwww-data。我还在根用户目录下有一个裸 git 存储库,可以/var/www/example.com在 post-receive 挂钩中结帐。

这工作得很好,但考虑到它是一个生产服务器,我想提高一些安全性并从 root 用户中删除 repo。所以我创建了一个 git 用户并在/home/git. 但是现在我遇到了一个用户拥有存储库而另一个用户拥有 Web 根的事实的权限问题。

我在网上阅读了很多论坛和教程。大多数似乎只使用 root 用户,其他人似乎有更严重的安全问题(例如www-data授予对 repo 的读取权限)。我正在从现实世界的经验中寻找见解,因为有很多方法可以做到这一点。

请注意,post-receive hook 不仅仅是结帐。它还执行一些构建过程,例如运行 Composer 和其他一些可能需要几分钟的 php 脚本。

我尝试了几种解决方案:

我尝试将 git 用户添加到www-data group,然后将 web 根目录重新添加到www-data钩子的末尾。这有两个问题。首先,我必须修改 sudoers 文件,我从中得到的结果是命中注定的。其次,在钩子运行的那几分钟内,检出的文件归 git 而不是www-data,因此站点上的用户可能会收到读取错误。

我尝试将 post-receive 的内容放在另一个文件中,并使用 sudo 执行它。同样,这需要编辑 sudoers 文件,以便 git 用户无需密码即可 sudo。

或者可能是将 repo 留在 root 用户下是较小的邪恶,而我做这一切都是徒劳的。

有没有我没有尝试过的更好的解决方案?

Zor*_*che 5

创建一个新组,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
Run Code Online (Sandbox Code Playgroud)

然后只需将post-receive脚本sudo -u www-data用于执行检查/修复所需的所有命令。