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

Subversion SVN

Subversionのセキュリティについて考えてみた。
まず、Subversionのサーバをどうするかで選択肢がわかれる。

svnserve
簡易サーバ。簡単な認証もあるため社内LANならばこれでも問題ない。
svn + ssh
SSHで暗号化接続できる。
http
Apacheと連携させてhttpで接続する。ブラウザからの確認もでき、Apacheの認証機能をそのまま使える。

まずはsvnserveでのセキュリティを調べてみる。

svnserve

簡易サーバsvnserveの場合は、

  1. svnserve.confによるリポジトリに対するアクセス設定
  2. svnserve.confとpasswdによるリポジトリに対する認証
  3. svnserve.confとauthzによるパスごとのアクセス設定

が可能。svnserveの場合は、どれも再起動せずに設定が反映された。

svnserve.confによるリポジトリに対するアクセス設定

匿名ユーザの場合と、認証済みユーザの場合が設定可能。匿名ユーザは「anon-access」で認証ユーザは「auth-access」となる。値は「none」、「read」、「write」を設定できる。
匿名ユーザのアクセスを制限する場合は、以下のように設定。

 [general]
anon-access = none

svnserve.confとpasswdによるリポジトリに対する認証

認証ユーザの認証はpassword-dbで指定したファイル(ここではpasswd)で設定する。

 [general]
anon-access = none
auth-access = write
password-db = passwd

passwdファイルには以下のように設定する。平文なので注意。

 [users]
fujihara = fujihara
dai = dai

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

svnserver.confには以下のように記述する。

[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz

authzにパスごとの設定を記述していく。
passwdファイルのメンバーをグループに分ける。

[groups]
developers = fujihara,nagasawa
manager = fujihara,aragaki

ルートフォルダ直下にはmanagerだけ読み書きができ、それ以外は読み込みだけできるようにする。以下の設定だとnagasawaさんは/all.txtを読むことができても編集できない。

[groups]
developers = fujihara,nagasawa
manager = fujihara,aragaki
[/]
@manager = rw
* = r

以下の設定だとdeveloperフォルダはmanagerの設定をしていないが、サブフォルダは親フォルダの設定を継承するので、ルートの「@manager=rw」を引き継いでいることになる。よってみんな読み書きできる。

[groups]
developers = fujihara,nagasawa
manager = fujihara,aragaki
[/]
@manager = rw
* = r
[/developer]
@developers = rw

以下の設定だと、managerフォルダはmanagerだけがアクセスできる。「* =」だけ書いてしまってもルートの設定を継承してmanagerだけのアクセスになりそうだが、「* =」だけだと全員アクセスできなくなってしまう。

[groups]
developers = fujihara,nagasawa
manager = fujihara,aragaki
[/]
@manager = rw
* = r
[/manager]
@manager = rw
* =

ファイルにアクセス設定をすることも可能。以下の場合、fujihara.txtにはfujiharaしかアクセスできない。

[groups]
developers = fujihara,nagasawa
manager = fujihara,aragaki
[/]
@manager = rw
* = r
[/fujihara.txt]
fujihara = rw
* =

なにも設定していないフォルダは、自動的に親フォルダの設定を継承する。以下の場合、sandboxフォルダ以下はmanagerしかアクセスできない。

[groups]
developers = fujihara,nagasawa
manager = fujihara,aragaki
[/]
@manager = rw
* = r
[/developer]
@developers = rw
[/manager]
@manager = rw
* =

チェックアウトするときには、読み込みができるものだけチェックアウトできる。上の設定では、fujiharaユーザならルートフォルダ直下の全ファイルと、developersフォルダとmanagerフォルダにある全ファイルをチェックアウトできる。
nagasawaユーザの場合は、developersグループなので、ルート直下のファイルと、developerフォルダにある全ファイルをチェックアウトできる。ただし、ルート直下ファイルは読み込み権限しかないので、ファイルを修正することはできても、コミット時にアクセスエラーとなる。
読み込みができると、修正ができてコミットできない状況になるので、「読み書きできる」か「なにもできない」にしぼれるならしぼったほうがいいかもしれない。

svnserve.confとauthzによるパスごとのアクセス設定まとめ

アプリケーションを作る場合に使えそうな設定を考えると、以下のようになった。

[groups]
admin = fujihara
leader = horikita
general = nagasawa,aragaki
[/]
@admin = rw
@leader = rw
@general = r
* =
[/doc]
@general = rw
[/trunk]
@general = rw
[/trunk/db.properties]
[/branches]
@general = rw
[/tags]
@general = rw

dbの接続情報などは個別に設定する。今回、修正はリーダーにしかできないようにしているが、理由は、ローカルでテストすることがある場合、リーダーだけに権限を与えると、一般ユーザはチェックアウトできなくて、「ファイルがないよエラー」になってしまうからだ。
一般ユーザにdb情報を伝えたくない場合は、リーダーだけに権限を与えるのもあり。