あーかいぶすハイディフィニション

ここはもう更新しとらんのじゃ

http 経由の Subversion で IP 制限する

要は、Trac とか Redmine で、レポジトリを Subversion にして連携してる場合、http 経由でアクセスするとき、どうやってプロジェクト(レポジトリ単位)毎に制限するのか、というお話。

実施した環境はウチの会社のローカルだったんだけど、Pound でバランシングしてたりでめんどかった。環境は以下のような感じ。

[インターネット]->[PCルータ兼FWサーバ(Windows2003Server)]->[Pound(CentOS5.3)]->[社内ローカル]

PCルータからポート 80 へのアクセスは転送されて、Pound でヘッダによって社内ローカルのサーバへ振り分ける設定。多分、運用する規模が小さければ常にセキュリティアップデートに気を配っておけば、こんなもんでいいんじゃないかな(いずれも二重化されてないから、一箇所クラッシュすると終了なんですけどね)。

話がずれましたが、上記のような環境でもインターネット直接続のような環境でもいいんですが、レポジトリのアクセス制限をどうするか。

基本的に、Subversion.conf は、conf.d 等に配置された段階で、設定の中に Basic 認証がコメントされています。これをコメントアウトするだけでも多少は効果がありますが、さらに IP 制限しましょう。「えー固定 IP 持ってない?キャハハ!」という時は、(何もしないよりマシなので)クライアントのホスト名とかで設定するしかないでしょうな(こういう時ってどうやって解決すりゃいいのかな)。一応そういうときのために、Basic 認証も設定しておくべきなんですけどね。

んで前置きが長くなったけど、設定は以下のようにするといいよ!ちなみにサンプルなので、レポジトリ名は「sample」とします。

<Location /repos/sample>
  SetEnvIf X-Forwarded-For "111.111.111.111" ipcheck
  SetEnvIf X-Forwarded-For "222.222.222.22[0-9]" ipcheck
  #SetEnvIf X-Forwarded-For "192.168.0." ipcheck

  Order Deny,Allow
  Deny from all
  Allow from env=ipcheck
  Allow from 192.168.0.
</Location>

SetEnvIf の 評価には正規表現が使えるとの事。
http://httpd.apache.org/docs/2.2/ja/mod/mod_setenvif.html

基本的に「SetEnvIf」の行をコピーして IP 制限すればおk。Pound とかプロキシ経由しない( X-Forwarded-For に値が挿入されない )環境なら、直接 Allow from で制限すればおk。なんかコメントアウトしてる行は、hosts に対象ドメインを記述して名前ベースでアクセスしてくる横着者が居るときとかに解除してね、っていうか入れといてもいいか、実害ないし。