Subversion1.6 + Apache2.2 サブドメイン設定 & AuthzSVN

BasicApacheとSubversionを使用して、SVNにhttp://~でアクセスするメモ。

サブドメインを用いて、SVNにアクセスする方法を試行錯誤してみました。

 

Subversionにサーバー外部からアクセスする方法は、ざっと調べてみるとおおきくわけて、Apacheベース(WebDAVモジュール)のものとsvnserveベースのものがあるようです。

 

#アクセス認証方法
Apache + Subversion http://~でアクセス Basic認証+ authzファイルによるアクセス制御
svnserve svn://~でアクセス 認証鍵を使ってssh+svn://~でアクセス

今回はApacheベースのものでやってみました。

なお、サーバーへのSubversionApacheのインストールは済んでいるものとします。

 

ここまでの設定は以下のURLを参考に

http://halu834.blog17.fc2.com/blog-entry-28.html

http://osima.jp/blog/log-fsv-subversion/

http://park1.wakwak.com/~ima/centos4_subversion0001.html

 

達成したい条件としては

1.http://svn.example.com/ のようにSVNアクセスにサブドメインを使用する

2.Basic認証で認証機能を付ける

3.authzファイルによるアクセス制御を付ける

4.SVNGUIでチェックアウトやコミットを行えるようにする

 

1の条件では

http://svn.example.com で/home/svn/repos内のリポジトリのリストを表示

http://svn.example.com/project1/ で/home/svn/repos/project1内のbranches,tags,trunkをリスト表示

できるようにしたい。

SVNにhttpでアクセスし、Basic認証を付ける

というわけで手順。

 

まずはサブドメイン使用 + Basic認証までを設定します

Apache設定ファイルのhttpd.confを開き、以下の設定を追加します。

httpd/conf.d/以下にsubversion.confというApacheSVNモジュール用の設定ファイルが作られている場合もあります。)

NameVirtualHost *:80
<VirtualHost *:80>
    ServerName svn.example.com
    DocumentRoot /home/dummy
    ErrorLog logs/svn_error_log
    <Location />
        Require valid-user
        AuthType Basic
        AuthName "Subversion repository"
        AuthUserFile /home/svn/repos/.htpasswd
        SVNListParentPath on
        DAV svn
        SVNParentPath /home/svn/repos
        SVNAutoversioning on
    </Location>
</VirtualHost>
<Directory "/home/dummy">
    Allow from all
    AllowOverride all
</Directory>

この設定では、ホストの振り分けをすべてVirtualHostで行い、全体のDocumentRootのアクセス権をDeny from allにしているため、ダミーのディレクトリをこのホストのDocumentRootに設定し、アクセス権をAllow from allにしています。

全体のDocumentRootのアクセス権をAllow from allにしている場合はDocumentRootの指定と<Directory>ディレクティブの記述は不要になります。

<Location>ディレクティブのAuthUserFileにはBasic認証用のパスワードを指定します。

パスワードの生成は以下のURLを参考にしてください。

http://www.atmarkit.co.jp/flinux/rensai/apache10/apache10b.html

SVNListParentPathはonにしておくと、/home/svn/repos以下のリポジトリをリスト表示することができます。

SVNParentPathはリポジトリが配置される親ディレクトリのpathを指定します。

httpd.confを変更したので、Apacheを再起動します。

service httpd restart

これでhttp://svn.example.com/にアクセスし、Basic認証を行うとリポジトリのリストを表示することができます。

また、http://svn.example.com/project1/でproject1内のbranches,tags,trunkを表示します。

※AuthzSVNによる細かなアクセス制限を設けないのであれば、以降の設定は不要です。

■AuthzSVNの設定

次に、AuthzSVNを使用しリポジトリに対してアクセス制限を指定していきます。

httpd.confもしくはhttpd/conf.d/subversion.confに

LoadModule authz_svn_module   modules/mod_authz_svn.so

があることを確認しておきましょう。なければ追記してください。

先ほどの設定にAuthzSVN設定用ファイルへのアクセスパスを追加します。

NameVirtualHost *:80
<VirtualHost *:80>
    ServerName svn.example.com
    DocumentRoot /home/dummy
    ErrorLog logs/svn_error_log
    <Location />
        AuthzSVNAccessFile /home/svn/repos/authzsvn.conf
        Require valid-user
        AuthType Basic
        AuthName "Subversion repository"
        AuthUserFile /home/svn/repos/.htpasswd
        SVNListParentPath on
        DAV svn
        SVNParentPath /home/svn/repos
        SVNAutoversioning on
    </Location>
</VirtualHost>
<Directory "/home/dummy">
    Allow from all
    AllowOverride all
</Directory>

アクセスパスに指定した場所にauthzsvn.confを作成し、内容を記述していきます。

[groups]
dev1 = Mike, Jhon
dev2 = Wataru, Satoshi

[/]
* = rw

[project1:/]
@dev1 = rw
@dev2 =
[project2:/]
@dev1 = r
@dev2 = rw

[groups]ではBasic認証で使用するユーザー名によってグループを作成することができます。

例ではdev1, dev2グループを作成しています。

[/]はリポジトリルートを意味します。今回の例でいうとプロジェクトがリスト表示される部分です。

*はすべてのユーザーを意味します。

rは読み込み、wは書き込みの許可があることを指します。

両方許可しない場合は=の後に何も記述しません。

[project1:/][project2:/]のようにプロジェクトごとにアクセス権を指定することもできます。

例では、dev1グループはproject1の読み書き、project2の読み込みを行うことができます。

authzSVNの設定は以上です。

ですが、VirtualHostを設定している場合はこれだけじゃ動きません。

■※ここからが本題

今回の例のようにVirtualHostによってLocationを指定した場合、authz.conf内の[/]で指定したリポジトリルートを*=rwのように読み書き可にしているにも関わらず、http://svn.example.com/へのアクセスで「403 Forbidden」になってしまう問題が発生します。

http://svn.example.com/project1/のようにプロジェクトを指定すると、しっかり表示されるのですが。。

どうやら<Location />の指定をすると,authz.confの[/]がリポジトリルートを認識できないようです。

解決策

NameVirtualHost *:80
<VirtualHost *:80>
    ServerName svn.example.com
    DocumentRoot /home/dummy
    ErrorLog logs/svn_error_log
    <Location />
        AuthzSVNAccessFile /home/svn/repos/authzsvn.conf←ここを削除
        Require valid-user
        AuthType Basic
        AuthName "Subversion repository"
        AuthUserFile /home/svn/repos/.htpasswd
        SVNListParentPath on
        DAV svn
        SVNParentPath /home/svn/repos
        SVNAutoversioning on
    </Location>
    #追加
    <Location /repos>
        AuthzSVNAccessFile /home/svn/repos/authzsvn.conf
    </Location>
</VirtualHost>
<Directory "/home/dummy">
    Allow from all
    AllowOverride all
</Directory>

 

アクセスパスの指定だけ<Location /repos>としたディレクティブに入れるとなぜか動いてくれる・・・

なぜだかわかりませんが、これで一応解決です。