Использование git post-receive hook со средой nginx и php-fpm - PullRequest
2 голосов
/ 02 марта 2012

У меня есть сервер CentOS 6, настроенный с использованием git, gitosis, nginx и php-fpm.

При нашей установке nginx выполняет сценарии php через php-fpm, который настраивается для каждого сайтаоснова для работы в качестве конкретного пользователя в целях безопасности (то есть не все в nginx: nginx), поскольку мы не хотим ситуации, когда если один сайт скомпрометирован, все сайты скомпрометированы.

Наша среда прекрасно работает,но когда задействован 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)

Это имеет смысл, и это то, что я ожидал.Тем не менее, мне интересно, есть ли способ обойти эту проблему в данном конкретном случае?Есть ли способ, которым я могу изменить хук post-receive, чтобы он запускался от имени пользователя root (в настоящее время он запускается пользователем gitosis) или каким-либо другим способом, чтобы он был успешным?

Просто чтобы было ясно: никаких других проблем с настройкой нет, git работает нормально, nginx / php-fpm работает нормально, но это проблема с разрешениями, которую я не совсем знаю, как обойти.

1 Ответ

2 голосов
/ 06 марта 2012

Вы можете использовать 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

Аналогично для других пользователей.

Не проверено, поэтому, пожалуйста, протестируйте перед внедрением!

...