Windows Server に Apache を利用して Subversion サーバーを構築して ActiveDirectory 認証を設定する

ブログにも書いたけどこっちにも。

タイトルの通り。以下の環境・アプリケーションを使用して Subversion サーバーを構築する。

* Windows Server 2012
* Apache 2.4.16
* Subversion 1.9.0
* 外部からは `http://svn.example.com/svn/` の URL に対してアクセス。 

# 1. 準備

ApacheHaus の Web ページから、Apache および Subversion のモジュールをダウンロードする。
Windows 向けのパッケージは ApacheHaus 以外のサイトでも公開されているが、ApacheHaus だと Subversion のモジュールも一緒に提供されているので安心感がある。

http://www.apachehaus.com/cgi-bin/download.plx

今回は以下のモジュールをダウンロード。
**※ Apache および Subversion のモジュールは VC9 でコンパイルされたものと VC11 でコンパイルされたものの 2 種類があるので揃えるように注意する。**

* Apache 2.4.16 x64 (Apache 2.4.x **VC11**)
* Mod Subversion 1.9.0 for Apache 2.4.x x64 (Modules for Apache 2.4.x **VC11**)

# 2. モジュールを展開する

ダウンロードしたモジュールを展開する。今回はそれぞれ以下のディレクトリに展開する。

* Apache : D:\Application\Apache\httpd-2.4.16-x64
* Subversion : **Apache と同じディレクトリに展開 (統合) する。

```
D:\
  `- Application\
     `- Apache\
        `- httpd-2.4.16-x64\
```

# 3. リポジトリを配置するディレクトリを作成する

Subversion のリポジトリを配置するディレクトリを作成する。今回は `D:\Application\Apache\_svn\repositories` というディレクトリを作成。

# 4. Apache の設定ファイルを修正

Apache の設定ファイルを修正。主な修正内容は以下のとおり。

**httpd.conf**

* デフォルトの設定だと `ServerRoot` が存在しないディレクトリをを指しているので修正
* 必要なモジュールを有効化
* 今回用に作成する設定ファイルを読み込むように設定

**svn.conf (新規作成)**

* Subversion サーバーの設定
* LDAP 認証の設定
* リポジトリごとのアクセス権限を設定できるようにする

## httpd.conf

修正する箇所のみ記載。

```diff
(デフォルトの設定だと `ServerRoot` が存在しないディレクトリをを指しているので修正)
- Define SRVROOT "/Apache24"
+ Defile SRVROOT "D:/Application/Apache/httpd-2.4.16-x64"

