04 8月 2015
git / svnでのSSHを許可するがログイン出来ないユーザを作成
SSHでgitやsvnにアクセスさせたいが、ログインはさせてたくないという要件があったので実装してみました。
https(WebDAV)でBASIC認証でも使用すればいいのですが、他のアカウントではSSH認証鍵を使用しているので、管理を同じにしたいというのはよくある話です。
以下はSVNでの例です。
まずユーザをつくります。
$ sudo useradd -g svn -m -s /bin/bash svnuser
上記の例ではsvnuserというユーザをsvnグループで作成しています。
svnグループはsvnにアクセスできるグループです。
(SVNレポジトリはグループをsvnにして、グループにはSGIDが設定されているものとします)
SVNへのアクセスを許可するユーザから公開鍵を受け取って設定します。
$ sudo su svnuser $ cd /home/svnuser $ mkdir .ssh $ chmod 700 .ssh $ cat [受け取った公開鍵] >> authorized_keys
ここまでは通常の手順です。
ここで、authorized_keysに細工を加えます。
authorized_keysは公開鍵の内容が下記のように入っています。
ssh-rsa AAA・・・(公開鍵の内容)
この行の先頭に以下のように付け加えます。
command="svnserve -t",no-port-forwarding,no-pty,no-agent-forwarding,no-X11-forwarding ssh-rsa AAA・・・(公開鍵の内容)
svnserveはパスが有効でない場所にあれば、絶対パスで記述します。
svnのコミットするユーザ名を公開鍵ごとに変えたい場合は以下のように tunnel-userオプションで指定します。
command="svnserve -t --tunnel-user=user1",no-port-forwarding,no-pty,no-agent-forwarding,no-X11-forwarding ssh-rsa AAA・・・(公開鍵の内容)
これでuser1という名前でコミットされることになります。
またSVNレポジトリの場所を意識させたくない場合は以下のよう rオプションでディレクトリを指定します。
command="svnserve -t --tunnel-user=user1 -r /var/svn",no-port-forwarding,no-pty,no-agent-forwarding,no-X11-forwarding ssh-rsa AAA・・・(公開鍵の内容)
svn+ssh://(server)/ のようにアクセスすると、/var/svn以下のレポジトリを見に行くようになります。
gitの場合もほぼ同じですが、svnserveの代わりに以下のようにします。
command="git-shell -c \"$SSH_ORIGINAL_COMMAND\"",no-port-forwarding,no-pty,no-agent-forwarding,no-X11-forwarding ssh-rsa AAA・・・(公開鍵の内容)
コミットユーザ名はgitconfigで指定するので、ここでは不要ですね。