以下の説明は、一定の説明のための実施形態であるが、クレームのスコープはその説明のための実施形態に限定されるものではない。また、説明のための実施形態は、いくつかの新規の特徴を含んでいてもよく、特有の特徴は以下に述べられるシステムや方法を実施するための必須のものでなくてもよい。
図1は、セキュリティサービスを実装するためのシステム100の実施例を示したブロック図である。システム100は、動作している仮想マシンにおいて、セキュリティサービスの追加、変更、および削除を動的に許可し、システム100はオペレーティングシステム140(以下、OSと称する)、Java仮想マシン130(以下、JVMと称する)、Java Authentication and Authorization Service 135(以下、JAASと称する)、Open Services Gateway initiative platform 120(以下、OSGiと称する)、およびコンテキストファクトリ110を有する。システム100は、クライアントアプリケーション170およびセキュリティプロバイダ1 150−1〜セキュリティプロバイダN 150−Nを更に有し、ここでNはセキュリティプロバイダの数を示す。OS140はアプリケーションとハードウェアとの仲介手段として動作し、コンピュータデバイスのリソースの共有の管理、各リソースにアクセスするためのインタフェースの提供、他のアプリケーションに対するサービスの提供を行う。JVM130は、コード(例えば、JAVAバイトコード)を実行するマシン言語に変換するプラットフォーム非依存環境である。JAAS135は、認証および認可サービスを実装し、アプリケーションおよびユーザのアクセス制御を実行する。JAAS135は、異なるログインモジュールをシステムに構成できるようにし、異なるログインモジュールは、JAASアプリケーションプログラミングインタフェース(API)を介してアプリケーションにより構成およびアクセスされることができる。
OSGiプラットフォーム120は、モジュールシステムと、JAVAのサービスプラットフォームと、アプリケーションやコンポーネント(以下、“バンドル”とまとめて称する)のインストール、開始、停止、アップデート、アンインストールをJVM130の再起動を要求することなく実行できる実行環境とを提供する。バンドルは、他のバンドルが利用可能なようにサービスを構成することができる。バンドルのサービスは、他のバンドルが検知し利用できるようにサービスレジストリに追加され、そのレジストリからのサービスの削除は、サービスの削除を検知するように用いられることができる。
システム100は、他のアプリケーション、モジュール、バンドル、コンポーネントなどが利用可能なセキュリティサービスを構成するセキュリティサービスを含む。図1は、セキュリティプロバイダ1−N(以下、“セキュリティプロバイダ150”と称し、150−1、150−2、・・・、150−N)を示し、ここでのNはシステムが動作させることができるセキュリティプロバイダの全数を示す任意の正の整数を示している。セキュリティプロバイダ150(図8に示す)は、バンドル内に実装されることができ、これらのサービスをOSGiサービスとして利用できるようにする(OSGiサービスレジストリにサービスを追加することを含む)。セキュリティサービスプロバイダ150は、ログインモジュールを含むか、JAAS認証/認可サービスを含むサービスを提供すること、の両方もしくはいずれか一方を構成することができる。クライアントアプリケーション170は、バンドルであってもよく、クライアントアプリケーション170は、セキュリティプロバイダ150に1または複数のサービス(例えば、認証や認可)を要求してもよい。
システム100は、OSGiプラットフォーム120にコンテキストファクトリ110を有する。コンテキストファクトリ110は、クライアントアプリケーション170によるセキュリティサービスのアクセスを円滑にする。セキュリティプロバイダ150がOSGiプラットフォーム上にロードされ、開始された場合、セキュリティプロバイダ150は、自身を登録し(例えば、コンテキストファクトリ110やカスタムコンフィグレーションユニット215(図2参照)に)、これは、セキュリティプロバイダ150によって提供される任意のサービスを登録することやサービスプロバイダおよび/もしくはサービスに対するクラスローダを登録することを含む。クラスローダは、仮想マシン(例えば、JVM)にクラス(例えば、Javaクラス)をロードする。クラスローダは、ライブラリを検索し、ライブラリのコンテンツを読み込み、ライブラリ内に格納されたクラスをロードする。ロードは、“オンデマンド”にて(すなわち、動的に)実行されることができるため、クラスがJVMによって実際に用いられるまでロードは実行されないようにしてもよい。
コンテキストファクトリ110は、クライアントアプリケーション170からセキュリティサービスに対する要求を受け付け、クライアントアプリケーション170にセキュリティサービスのインタフェース(例えば、ログインコンテキスト)を返す。ログインコンテキストは、セキュリティサービスにインタフェースを提供し、後認証ユーザ信用情報を格納し、特権や許可をリストアップするオブジェクトである。ログインコンテキストは、セキュリティプロバイダ(例えば、ログインモジュール)からのメソッドを呼び出す“ログイン”手段を含む。また、ログインコンテキストは、JAASによってインスタンスを作成してもよく、JAAS APIに適合してもよい。インタフェース(例えば、LoginContextなどのログインコンテキスト)を用いることによって、クライアントアプリケーション170は、コンテキストファクトリ110(例えば、プロキシとして動作するコンテキストファクトリ110)の関与なしに、セキュリティサービスやセキュリティプロバイダ150と相互に通信できるようにしてもよい。したがって、クライアントアプリケーション170は、セキュリティサービスと通信を行うために、クライアントアプリケーションの指定および/またはセキュリティサービスの使用を簡略化するJAAS135の標準APIを用いることができる。
図2は、セキュリティサービスを実装するためのシステム200の実施例を示したブロック図である。システム200は、OS240、JVM230、JAAS235、OSGiプラットフォーム220、クライアントアプリケーション270、およびセキュリティプロバイダ250を有する。更に、システムはコンテキストファクトリ210およびカスタムコンフィグレーションユニット215を有する。カスタムコンフィグレーションユニット215は、セキュリティプロバイダ250のサービスおよびクラスローダを登録する。カスタムコンフィグレーションユニット215は、セキュリティプロバイダ250に関するデータを格納するコンフィグレーションテーブル217を有し、コンフィグレーションテーブル217は、コンフィグレーション名、ログインモジュールクラス名、または/および、ログインモジュールクラスローダを含む。セキュリティプロバイダ250に関するデータは、コンフィグレーションテーブル217内の各コンフィグレーションエントリに格納されることができる。さらに、本実施形態において、コンテキストファクトリ210は1または複数のサービスとしてシステムの他のメンバが利用可能な機能性を構成するバンドルであり、コンテキストファクトリ210はOSGiフレームワークにそのサービスを追加する。その上、カスタムコンフィグレーションユニット215はバンドルであり、1または複数のサービスとして利用可能な機能性を構成するようにしてもよく、他の実施形態ではカスタムコンフィグレーションユニット215はバンドルではないようにしてもよい(例えば、OSGiプラットフォーム220の一部であってよい)。したがって、システム200は、JVMが動作している間、セキュリティプロバイダおよびクライアントアプリケーションの動的な追加および削除に加えて、コンテキストファクトリ210およびカスタムコンフィグレーションユニット215の動的な削除、変更、および追加を許可する。
図3は、セキュリティデバイス300の実施例を示すブロック図である。セキュリティデバイス300は、ネットワークを介さないコンピュータリソース1 380およびネットワーク370を介したコンピュータリソース2 390と通信を行う。ネットワーク370は、インターネット、WAN、およびLANを含むいくつかのネットワークの組み合わせや有線/無線のネットワークを含んでもよい。さらに、セキュリティデバイス300は、例えば、USB、シリアルポート、Firewire、Bluetooth(登録商標)、およびWiFiを含む有線/無線の手段を介して、コンピュータリソース1 380と通信を行う。
セキュリティデバイス300は、1または複数のプロセッサ301(以下、“CPU301”と称する)を含み、CPU301は、標準的なマイクロプロセッサでもよいし、カスタマイズされたマイクロプロセッサでもよい。CPU301は、コンピュータ可読命令を読み込んで実行するように構成され、CPU301は、セキュリティデバイス303の他のコンポーネントに命令および/もしくは制御してもよい。セキュリティデバイス300は、他のデバイスへの通信インタフェースを提供するI/Oインタフェース303を有し、I/Oインタフェース303は、表示デバイス、マウス、印刷デバイス、タッチスクリーン、ライトペン、光学式記録デバイス、スキャナ、マイクロフォン、カメラなどを含む。セキュリティデバイス300は、メモリ305を有し、メモリ305は、ROM、RAM、フラッシュメモリのような揮発性もしくは不揮発性であってよい。セキュリティデバイス300は、さらにセキュリティデバイス300がネットワーク370と通信を行うためのネットワークインタフェース307を有する。記憶デバイス309は、データやモジュールを格納し、例えば、ハードドライブ、光学式記憶デバイス、ディスケット、および/または、固定ドライブを含んでよい。セキュリティデバイス300のコンポーネントは、バスを介して接続される。セキュリティデバイス300は、セキュリティデバイス300のハードウェア、処理、割り込み、メモリ、および/またはファイルシステムを管理するオペレーティングシステムを有する。
セキュリティデバイス300は、コンテキストファクトリ310、カスタムコンフィグレーションユニット315、およびセキュリティプロバイダ320を有する。コンテキストファクトリ310、カスタムコンフィグレーション320、およびセキュリティプロバイダ320は、コンピュータ実行可能命令にて実装されることができる。説明のために、セキュリティデバイス300のメンバがコンピュータ実行可能命令を実行するように述べられてはいるが、コンピュータ実行可能命令は、セキュリティデバイス300によって実行され、以下に述べられる特定の動作をセキュリティデバイス300に行わせるようにしてもよい。コンピュータ実行可能命令は、ロジックを含んでもよく、ソフトウェア、ファームウェア、および/またはハードウェアにて実装されてもよい。他の実施形態において、コンテキストファクトリ310およびカスタムコンフィグレーションユニット315は、単一のメンバもしくは複数のメンバにさらに分割されて組み込まれてもよい。セキュリティデバイス300は、コンピュータリソース1 380やコンピュータリソース2 390へのアクセスを制御してもよいし、コンピュータリソース1 380はコンピュータリソース2 390にアクセスする前に、セキュリティプロバイダ320との認証および/または認可動作を実行するようにクライアントアプリケーションに要求してもよい。
図4は、セキュリティサービスを追加する方法の実施形態を示すフローチャートである。この方法の他の実施形態や以下で述べるのとは別の方法では、ブロックの省略、ブロックの追加、ブロックの並び順の変更、ブロックの組み合わせ、および/もしくはブロックの分割のいずれを行ってもよい。更に、図1〜3に示すシステムおよびデバイスのコンポーネント(例えば、コンテキストファクトリ110、カスタムコンフィグレーションユニット215)は、図4に示された方法を実装してもよいし、以下に述べる方法とは別の方法であってもよい。
まずブロック400において、JAVA仮想マシンのような仮想マシンが開始される。次にブロック410において、セキュリティモジュールに対するクラスローダが取得される。例えば、関連付けられたクラスローダを有するセキュリティモジュールは、OSGiプラットフォームを含む仮想マシン上のバンドルの一部としてインストールされてもよく、セキュリティモジュールは、メソッド呼び出しにて渡されたパラメータとしてカスタムコンフィグレーションにクラスローダを(ログインモジュール名やクラスパスと同様に)提供してもよい。ブロック420に移動し、コンフィグレーションエントリは、セキュリティモジュールに対して生成される。コンフィグレーションエントリは、クラスローダを示し、そのクラスローダをセキュリティモジュールに関連付ける。最後にブロック430において、コンフィグレーションエントリは、例えばメモリ内のコンフィグレーションテーブルに格納される。
図5は、ログインコンテキストを生成するための方法の実施形態を示すフローチャートである。まずブロック500において、ログインコンテキストを生成するためのリクエストが取得される。リクエストは、例えば、Multifunction Embedded Application Platform (MEAP)アプリケーションのような、クライアントアプリケーション、バンドル、モジュール、コンポーネントなどからのメソッド呼び出しを含み、リクエストは、要求されたログインコンテキストやログインモジュールを示してもよい。ブロック510において、要求されたログインコンテキストに関連付けられたコンフィグレーションエントリは、例えばコンフィグレーションテーブルから取り出される。次にブロック520において、JAASクラスローダは、要求されたログインコンテキストに関連付けられたクラスローダに設定され、ブロック530において要求されたログインコンテキストが生成される。最後にブロック540において、ログインコンテキストは、要求をしたアプリケーション、バンドル、モジュール、コンポーネントなどに提供される。
図6は、ログインコンテキストを生成するための方法の実施形態を示すフローチャートである。ステージ680において、ログインモジュール651は、カスタムコンフィグレーションユニット615に登録される。実施形態に応じて、ログインモジュール651は、自身をカスタムコンフィグレーションユニット615に登録してもよいし、他のアプリケーション、モジュール、バンドルなどがログインモジュール(例えば、ログインモジュールを含むバンドル)を登録してもよい。ステージ682において、カスタムコンフィグレーションユニット615は、ログインモジュールに関連付けられた情報をコンフィグレーションテーブルに記録する。
次にステージ684において、クライアントアプリケーション670は、コンテキストファクトリ610にログインコンテキストを要求する。ステージ686において、コンテキストファクトリ610は、要求されたログインコンテキストに対するクラスローダをカスタムコンフィグレーションユニット615から取り出す。ステージ688へ進み、コンテキストファクトリ610はスレッド切替を行い、JAASデフォルトクラスローダを要求されたログインコンテキストに対するクラスローダに変更する。スレッドは、オペレーティングシステムによってスケジューリングされることができる処理の単位である。次にステージ690において、コンテキストファクトリ610は、JAAS635にログインコンテキストを要求する。ステージ692において、JAASは、クラスローダ(また、いくつかの実施形態では、クラス名(例えばログインモジュールの省略されていないクラス名(例えば、“com.canon.jaas.LoginModuleA”)))を用いてログインモジュール651に関連付けられたログインコンテキストを生成する。スレッド切替の間、コンテキストファクトリ610および/またはJAAS635は、追加のログインコンテキストを生成しようとする試みをブロックする(例えば、呼び出しブロッキング)。ステージ694に移り、コンテキストファクトリ610および/またはJAAS635に追加のログインコンテキストを生成することを許可するようにスレッドは元に戻され、JAASクラスローダはJAASデフォルトクラスローダに戻すように変更され、生成されたログインコンテキストはクライアントアプリケーション670に返される。最後にステージ696において、クライアントアプリケーション670は、返されたログインコンテキストを用いてログインモジュール651にログインを要求する。返されたログインコンテキストを用いることで、クライアントアプリケーション670は、プロキシを用いることなく、ログインモジュールおよび/もしくはJAASと通信を行うことができる。したがって、クライアントアプリケーション670は、JAAS認証を行うために標準JAASインタフェースを用いることができる。
図7は、セキュリティサービスを実装するためのシステムの実施形態を示したフロー図である。システムは、クライアント770、JAAS735、コンテキストファクトリ710、カスタムコンフィグレーションユニット715、およびログインモジュール751を有する。ステージ1において、ログインモジュール751は、登録情報をカスタムコンフィグレーションユニット715に送信する。ログインモジュール751は、OSGiバンドルの一部として追加され、そしてログインモジュール751は、自身をカスタムコンフィグレーションユニット715に登録する。登録情報705は、モジュールの識別子、クラスローダ、クラス名、コールバックハンドラ、および/またはアプリケーションコンフィグレーションエントリを有する。カスタムコンフィグレーションユニット715は、登録情報をカスタムコンフィグレーションテーブル717に追加する。例えば、カスタムコンフィグレーションユニット715は、登録情報705をログインモジュールに関連付けられたエントリに格納してもよい。
ステージ2において、クライアント770は、ログインコンテキストに対する要求713をコンテキストファクトリ710に送信する。ログインコンテキストに対する要求713は、ログインコンテキストが検索された1または複数の要求されたログインモジュール(例えば、ログインモジュール751)を識別する。次にステージ3において、コンテキストファクトリ710は、要求されたログインモジュール(この例では、ログインモジュール751)のクロスローダに対する要求720を送信する。クラスローダに対する要求720を受信することに応答して、カスタムコンフィグレーションユニット715は、コンフィグレーションテーブル717(例えば、登録されたログインモジュールと対応付けられたクラスローダとのマップ)を参照することによって、要求されたログインモジュールに関連付けられたクラスローダを識別する。次にステージ4において、カスタムコンフィグレーションユニット715は、ログインモジュールクラスローダへのリファレンス725をコンテキストファクトリ710に送信する。
ステージ5において、コンテキストファクトリ710は、JAAS735のログインモジュールクラスローダへのリファレンスを修正する。まず、ログインモジュールクラスローダリファレンスは、JVMのランタイムにて決定されたJAASデフォルトクラスローダ745を参照する。JAAS735は、ログインコンテキストのインスタンスを作成するためのクラスローダを検出するためにログインモジュールクラスローダリファレンスを自動的に参照するであろうが、JVMが稼働している間はJAAS735がログインモジュールクラスローダリファレンスを変更できないため、コンテキストファクトリ710は、デフォルトクラスローダ745の代わりにログインモジュールクラスローダ750を参照するように、ログインモジュールクラスローダリファレンスを変更する。ステージ5において、コンテキストファクトリ710は、他のログインコンテキストの生成をブロックするために、スレッドのブロックを開始する。JAAS735は、ログインモジュールクラスローダリファレンスによって参照されるクラスローダを用いてログインコンテキストを生成するため、ブロッキングは重要となるであろう。故に、ブロックされない場合は、ログインモジュールクラスローダリファレンスがログインモジュールクラスローダ750を参照している間、JAAS735は、他の要求されたログインコンテキストのインスタンスを作成するためにログインモジュールクラスローダ750を用いるであろう。しかしながら、他の要求されたログインコンテキストは、デフォルトクラスローダ745に関連付けられたログインコンテキストに対する要求であってもよい。したがって、ログインモジュールクラスローダリファレンスがログインモジュールクラスローダ750を参照している間、他のログインコンテキストの生成をブロックすることが求められるであろう。
ステージ6において、ログインモジュールクラスローダリファレンスがログインモジュールクラスローダ750を参照すると、コンテキストファクトリ710はログインコンテキスト717に対する要求をJAAS735へ送信する。ステージ7において、JAAS735は、ログインモジュールクラスローダリファレンスによって参照されたクラスローダ730(現時点では、ログインモジュールクラスローダ750)を取得する。ステージ8において、JAAS735は、ログインモジュールクラスローダ750を参照するクラスローダリファレンス755を受け取る。次にステージ9において、JAAS735は、ログインモジュールクラスローダ750を用いてログインコンテキストのインスタンスを生成する。
ステージ10に進み、ログインコンテキストへのリファレンス765は、JAAS735によってコンテキストファクトリ710へ返される。そして、コンテキストファクトリ710は、参照するログインモジュールクラスローダリファレンスをデフォルトクラスローダ745に変更し、スレッドのブロッキングを終了する。次にステージ11において、ログインコンテキストへのリファレンス765は、クライアント770へ返される。最後にステージ12において、クライアント770は、ログインモジュール751と通信するためにログインコンテキスト760を用いる。したがって、クライアント770は、プロキシを要さず、JAAS735におけるログインコンテキスト760を介してログインモジュール751と通信を行い、そして、クライアント770は、ログインモジュール751と通信を行うために標準JAAS APIを用いることができる。
図8は、OSGiバンドルとして実装されるセキュリティプロバイダの実施形態を示すブロック図である。セキュリティプロバイダA850−1のバンドルは、ログインモジュールAおよびクラスローダAを含む。セキュリティプロバイダB850−2のバンドルは、ログインモジュールBおよびクラスローダBを含む。セキュリティプロバイダC850−3のバンドルは、複数のログインモジュールとしてログインモジュール1〜N(Nは、任意に適用可能なログインモジュールの数)およびクラスローダCを含む。セキュリティプロバイダCのクラスローダCは、複数のログインモジュールに関連付けられており、クライアントアプリケーションを関連付けられたログインモジュールと通信を行うようにするためのログインコンテキストを生成するために用いられることができる。
さらに、クラスローダは、関連付けられたOSGiバンドルのログインモジュールとのみ通信が可能なようにログインコンテキストを生成できるようにしてもよい。例えば、クラスローダAは、クライアントアプリケーションがログインモジュールAと通信できるようにするログインコンテキストを生成するために用いられてよいが、クライアントアプリケーションが他のセキュリティプロバイダ(例えば、ログインモジュールB、ログインモジュール1)からログインモジュールと通信できるようにするログインコンテキストは生成できない。また、クラスローダCは、クライアントアプリケーションがセキュリティプロバイダC(ログインモジュール1、ログインモジュール2、・・・、ログインモジュールN)と通信できるようにするログインコンテキストを生成するために用いられてよいが、アプリケーションが他のセキュリティプロバイダ(例えば、ログインモジュールA、ログインモジュールB)と通信できるようにするログインコンテキストを生成するために用いられることはできない。
図9は、コンフィグレーションテーブル917の実施形態を示す。コンフィグレーションテーブルは、各ログインモジュールに関連付けられたエントリ(例えば、エントリ918A〜C)を含む。示す実施形態において、エントリは、ログインモジュール、そのクラスローダ、そのクラス名、そのコールバックハンドラ、およびそのコンフィグレーションエントリを含む。したがって、コンフィグレーションテーブル917は、ログインモジュールとログインモジュールに関連付けられたいくつかの情報とをマッピングするために用いられてよい。
上述したデバイス、システム、および方法は、1または複数の記憶媒体に格納されたコンピュータ実行可能指示を読み出し、それらを実行するように構成された1または複数のデバイスに、上述した動作を実現するためのコンピュータ実行可能命令を格納した1または複数の記憶媒体を供給することによって達成されることができる。この場合において、1または複数の記憶媒体から読み出されたコンピュータ実行可能命令を実行した際に、1または複数のデバイスは、上述したデバイス、システム、および方法の動作を実行する。また、1または複数のシステムおよび/またはデバイス上のオペレーティングシステムは、上述したデバイス、システム、および方法の1または複数の動作を実装してよい。したがって、コンピュータ実行可能指示およびコンピュータ実行可能命令を格納した1または複数の記憶媒体は、実施形態の構成要素となる。
いくつかの適用可能なコンピュータ可読記録媒体(例えば、磁気ディスク(フロッピー(登録商標)ディスクやハードディスクを含む)、光学式ディスク(CD、DVD、ブルーレイディスクを含む)、光磁気ディスク、磁気テープ、および固定デバイス(フラッシュメモリ、DRAM、SRAMを含む))は、コンピュータ実行可能命令に対する記憶媒体として採用できる。コンピュータ実行可能命令は、デバイスに挿入された機能拡張ボードやデバイスに接続された機能拡張ユニット上に提供されたコンピュータ可読記憶媒体に書き込まれてもよいし、機能拡張ボードやユニット上に提供されたCPUが上述したデバイス、システム、および方法の命令を使用するようにしてもよい。
この開示は、特定の説明のための実施形態に関しての詳細な記述を行った。クレームのスコープは上述した実施形態に限定されるものではなく、クレームのスコープから外れることのない範囲で様々な変更および改良を行ってもよい。