_J Blog

学んだ事のまとめやメモなどが中心です

GitoliteをつかってGitリポジトリを権限管理する


やりたかった事

対象のGitのリポジトリ
 ・限られたユーザーにしかPUSHさせたくない
 ・誰でも閲覧できるようにしたい
という事がありました。


この事を解決する手段として、


1.sshプロトコルを利用し、ユーザーとグループで管理する
2.ツールを使う
 Gitosis、Gitolite、etc...

が真っ先に思いついたのですが、
Gitリポジトリのあるサーバーに、ユーザーとグループたくさん作るのも嫌だったので、
ツールを使う事にし、今回はGitoliteを利用する事にしました。


導入手順

つらつらと書きます。
※下の方に入れる途中で起きたエラーと解決策を書いてあります

まずgitユーザーを作成して、sudo権限をつけておきます。
※sudoつけずにrootで作業してもいいです。


gitユーザーでの作業

gitユーザーになります

ソース取得

cd /usr/local/src
sudo git clone git://github.com/sitaramc/gitolite.git
cd gitolite

パスの通ってる所にシンボリックリンク作成

./install -ln /usr/local/bin

$HOME/.ssh に移動(ディレクトリがなければ作成する)

mkdir  ~/.ssh
cd ~/.ssh

秘密鍵・公開鍵の作成

ssh-keygen -t rsa -f gitolite_id_rsa

gitoliteのセットアップ

gitolite setup -pk ~/.ssh/gitolite_id_rsa.pub 

ssh configの設定

vim ~/.ssh/config
# ~/.ssh/config
host localhost
  user gitolite
  hostname localhost (ここはサーバーのIP. 外部ならそれを指定)
  port 22
  identityfile ~/.ssh/gitolite_id_rsa

ssh 周りの権限変更

chmod 600 ~/.ssh/*
chmod 700 ~/.ssh

clone する

cd ~
git clone gitolite@localhost:gitolite-admin ・・・(1)


別ユーザーを作成して試してみる

tomユーザー作成

sudo useradd tom
su - tom

<span class="deco" style="font-weight:bold;">
tomユーザーでの操作
</span>

鍵の作成
>|cterm|
mkdir .ssh
cd .ssh
ssh-keygen -t rsa -f tom ・・・(2)

ssh 設定ファイル作成

vim ~/.ssh/config
# 基本的にidentityfile以外 管理者の設定と同じ
host localhost
  user gitolite
  hostname localhost
  port 22
  identityfile ~/.ssh/tom

ssh周りの権限設定

chmod 600 ~/.ssh/*
chmod 700 ~/.ssh


ユーザー追加作業(gitユーザーでの操作)

cd {(1)でcloneしたgitolite-adminリポジトリ}
vim keydir/tom.pub (ここは追加したいユーザー名 + .pub という名前でファイルを作る)
# keydir/tom.pub
(2)で作成した公開鍵の内容をコピー


リポジトリ権限の設定

tomユーザーにはtestingリポジトリに書き込み権限のみ与える

vim conf/gitolite.conf
# conf/gitolite.conf
# 一応グループを定義
@developer = tom

repo gitolite-admin
    RW+ = gitolite_pub_rsa

repo testing
    RW+ = gitolite_pub_rsa
    R = @developer

ファイルをpushする
※gitのuser.nameとuser.emailを設定していないときは
※git config --global user.email "you@example.com" と git config --global user.name "Your Name" でgitの設定しておくこと

git add keydir/tom.pub conf/gitolite.conf
git commit -m 'add tom key file and add testing repository permission of tom'
git push origin master

tomユーザーでの操作
testingリポジトリをcloneする

cd ~
git clone tom@localhost:testing

編集してpushしてみようとする

cd testing
echo 'hoge' > README
git add README
git commit -m 'first Tom's commit'
git push origin master

すると下記のように出力され、pushに失敗する

FATAL: W any testing tom DENIED by fall thru
(or you mis-spelled the reponame) 
atal: The remote end hung up unexpectedly 

pushできない事を確認できた。



これで一旦完了です。

実際に導入してみて、今のところうまく行っています。
これから運用フェーズだなー。。。


*** 番外編 ***(トラブルシューティングなど)


1. gitoliteの install -ln /usr/local/bin が エラー

こんなメッセージが出たとき

Can't locate Time/HiRes.pm in @INC (@INC contains: /home/gitolite/src/gitolite/src/lib /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /home/gitolite/src/gitolite/src/lib/Gitolite/Common.pm line 76.

BEGIN failed--compilation aborted at /home/gitolite/src/gitolite/src/lib/Gitolite/Common.pm line 76.
Compilation failed in require at gitolite/install line 15.
BEGIN failed--compilation aborted at gitolite/install line 15.


解決した方法:perlのモジュールをいれる

yum install perl-Time-HiRes -y


2. ssh で Permission denied が出るとき

基本的に /var/log/secure を確認すれば分かる事が多い
みてみましょう


3. ユーザーでcloneしようとしたら、pemの設定してあるのにパスワード聞かれる

/var/log/secure に User gitolite not allowed because account is locked ってでてるときは

vim /etc/ssh/sshd_config
#UsePAM no # <- こっちをコメントアウト
UsePAM yes

上記のように UsePAMを有効して sshdを再起動すると直った


4. リモートクライアントからの接続の場合でpassword聞かれてしまう場合

下記リンクを参考に
http://blog.teapla.net/archives/1843

Host gitolite・・・(3)
    User gitolite
    Hostname gitserver
    IdentityFile ~/.ssh/id_rsa.gitolite

のように設定していたとき、

git clone gitolite@gitserver:testing

とやるとパスワード聞かれてしまうけど、


git clone gitolite:testing

↑ (3) .ssh/config の Hostに設定したとこの名前

とするとパスワードなしでちゃんといけた。


5. リポジトリの場所変えたい

下記ドキュメントを参考にした
http://sitaramc.github.com/gitolite/dev-notes.html

デフォルトでは gitolite setup --pk xxxxx.pub を実行したユーザーのホームディレクトリになる

~/.gitolite.rc の%rc 内に
GL_REPO_BASE => 'path/to/repo'
を書くと変えれる

ソース的にはこの辺
/usr/local/src/gitolite/src/lib/Gitolite/Setup.pm


6. 大元のadminレポジトリを変える

大元は ~/.gitolite/ いかにあるが、
これは~/.gitolite.rc の GL_ADMIN_BASE に値を設定すれば変更できる