[ADSI] 認証動作ごとの AD へのアクセス要件とは ~ IIS Server と DCの OS のバージョンによって ASP が動作したり、しなかったり ~
皆様ごきげんよう。ういこです。
昨日(というか、今日というか)3/10 午前 0 時から ILM2 新機能などについての Webcast があり、颯爽と参加したのですが、英語早すぎて途中気が遠くなるわ、なんだか公私共にいろいろ考えてしまって鬱々としてしまうわ、死んじゃうかと思いました。誰かリアルに翻訳こんにゃくを作ってよドラえも○!僕たち死んじゃうよ!!
ちなみに日本からの参加者はぴろとくん、わたし、お父さんはサーベイに答え忘れたのでカウント外として、もう一人の方だけでした★
…それはともかく、今内容をまとめたりしていますが、一言で言うと、「こりゃ売れそうだわ」って感じでした。パスワード リセットの機能、メールのディストリビューション リストを簡単に作れる機能、ワークフローやら、もし ILM2 を導入したら、IT 部門の管理コストが相当 Reduce できると思います。まだ Release Candidate なので詳細はもうちょっと先かと思いますが、マニアックすぎて「なにそれ、ルーカ○フィルムのアレ? 」みたいに言われちゃう ILM が、イコール Identity Lifecycle Manager になる日を思い出すと願ったりしています。でもマジでこれ売れるだろうなぁ。
さて、今日の能書きはともかく今日のお題はこちら!
【今日のお題】
助けてドラえ○ん! ADSI でユーザー名とフルネームを表示する ASP プログラムが、実行するサーバーの OS と要求を受け取るドメインコントローラの OS のバージョンによって動作したり、しなかったりしちゃうYO!!
あらあら大変。要は環境によって動作が変わっちゃうけどなんでやねん why? っていうことなのですね。
さて環境を見てみましょう。
◆環境
認証の形態 | |||||
Web サーバ (IIS) |
ドメイン コントローラ |
匿名認証有効 |
基本認証 |
統合認証 |
基本 + 統合 |
Windows 2000 Server |
Windows 2000 Server |
○ |
○ |
○ |
○ |
Windows 2000 Server |
Windows Server 2003 ★ |
× (※a) |
○ |
× (※a) |
× (※a) |
Windows Server 2003 |
Windows Server 2003 |
○ |
○ |
× (※a) |
○ |
Windows Server 2003 |
Windows 2000 Server |
× (※b) |
○ |
○ |
○ |
○ … プロパティの表示ができた | |||||
× (※a) … 表示失敗。80070560→"ERROR_NO_SUCH_ALIAS"→The specified local group does not exist. | |||||
× (※b) … 表示失敗。80070035→"ERROR_BAD_NETPATH"→Automation error, network path not found.
|
・統合認証の際の匿名認証は、オフに設定された状態で検証している。
・クライアントでのユーザーはローカルユーザとしてログオンしている。
・クライアントと IIS サーバは同じドメイン。
・クライアントは ASP を参照する際にドメインのユーザー名とパスワードを入力する。
・認証ダイアログに入力するユーザアカウントは、任意の Domain Users グループのメンバであるユーザ アカウントを使用する。
<< ★ パターンの検証についての補足 >>
Windows Server 2003 ドメインは IIS が存在する 2000 ドメインとは別ドメインであり、信頼関係はない。
この際の ASP プログラム中のユーザ名とドメイン名は、この Windows Server 2003 ドメインのユーザアカウントとドメイン名を指定する。
<< ASP の実装はどんなふう? >>
ASP では、 GetObject("WinNT://< ドメイン名 >/< ユーザ名 >") という実装を行っている。
なるほど、確かに動作が違うようです。
問題が発生した場合、※a は、指定したローカルグループが見つからないエラーで、
※b は、そもそもネットワークパスすら見当たらないというスゴイ状況です。では、何が起きているのでしょうか?
IIS の統合認証のモードで、信頼関係のない別の 2003 ドメインのユーザを ADSI で参照しようとしていることになります。
【結論】
端的に言えばこれはいわゆるダブルホップ問題です。
クライアント から ASP を介し Active Directory (AD) へアクセスする場合、クライアント ⇒IIS 間、IIS ⇒ AD 間の認証動作を伴います。この二段構えの認証動作をダブルホップと呼びます。ダブルホップを伴う AD へのアクセスの場合、必要なプライマリ トークンの受け渡しが行えないような構成であるとこうした現象となる場合があるのです。
【認証動作ごとの AD へのアクセス要件とは?】
それでは、各認証を用いた場合の、AD へのアクセス要件はどんななんでしょうか?
< 匿名認証 >
匿名認証に用いられる IIS サーバ上のアカウントと、AD サーバのビルトイン アカウントが同等であればアクセスが可能です。
< 基本認証 >
クライアント側で必要な資格情報を入力し、このアカウントを用いて ASP から AD へのアクセスを行います。この際、資格情報としてアクセスするアカウントに AD 側の アカウントを用いてやればアクセスが可能です。
< 統合認証 >
この場合、
(1) Kerberos 認証
(2) Microsoft 暗号化認証
上記の順に認証を行います。しかし、Microsoft 暗号化認証はダブルホップ偽装をサポートしていない点に注意が必要です。ただし、 Kerberos 認証が有効であればアクセスが可能になります。 もっとも、IIS、AD サーバ間において信頼関係が無い構成では Kerberos 認証に失敗してしまいます。
< 基本認証 + 統合認証 >
この場合、以下の順に認証動作を行います。
(1) 統合認証 ( Kerberos 認証、 Microsoft 暗号化認証 )
(2) 統合認証が使用できないとクライアント側で判断された場合 : 基本認証実行
ただし、統合認証を行い認証に失敗した場合は基本認証に切り替えての認証動作は行いません。 この優先度から、統合認証で AD へのアクセスが可能な環境は同様にアクセスが可となります。また、基本認証では AD へのアクセストークンが受け渡せるため、クライアント側で統合 認証が使用できないと判断された場合は、基本認証によりアクセス可能となります。
【使用される認証はどうやって決定されるの?】
では、使用される認証についてはどうやって決定されるのでしょうか。
実は実行するスクリプト実装に依存したものではなく、クライアント、IIS(ASP)、ActiveDirectory サーバ の構成内容で決定されるのでした。
たとえば Windows 認証を有効にした場合、Kerberos 認証の使用をしたいとします。この場合、以下の条件を満たす必要があります。
・ Active Directory サーバが Windows 2000 以降のドメインコントローラにインストールされている。
・クライアントで使用されるブラウザが Kerberos 認証をサポートしている。
これに加え、Kerberos 認証 が機能するためには、クライアント、IIS、Active
Directory サーバ間において、信頼された接続が確立されている必要があります。
これを踏まえて、上記の構成をもう一度見てみましょう。この場合、Windows 2003 の Active Directory 環境につきましては、クライアント、IIS のドメイン グループとの信頼関係がない無いといっています。つまり、ダブル ホップ偽装をサポートしていない、NTLM 認証が使用されてしまうことになるのです。
それでも、どーしてもダブルホップしたい!そんなときに思いつくのは Kerberos 認証動作ですよね。
では、そもそも Kerberos 認証動作ってどんな動作なんでしょうか。
Kerberos 認証は、キー配布センタ (KDC)によりクライアント認証で発行されるサービス チケットを、要求するネットワークサービスに提示する事で動作します。すべてのドメイン コントローラは KDC として機能しますが、今回の構成ではクライアントが所属するドメインの DC を KDC として利用するため、所属するドメインと信頼関係を持たない Active Directory のアクセスは行えません。よって、このシナリオだと Kerberos 認証もつかえないという大変しょんぼりな結果になってしまうのでした。
ではどうしたらいいのよキー!…いやいや、あわてないでください。
こういうときも何とかできるか考えてみようじゃないですか。
今回のポイントは、「ダブルホップ」ですよね。
つまり、接続動作を実現するためには、ダブルホップに左右されない認証を用いればいいんですよ。 信頼関係をもたないドメイン構成間の認証としては、基本認証を使用すれば OK ということになります。
【参考ドキュメントとか】
ダブルホップ問題と認証方法に関連する情報といたしましては、以下技術情報がございますので、よろしければ合わせてご確認くださいませ!
ADSI GetObject クエリが VBScript からは実行できるが ASP からは実行できない
https://support.microsoft.com/default.aspx?scid=kb;ja;278836
[HOWTO] ASP.NET で System.DirectoryServices 名前空間を使用する方法
https://support.microsoft.com/default.aspx?scid=kb;ja;329986
[INFO] IIS におけるブラウザクライアントの認証方法
https://support.microsoft.com/default.aspx?scid=kb;ja;264921
ちょっと今日は寝てないので、内容がぼよぼよ~んとしてるかもしれません。
そのうち何かあれば直すので、ご容赦くださいませ。皆様も睡眠は大事ですよ!お仕事はほどほどに。
~ういこう@ほんとうちの blog って不人気みたい~
(ちなみに私は「光神話 パルテナの鏡」の中ボスでケルベロスって名前知りました。あるいは”赤い眼鏡”? どうでもいいですが )