安全かつ手軽に svn+ssh

SubversionSSH 経由で使う場合、パスフレーズの入力が厄介です。だからといって、パスフレーズなしの鍵を使って SSH ログインできるようにしておくと、秘密鍵の盗難が即アカウントの奪取に繋がり危険です。

安全性をある程度維持しつつパスフレーズ入力の煩雑さを回避するには主に2つの方法が知られています。

  1. SSH のエージェントを使う
  2. Subversion 接続時のみパスフレーズなしの SSH 秘密鍵を利用する

ここでは 2. の方法について説明します。後述しますが、実際のところあまり安全とはいえない場合もあるので、限られた環境での運用にとどめて置くことが肝要です。

以下で、サーバとは Subversionリポジトリがおいてある計算機、クライアントとはサーバへアクセスする計算機とします。

クライアント側での準備

クライアント側にログインし、クライアントからサーバへ SSH 接続する際に利用する鍵ペアとは別に、新たに1つの鍵ペアを生成します。パスフレーズはなしにします。$HOME/.ssh/id_rsa_svn, $HOME/.ssh/id_rsa_svn.pub を作成したと仮定します。

サーバ側での準備

サーバ側で、クライアントの公開鍵を $HOME/.ssh/authorized_key ファイルに追加します。その際、以下のように公開鍵(ssh-rsa AAAA...の部分)の前にいくつかの設定を付け加えておきます。すべて1行で記述します。

command="/usr/bin/svnserve -t",from="iii.jjj.kkk.lll",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa AAAA...(略)

付け加えた設定のうち、最初の2つの機能は以下の通りです。

  • command="/usr/bin/svnserve -t" を指定することで、当該鍵ペアによるアクセス時にサーバ側で起動できるコマンドを svnserve に制限します。秘密鍵を盗まれた場合にシェルの奪取を回避できます。
  • from="iii.jjj.kkk.lll" にクライアントのドメイン名(ワイルドカード併用可)もしくはIPアドレスを指定することで、他の計算機から当該鍵ペアを利用してサーバへアクセスすることを禁止できます。

上記のようにサーバで実行できるコマンドの制限と接続元の制限を行っても、クライアントがクラックされた場合は Subversion で管理しているリポジトリの内容が漏洩したり改変される可能性があります。十分に注意して下さい。

クライアント側から接続確認

環境変数 SVN_SSH に以下のように設定します。クライアント側のログインシェルが bash の場合、$HOME/.bashrc あたりに書いておくとよいかも知れません。

export SVN_SSH="ssh -i $HOME/.ssh/id_rsa_svn"

クライアント側で svn+ssh できることを確認します。

svn ls svn+ssh://svnserver/path/to/svnrepos/

クライアント側で以下のコマンドを実行し、サーバ側で svnserve 以外のコマンドを実行できないことを確認します。

ssh -i $HOME/.ssh/id_rsa_svn svnserver
ssh -i $HOME/.ssh/id_rsa_svn w