ksaitoの日記

日々試したことの覚え書き

Subversionのアクセス制御を設定する

Subversionリポジトリのアクセス制御は、全く興味がなかったのですがホスティングするプロジェクトが増えると他のプロジェクトのソースを間違えて修正してしまうのが心配という意見が必ず出てきます。
こうした意見が出始めると開発用のリポジトリと開発後のソースを入れるリポジトリを別にしたいということになります。
2つのリポジトリの間は、「手作業でマージするのでだいじょぶです」という本末転倒なところに行き着きます。
仕方がないのでSubversionのアクセス制御を設定することにしました。

要件

特定の開発者は、特定のリポジトリにしかコミットできないようにしたい。
例えば、ユーザdev1はrepo1リポジトリの/trunkのコミットのみ許可するように設定したい。

Apache2+mod_authz_svnの設定

アクセス制御は、Apache2+mod_authz_svnで実現します。
Ubuntu/Debianの場合、デフォルトで以下のように設定します。
AuthzSVNAccessFileに指定したファイルにアクセス制御を設定します。

$ grep -v "#" /etc/apache2/mods-enabled/dav_svn.conf | grep -v ^$
<Location /svn>
  DAV svn
  SVNParentPath /var/lib/svn
  AuthType Basic
  AuthName "Subversion Repository"
  AuthUserFile /etc/apache2/svn.passwd
  AuthzSVNAccessFile /etc/apache2/dav_svn.authz
  <LimitExcept GET PROPFIND OPTIONS REPORT>
    Require valid-user
  </LimitExcept> 
</Location>
$ 

アクセス制御の設定

アクセス制御は、テキストファイルで割りと直感的です。
ログインユーザ名か[groups]で定義するユーザグループ毎に読み取り/書き込み/アクセス拒否の指定ができます。(といってもアクセス拒否は匿名ユーザを許可していると意味がありません)
例えば、みんなコミットできるが、一部の限定した人だけは、特定のリポジトリのtrunkしかコミットできないようにするには以下のように設定します。
少数のユーザをグループにして例外のみを定義するのがコツではないかと思います。テキストファイルなのであまり複雑な設定にしてしまうと正しく設定されているか確認することが困難になります。

$ cat dav_svn.authz
[groups]
developers=dev1

[/]
*=rw

[repo1:/sample/trunk]
@developers=rw

[repo1:/sample/tags]
@developers=r
$ 

正直なところ特定多数であれば、制限かけることに全くメリットを感じませんが...