カスタム Credential Provider の開発

 

PlatformSDK( Windows SDK) サポートの mitsuruwです。
主に File I/O やセキュリティなど Windows のベーステクノロジーに関連したプログラミングのサポートを担当しております。どうぞよろしくお願いいたします。

今回は Windows Vista 以降大きく変更されたアーキテクチャの一つ、Credential Provider の開発について少しお話したいと思います。

Credential Provider とは

Windows XP 以前の Windows では、ログオンの認証を行うために Graphical Identification and Authentication (GINA) と呼ばれる仕組みが用意されて おり、これをカスタマイズすることにより指紋認証のような独自の認証機能を実装することが可能でした。Windows Vista 以降ではこの GINA に代わって Credential Provider という仕組みが用意されており、GINA と同じく独自の認証機能を実装し、カスタマイズすることが可能です。Credential Providerはセキュリティ向上の観点からカスタマイズ可能な個所が限られていますが、その分 GINA よりもシンプルでわかりやすい仕組みになっています。

 

カスタムのCredential Provider を開発する上でまず意識しておかなければいけないポイントは、Credential Provider はあくまでユーザーからの資格情報( アカウントやパスワードなど Windows にログオンするために必要な情報) を取得することを目的としたインターフェースであり、それ以外の処理を実装する場合は注意が必要だという点です。
例えば、Credential Provider の中で他のネットワーク リソースにアクセスするような時間のかかる処理を行うことは推奨されません。また、Credential Provider には独自のダイアログを表示するためのインターフェースも用意されていますが、まずはあらかじめ用意されているCredential Provider 用のコントロール(テキスト/コンボボックスなど) を使用して期待する動作を実現できないかを検討するのが良いでしょう [図A 参照]。

 

図A: Credential Provider で用意されている各種コントロール
(後述のSampleAllControlsCredentialProvider より抜粋)

 

Credential Provider 開発の第一歩

Credential Provider を開発するにあたっては、まず初めに以下のドキュメントに目を通していただくのが良いと思います。

 Title : Custom Login Experiences: Credential Providers in Windows Vista
URL : https://msdn.microsoft.com/ja-jp/magazine/cc163489.aspx

 これは2007年のMSDNマガジンに掲載されたもので少し前の情報になりますが、Credential Provider について理解するための情報についてよくまとめられています。
冒頭では従来の仕組みであったGINAと Credential Provider を比較し、それぞれどういった違いがあるのかといった点について解説されていますので、ぜひ一読されることをお勧めします。また、”ハイブリッド資格情報プロバイダの呼び出しシーケンス” には、Credential Provider の各メソッドがどのような順で呼び出されるのかがわかりやすく記述されています。

次に実際のコード作成を進めることになるのですが、Credential Provider で実装しなければいけないインターフェースをいきなりスクラッチで実装することはなかなか大変です。そのため、まずは以下のサイトからサンプル プログラムをダウンロードし、このサンプルプログラムをもとに開発を進めることをお勧めします。

 

 Title : Download details: Windows Vista Credential Provider Samples
URL : https://www.microsoft.com/downloads/en/details.aspx?FamilyID=b1b3cbd1-2d3a-4fac-982f-289f4f4b9300

 

上記サイトからダウンロードできるサンプルはすでに動作実績があるもので、可能な限りシンプルな実装になっています。Credential Provider の開発を進めていく際に想定しない動作に遭遇したときは、このシンプルなサンプルでも再現するかを確認することによって、ポイントを絞った効果的な切り分けを行うことができます。実際に私たちサポートにお問い合わせいただく場合にもこのサンプルでも現象が発生するかをまずご確認いただけるようにご案内させていただくことが結構あります。
このサンプルをダウンロードすると RTMCredentialProviderSamples__FINAL.zip という圧縮ファイルを入手することができます。ダウンロードしたファイルを解凍すると [RTMCredentialProviderSamples__FINAL] というフォルダが展開されます。このフォルダにはいくつかのファイルが含まれていますので、これらの内容をそれぞれ簡単にご説明しましょう。

 

 

