- blogs:
- cles::blog

リバースプロキシと Digest 認証



svn サーバをリバースプロキシ越しに使おうと思って mod_rewrite を使ってルールを書いてみたのですが、認証でコケるので困ってしまいました。
仕方がないので svn が入っているマシンの error_log を確認してみたところ、下記のような見慣れないエラーが出ていました。
どうやら Digest 認証がうまくいってないようです。この svn サーバは Kanon で構築したものでしたが、認証がデフォルトで Digest だということをすっかりすっかり忘れていました。ダイアログが同じなので Basic 認証と勘違いしていました。ダイジェスト認証の仕様についてはRFC2617*1に詳細がありますが、ダイジェストの生成アクセス先の uri が含まれているので、リバースプロキシでオリジナルのサーバと違うパスにコンテンツをマッピングしてしまうと認証が通らなくなってしまうようです。このあたりではまっているのはどうやら僕だけではないようで、いろいろと事例*2が出てきます。
以下、設定メモ。
† まず単純に rewrite して失敗
今回のサーバ構成はこんな感じです。
Origin は root を持っていますが、Proxy の方は一般ユーザーということで、 .htaccess だけでなんとかしなければならない状態でした。
とりあえず http://proxy.example.com/~someuser/svn/* → http://origin.example.com/svn/* とすればいいような気がしたので、下記のファイルを配置。
http://proxy.example.com/~someuser/svn/.htaccess
ところがこの設定では、前述の Digest: uri mismatch が出て認証できませんでした。
† さらに工夫してみる
仕方がないので、ググってみつけた事例*3を参考に origin のサーバにもユーザーディレクトリを掘って、さらに mod_rewrite することにします。
mod_rewriteの設定は下記のような感じになりました。
http://proxy.example.com/~someuser/svn/.htaccess
http://origin.example.com/~someuser/svn/.htaccess
これで Digest 認証は無事通るようになったので「いけるか?」と思ったのですが、無情にも svn は下記のようなエラーになってしまいました。
よく見ると、proxyマシンの /svn 以下のファイルに PROPFIND しようとしているのが確認できます。
おそらく svn で流れてくる情報のパスがオリジナルのパスになっているのでしょうが、さすがにこれ以上問題を深追いするのも難しくなってきました。
† 仕方がないので
もう仕方がないので、originの /svn のエイリアスを /~someuser/svn にも配置してしまうことにしました。
ちょっとダサいのですが、今回はここでタイムアップです。
- *1: HTTP 認証: 基本アクセス認証及びダイジェストアクセス認証
- *2: Digest 認証と Reverse proxy の話 - 酒日記 はてな支店
- *3: Proxy越しのDigest認証 - インフラエンジニアway
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/4983
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(112179)
3 . 年次の人間ドックへ(111663)
4 . 2023 年分の確定申告完了!(1つめ)(111250)
5 . 三菱鉛筆がラミーを買収(111143)