SVN+SSHの鍵認証セットアップ(CUI編)

SVNを自宅サーバに構築すると、自宅外からリポジトリにアクセスしたくなる人も
少なからず出てくるでしょう。
その際にはセキュリティ対策はほぼ必須と言えるでしょう。

SVNで用意している独自のプロトコルは扱いが簡単ですが、
データのやり取りは平文で行われます。
したがって、第三者からリポジトリのデータを傍受される可能性があります。

セキュリティの観点から最も安全な方法は
SSHトンネル+鍵認証でやり取りする方法でしょう。
今回はこの方法を使う手順のメモ書きです。

これを行うにあたり、サーバのSSHポートを事前に解放しておく必要があります。
SSHはデフォルトのポート番号以外、公開鍵認証のみ有効にするのが安全です。

1.公開鍵・秘密鍵のペア作成
まずはデータのやり取りをするための公開鍵・秘密鍵を作成します。
なお、既にSSH認証用の鍵を持っている場合でも一から作成します。(理由は後述)

ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (ホームディレクトリ/.ssh/id_rsa): key.svn
Enter passphrase (empty for no passphrase):パスワード
Enter same passphrase again:パスワード
Your identification has been saved in key.svn.
Your public key has been saved in key.svn.pub.

2.公開鍵の登録
作成した公開鍵をサーバに登録します。
サーバの~/.ssh/authorized_keysに
作成した公開鍵ファイル(上記ではkey.svn)の内容をコピペします。

vi ~/.ssh/authorized_keys
公開鍵データ
公開鍵データ
 ・・・
末尾に新たに作成した公開鍵データをペースト

ここで、ペーストした公開鍵の前に以下command〜を挿入します。

公開鍵データ
公開鍵データ
 ・・・
command="/opt/bin/svnserve -t" 末尾に新たに作成した公開鍵データをペースト

svnserveへのパスはご自身のサーバの環境をご確認ください。
これをしないと、SVN+SSHログインしたときに以下の様にsvnserveコマンドが無いよと
怒られてしまう場合があります。

svn checkout svn+ssh://ホスト名
bash: line 1: svnserve: command not found
svn: To better debug SSH connection problems, remove the -q option from 'ssh' in the [tunnels] section of your Subversion configuration file.
svn: Network connection closed unexpectedly

このcommand〜を挿入することで上記のエラーを回避できます。
しかし、その代償としてSSHで正常にログインできなくなります。
新しく鍵を作成するのはこのためです。

3.SSHデーモン再起動
authorized_keysの設定を有効にするために、SSHデーモンを再起動します。

4.クライアントのSVN+SSH接続設定
SVN(CUI)でSSH接続出来るように、$SVN_SSHに設定情報を追加します。

SVN_SSH="ssh -p ポート番号 -i 秘密鍵のフルパス"
export SVN_SSH

5.リポジトリのチェックアウト
あらかじめ作成しておいたリポジトリをチェックアウトします。

svn checkout svn+ssh://ユーザ名@ホスト名/リポジトリのパス チェックアウト先ディレクトリ

これでチェックアウトできれば成功です。

この方法は、鍵の作成とクライアント側の設定をしなければならないのが面倒です。
また、SSHを外部に解放しなければならないので、この辺りのセキュリティ対策もしっかり行う必要があります。
しかし、ちゃんと設定を行えば安全なデータのやり取りが出来るため非常に安全です。

■参考文献
svn+ssh “svnserve: command not found”
Apache Subversion FAQ