- Windows Vista Credential Provider Samples Overview UPDATE.doc

一緒にダウンロードしたサンプル プログラムについて詳細に説明されています。まずはこのドキュメントを見ながら一番シンプルなサンプル [Sample Credential Provider]をビルドして登録してみるのが良いでしょう。

[Sample Credential Provider] をビルドして登録する方法については、5ページ目以降に記載されている ”Common Tasks For Extending SampleCredentialProvider” の1. ~ 20. の項目を順番に行えば大丈夫です。これはそんなに難しい作業ではないと思います。ドキュメントの後半に記載されている “Appendix A – Frequently Asked Questions” には、よくお問い合わせいただくような内容が Q&A でまとめられています。これも非常に有用な情報ですので、ぜひご一読ください。
なお、Credential Provider を開発するためには Windows SDK for Vista が必要ですが、これをサポートしているのが Visual Studio 2005 以降となるため、それ以前のVisual Studio ではCredential Provider を開発することはできません。

Windows Vista Credential Provider Samples Overview UPDATE.doc にざっと目を通したら、次は各サンプルプログラムをみていきましょう。

 

- SampleCredentialProvider

Administrator と Guest のログオンのみ実装されている最もシンプルな Credential Provider のサンプルです。まずはこのサンプルの各メソッドをトレースするようなログをいれて、各メソッドがどのようなタイミングで呼び出されて、どのような処理を行っているのかを確認するところから始めると良いでしょう。

 

- SampleCredUICredentialProvider

Credential Provider はログオン認証を行うときだけ使用されているわけではなく、CredUIPromptForWindowsCredentials() というAPIを使用することで様々なアプリケーションから使用することが可能です。例えば、リモートデスクトップで他のマシンに接続する際に認証するためのダイアログも CredUIPromptForWindowsCredentials() によって呼び出されています。このサンプルでは、ログオン認証以外にアプリケーションから呼び出されるシナリオ(CPUS_CREDUI) のための処理が実装されています。
Credential Provider が呼び出されるシナリオは、CREDENTIAL_PROVIDER_USAGE_SCENARIO 列挙体にまとめられています。これを眺めるとどういった場合にCredential Provider が使用されるのか大体イメージしていただけると思います。

 Title : CREDENTIAL_PROVIDER_USAGE_SCENARIO Enumeration (Windows)
URL : https://msdn.microsoft.com/ja-jp/library/bb762493.aspx

- SampleAllControlsCredentialProvider

基本的にはSample Credential Provider と同じようなサンプルなのですが、こちらはテキストボックスやコンボボックスなど、Credential Provider が使用できる9つのUIコントロールをすべて実装したサンプルになっています。Credential Provider でどういったUIを実装できるのかを確認することができます。

  

- SampleHardwareEventCredentialProvider

外部からのイベントによってCredential Provider を制御するような仕組みを実装したサンプルです。サンプルではダイアログボックスのボタンによって動作が変わるような仕組みを実現していますが、たとえば指紋認証を行わないとログオンできないような仕組みを実装する際にも参考になります。

  

- SampleWrapExistingCredentialProvider

これだけは他のCredential Provider のサンプルとは少し違う特殊な実装になっています。このサンプルは、OS 標準の Password Credential Provider (ほとんどの方が一般的に使用されている Credential Provider です) をラップしています。例えば、標準のCredential Provider でほとんど問題ないけれど、少しだけ処理を追加したい、表示を変えたい、といった場合、このサンプルのように他のCredential Provider をラップしたものを作成することで、新しく Credential Provider を開発するよりもはるかに簡単にカスタマイズすることができます。これはWindows XP の頃にMS-GINA をラップしたスタブGINAを作成した経験がある方にはイメージしていただきやすいかもしれません。

いかがでしょうか。Credential Provider は認証用のインターフェースということで他のアプリケーションと比較してやや特殊な分野になるのかもしれませんが、実際にビルドして動作させてみるとそれほど複雑でわかりにくいものではないことがお分かりいただけるといます。
次回以降はCredential Provider 開発について、ポイントごとにもう少し踏み込んだ内容をご紹介していきたいと思います。