Git
Chapters ▾ 2nd Edition

4.4 Git на сервері - Налаштування Серверу

Налаштування Серверу

Розглянемо покрокове налаштування SSH доступу на сервері. У цьому прикладі, ми використаємо метод авторизованих ключів (authorized_keys) для авторизації ваших користувачів. Ми знову припустимо, що на вашому сервері стандартний дистрибутив Лінукс, наприклад Ubuntu.

Note

Чимало з того, що тут описано, може бути автоматизовано за допомогою команди ssh-copy-id замість того, щоб копіювати й встановлювати публічні ключі вручну.

Спершу, створимо користувача git та теку .ssh для цього користувача.

$ sudo adduser git
$ su git
$ cd
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys

Далі, треба додати публічні SSH ключі якогось програміста до файлу authorized_keys користувача git. Припустимо, що у вас є перевірені публічні ключі та ви їх зберегли до тимчасових файлів. Нагадаємо, публічні ключі виглядають схоже на:

$ cat /tmp/id_rsa.john.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
dAv8JggJICUvax2T9va5 gsg-keypair

Ви просто долучаєте їх до файлу authorized_keys користувача git в його теці .ssh:

$ cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.josie.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.jessica.pub >> ~/.ssh/authorized_keys

Тепер ви можете налаштувати порожнє сховище для них за допомогою git init з опцією --bare, яка створює сховище без робочої теки:

$ cd /srv/git
$ mkdir project.git
$ cd project.git
$ git init --bare
Initialized empty Git repository in /srv/git/project.git/

Після цього, Джон, Джосі та Джесіка можуть викласти першу версію свого проекту до того сховища, якщо додадуть його як віддалене сховище та викладуть до нього гілку. Завважте що хтось має заходити до машини та створювати чисте сховище щоразу, коли ви хочете додати проект. Використаймо gitserver як ім’я хосту (hostname) серверу, на якоми ви налаштували користувача git та сховище. Якщо ви ваш сервер працює у внутрішній мережі, та ви налаштуєте DNS щоб ім’я gitserver вказувало на ваш сервер, то ви можете використовувати команди як і раніше (припустимо, що myproject це існуючий проект з файлами):

# на машині Джона
$ cd myproject
$ git init
$ git add .
$ git commit -m 'initial commit'
$ git remote add origin git@gitserver:/srv/git/project.git
$ git push origin master

Після цього, усі інші можуть зробити клон цього сховища, та викладати зміни назад так само легко:

$ git clone git@gitserver:/srv/git/project.git
$ cd project
$ vim README
$ git commit -am 'fix for the README file'
$ git push origin master

За допомогою цього метода, ви можете швидко отримати працюючий сервер Git з доступом на читання та запис для декількох програмістів.

Зауважте, що наразі усі ці користувачі також можуть заходити на сервер та отримують доступ до оболонки (shell) як користувач git. Якщо ви не хочете цього дозволяти, вам треба змінити програму оболонки на щось інше у файлі passwd.

Ви легко можете обмежити користувача git до виключно активності Git за допомогою утиліти git-shell, що входить до поставки Git. Якщо ви вкажете її для вашого користувача git, як програму, що запускається при вході, то користувач git не зможе здобути нормальний доступ до вашого серверу. Щоб цим скористатись, задайте git-shell замість bash чи csh як оболонку при вході для вашого користувача. Щоб це зробити, треба спочатку додати git-shell до /etc/shells, якщо його там ще нема:

$ cat /etc/shells   # перевірте, може `git-shell` вже є у файлі. Якщо ні...
$ which git-shell   # переконайтесь, що git-shell присутній на вашій системі.
$ sudo vim /etc/shells  # та додайте шлях до git-shell за допомогою останньої команди

Тепер ви можете відредагувати оболонку для користувача за допомогою chsh <ім'я користувача> -s <оболонка (shell)>:

$ sudo chsh git  -s $(which git-shell)

Тепер користувач git може використовувати з’єднання SSH виключно щоб викладати та забирати сховища Git, та не може зайти до машини. Якщо ви спробуєте, ви побачите відмову від входу, схожу на:

$ ssh git@gitserver
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to gitserver closed.

Тепер мережеві команди Git продовжать працювати без проблем, проте користувачі не зможуть отримати оболонку. Як і стверджує вивід, ви тепер можете створити теку в домашній теці користувача git, що трохи змінити поведінку команду git-shell Наприклад, ви можете обмежити команди Git, які прийме сервер, або ви можете змінити повідомлення, яке бачать користувачі, якщо вони спробують зайти через SSH. Виконайте git help shell для докладнішої інформації про це.