У меня есть 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
которой есть отключенный пароль.
bar
с паролем, то я могу использовать этот git-репозиторий, заменив foo@localhost: /var/www/git/bar
с помощью bar@localhost: /var/www/git/bar
ssh://
, я все еще могу clone
но получаю ту же ошибку при нажатии как foo
но не в качестве bar
Я включаю пароль.Что я делаю не так?
Это потому, что разрешения .ssh
и authorized_keys
слишком открыты или не принадлежат bar
?
Даже когда я иду (как Судо) в bar
домашнего каталог и сделать все, принадлежащее ему, я все еще получаю ту же ошибку.
Наконец, я установил мой .ssh/config
для тестового пользователя foo
чтобы:
Host localhost
Hostname 127.0.0.1
IdentityFile ~/.ssh/foo
User foo
Оказывается, это действительно разрешения. хвост /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
/var/dir/git
и удалить все файлы скелета (.bashrc,.profile,.bash_logout)su - git
и использовать пароль, который вы создали ранее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
будет разорвать сервер!