ラベル CDJ の投稿を表示しています。 すべての投稿を表示
ラベル CDJ の投稿を表示しています。 すべての投稿を表示

2016年1月31日日曜日

[Windows 10/Azure AD]ハイブリッド環境におけるドメイン参加とシングルサインオン①

こんにちは、富士榮です。

Azure Active Directory(Azure AD)に参加したWindows 10デバイスでのデバイス・サービス間のシングルサインオンの仕組み(Microsoft Passport)については、これまでもidconや本ブログなどでも解説をしてきました。

 [Windows10]デバイス&サービス間のシングルサインオンの仕組み
  http://idmlab.eidentity.jp/2015/05/windows10.html
 [FIDO/Windows10]idcon vol.20(別名fidcon)が開催されました
  http://idmlab.eidentity.jp/2015/05/fidowindows10idcon-vol20fidcon.html


しかし、現実のエンタープライズ・シナリオでは一気にAzure ADへPCを参加させて、クラウドだけで生きていく、ということは考えにくく、まずは現存のオンプレミスのドメインとWindows 10をどうやって組み合わせて活用していくのか?が焦点になっていくものと思われます。

と、いうことで今回はオンプレミスのドメインにWindows 10のPCを参加させて、Azure ADと連携することで得られる利点について解説していきたいと思います。いわゆるハイブリッドID基盤をWindows 10を使うことで更に活用できますよ、というシナリオです。

ちなみに、やれることは単純にデバイスへのログインと社内アプリ、社外アプリへのシームレスなログイン(シングルサインオン)ですが、この環境を実現するためのシナリオとしては複数の方法があります。

1)AD FSを構築してAzure ADとID連携する方法
 現在も主流となっているオーソドックスな方法です。PCはあくまでオンプレのAD DSに参加、ログインをして利用しますので、社外で利用する場合は社内ネットワークへVPN接続するか、Web Application Proxy(WAP)を用意してForm認証する必要があり、AD FSがダウンすると全滅するという弱点がありました。

2)Azure AD WAPを使う方法
 上記1のパターンと似ていますが、PCはAzure ADに参加して社内アプリへのアクセス時だけAzure AD WAPを使うため、可用性の面では改善されたものの、社内にいても社内アプリケーションへのアクセスはあくまでAzure AD WAP経由となるため、ファイルサーバなどの非Webアプリケーションへの対応ができない、など機能面で現実的な選択ではありませんでした。

3)Windows Server 2016のAD FSを使い、Microsoft Passport for Workを利用する方法
 おそらく今後の本命になると思います。社外はAzure ADを使ったMicrosoft Passport、社内はMicrosoft Passport for Work、社内外のつなぎはAzure ADとAD FSの連携という形になるので、オンプレのAD DSに参加したPCでもAzure ADに参加したPCでもシームレスに社内外のアプリケーションを利用できます。非WebアプリケーションについてもMicrosoft Passport for Workではカバーする予定らしいので、そうなると無敵です。弱点は基盤構築が超面倒なところですかね。SCCMとかIntuneとかのMDMが必要になりそうです。

4)Azure AD Connectを使いMicrosoft Passportに使うデバイス情報をオンプレ・クラウド間で同期する方法
 今回紹介する方法です。PCはオンプレのADへ参加するので従来通り社内リソースは統合Windows認証で利用し、社外アプリケーションはAzure ADとMicrosoft Passportで利用する形をとります。認証する局面においてクラウド・オンプレの間で連携がないので、完全に環境を切り離すことが可能なので、可用性はあんまり気にしなくても良いのが利点です。ただ、この後解説しますが現状はちょっと環境を選びます。


では、さっそく解説します。

◆実現すること
おさらいですが、以下を実現します。
・ドメイン参加したWindows 10 PCがAzure ADと連携されているアプリケーションへSSO(PCログインとアプリログインのSSO)できるようにする
・社内ファイルサーバなどへのログインは従来通り統合Windows認証を利用
 ※つまり、Windows Server 2016のAD FSを使ったMicrosoft Passport for Workシナリオではありません。
・社外アプリ(Azure AD連携アプリ)へのログインはMicrosoft Passportを利用




