【问题标题】:Using git post-receive hook with nginx and php-fpm environment在 nginx 和 php-fpm 环境中使用 git post-receive 钩子
【发布时间】:2012-03-20 10:52:30
【问题描述】:

我有一个使用 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 挂钩以 root 身份运行(它目前由 gitosis 用户运行)或以其他方式运行以使其成功?

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

【问题讨论】:

    标签: git permissions gitosis php


    【解决方案1】:

    您可以使用sudo 使挂钩以user1user2user3 或您的系统需要的任何方式运行。您需要考虑让gitosis 用户能够伪装成您的网络用户的安全隐患,即使在一定程度上也是如此。

    示例食谱

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

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

    对于其他用户也是如此。

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

    【讨论】:

    • 这个问题是我必须将 gitosis 添加到每个网站的用户组。这反过来会否定让每个用户在权限的角度上相互隔离的原因。我开始认为如果不损害我们建立的系统的完整性,这是不可能的。
    • 我不明白您为什么必须使用这种技术将gitosis 添加到每个网站的用户组? sudo 会以www-data (或任何实际的网络用户)运行结帐脚本。您需要一个单独的结帐脚本,在 /etc/sudoers 中为每个用户匹配一个匹配条目,但如果确实需要,也可以对其进行参数化。
    • 没有单个网络用户,因此 www-data 不适用。我们的服务器在设置时考虑到了相当严格的安全性——每个网站都有自己的用户。这些用户不属于任何组,只属于他们自己的,因此不能修改彼此的文件,这在使用 php-fpm 运行 php 时很重要(因为 php 以用户身份运行)。
    • 我已经更新了文本——希望这可以更清楚地说明如何应用于多个用户。
    • 谢谢,我将对此进行测试并尝试模拟最坏的情况。
    猜你喜欢
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 2014-05-13
    • 2014-10-28
    • 1970-01-01
    • 2011-04-15
    • 2013-06-26
    • 2012-01-02
    相关资源
    最近更新 更多