git、gitosis、nginx、およびphp-fpmでCentOS 6サーバーをセットアップしました。git post-receiveフックをnginxとphp-fpm環境で使用する
私たちのセットアップでは、nginxはphp-fpmを使ってPHPスクリプトを実行します。php-fpmは、セキュリティ目的のために特定のユーザーとして実行するようサイトごとに構成されています(nginx:nginxのすべてではありません)。 1つのサイトが侵害された場合、すべてのサイトが侵害される状況。
私たちの環境は素晴らしいですが、gitが関わっているときは、php-fpmが根本的な問題を作り出しています。成功したローカルで次のコマンドを実行している際に
:私のポスト受けるフックが実行され
$ git push origin
:
#!/bin/sh
GIT_WORK_TREE=/var/www/vhosts/example.com/httpdocs git checkout -f
通常、これはしかし、をhttpdocsフォルダにレポの内容をコピーしますphp-fpmがインストールされていてディレクトリ+ファイルが特定のユーザによって所有されているため、gitosis(または他のroot以外のユーザ)はディレクトリに書き込むことができません。これは、次のエラーによって明らかになります。
remote: error: git checkout-index: unable to create file index.php (Permission denied)
これは意味があり、それは私が期待するものです。しかし、私はこの特定のケースでこの問題を回避する方法があるのだろうかと思いますか?ポスト受信フックを変更してルートとして実行する方法(現在はgitosis
ユーザが実行しています)やそれが成功するための他の方法ではありますか?
セットアップに他の問題はありません。gitはうまく動作しますが、nginx/php-fpmは正常に動作しますが、これは回避方法がわかりません。
この問題は、すべてのウェブサイトのユーザーグループにgitosisを追加する必要があるということです。これは、アクセス許可の観点から、各ユーザーが互いに隔離されている理由を無効にします。私たちが設定したシステムの完全性を損なうことなく、これが不可能ではないと考え始めています。 – Brendan
なぜこのテクニックを使って各ウェブサイトのユーザグループに 'gitosis'を追加しなければならないのでしょうか? 'sudo'はチェックアウトスクリプトを' www-data'(または実際のウェブユーザが何であれ)として実行します。 '/ etc/sudoers'に一致するエントリを持つ別のチェックアウトスクリプトが各ユーザに必要ですが、本当に必要ならばこれをパラメータ化することができます。 – msandiford
ウェブユーザーは一人もいないので、www-dataは適用されません。私たちのサーバーは、厳重なセキュリティを念頭に置いて設定されています。すべてのWebサイトには独自のユーザーがいます。これらのユーザは、どのグループにも所属していないので、それぞれのファイルを変更することはできません。これは、php-fpmでphpを実行する場合(phpはユーザとして実行されるため)重要です。 – Brendan