svnserve ベースのサーバ

はじめに

Subversion には、Svnserve (通常の TCP/IP 接続上でカスタムプロトコルを使用する軽量スタンドアロンサーバ) があります。小規模構成にしたい場合や、本格的な Apache サーバを使用できない場合には申し分ありませんし、

ほとんどの場合、svnserve は Apache ベースサーバよりセットアップが簡単で、早く実行できますが、高度な機能のいくつかはありません。また今では、さらに安全にしやすくする SASL サポートも含まれています。

svnserve のインストール

  1. Subversion の最新版は、http://subversion.tigris.org/getting.html から取得してください。またはパッケージ化済みインストーラを、CollabNet の http://www.collab.net/downloads/subversion から取得してください。このインストーラは、svnserve を Windows サービスとしてセットアップし、セキュリティのために SASL を使う場合に必要となるいくつかのツールも含んでいます。

  2. 既に Subversion をインストールしてあり、svnserve が稼働している場合、継続する前に停止する必要があります。

  3. Subversion インストーラを実行します。サーバ上で実行しているなら (お勧め)、ステップ 4 までスキップできます。

  4. Windows エクスプローラを開き、Subversion のインストールディレクトリ (通常 C:\Program Files\Subversion) にある bin ディレクトリに行ってください。svnserve.exe, intl3_svn.dll, libapr.dll, libapriconv.dll, libapriutil.dll, libdb*.dll, libeay32.dll, ssleay32.dll があるのでこのファイルか、bin ディレクトリのすべてのファイルをサーバ用のディレクトリ (例: c:\svnserve) にコピーしてください。

svnserve の実行

svnserve をインストールしたら、サーバを実行する必要があります。起動する単純な手順は、DOS のシェルから以下のようにするか、Windows のショートカットを作成することです。

svnserve.exe --daemon

svnserve が起動し、ポート 3690 でリクエストを待ち受けます。--daemon スイッチは、svnserve に daemon プロセスとして実行するように指示します。そのためすでに実行されている場合は、手動で終了する必要があります。

まだリポジトリを作成していないなら、Apache サーバのセットアップ 「設定」 の説明を参照してください。

svnserve が作動しているかテストするため、TortoiseSVNリポジトリブラウザ でリポジトリを参照してください。

リポジトリが c:\repos\TestRepo にあり、サーバ名が localhost とすると、リポジトリブラウザに以下のように入力します。

svn://localhost/repos/TestRepo

セキュリティを高め、URL を入力する時間を節約するために、--root スイッチを用いてサーバ上の指定したディレクトリにルートを設定し、そこだけアクセスするようにできます。

svnserve.exe --daemon --root drive:\path\to\repository\root

ガイドのように以前行ったテストの物を使用して、svnserve を以下のように実行します。

svnserve.exe --daemon --root c:\repos

すると TortoiseSVN のリポジトリブラウザでは、次のように省略できるようになります。

svn://localhost/TestRepo

--root スイッチは、あなたのサーバの svnserve の場所と違うパーティションやドライブにリポジトリがある場合にも、指定する必要があることに注意してください。

svnserve は複数のリポジトリを提供します。そのリポジトリは、定義したルートフォルダ以下に配置され、ルートからの相対パスでアクセスできます。

警告

ネットワーク共有上で Berkeley DB リポジトリを、作成したりアクセスしたりしないでください。これはリモートファイルシステム上に存在できません。ドライブレターにマッピングしたネットワークドライブでもダメです。ネットワーク共有上で Berkeley DB を使おうとした場合、(すぐに不可思議なエラーに遭遇するか、数ヶ月後にリポジトリデータベースが破損するか) 結果が予想できません。

svnserve をサービスとして実行

ユーザが svnserve を実行するのは、通常、最善の方法というわけではありません。サーバに常にユーザがログインすることになり、リブート後には、svnserve を再起動するのを忘れないようにしなければならないのです。よりよい方法は、svnserve を Windows サービスとして実行することです。Subversion 1.4 で開始すると、svnserve は ネイティブな Windows サービスとしてインストールできます。

svnserve をネイティブ Windows サービスとしてインストールするには、以下のコマンドを 1 行で記述し、Windows の起動時に自動起動するサービスを作成してください。

sc create svnserve binpath= "c:\svnserve\svnserve.exe --service 
    --root c:\repos" displayname= "Subversion" depend= tcpip 
    start= auto

