ちょっとしたコネタの紹介
gitoliteをhost
にgit
というユーザ名でインストールするとssh://git@host:reponame.git
でreponame
というリポジトリに対するアクセス制御をすることができる。
当然ながらssh://git@host:reponame.git
はhost
にgit
というユーザ名でSSH接続することを意味する。
で、不思議なのはgitoliteは一体どうやってユーザの判別をしているのか、ということだ。
なにせgitoliteはサーバ上にインストールされているのだから、gitoliteから見たらどのアクセスもgit
というユーザなのだ。どうやってgitoliteは「このアクセスはyuku_tからだ」「こっちのはyaottiからだ」という風に判断しているのだろう。(むしろこれができなければアクセス制御なんてできっこない)
答えはgit
ユーザのauthorized_keys
ファイルにある。
authorized_keys
が単なる公開鍵置き場だと思ったら大間違い。実はもっといろいろな設定ができるのだ。
以下にauthorized_keys
の例を引用する。
# gitolite start
command="/home/git/gitolite/src/gitolite-shell taka84u9",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1y...== taka84u9
# gitolite end
ssh-rsa
以降が普段我々が公開鍵を設定している箇所だ。
そしてその前半部分にcommand
やno-port-forwarding
など見覚えのない部分がある。
実はsshdは公開鍵でユーザの認証を取ったあとの制御をこの部分で記述することができるのだ。
そして、command
というのがユーザがログイン後に実行するコマンドになる。よくよく見てみると
command="/home/git/gitolite/src/gitolite-shell taka84u9"
gitolite-shell
というコマンドに対して引数でユーザ名が渡されている。
先ほどの疑問の答えがこれで、このスクリプトの中でアクセス制御が行われる。
またこのユーザ名は$GL_USER
という環境変数に格納されるためgitoliteで管理されているgitリポジトリのhookの中でユーザの判別もできる、という訳。
なかなか面白い実装だと思う。