Q

Internet Information Services(IIS)で構築したWebサーバーのコンテンツに,基本認証を使ってアクセスさせています(図4)。しかし,プロキシ・サーバー経由の場合にうまくいきません。ユーザーAがWebサーバー上で認証を受けた後に,同じプロキシ・サーバーを使っているユーザーBがアクセスすると,認証を要求されずにコンテンツが読めてしまいます。

図4●Internet Information Servicesにプロキシ・サーバー経由でアクセスすると同一ユーザーとして認証される

 しかも,IIS上ではユーザーBのアクセスもユーザーAのものとして把握されているようです。ユーザーBのパケットをキャプチャして調べてみると,HTTPリクエストには全く認証情報が含まれていない匿名アクセスなのに,IISのログ上ではユーザーAがアクセスしたことになってしまっています。

 設定を変更してみたところ,標準で有効になっているHTTPキープ・アライブを無効にすると,期待通りにユーザーBの認証処理が行われるようになりました(図5)。なぜなのでしょう?

図5●Internet Information ServicesにおけるWebサイトのプロパティ画面にある[HTTPキープアライブを有効にする]のチェックを外すとユーザーごとに認証を求めるようになる
A

IIS 4.0/5.0では,HTTPキープ・アライブを使用したTCP同一セッション上のHTTPリクエストを,同一ユーザーのものとして取り扱います。そのため,あるTCPセッション上での最初のHTTPリクエストでユーザーAとして認証されれば,そのセッションを明示的にクローズするまで,同じセッション上を使うHTTPリクエストはすべてユーザーAのものとして扱われます。HTTPリクエスト中に認証情報(Authorizationヘッダー)がない匿名アクセスでも同様です。

 HTTPはリクエスト・レベルで認証するのが本来の仕様なため,米国版のサポート技術情報「323574」にもありますが,これは本来はバグといえます。しかし,マイクロソフトではパフォーマンス向上のため,このような独自の実装にしたようです。

 今回の場合,HTTPキープ・アライブが有効だと,プロキシ・サーバーとIISとの間で仮想的なTCPセッションを張ったままになります(実際にはプロキシ・サーバーの実装にも依存)。このため,同じプロキシ・サーバーを使う別のPCからのHTTPリクエストも,このTCPセッションを再利用する形になり認証なしで前のユーザーが再度アクセスしたことになってしまいます。

 ご質問にあるように,すべてのアクセスについてHTTPキープ・アライブを無効にすれば,確かに期待通りの動作になるはずです。ただし,HTTP/1.1の仕様ではデフォルトでキープ・アライブは有効にするように規定しています(該当サイト) 。そのため,キープ・アライブを無効にする回避策は正攻法とはいえません。

VBスクリプトで設定を変更
 そこで,本来の仕様のようにHTTPリクエスト・レベルで認証するよう設定を変更しましょう。具体的には,IISの管理スクリプト・ユーティリティであるadsutil.vbsでメタ・ベースのAuthPersistenceプロパティにサブフラグAuthPersistSingleRequest=Trueを設定してください。

 例えば,IIS 5.0でサイト・レベルに設定する場合,「cscript adsutil.vbsset W3SVC/AuthPersistence 0」と明示的に0にクリアしてから「cscriptadsutil.vbs set W3SVC/AuthPersistSingleRequesttrue」と設定します。念のために,「cscript adsutil.vbsget W3SVC/AuthPersistence」と入力して「64」が設定されていることを確認してください。

 なお,IIS 5.0のヘルプには,Auth-Persistenceのサブフラグは一度に1つしかTRUEに設定できない,と書いてあります。しかし,実際には1つをTRUEに設定しても,他の2つのサブフラグが自動的にはFALSEになることはありません。そのため,上記の一連の手順を踏んでください。

 IIS 4.0の場合は,AuthPersistSingleRequestなどのサブフラグを使用できません。そのため,「cscript adsutil.vbs set W3SVC/AuthPersistence64」と入力して値を直接設定します(IIS 5.0もこの方法で設定可能)。

 なお,Windows Server 2003のIIS6.0では,AuthPersistSingleRequest=True相当の設定がデフォルトになっており,今回のような問題は発生しません。

小森 博司