ホーム < ゲームつくろー! < IKD備忘録

Subversion
リポジトリごとにアクセス許可を設定する


 Subversionはバージョン管理ツールと呼ばれる部類の一つです。プロジェクト内で複数人数で開発をしている時にファイルの上書き衝突を防いでくれたり、特定のバージョンにアンドゥできたりと、もうこれが無いとどうやって開発して良いか分からないくらい必須のツールです。

 SVNはローカルPCにもインストールして使えますが(便利ですよ)、Apache等で構築したWebサーバーと連動させる事で、HTTPを通して世界のどこにいてもSVN管理下のファイルを取りだしたりSVNサーバーにアップしたり出来てしまいます!腰が砕ける程もの凄く便利なんです。ただ、世界中のどこからでもアクセスできるという事は、世界の誰でもSVNを通してファイルを読み書きができてしまうという事です。プロジェクト内の極秘のファイルが簡単に読まれてしまうのはまずい訳です。さらにバージョン管理されているファイルを勝手に上書きする事もできてしまいます。これらを防ぐためには、SVN管理フォルダ下のアクセス許可をきっちりと設定する必要があります。


@ Apache側の設定

 Apacheの設定ファイルであるhttpd.confファイル内のSVN設定項目を次のようにします:

Apache内SVN設定
<Location /hoge/svn>

    DAV svn
    SVNParentPath "C:/hoge/svn"
    AuthType Basic
    AuthName "Subversion repositories"
    AuthUserFile "C:/auth/svnPassword"
    Require valid-user
    AuthzSVNAccessFile "C:/auth/authzsvn.conf"

</Location>

Locationにはsvnの管理フォルダへのパスを指定します。
DAV svnは必ず必要です。このままでOKです。
SVNParentPathは複数のリポジトリフォルダをhoge/svnフォルダに置く場合に指定します。例えばhoge/svnフォルダにfooリポジトリとfoo2リポジトリを別に置く事を想定している場合などです。
AuthTypeは認証タイプで、Basicを指定するといわゆるBasic認証になります。これを使わないとHTTPを通してSVNフォルダにアクセスする時にパスワード認証が行われなくなってしまうので超重要な設定項目です。
AuthNameは認証名で、上の記述で固定です。
AuthUserFileにはユーザー名とパスワードが記載されているファイルを指定します。svnPasswordという拡張子無しのファイルを指定していますが、別に拡張子があっても構いません(笑)。このファイルの作り方はApacheのインストールフォルダのbin/htpassword.exeを参照下さい。
Require valid-userというのはこのフォルダにアクセスするすべてのユーザーのアクセスを基本許可するフラグです。基本許可するのですが、次のAuthzSVNAccessFileでアクセスにフィルタを掛けます。
AuthzSVNAccessFileはこのSVNフォルダ(hoge/svn)ノアクセス許可の設定ファイル名をパス指定します。このファイルの記述が肝です。

 以上でApache側の設定は終わり。これでHTTPを通してSVN管理下ファイルにアクセスする入口は整いました。


A SVNアクセス許可ファイルの作成

 続いてAuthzSVNAccessFileで指定したアクセス許可の設定ファイルを作ります。指定したパスに新規のテキストファイルを作り指定の名前に変更します。

 書き方には決まりがあります。まずは一番簡単な「全員の読み書き許可」はこんな感じです:

全員読み書き許可
[/]
* = rw

最初の[/]はルートフォルダ(hoge/svn)を意味しています。次の「* = r」ですが、「*」はすべてのユーザを意味しています。「rw」は「読み書き許可」を表しています。この設定にすると、svn下にあるすべてのリポジトリフォルダへの読み書きアクセスが許可されてしまいます。大公開になってしまうわけです(笑)。なので、通常ここは全員読み書き不可にするか、読み込みのみ許可するようにします。読み書き不可は、

全員読み書き不可
[/]
* =

と右側に何も指定しません。読み込みのみ許可(SVNのチェックアウトとUpdateを許可、コミットは不可)する場合は、

全員読み込みのみ不可
[/]
* = r

です。ただし、このままだと開発者もチェックアウトはできますがコミットできなくなってしまいます。そのため、通常は開発者や開発の許可を与えた人のみコミットを許可するようにします。一番愚直なやり方は開発者のID(ユーザ名)を列挙していく方法です:

開発者にコミット許可を与える
[/]
* = r
ikd = rw
hoge_san = rw
foo_kun = rw

この設定の場合、hoge/svnフォルダ下のすべてのリポジトリに対してikd、hoge_san、foo_hunは読み込みだけでなく書き込み(コミット)もできるようになります。個人指定ではなくて「開発者」というグループを作って、そのグループに対して許可を与える事もできます:

開発グループにコミット許可を与える
[groups]
developers = ikd, hoge_san, foo_kun

[/]
* = r
@developers = rw

最初に[groups]でグループ定義をします。グループ名に続いて複数人のユーザ名を列挙していきます。次にグループ名に対して読み書きのフラグを与えるのですが、個人名と識別するために頭に「@」を付けます。これで開発グループ全員に読み書きの許可が付きました。

 開発によっては、リポジトリごとにアクセス許可を設定する事もあります。その場合はリポジトリを指定していきます。リポジトリの指定は例えば[repo:/]などのように記述します。hoge/svn下にrepoというリポジトリとrepo_exというリポジトリがあるとした場合、個々のリポジトリに対する許可は次のように記述します:

個々のリポジトリのアクセス許可を設定
[groups]
developers = ikd, hoge_san, foo_kun

[/]
* = r
@developers = r

[repo:/]
* = r
@developers = rw

[repo_ex:/]
* =
@developers = rw
foo_kun =

repoリポジトリに対しては全員に読み込み許可を与えています。そして開発グループにはコミットの許可も付加しています。一方repo_exリポジトリは全員が読み書き不許可です。とっても秘密なリポジトリというわけです。開発陣のみ読み書きが許可されていますが、foo_kunだけは中を見る事もコミットもできません。

 リポジトリの下のフォルダに対しても細かくアクセス許可を指定できます。先ほど読み書きを不許可にされてしまったfoo_kunですが、repo_exリポジトリの下にあるsandboxフォルダのみ読み込み許可を与えるならば、

リポジトリ下のフォルダにもアクセス許可を設定
[groups]
developers = ikd, hoge_san, foo_kun

[/]
* = r
@developers = r

[repo:/]
* = r
@developers = rw

[repo_ex:/]
* =
@developers = rw
foo_kun =

[repo_ex:/sandbox]
foo_kun = r

とそのフォルダに対して読み込み許可フラグを再度付けてあげます。記述が無い場合、親フォルダの許可と同じになります。

 こんな感じで細かく許可を設定してあげれば、安心して世界に向けてSVN管理フォルダを公開できます。ちなみに、そういう管理フォルダはブラウザからもアクセスできますが、読み込み不許可にすると認証に失敗してみる事が出来なくなります。これを間違って設定していると、世界中に極秘ファイルを閲覧可能状態にしてしまう事もあるため、十分に気を付けて、テストで万全を期すようにして下さいね。