在nginx和php-fpm环境下使用git-post-rereceive-hook



我有一个使用git、gitosis、nginx和php-fpm设置的centos6服务器。

在我们的设置中,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

通常,这会将repo的内容复制到httpdocs文件夹中,但由于安装了php-fpm,并且目录+文件由特定用户所有,gitosis(或任何其他非root用户)无法写入该目录。以下错误表明了这一点:

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

这是有道理的,这也是我所期望的。然而,我想知道在这种特定的情况下,是否有办法绕过这个问题?有没有一种方法可以修改post-rereceive钩子以root身份运行(它目前由gitosis用户运行)或以其他方式使其成功?

需要明确的是:设置没有其他问题,git工作正常,nginx/php-fpm工作正常,但这是一个权限问题,我不太确定如何解决。

您可以使用sudo使挂钩以user1user2user3或任何您的系统需要的方式运行。您需要考虑gitosis用户能够伪装成您的web用户的安全性影响,即使是在有限的范围内。

示例配方

假设post-receive钩子以用户gitorious的身份运行,并假设您的web用户被称为user1user2user3等…

将您当前的post-rereceive挂钩移动到/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

其他用户也是如此。

未测试,所以请在实施之前进行测试!

最新更新