Subversionのセキュリティについて考えてみた。
まず、Subversionのサーバをどうするかで選択肢がわかれる。
- svnserve
- 簡易サーバ。簡単な認証もあるため社内LANならばこれでも問題ない。
- svn + ssh
- SSHで暗号化接続できる。
- http
- Apacheと連携させてhttpで接続する。ブラウザからの確認もでき、Apacheの認証機能をそのまま使える。
まずはsvnserveでのセキュリティを調べてみる。
svnserve
簡易サーバsvnserveの場合は、
- svnserve.confによるリポジトリに対するアクセス設定
- svnserve.confとpasswdによるリポジトリに対する認証
- 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情報を伝えたくない場合は、リーダーだけに権限を与えるのもあり。