В очередной раз напоминаю, что я не профессиональный администратор и возможно приведен...
В очередной раз напоминаю, что я не профессиональный администратор и возможно приведенный ниже вариант не отличается правильностью и безопасностью. Единственное за что я могу поручиться - этот вариант рабочий. Кроме того, здесь не пойдет речь о разделении прав внутри репозитория или репозиториев, все репозитории созданные по такому шаблону будут доступны для всех пользователей, которые будут иметь доступ к отладочному серверу и будут находиться в группе доступа к git. Я пишу о настройке под Debian.
Исходные
- Есть NN разработчиков
- Есть сервер на котором эти разработчики все вместе трудятся каждый под своей учетной записью
- Необходимо на этом сервере разместить git репозиторий с общим доступом для всех этих разработчиков
Порядок действий
-
Создаем отдельного пользователя
useradd git
Задаем ему зубодробильный пароль и радостно забываем его.
-
Теперь надо авторизоваться под этим пользователем (вообще можно и от рута все сделать, но так проще будет) и создать первый общий репозиторий
su -l git # авторизуемся как пользователь git (тут по идее нужен рутовый пароль)
mkdir my-repo-name # создаем папку под репозиторий
chmod 770 my-repo-name # полный доступ владельцу и группе
chmod +s my-repo-name # устанавливаем в этой папке наследование прав для группы
cd my-repo-name # заходим в папку репозитория
git init --bare --shared # инициализировали репозиторий (см. git help init)
С репозиторием все. Теперь нужно раздать доступ.
-
Всех пользователей, которые будут иметь доступ к git нужно добавить в соответствующую группу. Для этого поглядим что за группа у пользователя git
whoami # git
groups # git
Теперь каждого кому нужен доступ в git добавляем в эту группу, делать это нужно с рутовыми привилегиями понятное дело
usermod -a -G git user_login # добавляем пользователя в группу (см. usermod --help)
Если решим у пользователя доступ к git отобрать надо будет просто его убрать из этой группы, вот так:
deluser user_login git # удаляем пользователя из группы (см. deluser --help)
groups user_login # смотрим в каких группах сейчас выбранный пользователь состоит
Все, по паролю доступ к git уже есть, то есть вот в такой манере
mkdir test-repo # создали папку под репозиторий
cd test-repo # зашли в неё
git clone ssh://user_login@my-host.com/home/git/test-repo . # клонируем репозиторий
git remote -v # куда смотрит локальный репозиторий (см. git --help remote)
Правда, при каждом push или pull запросе нужно будет вводить пароль. Казалось бы и так нормально, но..
ЕСТЬ СПОСОБ УДОБНЕЕ :)
Чтобы не вводить на каждый pull или push пароль, можно прикрутить доступ по публичному ключу. Для этого каждый разработчик должен сгенерить на своей локальной машине публичный ключ и прислать его нам. Сделать это можно так
ssh-keygen -t rsa # тут нас попросят задать имя ключа и ключевую фразу, нужно её запомнить
После этой процедуры сгенерится два ключа ~/.ssh/key-name и ~/.ssh/key-name.pub который собственно и является публичным ключем. Вот эти публичные ключи и должны прислать вам разработчики. Теперь на сервере их нужно добавить к авторизованным ключам для пользователя git.
su -l git # заходим под пользователем гита
cd ~ # переходим в домашнюю папку
mkdir .ssh # создаем папку для конфигов если её нет
cat key-name.pub >> .ssh/authorized_keys # добавляем в конец файла авторизованных ключей
Теперь на стороне разработчика нужно один раз авторизоваться с указанием конкретного ключа
ssh git@dev-host.com -i ~/.ssh/key-name # попросят ввести пароль от ключа, который был задан при генерации
Все, после этой процедуры постоянно вводить пароль для авторизации не потребуется. Все разработчики будут авторизовываться по ключу как пользователь git, а значит заморока с наследованием прав на папки больше не нужна. И теперь для добавления нового репозитория достаточно просто сделать следующее
su -l git # вошли как пользователь git
cd ~ # перешли в хомяк
mkdir new-repo # папка под репозиторий
cd new-repo # зашли в папку
git init --bare # создали пустой репозиторий
Такой репозиторий тут же станет доступен всем пользователям которые ходят по публичному ключу. Для разработчиков это будет выглядеть вот так:
mkdir new-project
cd new-project
git clone git@dev-host.com:new-repo .
Осталось добавить, что нужно репозитории регулярно резервировать, "во избежание" так сказать. Чтобы отобрать у пользователя доступ к гиту во втором случае (с публичным ключем), нужно определить его публичный ключ и удалить его из ~/.ssh/authorized_keys на сервере. Все ключи подписаны, так что возможно получится вычислить его по подписи. Если же не удастся.. то придется либо перезаписывать всем доступы, либо последовательно их отключать и смотреть у кого отвалится доступ. Как-то так :) В заметке нет ничего нового, почти все это можно прочитать
здесь и
здесь.
p.s.: хорошо бы заглушить вход в консоль для пользователя git.
sudo vim /etc/passwd
Ищем строку вида:
git:x:1000:1000::/home/git:/bin/sh и приводим её к вот такому виду
git:x:1000:1000::/home/git:/usr/bin/git-shell. Надо это затем, чтобы пользователь git не мог зайти в консоль и погрохать все репозитории, например.