Subversionの導入とapacheでの公開及びアクセス制御

Redhat Enterprise互換のLinuxディストリビューション CentOS に、Subversionをインストールします
また、apacheで外部公開し、アクセス制御も行う設定をします

※以前書いた記事を本サイトに転記したものです

目次

  1. 構築する環境
  2. subversion導入
  3. subversionを使ってみる
  4. リポジトリの作成
  5. リポジトリの編成/ソースの追加
  6. タグの作成/ブランチの作成
  7. WebDAVでのリポジトリ公開
  8. WebDAVアクセス認証

構築する環境

Redhat Enterprise互換ディストリビューションであるCentOS上に、Subversionサーバを構築します
構築したSubversionサーバへはWebDAV経由でリポジトリへのアクセスを行える様にします
また、利用ユーザ(グループ)毎に細かいアクセス制限ができる様にします
WebDAVを使うという事で、apache2の導入も必要になります
ここではapache2の導入が終わっていることを前提での手順を記載します

subversion導入

yumにて導入を行います。

$ sudo yum install subversion

これでインストールは完了です

引き続き、リポジトリを作ったり、WebDAVで公開したり、アクセス認証の設定等を行っていきます

subversionを使ってみる

Subversionのインストールが完了しましたので、実際に使ってみようと思います
「sample」というプロジェクトのソースをsubversionで管理する様にします。(リポジトリ名もsample)
なお、sampleプロジェクトは以下の様なディレクトリ/ファイル構成とします。

sample
  +--src/
    + aaaa.c
    + bbbb.c
    + include/
      +aaaa.h
      +bbbb.h

また、リポジトリの編成は以下の様にします。


sample/trunk        : 開発の主系
sample/branches     : ブランチのコピーを保持
sample/tags         : タグのコピーを保持

リポジトリの作成

リポジトリの作成場所は、/home/svn/repos/sampleとします。
ディレクトリを作成後、リポジトリをcreateします。

$ sudo mkdir -p /home/svn/repos/sample
$ sudo svnadmin create /home/svn/repos/sample

リポジトリの編成/ソースの追加

リポジトリの編成及びソースの追加を行います。

編成

sampleリポジトリにtrunk,branches,tagsディレクトリを作成します。


$ sudo svn mkdir file://localhost/home/svn/repos/sample/trunk -m "create"
$ sudo svn mkdir file://localhost/home/svn/repos/sample/branches -m "create"
$ sudo svn mkdir file://localhost/home/svn/repos/sample/tags -m "create"

ソースの追加

sampleプロジェクトのソース一式が/tmp/sample/以下にあると仮定します。
開発の主系であるtrunkにソース一式をインポートします。

$ sudo svn import /tmp/sample file://localhost/home/svn/repos/sample/trunk -m "import trunk branches and tags." 

タグの作成/ブランチの作成

タグ/ブランチとはソースのある時点でのスナップショットです。
例えば、「バージョン1.5」の時点での全ソースを後から取得したい場合にあらかじめバージョン1.5時点でのスナップショットを作成しておけば、いつでも取り出せます。
なお、subversionではタグ/ブランチの区別はありません。(ブランチは、最終的にtrunkにマージされるはず・・)
要は「どう使うか」です。

リポジトリの構成で、タグはtags、ブランチはbranchesと決めたので、それぞれの所に以下を実行してtrunkのある時点でのスナップショットを作成します。


$ sudo svn copy file://localhost/home/svn/repos/sample/trunk file://localhost/home/svn/repos/sample/tags/release-1.5 -m "Release 1.0"

これで、Release1.5のタグが作成されました。

WebDAVでのリポジトリ公開

これまでの設定で、SVNリポジトリは使える様になりましたので、WebDAVでリポジトリを公開すべく、追加で設定を行います。
この設定を行うことにより、http://localhost/svn/sample/trunk/ といったURLでリポジトリにアクセスできる様になります

mod_dav_svnの導入

yumにて導入を行います。

$ sudo yum install mod_dav_svn

mod_dav_svnの設定

apache2用のsubversion設定ファイル(/etc/httpd/conf.d/subversion.conf)に対して以下の設定を行います。
ファイルがない場合は新規に作成します


    DAV svn
    SVNPath /home/svn/repos/sample

リポジトリのパーミッション変更

Apacheプロセスがリポジトリにアクセス(読み込み・書き込み)ができる様に適切にパーミッションを変更します

$ sudo chown -R apache:apache /home/svn/repos/sample

SELinux用対策

SELinuxが有効(Enforcing)の場合、/home/svn/repos以下に対して、ラベルを付与しアクセス可能となる様にします

$ sudo chcon -R -h -t httpd_sys_content_t /home/svn/repos

