Správa linuxového serveru: Víceuživatelský Git server s Gitosis

Minulý díl byl věnován zpřístupnění Git repozitářů přes webové rozhraní pomocí webové aplikace Gitweb a také přes Git démona pro read-only přístup. V tomto dílu se dozvíte, jak zpřístupnit Git repozitáře více lidem a definovat pravidla přístupu pomocí nástroje Gitosis.

Úvod

Pokud jste nečetli poslední dva díly, které se věnovaly SCM nástroji Git, základům jeho používání a jeho jednoduchému nasazení na vlastní server, projděte si první díl a druhý díl, abyste byli v obraze.

Představili jsme zde jednoduché techniky zprovoznění centrálního Git repozitáře. Probrali jsme v zásadě dvě možnosti – veřejný read-only přístup k repozitáři prostřednictvím Git démona a kompletní (read-write) přístup přes SSH. Obojí je velmi jednoduché na zprovoznění (je-li vůbec třeba něco zprovozňovat), avšak pro některá použití nemusí takto jednoduché techniky představovat optimální řešení, jelikož jim chybí možnost jemněji definovat pravidla přístupu a hlavně neumožňují bezpečný přístup více uživatelů k jednomu repozitáři. Gitosis je jedním z nástrojů, který umožňuje přístup k repozitářům definovat detailněji a pro více uživatelů. Lze jej integrovat s webovou aplikací Gitweb a Git démonem, i když to v Debianu nefunguje out-of-the-box (postup, jak toho docílit, bude naznačen).

Dodám, že Gitosis neumožňuje úplně nejjemnější dělení přístupových práv. V zásadě umožňuje víceuživatelský přístup k jednotlivým repozitářům a pro každého uživatele (nebo skupinu) umožňuje definovat oprávnění buď k read-only nebo read-write přístupu. Ačkoliv je to oproti dříve představeným metodám podstatné zlepšení, existují ještě sofistikovanější nástroje, jako např. Gitolite.

Gitosis používá ke svému nastavení Git. Při instalaci dojde k vytvoření správcovského repozitáře, prostřednictvím kterého je pak možné měnit nastavení a připravovat půdu pro nové repozitáře. Pro přístup je používán SSH server a veřejné klíče. Pokud vám není jasná problematika použití SSH klíčů, přečtěte si můj Úvod do SSH pro správce. Ve zbytku článku předpokládám, že tuto problematiku ovládáte.

Gitosis je vázán na jednoho konkrétního uživatele, v Debianu je to stejnojmenný uživatel, tedy gitosis. Gitosis řídí přístup jednotlivých uživatelů prostřednictvím konfigurace a SSH klíčů. Žádné uživatelské účty se při práci s ním nezakládají. Z pohledu systému vše probíhá pod jedním uživatelem.

Instalace a zprovoznění Gitosis

Prvním krokem nemůže být nic jiného než nainstalování příslušného balíčku. V repozitářích Debianu je k dispozici stejnojmenný balíček gitosis, který nainstalujte takto:

aptitude install gitosis

Pokud se vás během instalace Debconf nezeptá na SSH klíč, který má být použit pro přístup k repozitáři správce, nedojde k vytvoření tohoto repozitáře, a bude tedy nutné jej vytvořit ručně (obvyklý trik s dpkg-reconfigure gitosis zde nejspíše nezabere, alespoň dle mých pokusů). Ruční vytvoření repozitáře je však velmi jednoduché:

sudo -H -u gitosis gitosis-init < id_rsa.pub

Předpokladem je dostupnost souboru id_rsa.pub s veřejným SSH klíčem, který budete používat pro přístup ke správcovskému repozitáři gitosis-admin.

Nastavení Gitosis

V tuto chvíli byste měli mít možnost naklonovat správcovský repozitář na svém počítači.

git clone gitosis@server.example.org:gitosis-admin.git

Pokud se podíváte do obsahu repozitáře, naleznete soubor gitosis.conf (hlavní konfigurační soubor Gitosis) a adresář keydir. Ten slouží jako úložiště SSH klíčů jednotlivých uživatelů.

Výchozí konfigurační soubor je velmi strohý. Příklad komentovaného konfiguračního souboru pro inspiraci naleznete např. v /usr/share/doc/gitosis/examples/example.conf (platí pro Debian).

Obecné nastavení Gitosis naleznete v bloku [gitosis]:

[gitosis]
gitweb = no
daemon = no

