純規の暇人趣味ブログ

手を突っ込んで足を洗う

Ubuntu(またはRaspbian)でGitサーバ(Gitolite)をセットアップする

      2016/07/09    HimaJyun

世の中には僕のような様々な(どうでも良い)事情があるため(と言う事を理由にして)自分でGitサーバを建てようとする(少々奇特な)人間も居ます。

だいたいそう言う奴に限って(メンバーは自分1人なのに)やたらとセキュリティを気にしたりするものです。

そこで、今回はGitのユーザ認証をとても強力にする「Gitolite」でGitサーバをセットアップしてみようと思います。

Gitolite

Gitの惜しい点はユーザ認証の機能が少々物足りない事です、そりゃ、まぁ、Smart HTTPでLDAP認証とかにすれば行けるんでしょうけれども……

Gitoliteはその「物足りない」ユーザ認証を強化してくれます、レポジトリ別のアクセス権は当然ながら、ブランチ別、正規表現に一致する物、なども可能です。

と、説明しなくてもここを見ている方であればご存知かもですね。

前提条件

以下の様な状態であると仮定して話を進めます。

  • Ubuntu 16.04(またはRaspbian、と言うか*nix系ならどれでもほぼ同じ手順で行けるはず)
  • git、sshがインストール済み(例:sudo apt-get install git openssh-server)
  • レポジトリは「/var/git」
  • Gitoliteを動作させるユーザは「git」

インストール

さて、さっさとセットアップしてコーディングを再開したいですね。

管理者用鍵ファイルの用意

普段使っているPCでGitoliteの管理者となるアカウント用のSSH鍵を作成しておきましょう。

ssh-keygen -t rsa -f <鍵ファイル名>

ここで指定した<鍵ファイル名>がGitoliteから管理する際(すなわち、アクセス権を設定する際)のユーザ名になるので、分かりやすい名前にしておきましょう。(今回は「git-admin」として話を進めましょう)

コマンドを実行した後に作成される<鍵ファイル>.pub(今回の場合であればgit-admin.pub)を適当な方法でGitサーバに送信しておきましょう。

gitユーザの作成

Gitoliteを動作させるためのユーザ「git」ユーザを作成しましょう。

ただ、Gitoliteはユーザのホームディレクトリ(デフォルトだと/home以下)にレポジトリをセットアップしようとする(と言うかsshの仕様的にそうせざるを得ない?)ので、/var/gitにセットアップする事が出来ません。

なので、ホームディレクトリとして/var/gitを指定してユーザを追加しようと思います。(ホームディレクトリが/var/gitにあるのは気分的にしっくり来ませんが、レポジトリが/home/gitにあるのもしっくり来ません……)

ホームディレクトリの指定は「-d」オプションです、ぶっちゃけこう言う時以外には使い道なんてなさそうですが……

sudo useradd -d /var/git -m -s /bin/bash git

セットアップ

鍵ファイルは事前に「git」ユーザから読み込めるようにしておく必要があるでしょう。

sudo mv <鍵ファイルのパス>/git-admin.pub /var/git/git-admin.pub
sudo chown git:git /var/git/git-admin.pub

そして以下のコマンドを順に実行すれば良いでしょう。

sudo su - git
git clone git://github.com/sitaramc/gitolite
mkdir -p ~/bin
gitolite/install -to ~/bin

追:一時ディレクトリを作成して、その中でclone、作業が終わったら一時ディレクトリごと削除、と言う方法がありますが(と言うかこのサイトでも当初そう書いていた)後の更新の事を考えたらcloneしたgitoliteのソースは保管しておいた方が良いです。

次に、Gitoliteをセットアップします、Gitoliteのセットアップは以下のコマンドです。

~/bin/gitolite setup -pk ~/git-admin.pub

後は要らないファイルを消してしまいましょう。

rm -rf ~/git-admin.pub

パスワードも一応設定しておきましょう。

# gitユーザからログアウト
exit
sudo passwd git

使い方

セットアップも終わりましたし、さっそく使ってみましょうか。

(ここで紹介する以外にも、もっと高度な事も出来るらしいです。)

普通に使う

基本的にはSSHを使ってGitを利用する時と同じでしょう。

ただ、鍵ファイルはもれなくid_rsa.pub以外になっているでしょうから、~/ssh/config(Git for WindowsならC:\Program Files\Git\etc\ssh\ssh_config)に設定が必要です。

こんな感じで(vegito.jyn.jpはGitサーバのアドレス、こいつがスーパーベジット!!、え?、Gitの読みは「ギット」だって?、知っていますわよ。)

Host vegito.jyn.jp
	User git
	IdentityFile ~/.ssh/git-admin

後は普通にいつも通り

git clone ssh://vegito.jyn.jp/gitolite-admin.git

フルパスを入れなくて良いのでとても楽

ユーザの追加

Gitoliteの管理は基本的に設定変更->プッシュ、な感じ。

予めメンバーからSSHのカギを受け取って保存しておき、gitolite-adminレポジトリをcloneしてkeydir/に「<受け取った鍵>.pub」を追加する。

コミットすれば追加完了(ただし権限を設定しないと何も見られない)

git add keydir/.
git commit -m "適当なメッセージ"
git push origin master

逆にユーザを削除する場合はこの鍵ファイルを消せばいいのかな?

レポジトリの追加(権限の設定)