◆前提および制限事項
実現するためには以下の前提や制限があります。
・Azure ADとAD DSはAzure AD ConnectでID同期を行っている
・Azure ADとAD DSはフェデレーションしていない(AD FSを使っていない)
・Azure ADとAD DSの間はパスワードハッシュ同期を行っている
・PCはWindows 10(TH2以降)
・ドメインコントローラはWindows Server 2012R2以降
・オンプレドメイン名とAzure ADドメイン名は同一であること
 (Azure AD ConnectでメールなどUPN以外の属性でオブジェクト・マッチングをするとNG。代替UPNでも良いので同一UPNが必要)
・実際にデバイスがAzure ADに登録されるまでには結構時間がかかります。(ログイン、Azure AD Connectによる同期、ログインの順で処理が走るので、同期の前後でログインをする必要があります)


◆準備作業
まず、準備として以下の2点を行います。
1.クライアントPCが自動的にデバイス登録(Workplace Join)を行うためのタスクの有効化

 グループポリシーの設定を行います。
 Windows Server 2016のドメインだと、
  コンピューターの構成
   ⇒ポリシー
    ⇒管理用テンプレート
     ⇒Windowsコンポーネント
      ⇒デバイスの登録
 から「ドメインに参加しているコンピューターをデバイスとして登録する」を有効にします。
 ※2012 R2サーバだと、「社内参加(Workplace Join)」という名前の項目になっています。





 このポリシーを有効にすることで、クライアントPCにユーザがログインしたタイミングでデバイスを登録するためのタスクスケジューラ(dsregcmd.exe)が起動するようになります。
 (このあたりの細かい動きは次回解説します)


2.有効化されたタスクがAzure AD DRSのドメイン、テナントを解決するためのエントリ(SCP:Service Connection Point)をAD DS上に登録

 1の作業で有効化したタスクがデバイスを登録する先となるAzure ADのサービス名(ドメイン名およびテナントID)をAD DS上に登録する作業です。
 実際の作業としてはAzure AD Connectに含まれるPowerShellのコマンドレット「Initialize-ADSyncDomainJoinedComputerSync」を実行することになります。

 こんな感じです。



 これを行うと、CN=62a0ff2e-97b9-4513-943f-0d221bd30080,CN=Device Registration Configuration,CN=Services,CN=Configuration,DC=example,DC=comにazureADNameとazureADIdという二つの情報が登録されます。先のタスクスケジューラはこの値を見てデバイス情報を登録する先のAzure ADを判別します。
 ※ちなみに、Azure ADのディレクトリ内に複数のドメインが存在する場合、意図しないドメイン名が登録されてしまうことがありますので、その場合は直接AD DS上の値を修正する必要がありそうです。(これが原因かどうかはわかりませんが、うまく動かないことがありました)




◆PCをドメインに参加させ、ドメインユーザでログイン、そして同期する
ここは特に何もいりません。通常の手順です。

ただ、グループポリシーが正常に適用されると「Automatic-Device-Join」というタスクが自動的に実行されているはずです。



結果、いくつかのことが発生します。

まずは、初回ログインの際、ドメインに登録されたコンピュータオブジェクトのuserCertificate属性に証明書がセットされます。(タスクの中で自己証明書を発行します)



このあとAzure AD Connectでデバイス情報の同期を行います。Azure AD Connectの同期ルールを見るとuserCertificateに値が入っていないとAzure ADへコンピューターオブジェクトを同期しないので、この段階で初めて同期対象となるためです。

同期されるとAzure AD上にデバイスが登録されます。登録状態はGraph Exploreで確認するしか方法がありません。



そして、再度ドメインユーザでログインします。
するとAzure AD上に登録されたデバイスとログイン時に実行されるタスクによる登録要求の突合が行われ、Microsoft Passportに必要なKey Registration Serviceエンドポイントでの認証に必要なクライアント証明書がダウンロードされます。
この後、Windows 10はキーペアを生成し、秘密鍵をTPMに、公開鍵をKey Registration Serviceへ登録し、Microsoft Passportのデバイス登録フェーズが完了します。

次回Azure ADへログインする際はTPM上の秘密鍵で署名したリクエストによりPrimary Refresh Token(PRT)が取得できるので、そのあとは必要なアクセストークンを取得してアプリケーションを利用、という流れでシングルサインオンが実現します。

この際、ユーザのアカウント設定のページにはAADTokenBrokerが発現、紐づけられたAzure AD上のアカウント情報が表示されます。




◆Azure ADと連携したアプリケーションへアクセスする
ここまで来れば、これまで紹介したものと同じです。
アクセスパネルにアクセスするとAzure ADでのログインを求められることなく、アクセスできます。





