Gitのユーザ管理をgitosisで設定する

Gitリポジトリを複数の人と共有したいが、
サーバにUNIXのユーザアカウントを追加したくない、ということでgitosisを設定した。

gitosis – Git リポジトリ群の管理とアクセス制御 vol.0
gitosis – Git リポジトリ群の管理とアクセス制御 vol.1

このページが大変参考になった。

以下、既存のgitリポジトリをgisosisでアクセス制御するところまで設定できたので記録。

前提

  • gitサーバ……..gitserver.yamakk.com
  • クライアントA (MacBookPro 実作業)……..mcbk.local
  • クライアントB (VMWare上のCentOS5)……..cent5.local
  • 前準備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: | Filed under: 技術 | Tags: , , | No Comments »

    Leave a Reply