У git недостаточно прав для добавления объекта в локальный репозиторий git-сервера.

1

У меня есть www-data работающий с php который контролирует git-сервер. Пользователь www-data создает пользователей Unix (давая ему sudo adduser), и эти пользователи должны контролировать свою собственную личную директорию git, где каждый пользователь может разместить свои репозитории.

Я следовал этому руководству как минимум десять раз, в дополнение к этому, я также следую этому руководству, чтобы создать git-сервер.

  • Apache добавляет пользовательскую bar unix с домашним /var/www/git/bar и у пользователя нет пароля (--disable-password)

  • Пользовательская bar является частью групповых gitusers которая позволяет +rwx членам группы, и имеет свою оболочку, установленную в /usr/bin/git-shell.

  • Это делается для того, чтобы www-data могли получить доступ к его домашнему каталогу и заполнить его репозиториями и ssh-ключами.

  • Домашний каталог скелета также заполнен git-shell-commands а пользовательские www-data создают /var/www/git/bar/.ssh/authorized_keys где он добавляет открытый ключ пользователя foo пользователя.

Когда www-data добавляет нового пользователя, а затем новый репозиторий, он делает:

sudo adduser --disabled password\
             --home /var/www/git/bar\
             --conf /var/www/conf/adduser.conf\
             --ingroup gitusers\
             bar

Вышеупомянутое ^^ выполняется через php. .ssh и authorized_keys принадлежат www-data.

Затем www-data начинает создавать новый каталог и инициализирует его:

  • mkdir/var/www/git/bar/test.git
  • cd/var/www/git/bar/test
  • git --bare init

Мой тестовый пользователь foo может прочитать его из ssh (он просто клонирует пустой репозиторий). Как только я попытаюсь нажать начальную фиксацию:

git clone ssh://foo@localhost:/var/www/git/bar/test.git
cd test
touch readme
vim readme
git add .
git commit -m "init"
git push origin master
[email protected] password:
Counting objects: 6, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (6/6), 411 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 ssh://foo@localhost:/var/www/git/bar/random.git
 ! [remote rejected] master -> master (unpacker error)
error: failed to push some refs to 'ssh://foo@localhost:/var/www/git/bar/random.git'

Меня спрашивают пароль пользователя foo (который является пользователем с открытым ключом).

Это НЕ пользователь Unix, которому принадлежит домашний каталог, который является пользовательской bar которой есть отключенный пароль.

  1. почему меня спрашивают пароль ssh? не должны ли они ssh key позаботиться об этом?
  2. Если я создаю bar с паролем, то я могу использовать этот git-репозиторий, заменив foo@localhost: /var/www/git/bar с помощью bar@localhost: /var/www/git/bar
  3. Когда я вообще не использую ssh://, я все еще могу clone но получаю ту же ошибку при нажатии как foo но не в качестве bar Я включаю пароль.

Что я делаю не так?

Это потому, что разрешения .ssh и authorized_keys слишком открыты или не принадлежат bar?

Даже когда я иду (как Судо) в bar домашнего каталог и сделать все, принадлежащее ему, я все еще получаю ту же ошибку.

Наконец, я установил мой .ssh/config для тестового пользователя foo чтобы:

Host localhost
     Hostname 127.0.0.1
     IdentityFile ~/.ssh/foo
     User foo
  • 1
    Хотя это не ответ на ваш вопрос, я думаю, что вы атакуете это неправильно. Посмотрите на gitolite и, если он (или gitlab) не соответствуют вашим потребностям, посмотрите, как они реализуют, позволяя пользователям иметь частные репозитории. Это намного более простое решение - иметь одного пользователя git для всех пользователей. Многим пользователям Unix трудно добиться успеха в хорошем смысле.
Теги:
ssh

1 ответ

0
Лучший ответ

Оказывается, это действительно разрешения. хвост /var/log/auth.log обеспечил понимание:

Authentication refused: bad ownership or modes for directory/var/www/git/bar

В результате этого я понял, что проблема в том, что весь домашний каталог был доступен группе.