かなりややこしいフローになるため、次回は少し深いところの仕組みを解説し、なぜこのような動きをするのか?を解説したいと思います。

2015年5月10日日曜日

[Windows10]デバイス&サービス間のシングルサインオンの仕組み

※ご注意
・現在公開されている情報+Fiddler等でWindows10の動きを解析した結果からの推測です。
 (そのうちMSDNあたりに確かな情報も公開されると思います)
・Windows10 Insider Preview(Build 10074)をベースに確認しています。
・細かい話は今月末(5/27)に開催されるidcon(別名fidcon)で話をする予定です。



今回はこれまで紹介してきたWindows10のクラウド・ドメイン参加(Cloud Domain Join/CDJ)によるPCログオンとOffice365等のアプリケーションの間のシングルサインオンの動作の仕組みについて考えてみます。

その前におさらいです。

◆CDJとは
簡単にいうと、Windows10のデバイス(PC)へのログオンにAzure Active Directory(AzureAD)を使う、つまりオンプレミスのActive Directoryへのドメイン参加ではなく、クラウド上のAzureADへドメイン参加する機能のことです。

<関連ポスト>
 [Windows10/AAD]クラウド・ドメイン参加を試す
 http://idmlab.eidentity.jp/2015/02/windows10aad.html

 [Windows10/AAD]OOBEでクラウド・ドメイン参加
 http://idmlab.eidentity.jp/2015/03/windows10aadoobe.html


◆CDJを使ったTrue SSOとは
これまでWebアプリケーション間のSSOはAD FSやAzureADなどSAMLやws-federationの実装により割と容易に実現出来ました。また、社内のPCの様にActive Directoryドメインに参加している環境においてはAD FSへの統合Windows認証をすることによりPCログオンとWebアプリケーションとの間でのSSOを実現してきました。
しかし、あくまで統合Windows認証に依存する仕組みのため、社外からのアクセスなどドメイン・ネットワークの境界を超えると途端にSSO出来なくなる、という非常に限定的な仕組みでもありました。


しかし、CDJを使いPCログオンをAzureADで行うことによりドメイン・ネットワークの境界の外にある社外PCについてもPCログオンとWebアプリケーションのSSOを実現することが出来るようになりました。


