Gitのユーザ管理をgitosisで設定する
Gitリポジトリを複数の人と共有したいが、
サーバにUNIXのユーザアカウントを追加したくない、ということでgitosisを設定した。
gitosis – Git リポジトリ群の管理とアクセス制御 vol.0
gitosis – Git リポジトリ群の管理とアクセス制御 vol.1
このページが大変参考になった。
以下、既存のgitリポジトリをgisosisでアクセス制御するところまで設定できたので記録。
前提
前準備1
mcbk.localとcent5.localそれぞれ公開鍵(~/.ssh/id_dsa.pub)を作る
% ssh-keygen -t dsa
前準備2
sshのポートを22から変更しているサーバなので、
mcbk.localとcent5.localの.ssh/configにsshのホスト設定をする
Host gitserv HostName gitserver.yamakk.com port 12345
これで
% ssh gitservとするだけで
% ssh -p 12345 gitserv.yamakk.com と同じことができる
以下の表記
mcbk.local% # mcbk.localからコマンドを実行
cent5.local% # cent5.localからコマンドを実行
とする.
実際の設定
gitosis用にユーザ ‘git’ を作成
gitserv% sudo useradd -s /bin/sh -d /home/git git
これから設定をメインで行うmcbk.localの公開鍵をサーバに転送
mcbk.local% scp ~/.ssh/id_dsa.pub gitserv:/home/yamakk
gitservでgitosis-initを実行. gitosis,repositoriesの2ディレクトリが出来る
mcbk.local% ssh gitserv gitserv% sudo -H -u git gitosis-init < /home/yamakk/id_dsa.pub Initialized empty Git repository in /home/git/repositories/gitosis-admin.git/ Reinitialized existing Git repository in /home/git/repositories/gitosis-admin.git/
post-updateフックスクリプトのパーミッションが644なので755に変更する
gitserv% chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update
mcbk.localからgitosis-admin.gitをgit cloneできるか確認. できなければ公開鍵の設定に間違いがあるはず.
mcbk.local% mkdir workspace mcbk.local% cd workspace mcbk.local% git clone git@gitserv:gitosis-admin.git # or git clone ssh://git@gitserv/gitosis-admin.git Initialized empty Git repository in /Users/yamakk/workspace/hosting-self/gitosis-admin/.git/ remote: Counting objects: 5, done. remote: Compressing objects: 100% (4/4), done. remote: Total 5 (delta 0), reused 5 (delta 0) Receiving objects: 100% (5/5), done.
今後、このgitosis-adminのなかにあるkeydirと, gitosis.confを編集し、
git commit; git pushすることがアクセス制御の主な作業内容になる。
gitosis-admin/gitosis.confを編集 cent5.localを管理者に追加
mcbk.local% emacs gitosis-admin/gitosis.conf
[gitosis] [group gitosis-admin] writable = gitosis-admin members = mcbk.local cent5.local
作業しているmcbk.localのgitosis-admin/keydirに、cent5.localの公開鍵を入れる
この際、公開鍵をgitosis.confに記載したmember名.pubという名前にすること
mcbk.local% scp cent5.local:~/.ssh/id_dsa_pub gitosis-admin/keys/cent5.local.pub
gitosis-admin以下にある gitosis.conf と keysに加えた変更を git add; git commit; git push
cd gitosis-admin mcbk.local% git add gitosis.conf mcbk.local% git add keys/cent5.local.pub mcbk.local% git commit -m "account 'cent5.local' added this account is admin" [master a286a5d] account 'cent5.local' added this account is admin 2 files changed, 2 insertions(+), 1 deletions(-) create mode 100644 keydir/yamakk@cent5.local.pub mcbk.local% git push (中略)
cent5.localがmcbk.localと同様にgitosis-adminをgit cloneできるか確認する
mcbk.local% ssh cent5.local cent5.local% mkdir workspace cent5.local% cd workspace cent5.local% git clone git@gitserv:gitosis-admin.git # or git clone ssh://git@gitserv/gitosis-admin.git (中略)
cent5.local と mcbk.localにそれぞれプライベートなリポジトリを操作する権限を作成
mcbk.local% emacs gitosis-admin/gitosis.conf
[gitosis] [group gitosis-admin] writable = gitosis-admin members = mcbk.local cent5.local [group cent5] writable = private/cent5 members = cent5.local [group mcbk] writable = private/mcbk members = mcbk.local
mcbk.local% git add gitosis.conf mcbk.local% git commit -m "group cent5 and mcbk added. both are private repositories." mcbk.local% git push (中略)
プライベートなリポジトリを作成し、サーバにgit push
mcbk.local% mkdir some-private-repos mcbk.local% cd some-private-repos mcbk.local% git init mcbk.local% git remote add origin git@gitserv:private/mcbk mcbk.local% echo 'This git repositori is private. ' > README mcbk.local% git add README mcbk.local% git commit -m "Initial commit" mcbk.local% git push origin master
git cloneできるか確認
mcbk.local% git clone git@code:private/cent5.git Initialized empty Git repository in /home/yamakk/workspace/cent5/.git/ remote: Counting objects: 3, done. remote: Total 3 (delta 0), reused 0 (delta 0) Receiving objects: 100% (3/3), done.
ここからは、実際に以前から使っているリポジトリをgitosisにアクセス制御させる。
/home/git/repositories以下に元々redmineと共につかっていたリポジトリ(project_foo.git)のシンボリックリンクを作成
chown -R git:git /var/redmine/git_repos gitserv% ln -s /var/redmine/git_repos/project_foo.git /home/git/repositories/
mcbk.local% emacs gitosis-admin/gitosis.conf
[gitosis] [group gitosis-admin] writable = gitosis-admin members = mcbk.local cent5.local [group cent5] writable = private/cent5 members = cent5.local [group mcbk] writable = private/mcbk members = mcbk.local [group project_foo] writable = project_foo members = cent5.local
project_fooに関するアクセス制限を設定したので、git commit; git push
mcbk.local% git add gitosis.conf mcbk.local% git commit -m "group project_foo added." mcbk.local% git push
cent5.localがgit cloneできるか確認
cent5.local% git clone git@code:project_foo.git Initialized empty Git repository in /home/yamakk/workspace/project_foo/.git/ remote: Counting objects: 280, done. remote: Compressing objects: 100% (262/262), done. remote: Total 280 (delta 154), reused 0 (delta 0) Receiving objects: 100% (280/280), 113.83 KiB, done. Resolving deltas: 100% (154/154), done.
権限を持たないmcbk.localが正しくアクセス拒否されるか確認
mcbk.local% git clone git@code:project_foo.git Initialized empty Git repository in /Users/yamakk/workspace/project_foo/.git/ ERROR:gitosis.serve.main:Repository read access denied fatal: The remote end hung up unexpectedly
OK
Posted: August 12th, 2010 | Author: yamakk | Filed under: 技術 | Tags: git, gitosis, redmine | No Comments »
Leave a Reply