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 に値を設定すれば変更できる