Свой сервер центральных Git-репозиториев

Установка Git на сервер

apt install git-core

Репозитории

Условимся, что у нас будет mygit пользователь, содержащий центральные Git репозитории. Клиенты будут подключаться к mygit пользователю через Git по SSH, однако напрямую по SSH доступ следует отключить.

Сперва создадим mygit пользователя:

adduser mygit

Создание репозитория

Дальнейшая работа необходима от имени этого пользователя для того, чтобы каталоги и файлы имели соответствующие права, группу и владельца. Войдём под ним:

su mygit
cd
mkdir название_репозитория.git
cd название_репозитория.git/
git init --bare

Когда все репозитории созданы, выходим из пользователя mygit:

exit

Работа без ввода пароля

Сейчас любое соединение клиента требует ввода пароля пользователя mygit. Чтобы клиенты могли работать с Git репозиториями пользователя без ввода пароля, необходимо добавить публичные ключи клиентов (содержимое файлов id_rsa.pub) в ~/.ssh/authorized_keys.

Но сперва установка OpenSSH клиента и сервера осуществляется командой

apt install ssh

Конфигурация SSH

С помощью редактора mcedit (или nano, в случае mcedit требуется сперва установить mc) откроем файл /etc/ssh/sshd_config:

mcedit /etc/ssh/sshd_config

Убедитесь, что следующий параметр имеет указанное значение:

PermitEmptyPasswords no

Здесь можно указать другой порт для SSH, но в этом случае, при последующем подключении клиентами, команда подключения должна будет иметь подобный вид:

ssh -p ПОРТ логин@сервер

Перезапустить SSH сервер можно командой:

service ssh restart

Чтобы в последующем не вводить логин, сервер и порт, можно задать пресет ssh в .ssh/config, например,
так:

Host preset1
HostName IP_адрес_или_домен
User имя_пользователя
Port порт

и уже авторизоваться по

ssh preset1

Клиенты

У пользователей, которые будут подключаться к серверу через SSH или Git (по SSH), должен быть установлен SSH клиент и сгенерированы ключи. Проверить, сгенерирован ли ключ, можно по наличию файла ~/.ssh/id_rsa.pub . В случае отсутствия, необходимо его сгенерировать, например, с помощью следующей команды:

ssh-keygen -t rsa -C "email@сервер"

Пароль можно не устанавливать.

Затем добавьте ключ в ssh-agent:

ssh-add ~/.ssh/id_rsa

Авторизация по ключу

Чтобы при каждом соединении с SSH и Git (он будет у нас работать тоже через SSH) не вводить пароль, нужно создать файл /home/mygit/.ssh/authorized_keys на сервере.

Обратите внимание: для создания каталога .ssh (если таковой отсутствует) и файла authorized_keys необходимо быть авторизованным под самым тем пользователем, в домашнем каталоге которого осуществляются действия, то бишь под mygit. Либо после установить соответствующие права, группу и владельца.

В этом файле на каждой строке должно быть содержимое публичного ключа (~/.ssh/id_rsa.pub) клиентов этого пользователя. В конце файла authorized_keys должна быть пустая строка.

Иными словами, если у нас имеется server_user_1, к которому будет осуществляться доступ через ssh клиентами client_user_1 и client_user_2, то в домашнем каталоге пользователя server_user_1 файл ~/.ssh/authorized_keys должен иметь три строки:

содержимое id_rsa.pub client_user_1
содержимое id_rsa.pub client_user_2
(пустая строка)

Отключаем прямой доступ к SSH

Когда все центральные репозитории созданы, а публичные ключи клиентов добавлены в соответствующий файл, и всё у всех работает, пора отключить прямой доступ к пользователю mygit по SSH.

Здесь и далее работаем от имени root. Узнаем полный путь к оболочке git-shell:

which git-shell

И запоминаем.

Затем открываем файл /etc/passwd в mcedit (или в другом редакторе, например, nano):

mcedit /etc/passwd

Находим (скорее всего в конце файла) строчку, начинающуюся на mygit, и вместо /bin/bash (или /bin/sh, далее буду указывать /bin/bash) оболочки указываем полный адрес оболочки git-shell. Например, /usr/bin/git-shell. Не удалите перенос строки в конце файла. Сохраняем.

Теперь доступ к пользователю mygit через SSH разрешён только для Git.

Однако ранее использованная команда «su mygit» тоже работать не будет! Поэтому, когда необходимо добавить новый публичный ключ в authorized_keys или создать новый центральный репозиторий, то сперва потребуется в файле /etc/passwd заменить git-shell на прежнюю оболочку (/bin/bash), войти под пользователем (su mygit), произвести необходимые изменения, выйти к root (exit), и затем снова заменить оболочку пользователя в файле /etc/passwd на git-shell. Довольно не удобно, думаю, что в этой ситуации следует поступить как-то иначе, но пока не знаю как.

Развернуть репозиторий на клиенте

На клиентах развёртывать репозиторий просто:

git clone mygit@сервер:название_репозитория.git конечный_каталог

Если порт отличается от стандартного, то уже так:

git clone ssh://mygit@сервер:порт/home/mygit/название_репозитория.git конечный_каталог
 32   1 мес  
Популярное