IIS 5.0 を利用してイントラネットの Web サーバを構築しようとしています。 基本的にユーザ認証を行なうことでアクセス制御を行なう予定です。 幾つか仮想ディレクトリを作成していますが、図1のように、別のマシンの共有を仮想ディレクトリに設定すると、アクセス制御がうまくできません。
図1: 仮想ディレクトリの設定
上の画面で「接続」ボタンを押すと下のダイアログボックスが出てくるので、接続に使う認証情報を入力する。
いろいろ試してみましたが、誰でアクセスしても、図1のダイアログボックスで設定したアカウントの権限でアクセスしてしまっているようです。
実際、 IIS で認証を行なったアカウントでアクセス可能なファイルであっても、 図1のダイアログボックスで設定したアカウントでアクセスできないファイルにアクセスしようとすると、図2-1のようなダイアログが出てきてしまい、誰のアカウントとパスワードを入力しても図2-2のような画面になってしまって、該当のファイルにアクセスすることができません。 何とかIISで認証したアカウントの権限で仮想ディレクトリ内のコンテンツにアクセスさせることはできないのでしょうか?
図2-1: 認証情報を問い合わせるダイアログボックス
図2-2: どんな認証情報入力すると現れる認証エラーの画面
基本的に、この動作はWindows 2000の仕様になります。
図3のように IISが認証したユーザの権限でコンテンツにアクセスする際は、通常「偽装(Impersonalization)」という機能によって、一時的にそのユーザの権限でアクセスを行ないますが、偽装を行なっても別のマシン上のコンテンツにアクセスする際には再度認証を行なう必要があります。 しかし認証に必要なパスワードの情報はセキュリティ上の理由で保存されていないため、そのままでは別のマシンにアクセスすることができないのです。
+-- 再度認証が必要 | [クライアント] ----> IIS マシン --------> リモートマシン ユーザA | として |<-- 偽装を行ないユーザAとしてアクセス 認証 | ローカルコンテンツ
図3: 偽装を用いた場合の別マシンへのアクセス
ただしActive Directoryを構築していて Kerberos 認証が利用できる場合は、期待する動作を実現させる方法があります。 Kerberos 認証の場合は「委任(Delegation)」という機能を用いることで、図4のように、一度認証された情報を持ち回ることが可能なためです。
+-- ユーザAとして認証したチケットを提示 | [クライアント] ----> IIS マシン --------> リモートマシン ユーザA | として |<-- 偽装を行ないユーザAとしてアクセス 認証 | (チケットを ローカルコンテンツ 受けとる)
図4: Kerberos 認証の場合の別マシンへのアクセス
ただし、委任の機能は通常無効になっているため、幾つか設定が必要になります。
まずは「Active Directory ユーザとコンピュータ」よりリモートマシンのコンピュータオブジェクトのプロパティで図5のように「アカウントを委任に対して信頼する」がチェックされていることを確認します。通常DC(ドメインコントローラ)は、デフォルトでチェックされていて、それ以外のマシンはチェックされていないはずです。
図5: コンピュータアカウントのプロパティ画面
なお, この設定を行なうと
のような警告ダイアログが出現しますので、OK を押してください。
次に、IIS で認証するアカウントに付いても、図6のようにユーザのプロパティより「アカウントは委任に対して信頼されている」をチェックしておく必要があります。 なお、多数のアカウントに対してこの設定を行なう場合は ADSI でこの属性を操作することもできます。
図6: ユーザアカウントのプロパティ画面
図7に users コンテナ内の testuser というユーザに対してこの属性を設定するサンプルスクリプトを示します。
図7: Dim userAccountControl Dim objUser Set objUser = GetObject ("LDAP://CN=testuser, CN=users, DC=w2k, DC=ts, DC=coe, DC=nttdata, DC=co, DC=jp") userAccountControl = objUser.Get("userAccountControl") REM アカウントは委任に対して信頼されている属性(&h80000)を設定する userAccountControl = userAccountControl Or &h80000 objUser.Put "userAccountControl", userAccountControl objUser.SetInfo Set objUser = Nothing
最後にIISサーバ上で、図8のようなスクリプトを実行して該当の仮想ディレクトリの UNCAuthenticationPassThrough というプロパティを True に設定してください。 設定は即座に反映されますので、特にIISの再起動を行なう必要はありません。
以下の例では share という仮想ディレクトリに設定を行なっている。GetObject() で指定するパスは実際のIISマシンのサイト構成などによって適宜変更する必要がある。 Dim objVDir Set objVDir = GetObject("IIS://localhost/W3SVC/1/Root/share") objVDir.UNCAuthenticationPassThrough = True objVDir.SetInfo Set objVDir = Nothing
図8: UNCAuthencationPassThrough を設定するスクリプト
なお、冒頭でも述べたようにこの設定が有効になるのは Kerberos 認証で認証が行なわれた場合のみです。 Windows NT/9x 等の従来のクライアントからアクセスした場合や、別フォレストやワークグループ構成の Windows 2000 からアクセスした場合は Kerberos 認証は用いられません。 こうした場合は、委任の設定を行なっていても、冒頭の図1で示したアカウントとパスワード情報を利用した従来通りの方法で別マシン上のコンテンツに対するアクセスが行なわれます。