<関連ポスト>
 [Windows10/AAD]Technical Preview Build 10041のCDJでOffice365とのSSOを実現
 http://idmlab.eidentity.jp/2015/03/windows10aadtechnical-preview-build.html

 ※ちなみにBuild 10074ではOffice365とのSSOは上手く動かず、代わりにAzureの新管理ポータル(https://portal.azure.com/)へSSO出来るようになっています。



さて、本題です。
では、CDJを使いWindows10のPCではどのようにデバイスとアプリケーションの間のSSOを実現しているのでしょうか?

CDJではざっくり言うと以下の処理が実行されます。
①AzureADへのデバイス登録
 ⇒秘密鍵のダウンロード、TPMへの保存
②ユーザ認証
 ⇒秘密鍵を使ってAzureADからプライマリ・リフレッシュ・トークン(PRT)の取得
③アプリケーションへのアクセス
 ⇒AzureADでPRTをアクセス・トークンへ交換し、アプリケーションへ提示

PINや顔認証でPCにログインできるようになるのは、CDJでAzureADの信頼済みデバイスとして登録された後、TPM上にストアされた秘密鍵にアクセスすることが出来ることでユーザを認証することが可能なためです。
(この秘密鍵にアクセスするためのパスフレーズとしてPINやバイオメトリクスを使っているのが噂のWindows Helloです)


このあたりは、先日のJapan SharePoint Groupでデモを交えつつ話をした内容です。
当日のスライドはこちら。後半でNext Generation Credentials/NGC(現在はPassportって言ってるやつです)のフローを解説しています。



特にこの辺のスライドですね。


で、実際SSOを実現するには、この中で出てくるPRTをアプリケーション向けのアクセス・トークンに交換する必要がありますが、この部分を担当しているコンポーネントがWindows10から導入された「Web Account Manager」および「AAD Token Broker Plugin」です。

Web Account Managerは現在.NETやJava Script向けに提供されているActive Directory Authentication Library(ADAL)の後継(?)となるコンポーネントで、バックエンドで認証やアクセストークンの取得などの処理を行うものです。ただ、ADALが各アプリケーションに組み込むライブラリとして提供されていたのに対して、Web Account ManagerはWindows10/Windows Phone10に組み込まれた独立したモジュールとなっています。

OpenID ConnectのRPとして実装されたWebアプリケーションは、AzureAD上に登録する必要があり、登録の際のredirect_uriに「ms-appx-web://Microsoft.AAD.BrokerPlugIn/[アプリケーションのsid]」を指定することでWeb Account Managerを呼び出すことが出来ます。(ネイティブアプリケーションからはRequestTokenAsyncなどのAPI経由で呼び出します)

Build 2015のセッションより


単純にWeb Account Managerを使うだけだとAzureADで個別に認証をしてアクセス・トークンを受け取る必要がありますが、先にCDJで取得したPRTがあると、AAD Token Broker PluginがPRTをAzureADへ渡してアクセス・トークンを取得するのだと思われます。

これで、PCへのログオンとWebアプリケーションへのログオンのSSOの出来上がりとなります。


ちなみにAzureAD上にリソースとして登録していないWebサイトからの認証要求が来ると、AADのイベントログにID1098、1097が記録されるので、PRTの交換に失敗していることがわかります。




一番上にも書きましたが、5/27のidconでもう少し深く仕組みの紹介をしたいと思います。
※CDJの各フェーズで実際にどのような通信が発生しているのかをfiddlerで可能な限り取得した結果などもお見せできれば、、と思います。仕組み上、ログイン中に発生している通信も多いので、全部がトレースできる訳ではありませんが。。。

2015年3月13日金曜日

[Windows10/AAD]OOBEでクラウド・ドメイン参加

※PIN入力がうまく行ったので少し追記しました。
※うまく行く条件が判明しました。AADのユーザの姓名に日本語があるとNGです。

先日の続きです。

 [Windows10/AAD]クラウド・ドメイン参加を試す
 http://idmlab.eidentity.jp/2015/02/windows10aad.html

先日は一旦LiveアカウントでWindows10にログインした後、組織のアカウントでクラウド・ドメイン参加をしましたが、今回はsysprep後の初期セットアップ中にいきなり組織のアカウントでログインします。
(先日のポストでうまく行かなかった部分のフォローアップです)


前提となるAzureAD側の準備は先日のポストと何も変わりません。

PC側の手順は以下の通りです。

①PCを初期起動すると、ライセンスキーの入力を始め、色々と設定を入れる画面が出てきますが、まず[Shift+F10]を押してコマンドプロンプトを起動します。

②そしてレジストリエディタ(regedit.exe)を起動すると、いきなり「HKLM\Software\Microsoft\Windows\CurrentVersion\OOBE\TestHooks」が開いた状態になっていますので、表示されているキー「TestBlockAadWebApp」を消してしまいます。

③PCを問答無用で再起動します。

④うまく行けば、「このPCを所有しているのは誰ですか?」と聞いて来ます。
 この画面が出なければ再起動を繰り返します。私は3回くらい再起動したら出ました。どうやらタイミングの問題の様です。

⑤ここまでくれば前回と同じなので、組織のアカウントでログインします。
⑥PCにログインした後、AzureADのユーザの情報を見るとデバイスが登録されているのがわかります。




ディレクトリ同期されている環境だと、このデバイス情報がオンプレミスのADにも同期されるようですが、現状はうまく同期されません。おそらく同期ルールがまだ対応していない、もしくはAD FSのDRSで拡張するオンプレADスキーマがクラウド・ドメイン参加のデバイスに対応していないんだと思います。

また、PCにログインした後、「クラウド体験ホスト」が自動的に起動してきてPINの登録が求められるんですが、これがやたらと不安定で、なかなかうまくPIN登録画面にたどり着かず、「Something went wrong」と言われてしまいます。
ここでPIN登録まで終わるとNGC(Next Generation Credentials)のセットアップ・フェーズが完了するはずなんですが、中々うまく行かないものですね・・・。

⇒試行錯誤していたらPIN入力画面が出てきました。
 関係性はわかりませんが、デバイス登録したユーザとは別のAADユーザでログインしたらPIN登録画面が出ました。
 ⇒姓・名に日本語が入っているユーザだとダメなようです。Previewの間は英語名のユーザを使うしかありませんね。

PINを使ってログオンできるようになります。


尚、この状態だとVisualStudio OnlineについてはPCログインとブラウザログオンがSSOされるようです。(初回ブラウザ起動時にID/PWDを入力するとクレデンシャルが保持される仕組みっぽい)
※Cookieとか全部消すとやり直せます。
※Office365でも試してみましたが、こちらはまだダメでした。



今後に期待です。