nginx с git-http-backend: недостаточно прав доступа для `git push` с пользователем www-data
Я пытаюсь настроить nginx с помощью fcgiwrap для пересылки запросов под https://<host>/git/<repo>.git
git-http-backend.
На сервере недавно установлен Debian Linux, поэтому в фоновом режиме не должно быть неудобных вещей.
Сценарий ошибки
Сокет fcgiwrap работает как www-data
пользователь и должен иметь доступ к репозиторию git (см. ниже). Тем не менее, при попытке нажать я получаю сообщение ниже git (в связи с проблемой с доступом, я предполагаю):
$ git push origin master
Counting objects: 6, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (6/6), 385 bytes | 0 bytes/s, done.
Total 6 (delta 0), reused 0 (delta 0)
remote: error: insufficient permission for adding an object to repository database objects
remote: fatal: failed to write object
error: unpack failed: unpack-objects abnormal exit
To https://xxx:xxx@127.0.0.1/git/test.git
! [remote rejected] master -> master (unpacker error)
error: failed to push some refs to 'https://xxx:xxx@127.0.0.1/git/test.git'
Настроить
Конфигурация nginx:
server {
server_name xxxxxxx.com;
location ~ /git(/.*) {
auth_basic "Private Git Repository";
auth_basic_user_file /etc/nginx/.htpasswd;
# fcgiwrap is set up to listen on this host:port
fastcgi_pass unix:/var/run/fcgiwrap.socket;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;
# export all repositories under GIT_PROJECT_ROOT
fastcgi_param GIT_HTTP_EXPORT_ALL "";
fastcgi_param GIT_PROJECT_ROOT /opt/git;
fastcgi_param PATH_INFO $1;
fastcgi_param REMOTE_USER $remote_user;
}
}
FastCGIWrap:
$ apt-get install fcgiwrap
$ cat /etc/init.d/fcgiwrap
...
FCGI_USER="www-data"
FCGI_GROUP="www-data"
# Socket owner/group (will default to FCGI_USER/FCGI_GROUP if not defined)
FCGI_SOCKET_OWNER="www-data"
FCGI_SOCKET_GROUP="www-data"
...
Разрешения в /opt/git:
$ chown -R git:git /opt/git/
$ chmod -R 775 /opt/git/
$ chmod -R a+s /opt/git/
$ ls -la /opt/git 0 !193 0jobs
drwsrwsr-x 6 git git 4096 Aug 11 15:21 .
drwxr-xr-x 3 root root 4096 Jul 15 12:01 ..
drwsrwsr-x 7 git git 4096 Aug 12 11:47 test.git
Конфигурация git repo:
$ cat /opt/git/test.git/config
[core]
repositoryformatversion = 0
filemode = true
bare = true
sharedrepository = 1
sharedRepository = 1
[receive]
denyNonFastforwards = true
[http]
receivepack = true
Пользователь nginx www-data
который является членом git
группа:
$ groups www-data
www-data : www-data git
$ cat /etc/group | grep www-data
www-data:x:33:
git:x:1001:www-data
обходные
Странно, если я
chgrp -R www-data /opt/git/
оно работает. Я хотел бы иметь это какgit:git
хоть.chmod a+s /usr/lib/git-core/git-http-*
работает. Теперь я тоже могу сделатьchmod -R 705 /opt/git/
и это работает. Я полагаю, потому что теперь пользователь root выполняет команды. Я сомневаюсь, что это безопасно. Так что не стоит использовать...Используйте SSH. Использование SSH работает, или даже войти в систему как пользователь
www-data
и подталкивание непосредственно к репо работает (поскольку права групп установлены правильно!). Тем не менее, это не вариант, так какhttps
доступ необходим!
Что мне не хватает?
У меня заканчиваются идеи.
Pushing per ssh работает. Если я сделаю chown -R 770 /opt/git/
тогда я не могу даже клонировать или получить через https. Так вроде www-data
пользователь не имеет доступа через git-http-backend
скрипт cgi. Но почему??? Пользователь является участником git
группа и должна иметь групповой доступ!!!
связанные с
- Ошибка при отправке на GitHub - недостаточно разрешений для добавления объекта в базу данных репозитория: основное внимание уделяется разрешениям, но не упоминается ответ на конкретную проблему пользователя nginx, не имеющего доступа через git-http-backend.
1 ответ
Перезагружать!!
Не могу поверить... Простой сервер reboot
решил это.
Я просто попытался это сделать, потому что мне нужно было выходить из системы и снова входить в нее, когда добавлял групповое разрешение для моего пользователя. Похоже, что разрешение вещи иногда не применяются на лету? Вот это да...