gitolite-adminレポジトリをcloneしてconf/gitolite.confを開く

以下の様に追記

repo <レポジトリの名前>
    <権限> = <ユーザ>

# 例
# repo hoge
#     R = goku
#     RW = vegeta
#     RW+ = vegito
#     - = buu

権限に設定出来るのは以下の通り

  • R = 読み取り許可
  • RW = 読み書きを許可、
  • RW+ = RWに加えて歴史の書き換えとかも出来る
  • - (マイナス) = 拒否

例の設定だとhogeレポジトリに対して

  • gokuに読み取り権限
  • vegetaに読み書き権限
  • vegitoに読み書き、歴史の改変権限
  • buuは拒否

みたいな具合です。

コミットしてプッシュ!!

git commit -am "適当なメッセージ"
git push origin master

レポジトリの削除

例えば、内部で作っていた物をGitHub上に公開する場合など、サーバ上のレポジトリが必要なくなった場合などは以下の通り。

  1. まずは、gitolite-adminレポジトリをcloneしてconf/gitolite.confを開く
  2. 次に、要らなくなったレポジトリの設定を削除。
  3. commit->pushでGitoliteの管理から削除される。
  4. レポジトリのあるサーバにログインしてレポジトリの実体を削除
sudo rm -r /var/git/repositories/hoge.git

レポジトリ名の変更

削除の応用ですわね。

  1. まずは、gitolite-adminレポジトリをcloneしてconf/gitolite.confを開く
  2. 変更したいレポジトリの名前を変更
  3. commit->pushでGitoliteの管理上の名前変更される。
  4. レポジトリのあるサーバにログインしてレポジトリの実体を名前変更
sudo su - git
cd /var/git/repositories
mv <前の名前>.git <新しい名前>.git

Gitoliteの更新

ここでの説明通りに進んでいれば「gitolite」ディレクトリにcloneしたソースコードが残っていると思うので(無ければもう一度cloneして下さい)、それを利用します。

# gitユーザに切り替え
sudo su - git
# もしgitoliteのソースコードを消してしまったのであれば再度clone
#git clone git://github.com/sitaramc/gitolite
# 更新
cd gitolite
git pull
# 再度installコマンドを実行する
./install -to ~/bin
# セットアップコマンドを再実行
~/bin/gitolite setup

管理者の鍵ファイルを更新したい

例えばHDDがぶっ飛んでGitoliteの管理者の鍵ファイルを失った場合、鍵ファイルを更新する事が出来ます。

まずはどの様な手法でも良いので新しい鍵ファイルをサーバに転送しましょう、また、この際、新しい鍵ファイルは元のユーザ名と同じにしておく必要があります(例えば、adminユーザの鍵を失ったのであればadmin.pub、のように)

今回は/tmp/admin.pubに新しい鍵を用意したと仮定します。

と言っても簡単です、もう一度gitolite setupコマンドを使用するだけです。

sudo su - git
~/bin/gitolite setup -pk /tmp/admin.pub

鍵ファイル名(ユーザ名)を変更したい

例えば、あなたの考え方が突然くるっぱして(管理者含む)ユーザ名を変更したくなったとします。

ユーザの追加、削除の要領で、gitolite-adminレポジトリを操作するだけで簡単に出来ます。

例として、adminユーザをnewadminユーザに変更したくなったとしましょう。

先にnewadminユーザの鍵ファイルを作成して下さい(元の鍵をコピーしたら重複で無視されるため)、例として~/.ssh/newadmin.pubに作成したとします。

作業は普段gitolite-adminレポジトリを操作しているPCで完結します。

# gitolite-adminレポジトリをcloneしていなければcloneする
#git clone ssh://gitrepo/gitolite-admin.git
cd gitolite-admin
# 鍵をコピー
cp ~/.ssh/newadmin.pub keydir/newadmin.pub
# 鍵の追加
git add keydir/.

次に、権限を書き換えます。

エディタで「conf/gitolite.conf」を開きましょう。

editor conf/gitolite.conf

例えば、以下の様に設定されているとします。

repo gitolite-admin
  RW+ = admin

これを、以下の様に変更します。

repo gitolite-admin
  RW+ = admin
  RW+ = newadmin

でもって、commitしてpushする

git commit -am "rename admin account."
git push origin master

要は、全く同じ権限を持つ新しいユーザを追加した訳ですね(そうしないと失敗した時に面倒)

その後、ssh_configの設定を更新するなどして新しい鍵を利用するようにしましょう。

#Host gitrepo
#  HostName 192.168.1.x
#  User git
#  IdentityFile ~/.ssh/admin
Host gitrepo
  HostName 192.168.1.x
  User git
  IdentityFile ~/.ssh/newadmin

新しいアカウントでclone出来るか試してみましょう。

cd ~
# ローカルレポジトリを削除
rm -rf gitolite-admin
# もう一度cloneしてみる
git clone ssh://gitrepo/gitolite-admin.git
cd gitolite-admin

上手く行ったら古いユーザを削除します。

rm keydir/admin.

confの方も忘れずに

editor conf/gitolite.conf
# ↓これを
#repo gitolite-admin
#  RW+ = admin
#  RW+ = newadmin
# ↓こうする
#repo gitolite-admin
#  RW+ = newadmin

あとはpushして古いアカウントを抹消します。

git commit -am "remove old admin account."
git push origin master

 - サーバ運営 , ,