使用git post-receive hook与nginx和php-fpm环境

时间:2012-03-01 21:55:44

标签: git permissions gitosis php

我使用git,gitosis,nginx和php-fpm设置了CentOS 6服务器。

通过我们的设置,nginx通过php-fpm执行php脚本,该脚本基于每个站点配置为出于安全目的而作为特定用户运行(即不是全部在nginx:nginx下)因为我们不希望如果一个站点遭到入侵,所有站点都会受到攻击。

我们的环境运行良好,但是,当涉及到git时,php-fpm会产生一个基本问题。

在本地成功运行以下命令后:

$ git push origin

我的post-receive挂钩运行:

#!/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-receive hook以root身份运行(目前由gitosis用户运行)或以其他方式运行以使其成功?

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

1 个答案:

答案 0 :(得分:2)

您可以使用sudo来使user1user2user3或您系统需要的任何内容都可以运行。您需要考虑让gitosis用户伪装成您的网络用户的安全隐患,即使是在有限的范围内。

示例食谱

假设post-receive挂钩以用户gitorious运行,并假设您的网络用户被称为user1user2user3等......

将您当前的接收后挂钩移至/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

与其他用户类似。

未经测试,请在实施前进行测试!

相关问题