(必要なモジュールを有効化。それぞれ先頭の # を削除してコメント解除。)
- #LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
+ LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
- #LoadModule ldap_module modules/mod_ldap.so
+ LoadModule ldap_module modules/mod_ldap.so

(今回用に作成する設定ファイルを読み込むように設定)
+ Include conf/svn.conf
```

## svn.conf

`httpd-2.4.16-x64\conf` ディレクトリ内に新規ファイルとして作成する。

```apache
#### Subversion サーバー
# モジュールロード
LoadModule dav_module       modules/mod_dav.so
LoadModule dav_fs_module    modules/mod_dav_fs.so
LoadModule dav_svn_module   modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
# バーチャルホスト設定
<VirtualHost *:80>
    ServerAdmin administrator@example.com
    ServerName svn.example.com
    CustomLog "logs/svn.example.com/access.log" common
    ErrorLog "logs/svn.example.com/error.log"
    Timeout 1200
    ProxyTimeout 1200

    <Location /svn/>
        DAV                 svn
        SVNParentPath       "D:/Application/Apache/_svn/repositories"
        SVNListParentPath   on
        AuthzSVNAccessFile  "D:/Application/Apache/_svn/access-rule.txt"
        
        # LDAP認証
        AuthType Basic
        AuthName "Subversion Repository"
        AuthBasicProvider ldap
        AuthLDAPUrl "ldap://ad.example.com:389/DC=example,DC=com?sAMAccountName?sub?(objectClass=user)"
        AuthLDAPBindDN  Administrator@example.com
        AuthLDAPBindPassword  administrator-password
        Require valid-user
        LDAPReferrals Off
    </Location>
</VirtualHost>
```

以下、簡単にディレクティブの設定を解説。詳しくはお調べください。

* CustomLog, ErrorLog  
  該当のバーチャルホストにアクセスされた際のアクセスログとエラーログの出力先を指定。  
  今回は `logs\svn.example.com` ディレクトリにログを出力するように設定しているが、**`svn.example.com` ディレクトリを事前に作成していないと apache の起動に失敗するので注意。**
* SVNParentPath  
  Subversion リポジトリが配置されているディレクトリを指定。
* AuthzSVNAccessFile  
  リポジトリごとにアクセス権限を設定するためのファイルを指定。権限の設定方法は後述。
* AuthLDAPUrl, AuthLDAPBindDN, AuthLDAPBindPassword  
  LDAP サーバー (今回は ActiveDirectory) に接続するための情報を指定。
* LDAPReferrals Off  
  よくわからないけど付けないとエラーが発生する。

# 5. リポジトリの作成

`D:/Application/Apache/_svn/repositories` ディレクトリにリポジトリを作成する。他のサーバーに作成済みの Subversion リポジトリをコピーしてきても OK 。
リポジトリを作成するためのコマンドは、Apache ディレクトリに統合した際に `httpd-2.4.16-x86\bin` に展開されているので、パスを通すか直接呼び出す。

初期ディレクトリの作成が長くて打ち間違えると大変なので、バッチ化した方がいい。

```
(リポジトリのルートディレクトリに移動)
> cd D:\Application\Apache\_svn\repositories

(リポジトリ hoge を作成)
> D:\Application\Apache\httpd-2.4.16-x64\bin\svnadmin.exe create hoge

(初期ディレクトリ作成)
> D:\Application\Apache\httpd-2.4.16-x64\bin\svn.exe mkdir ^
    file:///D:/Application/Apache/_svn/repositories/hoge/trunk ^
    file:///D:/Application/Apache/_svn/repositories/hoge/branches ^
    file:///D:/Application/Apache/_svn/repositories/hoge/tags ^
    -m "Create base directories"
```

# 6. リポジトリの権限設定

`D:/Application/Apache/_svn/access-rule.txt` にリポジトリのアクセス権限を設定するためのファイルを作成する。

```
[groups]
hoge = rabitarochan, user_aaa, user_bbb
fuga = user_aaa, user_bbb

[repo_hoge:/]
* = 
@hoge = rw

[repo_fuga:/]
* = 
@fuga = rw
```

以下、簡単に解説。詳細は `AuthzSVNAccessFile` でググろう。

* `[groups]` 以下にグループを定義することができる。`<グループ名> = <ユーザー名>` の形式で記述し、ユーザー名はカンマで区切る。
* `[<リポジトリ(ディレクトリ)名>:<パス>]` 以下にアクセス権限を定義できる。パスは `/hoge` のように詳細に設定することも可能。
  * `* = ` をはじめに定義し、全てのユーザーからのアクセスを禁止する。
  * `@hoge = rw` を定義し、`hoge` グループのユーザーに対して **r**ead / **w**rite 権限を追加。  
    読み取り専用の権限を設定する場合は `@hoge = r` と記述する。
  * グループは必ず作成する必要はなく、`user_ccc = rw` とユーザーの権限を直接定義することも可能。

# 7. Apache を Windows サービスに登録する。

コマンドプロンプトにて以下のコマンドを実行。

```
(Windows サービスに登録)
> D:\Application\Apache\httpd-2.4.16-x64\bin\httpd.exe -k install
```

以下、オプションなど補足。

* `-n <サービス名>` とすると、サービス名を指定できる。デフォルトは `Apache2.4`。
* Windows サービスを解除する場合は `-k uninstall` を実行する。もし `-n` オプションでサービス名を指定して登録した場合は、名前を揃える必要があるので注意する。

# 8. 起動, 動作確認

Windows サービスの管理画面から、登録したサービスを開始する。Apache の設定ファイルの記載ミスや、必要なファイル, ディレクトリがない場合は起動に失敗するため、Apache のログファイルを参照して解決する。

# まとめ

Apache + Subversion on Windows Server の手順をほぼ 1 から解説してみました。　Collabnet Subversion Edge が遅いと苦情を受けた方 (おれおれ!!) は、ぜひお試しください。

**お願い** : 基本的にはこの流れで問題ないはずですが、上手くいかない場合はコメントください。