Subversion1.5.2 apacheでのセキュリティ保護

感想おまちしてます!

Subversion SVN

Subversion1.5.2 svnserve.confでのセキュリティ保護と同じく、Apacheを使えばもっと高度な設定ができる。daily dayflowerさんの「Apacheで統合Windows認証を使う」みたいに統合Windows認証でNTLM認証とかを使えば、Windowsにログインするだけで簡単に使えるし。
前提条件としては、c:\svn_repositoryに「repo01」「repo02」とリポジトリが複数あるとする。
多分、svnserve.confはsvnserveを使う場合だけであって、Apacheを使う場合は、httpd.confだけで設定できるってことかな。
どっちの設定が有効になってるかわからなくならないように、svnserve.confを以下のようにコメントアウトしておいた。

[general]
#anon-access = none
#auth-access = write
#password-db = passwd
#authz-db = authz
スポンサーリンク

htpasswdでのBasic認証

svnserveのpasswdを使っての認証と同じく、Apacheの/bin/htpasswdを使って認証を設定できる。
異なるのがパスワードが暗号化される点。

C:\Program Files\CollabNet Subversion Server\httpd\bin>htpasswd.exe -c -m c:\svn_repository\htpasswd fujihara
New password: ********
Re-type new password: ********
Adding password for user fujihara

authzファイルを流用できるようにsvnserveでやったときと同じくユーザを追加。Subversion1.5.2をWindowsに入れると、Apacheも一緒に入ってくれるので(C:\Program Files\CollabNet Subversion Server\httpd)、そのconf/httpd.confを修正。
Dav svnを使うのでmod_dav_svn.soモジュールを有効にしておく。

LoadModule dav_module         modules/mod_dav.so
LoadModule dav_svn_module     modules/mod_dav_svn.so
<Location /svn>
DAV svn
SVNParentPath C:\svn_repository
AuthType Basic
AuthName "Subversion Basic Auth"
AuthUserFile C:\svn_repository\htpasswd
Require valid-user
</Location>

SVNParentPathにはリポジトリを置いているディレクトリしか指定できない。リポジトリ自体に設定すると、「Can’t open directory ‘C:\svn_repository\repo’: 指定されたパスが見つかりません。 」と怒られる。
Apacheを再起動して、「http://localhost/svn/repo」にアクセスすると認証画面がでる。認証に成功するとリポジトリ内が表示される。「http://localhost/svn/repo」にアクセスすると403になってしまうのでリポジトリ一覧は見れない。

リポジトリ一覧を表示する設定

SVNParentPath 設定するなら SVNListParentPath on も指定を参考にmod_dav_svnの設定でSVNListParentPathをonに設定する。

<Location /svn>
SVNListParentPath on
DAV svn
SVNParentPath C:\svn_repository
AuthType Basic
AuthName "Subversion Basic Auth"
AuthUserFile C:\svn_repository\htpasswd
Require valid-user
</Location>

これで「http://localhost/svn」にアクセスするとリポジトリ一覧が表示される。

ユーザを追加した場合にApacheの再起動は必要?

いらないみたい。毎回ファイルを読みに行ってるみたいです。

authzによるパスごとのアクセス設定

svnserveのときと同じようにauthzファイルを作成すれば可能。
httpd.confでmod_authz_svn.soを有効にしておく。

LoadModule authz_svn_module   modules/mod_authz_svn.so

1ファイルですべてのリポジトリのアクセス設定をする

httpd.confの設定は以下になる。

<Location /svn>
SVNListParentPath on
DAV svn
SVNParentPath C:\svn_repository
AuthType Basic
AuthName "Subversion Basic Auth"
AuthUserFile C:\svn_repository\htpasswd
AuthzSVNAccessFile C:\svn_repository\authz
Require valid-user
</Location>

AuthzSVNAccessFileを指定するとSVNParentPathである「http://localhost/svn」で403エラーとなった。
今回の場合、C:\svn_repositoryに複数のリポジトリがあるので、authzファイルを以下のようにした。1ファイルですべてのリポジトリを管理しているのが分かる。

[aliases]
[groups]
admin = fujihara
leader = horikita
general = nagasawa,aragaki
[repo01:/]
@admin = rw
@leader = r
@general = r
* =
[repo02:/]
@general = rw

設定を書き換えた場合、Apacheを再起動しなくても設定は反映された。

リポジトリごとの設定ファイルでアクセス設定をする

Locationを複数書けばなんとやら。

<Location /svn>
DAV svn
SVNPath C:\svn_repository\repo01
AuthType Basic
AuthName "Subversion Basic Auth"
AuthUserFile C:\svn_repository\repo01\htpasswd
AuthzSVNAccessFile C:\svn_repository\repo01\authz
Require valid-user
</Location>
<Location /svn>
DAV svn
SVNPath C:\svn_repository\repo02
AuthType Basic
AuthName "Subversion Basic Auth"
AuthUserFile C:\svn_repository\repo02\htpasswd
AuthzSVNAccessFile C:\svn_repository\repo02\authz
Require valid-user
</Location>

でも、これだとリポジトリを増やすたびにApacheを再起動しなければならなくなる。

Webブラウザでの閲覧

Apacheだと「http://localhost/svn」のようにブラウザに打ち込めばブラウザからリポジトリを眺めることができる。authzファイルを使えば、ブラウザからの閲覧も制限可能。