apache2の再起動

pache2を再起動し、設定を有効にする

$ sudo /etc/rc.d/init.d/httpd restart

動作確認

ブラウザで、http://ホスト名/svn/sample/ にアクセスすると、リポジトリが表示されます。

WebDAVアクセス認証

WebDAVでのリポジトリ公開の設定では、全ての人がリポジトリの参照及び更新ができてしまいます。
これではまずいので、細かい認証の設定例を記載します。

authzsvn.confの作成

home/svn/repos/sample/authzsvn.confを以下の様な内容で作成します

[groups]
#開発者
developers = foo, bar
#管理者
manager = foo
[/]
#すべての人が読み込み可能
* = r
[sample:/trunk]
#開発者は読み書き可能
@developers = rw
[sample:/branches]
#管理者は書き込みも可能
@manager = rw
[sample:/tags]
#管理者は書き込みも可能
@manager = rw

上記設定の場合、リポジトリ管理者をfoo , 開発者をfoo,barとして定義してます。
その他(匿名ユーザ)は読み込み専用とし、foo,barはtrunk下の読み書き可能、fooユーザはbranches及びtags下の読み書きが可能となります

匿名アクセスの設定例

すべての人に対して自由にアクセスすることを許します。ユーザは匿名で扱われます。
apache2用のsubversion設定ファイル(/etc/httpd/conf.d/subversion.conf)を以下の様に再定義します。


    DAV svn
    SVNPath /home/svn/repos/sample
    # our access control policy
    AuthzSVNAccessFile /home/svn/repos/sample/authzsvn.conf

認証つきアクセスの設定例

すべての人に対して認証を求めます。
apache2用のsubversion設定ファイル(/etc/httpd/conf.d/subversion.conf)を以下の様に再定義します。


    DAV svn
    SVNPath /home/svn/repos/sample

    # our access control policy
    AuthzSVNAccessFile /home/svn/repos/sample/authzsvn.conf

    # only authenticated users may access the repository
    Require valid-user

    # how to authenticate a user
    AuthType Basic
    AuthName "Subversion repository(sample)"
    AuthUserFile /home/svn/repos/sample/.htpasswd

なお、認証ファイル(/home/svn/repos/sample/.htpasswd)の作成は以下のようにして行います。

$ sudo /usr/bin/htpasswd -c /home/svn/repos/sample/.htpasswd foo

認証つき/匿名の両方でアクセスする場合の設定例

読み込み時は匿名でアクセスするが、更新時に認証を聞いてくる様な設定です。
apache2用のsubversion設定ファイル(/etc/httpd/conf.d/subversion.conf)を以下の様に再定義します。


    DAV svn
    SVNPath /home/svn/repos/sample

    # our access control policy
    AuthzSVNAccessFile /home/svn/repos/sample/authzsvn.conf

    # try anonymous access first, resort to real
    # authentication if necessary.
    Satisfy Any
    Require valid-user

    # how to authenticate a user
    AuthType Basic
    AuthName "Subversion repository(sample)"
    AuthUserFile /home/svn/repos/sample/.htpasswd

特定ディレクトリ以下のみ参照不可とする

Subversionを使って会社間で共同開発する場合、見られたくないドキュメント等があると思います
ここでは、特定ディレクトリ以下についてのみ特定グループの人は参照不可とする為の設定を行います(ディレクトリの存在そのものが知られる事はありません)
Windowsの場合も設定するファイルは同じですので、表記のパス名をWindows用に読み替えてください

想定するディレクトリ構成

以下の様なディレクトリ構成を仮定し、「local」ディレクトリ以下は協力会社には見えない様に設定します

sample
    +trunk
       +--src
           + aaaa.c
           + bbbb.c
              :  :
              :  :
       +--docs
           + 設計書.xls
              :  :
       +--local            <-- (*)ここから下を不可視にする。
           + 見積書.xls
              :  :

authzsvn.confの設定

協力会社のグループを「partner」として設定し、authzsvn.confを以下の様に設定します。(リポジトリ名は「sample」です)

[groups]
#開発者のアカウント (staff1,staff2,staff3というアカウントを定義)
developers = staff1, staff2, staff3
#管理者のアカウント (oresamaというアカウントを定義)
manager = oresama
#協力会社のアカウント (other1,other2というアカウントを定義)
partner = other1, other2
[/]
@manager = rw
[sample:/trunk]
@developers = rw
@manager = rw
@partner = rw

# 協力会社(@partner)は、/trunk/local以下のアクセスは拒否
[sample:/trunk/local]
@partner =

これで、trunk/local以下は協力会社からは存在さえ気付かれないはずです。