我使用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工作正常,但这是一个权限问题,我不太清楚如何解决。
答案 0 :(得分:2)
您可以使用sudo
来使user1
,user2
,user3
或您系统需要的任何内容都可以运行。您需要考虑让gitosis
用户伪装成您的网络用户的安全隐患,即使是在有限的范围内。
示例食谱
假设post-receive
挂钩以用户gitorious
运行,并假设您的网络用户被称为user1
,user2
,user3
等......
将您当前的接收后挂钩移至/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
与其他用户类似。
未经测试,请在实施前进行测试!