Zde se nastavuje globální zpřístupnění repozitářů Gitwebu a Git démona (aby toto nastavení mělo kýžený účinek, je třeba provést integraci těchto dvou nástrojů s Gitosis, což je naznačeno níže). Zpřístupnění repozitářů těmto nástrojům lze nastavit jak na globální úrovni zde, tak na úrovni jednotlivých repozitářů (viz níže).

Nastavení repozitáře

Nastavení repozitáře není nutné, stačí jméno repozitáře přiřadit konkrétní skupině uživatelů (viz níže). Pokud však chcete nastavit některé parametry repozitáře, vytvořte nový blok s jeho definicí, takto:

[repo mujprojekt]
gitweb = yes
description = Popis mého projektu
owner = Michal Dočekal
daemon = yes

V definici je naznačená integrace s Gitwebem a Git démonem (viz výše). Přístupnost repozitáře přes Gitweb řídí proměnná gitweb, přičemž pokud ji nastavíte na yes, doporučuji vyplnit i proměnné description (popis) a owner (jméno vlastníka). Tyto dvě proměnné slouží primárně pro integraci s Gitwebem. Poslední proměnná, daemon, řídí integraci s Git démonem.

Integrace s Gitwebem

Za účelem integrace Gitosis s Gitwebem upravte hodnoty v konfiguračním souboru /etc/gitweb.conf, takto:

$projectroot = "/srv/gitosis/git";
$projects_list = "/srv/gitosis/gitosis/projects.list";
$strict_export = "true";

Integrace s Git démonem

Integrace s Git démonem je trošku složitější. V první řadě je potřeba upravit parametry startovacího skriptu Git démona v souboru /etc/service/git-daemon/run. Zde nalezněte řádku se specifikací --base-path:

--base-path=/var/cache /var/cache/git

Jak je vidět, tato cesta neukazuje do úložiště Gitosis, tudíž v tomto stavu Git démon jednotlivé repozitáře „neuvidí“. Nastavte tedy správnou cestu, takto:

--base-path=/srv/gitosis/git /srv/gitosis/git

Soubor uložte a následně restartujte Git démona:

sv restart git-daemon

Poté by povolené repozitáře mělo být možné klonovat, takto:

git clone git://server.example.org/mujprojekt1.git

Nastavení uživatelů a přístupových práv

Výchozí nastavení Gitosis zahrnuje skupinu gitosis-admin, jejíž členové mají práva k repozitáři správce:

[group gitosis-admin]
writable = gitosis-admin
members = docekal

Pokud byste chtěli vytvořit skupinu skupina obsahující uživatele milan a jan s přístupem k repozitářům mujprojekt1mujprojekt2 a mujprojekt3 tak, aby uživatelé skupiny měli přístup k repozitářům mujprojekt1 a mujprojekt2 pouze pro čtení a k repozitáři mujprojekt3 i se zápisem, vypadala by konfigurace takto:

[group skupina]
writable = mujprojekt3
readonly = mujprojekt1 mujprojekt2
members = milan jan

Mezi členy (members) může patřit i jiná skupina – tu je ovšem třeba označit zavináčem na začátku:

members = @nejaka_skupina

U uživatelů se předpokládá existence souborů s jejich SSH klíči. Uživatel milan by měl mít klíč v keydir/milan.pub. Po nastavení a přidání klíčů změny commitněte a nahrajte na server:

git add gitosis.conf keydir
git commit -m 'nastaveni repositaru'
git push

Workflow pro jednotlivé repozitáře

Ve chvíli, kdy máte hotové nastavení oprávnění a repozitářů, je konečně můžete začít tvořit a nahrávat na server. Sada příkazů od vytvoření repozitáře až k jeho prvotnímu nahrání na server by mohla vypadat takto:

mkdir projekt
cd projekt
git init
git remote add origin gitosis@server.example.org:projekt.git
# vytvoření souborů a adresářů s obsahem repozitáře
git add *
git commit -m "initial commit"
git push origin master:refs/heads/master

Význam většiny příkazů by měl být patrný. Jádro postupu tvoří dva příkazy. První slouží k přidání serveru s Gitosis jako vzdáleného repozitáře:

git remote add origin gitosis@server.example.org:projekt.git

Druhý pak v prázdném repozitáři na serveru vytvoří „master“ větev z místní „master“ větve. Příkaz nemusíte opakovat, podruhé stačí git push.

git push origin master:refs/heads/master