Subversionのsvn接続とsvn+ssh接続を比較する

Subversionのリポジトリをsvn+sshで管理するで書いた内容によろしくない部分や分かりにくい部分があったので補足として、もう一度まとめてみました。

リポジトリの準備

前回と全く同じです。subversionグループのユーザがリポジトリを自由に読み書きできるようにします。

# 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設定

svnserveをデーモンとして起動して、svn://〜でアクセスする場合はsvnserveの起動ユーザ(恐らくrootのはず)がアクセスできればいいので、この設定は必ずしも必要ではありません。

リポジトリへのアクセス

svn://〜でアクセス

リポジトリがあるサーバでsvnserveをデーモンとして起動しておき、svn://〜 でアクセスする方法です。簡単に柔軟な設定ができますが

  • TCPポート(3690番)を解放する必要がある
  • 通信経路が暗号化されない
  • 設定ファイルでリポジトリへのアカウントを記述する必要があり、面倒

といったデメリットもあります。

svn+ssh://〜でアクセス

リポジトリへのアクセス経路にsshを使用します。svn+sshでアクセスすると、リポジトリのあるサーバにsshでログインした後、svnserveがトンネルモード(-t)で起動されます。リポジトリの各種操作はこのsvnserveが行います。実際にサーバにある/usr/bin/svnserveをリネームしたり削除すると、svn+sshリポジトリが操作できないことが確認できます。sshを経由することで、

  • sshのポートが解放されていればOK
  • 通信経路が暗号化される
  • sshのアカウントでリポジトリにアクセスできる

といったメリットが得られます。svnserveはトンネルモードで起動すると、既に外部で認証されているとみなしてリポジトリにアクセスする(ソース)ので、Subversion用のアカウント設定は必要ありません。ただし、公開鍵認証を使用する場合は、環境変数SVN_SSH

exprot SVN_SSH="ssh -i /home/user/.ssh/XXXXXX.ppk"

のように設定する必要があります。

それぞれの接続イメージを図にすると、こんな感じでしょうか。

これを見ると、svn+sshでアクセスした方が遙かに安全に思えます。しかし逆に、

  • リポジトリを操作する度にsshアカウントの認証が必要
  • svnserveの起動オプションを指定したい場合は専用のssh鍵が必要

という制約も発生します。

実際にssh接続する場合はパスフレーズ付きの秘密鍵を使用すると思いますので、svnで何らかの操作をする度に鍵のパスフレーズを入力することになります。これは流石に面倒なので、ssh-agentを使ってパスフレーズの入力を省くようにしましょう。ssh-agentを使いたくない場合は、svkを用いてリポジトリへの実際のアクセスを極力減らすのが有効かも知れません。svk自体試せてないので未知数ですが… svkはローカルでリポジトリのミラーを作ってくれて、ローカルでのコミットをまとめて行ってくれる(無駄なコミットをリポジトリに反映しない)らしいので、機会を作って試してみたいと思います。
もしくは、前のエントリでやったようにSubversion用の鍵を作って、そちらの鍵をssh-agentに登録するのもありかも知れません。

svnserveは起動オプションとして-rでリポジトリのルートディレクトリを指定できます。この設定をssh経由でも使用するには、これも前のエントリのようにsvn用の鍵を作り、~/.ssh/authorized_keysに起動オプションを記述することになります。svnserveをデーモンとして起動した場合はサーバ側で-rオプションを設定しますが、この場合はクライアント側でsvnserveのオプションを指定しているため、リポジトリに接続する全てのクライアントで同様の設定が必要になります。
自分で書いておいて何ですが、この-rオプションの指定はssh経由ではやらない方が混乱しなくて済むかも知れません。ルート階層に近いところにリポジトリを置いたり、シンボリックリンクを張って運用する方が賢明なように思います。

ssh鍵の管理

前のエントリでは、Subversion専用の鍵を作りました。これは、

  • svnserveの起動オプション(-r)を指定する
  • 同一サーバでsvn+sshした時に公開鍵と秘密鍵が同居するので、少しでもリスクを減らす

という2つの目的がありました。この内、後者は単にfile:///〜でアクセスすればいいだけ、ということに後から気付いたので全く気にする必要ありませんでした。というか、そんな運用しちゃいけませんね。ちなみに、file:///〜でリポジトリにアクセスする場合はsvnserveは全く関係しません。前者も先ほど書いたようにクライアント側の設定なので、あまり意味がありませんでした。
ということで、専用の鍵を作る場面というのは実際には滅多にないと思われます。通常のsshアカウントは与えたくないが、リポジトリにはアクセスさせたいという場合ぐらいでしょうか(それもわりとレアケースな気がしますが)。その場合は、svnserve, 専用サーバ|Subversion によるバージョン管理の末尾にあるように、authorized_keysでアクセス権限を適切に設定する必要があります。

■まとめ

■おまけ

WEB+DB Pressの最新号(VOL39)で「構成管理実践入門」としてSubversionの運用について、いろいろ書かれています。こちらも目を通してみるといいかも。

WEB+DB PRESS Vol.39

WEB+DB PRESS Vol.39