Таким образом, возврат к квадрату, позволяющий www-data быть частью группы с +rwx, не является возможным, так как он ломает ssh.

РЕДАКТИРОВАТЬ:

Комментарий от iveqy был очень мудрым, использование пользователей unix для такого рода операций - это излишество и открывает потенциальные дыры в безопасности, поскольку для этого требуется, чтобы вы эскалировали пользовательские www-data суперпользователю.

Я закончил использование gitolite-admin следующим образом (я добавляю его для будущей ссылки о том, как www-data пользователь apache под Debian/Ubuntu может контролировать гитолит).

инструкции

Веб-сервер apache2 работает как www-data в системе. Все скрипты php выполняются как www-data. Это требует, чтобы мы включили этот пользователь для автоматического управления нашим сервером git.

Чтобы gitolite работал, он требует, чтобы администратор предоставил ключ ssh. Это, в свою очередь, требует, чтобы пользовательские www-data (apache2) имели пару ssh-ключей. Пара ключей должна быть защищена иначе ssh не будет работать:

  • создать нового пользователя git с домашним каталогом в: /var/www/git
  • sudo adduser git --home/var/www/git
  • cd в /var/dir/git и удалить все файлы скелета (.bashrc,.profile,.bash_logout)
  • log локально в качестве пользователя git: su - git и использовать пароль, который вы создали ранее
  • убедитесь, что разрешения для git user home dir установлены на 755 (g + rx)
  • создайте .ssh dir: mkdir.ssh а затем сделайте его закрытым: chmod 700 -R.ssh

Теперь, когда www-data создают ваш ssh-ключ (выход из пользователя git):

  • перейдите в /var/www/ и создайте ./ssh принадлежащую www-данным и с 700 маской.
  • sudo -u www-data ssh-keygen -t rsa

Если все пойдет соответствующим образом, скопируйте файл /var/www/.ssh/id_rsa.pub в /var/www/git/.ssh/

  • предоставить право собственности на ключ для пользователя git: sudo chown git.git.ssh/id_rsa.pub
  • войдите в систему как git: su - git
  • сделать ключ паба приватным: chmod 600.ssh/id_rsa.pub

Время установки gitolite:

  • git clone git://github.com/sitaramc/gitolite
  • mkdir -p $HOME/bin
  • gitolite/install -to $HOME/bin

Установите общедоступный ключ rsa www-data который будет использоваться в качестве администратора гитолита:

  • $HOME/bin/gitolite setup -pk.ssh/id_rsa.pub

Вы должны получить:

Initialised empty Git repository in/var/www/git/repositories/gitolite-admin.git/Initialised empty Git repository in/var/www/git/repositories/testing.git/WARNING: /var/www/git/.ssh/authorized_keys missing; creating a new one (this is normal on a brand new install)

теперь пользователь git настроен. exit из системы: exit

НЕ СКАЗЫВАЙТЕ СПРАВОЧНИК /var/www/git ОТ СЕЙЧАС

Мы будем клонировать его локально и контролировать его оттуда. Клонировать его как пользовательские www-data:

  • сначала создайте локальную копию, принадлежащую www-data: sudo mkdir gitolite-admin && chown -R www-data.www-data gitolite-admin/
  • затем выполните как пользователь www-data команду: sudo -u www-data git clone git@localhost:gitolite-admin gitolite-admin/

Это клонирует gitolite-admin в /var/www/gitolite-admin из которого вы управляете сервером гитолит.

Инструкции по управлению гитолит-сервером см. на странице https://github.com/sitaramc/gitolite.

С этого момента любая команда gitolite, которую вы выполняете, выполняет ее как пользовательские www-data. Любая команда, выполняемая как root или sudo будет разорвать сервер!

PS: Я не несу ответственности, если это нарушит вашу конфигурацию apache. Надеюсь, это поможет любому, кто придет сюда по той же причине, что и я: создание git-сервера. Я открыт для предложений и лучших идей или улучшений.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню