设置使用git部署到服务器的生产Web服务器的用户和权限的最佳方法是什么?
背景
运行Ubuntu 12.04,我在/var/www下将Apache服务文件作为www-data 。 我在root用户目录下也有一个纯粹的git repo,它将在post-receive hook中检出到/var/www/example.com 。
这工作得很好,但考虑到它是一个生产服务器,我想扣上一些安全性,并从根用户删除回购。 所以我创build了一个git用户,并在/home/git下设置了repo。 但现在我有权限问题的事实,一个用户拥有回购,而另一个用户拥有网站的根。
我在网上阅读了很多论坛和教程。 大多数似乎只是使用root用户,其他人似乎有更糟糕的安全问题(如通过回购给www-data读取权限)。 我正在寻找真实世界的经验,因为有很多方法可以做到。
作为一个说明,后接收钩不仅仅是结帐。 它还执行一些构build过程,如运行Composer和一些其他的PHP脚本,可能需要几分钟的时间。
我尝试了几个解决scheme:
我尝试将git用户添加到www-data group ,然后将web根目录重新命名为www-data 。 这有两个问题。 首先,我必须修改sudoers文件,我从中得到的结果是碰撞和错过。 其次,在钩子运行的几分钟内,检出的文件由git拥有,而不是www-data ,因此站点上的用户可能会读取错误。
我试着把post-receive的内容放在另一个文件中,然后用sudo执行。 同样,这需要编辑sudoers文件,以便git用户可以不使用密码sudo。
或者,可能是将根目录下的回购权限放在了较小的位置,我无所作为。
有没有更好的解决scheme,我还没有尝试过?
创build一个新的组,然后添加git和www-data用户。 然后设置你的git裸仓库,始终使用你创build的组作为仓库文件的gid。 有了新的裸呼吸,你可以像这样使用git init --shared=group 。 ( 参考 )这将允许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来执行检查/修复所需的所有命令。
我认为有更好的方法来处理这种情况。
首先,我将从普通的git切换到某种基于angular色的访问控制(RBAC),比如gitolite 。
我也build议阅读这篇文章,描述一个非常类似于你需要的工作stream程。
要为您的要求实施解决scheme,步骤将是:
gitolite使用RSA密钥授予RBAC 在我看来,好处很多:
post-update挂钩脚本中的任何内容 git仓库进行,所以审计变成了一个简单的任务( git log和git blame ) 在一个标准的mod_php /var/www/example.com可以由一个git用户拥有,任何需要被php写入的文件/文件夹都需要由www-data(或者拥有666/777权限)所有。 在这种情况下,一个虚拟主机可以写入其他的虚拟主机文件。
或者:如果你正在运行mod_php,你可以添加例如mod_ruid2到Apache,然后用他自己的uid运行每个虚拟主机。 在这种情况下,这将是git用户。 或者,如果你喜欢fastcgi像设置和每个虚拟主机拥有自己的php-fpm池,则为php-fpm。 这样,每个虚拟主机都可以写入自己的文件,而不是其他虚拟主机的文件。
取决于你喜欢哪种方式。