Ubuntu(またはRaspbian)でGitサーバ(Gitolite)をセットアップする
2016/07/09
世の中には僕のような様々な(どうでも良い)事情があるため(と言う事を理由にして)自分で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上に公開する場合など、サーバ上のレポジトリが必要なくなった場合などは以下の通り。
- まずは、gitolite-adminレポジトリをcloneしてconf/gitolite.confを開く
- 次に、要らなくなったレポジトリの設定を削除。
- commit->pushでGitoliteの管理からは削除される。
- レポジトリのあるサーバにログインしてレポジトリの実体を削除
sudo rm -r /var/git/repositories/hoge.git
レポジトリ名の変更
削除の応用ですわね。
- まずは、gitolite-adminレポジトリをcloneしてconf/gitolite.confを開く
- 変更したいレポジトリの名前を変更
- commit->pushでGitoliteの管理上の名前は変更される。
- レポジトリのあるサーバにログインしてレポジトリの実体を名前変更
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