パスにスペースを含んでいる場合は、以下のように、(エスケープした) クォートでパスを囲んでください。

sc create svnserve binpath= "
    \"C:\Program Files\Subversion\bin\svnserve.exe\"
    --service --root c:\repos" displayname= "Subversion" 
    depend= tcpip start= auto

サービス作成後に、説明の追加もできます。これは Windows のサービスマネージャに表示されます。

sc description svnserve "Subversion server (svnserve)"

sc で使用するコマンドラインフォーマットは、かなり見慣れないものであることに注意してください。キー= 値 の組では、キーと = の間にはスペースがあってはなりませんが、値との間にはスペースがなくてはなりません。

ヒント

現在 Microsoft はサービスを、ローカルサービスアカウントかネットワークサービスアカウントのどちらかで動作させるのを推奨しています。サービスおよびサービス アカウントのセキュリティ計画ガイド をご覧ください。ローカルサービスアカウントで動作するサービスを作成するには、上記の例に以下を加えてください。

obj= "NT AUTHORITY\LocalService"

ローカルサービスアカウントには、Subversion とそのリポジトリに適切な権限を与え、またフックスクリプトで使用するアプリケーションにも同様に権限を与える必要があることに注意してください。ビルトイングループは、"LOCAL SERVICE" と呼ばれています。

一度サービスをインストールしたら、起動するのにサービスマネージャを使用する必要があります(サーバのリブート時に自動起動するならこの時のみ)。

より詳細な情報は、Windows Service Support for Svnserve をご覧ください。

svnserve の以前のバージョンを SVNService ラッパーを使ってインストールしており、今度はネイティブサポートするものに使用したい場合、そのラッパのサービス登録解除をする必要があります (まずサービスの停止を忘れないでください!)。サービスのレジストリエントリを削除するには、単純に

svnservice -remove

というコマンドを使用してください。

svnserve での Basic 認証

デフォルトの svnserve セットアップでは読取専用の匿名アクセスを提供しています。これは svn:// URL を、チェックアウト・更新に使用でき、リポジトリを見るのに TortoiseSVN のリポジトリブラウザを利用できるということです。しかしいずれの変更もコミットできません。

リポジトリへ書込アクセスを行えるようにするには、リポジトリディレクトリ内にある conf/svnserve.conf ファイルを編集する必要があります。このファイルは svnserve daemon の設定を制御します。また有用なドキュメントも含んでいます。

匿名書込アクセスを許可するシンプルな設定は、

[general]
anon-access = write

です。しかし、svn:author 属性が空のため、誰がリポジトリに変更を加えたのかがわかりません。誰が変更したのかコントロールできなくなってしまいます。いくらか危険な設定です!

これを解決するひとつの解答がパスワードデータベースを作成することです。

[general]
anon-access = none
auth-access = write
password-db = userfile

userfilesvnserve.conf と同じディレクトリに存在するファイルです。このファイルは、ファイルシステムのどこか他の場所に置くことができ (同じアクセス権が必要な複数のリポジトリがある場合に便利)、絶対パスか conf ディレクトリに対する相対パスで指定できます。パスを含める場合 /the/unix/way のように書かねばなりません。\ やドライブレターは動作しません。userfile の構造は

[users]
username = password
...

のようになります。この例は未認証 (匿名) ユーザの全アクセスを拒否し、userfile に並べたユーザに読み書きアクセスを与えます。

ヒント

同一のパスワードデータベースで複数のリポジトリを保守する場合、認証レルムを使用すると (TortoiseSVN が資格証明をキャッシュできるので 1 度入力すればよいため) 楽になります。詳細な情報は Subversion book の、特に Create a 'users' file and realm 節や、Client Credentials Caching 節にあります

SASL によるよりよいセキュリティ

SASL とは?

Cyrus Simple Authentication and Security Layer は、カーネギーメロン大学で書かれたオープンソースソフトウェアです。これは、いくつものネットワークプロトコル (と Subversion 1.5 以降) に汎用認証機構と暗号化機能を追加し、svnserve サーバと TortoiseSVN クライアントは、どちらもこのライブラリを利用できます。

有効なオプションのより完全な議論のために、Subversion book の Using svnserve with SASL 節を見るべきです。Windows サーバで安全な認証や暗号化をセットアップする、簡単な方法を探しているだけであれば、巨悪であるインターネット経由で、リポジトリへ安全にアクセスするために読み進めてください。

