Active Directory Federation Services 2.0 (AD FS 2.0) が2010年5月5日にRTWになってたので、クラウド/オンプレミスの境界を越えた認証と認可を見てみようと思います。
と、いってもフェデレーションで利用するトークンを作成したりするインフラ側の話と、トークンやクレームの方式の通信的な部分と、実際に認証・認可するアプリ側の部分と多岐に渡るためなかなか整理しづらいです。
今回はその中でもインフラより?だと思われる Active Directory Federation Services 2.0 を実際にインストールしてみたり使ってみた内容をメモ書きしておこうと思います。
フェデレーションってなんだ?とか AD FS 2.0 ってなんだ?という場合は以下のサイトも参考に。
- Active Directory Federation Services 2.0 – microsoft
- IdM実験室
- AD FS 2.0 でアプリケーションの世界が変わる – TechFilders
- クラウドや SaaS へのシングルサインオンを実現 – Windows Server 使い倒し塾
ADFS 2.0 をインストールしてテストするにあたり、Step-by-Step ガイドを参考にしています。今回記載する内容もそちらに沿って実施したので併せて参照すると良いかもです。
Step 1: 事前準備
今回想定している環境は以下の通りです。
シンプルですね。クライアントと Relying Party となるWebアプリケーションが稼働するマシンは Windows 7 にIISを入れて1台にしています。
対してADFSサーバーとなるマシンは仮想サーバー上で評価版 Windows Server 2008 R2 を使用しました。
ADFSサーバーは Windows Server 2008 R2 Std. x64 JPを素で入れて、ユーザー情報格納用に Active Directory Directory Services (AD DS) を構築しています。(ここでは割愛)
今回はフェデレーションのテストをしたいわけですので、ADFSサーバーとWebアプリケーションサーバーはネットワークとしては接続できますが、ADドメイン参加等は行っていません。(AD参加したらWindows認証でいけるし…)
AD DSまでできたら、AD FS 2.0 RTW をダウンロードしておきます。
Step 2-1: AD FS 2.0 のインストール
AD FS 2.0 のセットアップはウィザードに従って進めるだけで終わります。
| AD FS 2.0 の役割としてフェデレーションサーバーとして利用するか、プロキシとして利用するかを選択します。 ここではフェデレーションサーバーを選択します。 |
|
| Power ShellやIIS、.NET Framework 3.5 SP1等必要なコンポーネントも自動的にインストールされます。 | |
| 完了後はOS再起動します。 |
Step 2-2: AD FS 2.0 の設定
次はIISの設定を行います。AD FS 2.0 がSTSとして動作するにはHTTPS/SSLが必要=何かしらサーバー証明書が必要になりますが、今回は検証目的ですので自己署名の証明書で済ませてしまいます。
証明書の設定は割愛。IIS7.5の通常の方法で行います。
AD FSサーバーおよびRPとして使うWebサーバーですが、接続に利用するサーバー名(証明書に記載されるFQDN等)に含む文字は注意ください。
別環境でPC名そのままでやったのですが、アンダースコアが入っていたため怪しい挙動で認証が通りませんでした。。。(アンダースコア使うなよっていうツッコミは置いといて)
まぁそんな人はいないだろうけど…
ちなみにWebアプリケーション側でもHTTPSを使う予定ですので、忘れず自己署名の証明書を同じように作成して設定しておきます。
また、自己署名の証明書を使ったサイトにアクセスすると証明書のエラーが表示される(発行機関が信頼されていないなど)ので、あらかじめそれぞれのコンピューターに証明書をインポートしておき、警告が出ないようにしておきます。
AD FS 2.0 の設定は管理ツールから行います。
”AD FS 2.0 フェデレーション サーバーの構成ウィザード” をクリックします。
新規で作成するので”新しいフェデレーション サービスを作成する”を選択。
”スタンドアロン フェデレーション サーバー”を選択。
証明書が一つだけなのでそのまま。
これでAD FS サーバーの設定はひとまず終わりです。
Step 3: WIF サンプルアプリケーションのインストールと設定
今回のWebサンプルアプリケーションは、Windows Identity Foundation SDK (WIF SDK) に付属するサンプルをそのまま利用します。
どちらかというと AD FS 2.0 の挙動が見たかったので、アプリの詳細はまた今度。
まずは WIF SDK をダウンロードしてインストールします。
WIF SDK は現時点でv3.5とv4.0がリリースされていますが、v4.0はまだ英語版のみの提供となります。(言語設定を英語にするとダウンロードできます)
v4.0は Visual Studio 2010 のExtentions に対応しています。(今回使うツールなど)
ただサンプルアプリを動作させるだけが目的なら、どちらのバージョンでもOKでした。Visual Studio がなくても必要な設定等は可能ですので。まぁ今後のことを考えるとv4.0で問題ないかと思われます。
ではアプリケーションを設定していきます。SDKに付属するサンプルアプリケーションですが、既定で以下のパスに保存されているかと思います。
C:\Program Files (x86)\Windows Identity Foundation SDK\v4.0\Samples\Quick Start\Using Managed STS
※64Bit環境の場合です。
上記フォルダ内にある”Setup.bat”を管理者として実行すると、IIS上に”ClaimsAwareWebAppWithManagedSTS”仮想ディレクトリが作成されます。
この仮想ディレクトリはそのままだとアプリケーションプールに”WifSamples”が割り当てられていますが、アプリケーションプールそのものが無いのでこのままでは動きません。
何かしらアプリケーションプールを作成して設定しておきます。
例:
※既定のままだとエラーになったので、”ユーザープロファイルの読み込み”だけFalseからTrueにしています。
さて次はフェデレーションの設定を行います。Visual Studio 2010 を使う場合はソリューションを管理者モードで開いて、ソリューション右クリック→”Add STS Reference”を選択します。
Visual Studio が無い場合は直接以下のEXEを起動することで同様の設定が行えます。
C:\Program Files (x86)\Windows Identity Foundation SDK\v4.0\FedUtil.exe
※64Bit環境の場合。SDKがv3.5の場合はパスもv3.5を選択。
今回は日本語のほうが良いのでv3.5でのFedUtil.exeを実行してみようと思います。(v4.0でも英語なだけで差異はありません)
Visual Studio から起動した場合は”アプリケーション構成の場所”はすでに入力されていますが、直接起動した場合は対象のサンプルアプリケーションのWeb.configファイルを指定します。
”アプリケーションURI”はサンプルアプリケーションの公開URLを指定します。(※画面はHTTPですが、HTTPSでないと警告でます)
Security Token Service (STS) を指定します。今回はAD FSサーバーを利用するので、”既存のSTSを使う”を選択し、ドキュメントの場所にAD FSサーバーのURLを指定します。
(今回だと https://adfssrv.jp.contoso.com/)
ホスト名を入力し、場所のテストを行うと結果が開き、ホスト名以下が入力された状態になります。
この画面が表示されない場合やエラーが表示される場合はURLが間違っているか、証明書の問題で表示できないことが考えられますので見直します。
このXMLでは実際に要求できるトークンの種類等について定義されています。
証明書を厳密に確認する場合(本番運用等の場合)は検証を有効にしましょう。(今回は無効で設定)
発行されるセキュリティトークンを暗号化するかどうか指定します。今回は単純化する為に暗号化しないを選択。
先ほど参照したXMLにて定義されていた、STSから提供されるクレームの一覧です。
フェデレーションのメタデータは更新される場合もあるので、この画面のチェックボックスで自動的に更新するかどうかを指定します。
以上でWebアプリケーション側の設定が完了しました。実際には上記ウィザードで指定した内容はWeb.configに追記されています。
要求したいクレームを増やす場合などもWeb.configからできます。(コメントアウトを外すだけです)
Step 4: アプリケーションへの送信クレームに関する AD FS 2.0 の設定
Webアプリケーションから要求されたクレームを適切に処理できるように、AD FS 2.0 側でRelying Party (証明書利用者)を追加します。
AD FS 2.0 管理ツールにて”信頼できる証明書利用者を追加する”を選択します。
データソースを自動で読み込ませる為にWebアプリケーションのURLを指定します。
アクセス許可をルールに応じて指定することも可能です。今回は全員に許可します。
この画面で詳細を確認します。
完了後、そのまま要求規則の編集を行います。
”発行変換規則”の”規則の追加”をクリック。
今回は”入力方向の要求をパススルーまたはフィルター処理”を選択します。
入力方向の要求は”Windows アカウント名”を選択し、そのまま出力するようにパススルーを選択します。
発行変換規則では、要求されたクレームに対しどのような値を返すかのルールを定義します。
条件付けや、AD DS/AD LDS上の情報(LDAP)をマッピングしたり、DB上から取得、またアクセス許可の設定や委任の設定も可能です。
通常はこの一連の流れで要求クレームをどう処理するか定義すると思います。
※RPがほかにもあれば、同じように証明書利用者を追加していくことになります。
Step 5: サンプルアプリケーションへのアクセス
ではStep 4までで一連の設定は問題なく完了しているはずですので、実際にアプリケーションにアクセスしたいと思います。
※Step-by-StepガイドではIEの信頼サイトにサンプルアプリを追加しておけ、と記載がありますね。
IEを使って今まで設定してきたWebアプリケーションのURL https://<host name>/ClaimsAwareWebAppWithManagedSTS/ に接続します。
認証を聞かれるので、AD FSサーバー上の Active Directory ドメインのユーザーIDとパスワードを指定します。
認証が通ればログインでき、要求したクレームの内容が表示されます。
最初にアプリケーションに接続した際、セキュリティトークンを要求されますので、サーバー側にて指定されているSTS(今回だとAD FSサーバー)にリダイレクトされます。
そこで認証情報を与え、パスすればWebアプリケーションから要求されているクレームに対応する情報をクライアントにセキュリティトークンとして返送し、クライアントはWebアプリケーションに対しトークンを渡している…はずです。
今回のケースでは直接クライアントとSTSがHTTPSで通信しています。(WebアプリケーションとSTS間は通信していません)
Webアプリケーション側では受け取ったトークンが正しいものかどうかを証明書等から判断し、問題がなければ正しく認証されたものとして扱うことが可能です。
非常にシンプルな検証ですが、Windowsドメインな世界の信頼関係とは異なり、HTTPSだけで適切な認証と環境の分離ができていることがわかるかと思います。
実際通信にはHTTPSしか使用していませんので、証明書またはHTTPSのエンドポイントをうまく公開してあげることでネットワーク境界を超えることができそうだ、ということがわかります。
おまけ: クレームルールのカスタマイズ
せっかくActive Directoryドメインも構築しているので、AD DS上の情報を返すようにしたいと思います。
変換要求規則を変更して”LDAP属性の要求”に変更します。
Webアプリケーション側でWeb.configを修正し、追加のクレームも取得できるようにした後、クライアントからアクセスするとAD上に登録している情報を取得することができます。
いろいろ便利に使えそうですね。
その他
AD FS 2.0 はエラー等が発生するとイベントログに出力しますので、イベントビューアーで確認することが可能です。
ログの出力レベル等はAD FS 2.0 管理ツールから変更できます。
まとめ
AD FS 2.0 についてなんとなく利用目的が掴めたかな~と思います。
今回はアプリケーション側(WIF)にはノータッチでしたが、今後そのあたりも追及したいかな。最終的には Azure 上でのマルチテナント時の構成と、WAP AppFabric との連携までできるようにしたい。
AD FS 2.0 は企業のADドメインをそのまま活用できますので、余計な管理の手間がだいぶ減るんじゃないかな。
Exchange Server 2010 や SharePoint Server 2010 (2007も、か)もAD FS 2.0 に対応していますので、組織間の認証もうまく統合できそうです。
とまぁ自分用のメモなので端折った部分もありますが、理解の助けになれば幸いです。





































素晴らしい記事、ありがとうございます!!
場末のBlogですが見て頂きまして恐縮です~w
今後も細々とニッチなところ攻めたいと思いますので宜しくお願い致します。