Subversionのリポジトリをsvn+sshで管理する

通常Subversionを使う場合、-dオプションを付けてsvnserveをデーモンとして起動しておく必要があります。ですが、SSH経由でSubversionを利用する場合はsvn+sshによる接続時にsvnserve -tとトンネルモードでsvnserveが起動されるため、あらかじめ起動しておく必要はありません。
パスワード認証でsvn+ssh通信する場合はそれほど特別な設定をせずとも、svn+ssh://user@host/repos/hogeリポジトリにアクセスできます。が、鍵認証を使用する場合は少し手を入れてやらなければいけません。新たに鍵認証を使用するサンプルはわりと見付かるのですが、普段から鍵認証を使用している場合にSubversionの設定を追加する方法はあまり解説されていないので、自分のやった設定をメモしておきます。

リポジトリパーミッション設定

この作業はリポジトリを設置したサーバで行います。リポジトリへのアクセスはグループ権限で行います。ここでは、subversionグループを作成し、リポジトリへのアクセス権限を設定するため、以下のコマンドをrootで実行します。

# groupadd subversion ← グループ作成
# usermod -G subversion user ← userをsubversionグループに追加
# cd /usr/local/svn
# chgrp -R subversion . ← 所有グループの変更
# chmod -R 770 . パーミッション設定
# chmod -R g+s . ← setgidビット設定
# umask 002 ← umask設定

Subversion用のSSH鍵を作る

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa): ← そのままEnter
Enter passphrase (empty for no passphrase): パスフレーズを入力
Enter same passphrase again: パスフレーズをもう一度入力

これでid_rsa秘密鍵)とid_rsa.pub(公開鍵)を作成します。次に、~/.ssh/authorized_keysに新しく作った公開鍵の情報を追加します。viで開いて、追加する行の先頭に、

command="/usr/bin/svnserve -t -r /usr/local/svn" ssh-rsa (公開鍵情報)

のように接続時のコマンドを指定します。これで、この鍵を使って接続した時に指定のコマンドが実行されます。この例では、svnserveをトンネルモードで起動するオプションと、リポジトリのルートディレクトリの指定を入れています。
秘密鍵は適当な名前に変えて自分の環境に持ってきます。リポジトリへの接続はこの秘密鍵を使用します。

環境変数SVN_SSHを設定

ここからの作業は、リポジトリに接続する側のサーバで行います。
次に、接続時のSSHコマンドを環境変数SVN_SSHに設定します。

export SVN_SSH="ssh -l user -i /home/user/.ssh/subversion.ppk"

これを~/.bashrcに追加します。これでsvn+ssh://〜で接続する時のsshコマンドを設定します。
この部分の設定は、svnserve.confの[tunnels]セクションに設定を追加することで、複数の接続コマンドを使い分けることが可能です(試してないけど)。詳しくはsvnserve, 専用サーバ|Subversion によるバージョン管理をどうぞ。

これで、

svn co svn+ssh://user@host/repos/hoge/trunk .

のようにSSH経由でリポジトリにアクセスできるようになります。

この設定だと、チェックアウトやコミットの度にパスフレーズを入力しないといけませんが、このあたりはセキュリティとトレードオフなので何とも言えないところです。前述のリンクを参考にSubversion用の鍵での権限を適切に設定した上で、パスフレーズなしでアクセスできるようにする、というのが妥当な線かも知れません。

■参考書籍

パーミッションの設定はこの本を参考にやってます。若干書き方が薄いけど、とっかかりとしてはいい資料かと。

Subversion実践入門:達人プログラマに学ぶバージョン管理(第2版)

Subversion実践入門:達人プログラマに学ぶバージョン管理(第2版)