SASL 認証

サーバ上で特定の SASL 機構を有効にするには、3 つのことを行う必要があります。ひとつ目は、リポジトリの svnserve.conf ファイルに [sasl] セクションを作成し、以下のキーと値の組を設定することです。

use-sasl = true

ふたつ目は、svn.conf ファイルを好みの場所 (たいてい subversion をインストールしたディレクトリ) に作成することです。

みっつ目は、SASL が見つけられるように、ふたつの新しいレジストリエントリを作成することです。[HKEY_LOCAL_MACHINE\SOFTWARE\Carnegie Mellon\Project Cyrus\SASL Library] というレジストリキーを作成し、その中に以下のふたつの string 値を配置してください。SearchPathsasl*.dll プラグインを含むディレクトリパス (通常 Subversion をインストールしたディレクトリ) と、ConfFilesvn.conf ファイルを含むディレクトリです。CollabNet のインストーラを使用している場合、そのレジストリキーはすでに作成されています。

以下を含む svn.conf ファイルを編集してください。

pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: DIGEST-MD5
sasldb_path: C:\TortoiseSVN\sasldb

最後の行には、sasldb と呼ばれる認証データベースの場所を指定します。どこでもかまいませんが、あつらえ向きなのはリポジトリの親ディレクトリです。svnserve サービスが、このファイルを読めることを確認してください。

svnserve がすでに動作している場合、更新した設定を読むのを保証するため、svnserve を再起動する必要があります。

さて、すべてセットアップが終わったら、あとは、ユーザを作成しパスワードを設定するだけです。これには saslpasswd2 プログラムを使用する必要があります。CollabNet のインストーラを使用している場合、インストールディレクトリにあるはずです。以下のように使用してください。

saslpasswd2 -c -f C:\TortoiseSVN\sasldb -u realm username

-f スイッチでデータベースの場所を与えてください。realm はリポジトリの svnserve.conf ファイルに定義した値と同じでなければなりません。また、username は接続するのに使用するものと一致している必要があります。realm には、空白文字を使用できないことに注意してください。

sasldblistusers2 プログラムを使用して、データベースに格納されているユーザ名を表示できます。

SASL 暗号化

異なる暗号化レベルを有効・無効にするには、リポジトリの svnserve.conf ファイルにあるふたつの値を設定します。

[sasl]
use-sasl = true
min-encryption = 128
max-encryption = 256

min-encryption 変数と max-encryption 変数は、サーバで必要な暗号化レベルを制御します。暗号化を完全に無効にする場合、どちらの値も 0 としてください。データの単純なチェックサム比較 (つまり暗号化を利用せず、改ざんを防ぎデータの完全性を保証する) を有効にするには、どちらの値も 1 としてください。暗号化を許可する (しかし必須ではない) 場合、最小値を 0、最大値を数ビット長としてください。暗号化を無条件に必要とするには、どちらの値にも 1 以上を設定してください。先ほどの例では、クライアントには少なくとも 128 ビット暗号化が必要で、256 ビット暗号化以上は必要ないことを示しています。

svn+ssh での認証

svnserve ベースサーバでユーザ認証を行うもう一つの方法は、リクエストを通過させるトンネルに secure shell (SSH) を利用することです。SASL のセットアップようには単純ではありませんが、様々なケースで便利だと思います。

この方法では、svnserve は daemon プロセスで実行させず、secure shell が SSH で認証したユーザに対して svnserve を起動します。これを有効にするには、secure shell daemon がサーバに必要です。

サーバをセットアップする基本的な方法は、付録G SSH を用いた安全な svnserve で得られます。その他のFAQ にある SSH の話題については、SSH で検索してください。

svnserve のさらなる情報は Version Control with Subversion にあります。

svnserve でのパスベース認証

Subversion 1.3 で起動すると、svnserve は、Apache サーバで有効な mod_authz_svn パスベース認証方式と同じものをサポートします。リポジトリディレクトリにある conf/svnserve.conf ファイルを編集し、認証ファイルを参照する行を追加する必要があります。

[general]
authz-db = authz

authz には、作成したアクセス制限を定義したファイルを指定してください。リポジトリごとに独立したファイルを使用できますし、複数のリポジトリで同じファイルを使用することもできます。ファイル形式の説明については、「パスベース認証」 をご覧ください。