5 プリンシパル検証プロバイダ
認証プロバイダは、プリンシパル検証プロバイダを利用して、サブジェクトに格納されるプリンシパル(ユーザーとグループ)に署名し、信頼性を検証します。こうした検証によって、信頼度は向上し、悪意のあるプリンシパルによる改ざんの可能性を低くすることができます。サブジェクトのプリンシパルの検証は、WebLogic Serverで各呼出しのRMIクライアント・リクエストがデマーシャリングされる際に行われます。サブジェクトのプリンシパルの信頼性も、認可判定の際に検証されます。
この章の内容は次のとおりです。
プリンシパル検証の概念
プリンシパル検証プロバイダを開発する前に、次の概念を理解しておく必要があります。
プリンシパル検証とプリンシパル・タイプ
IDアサーション・プロバイダが特定のタイプのトークンをサポートするように、プリンシパル検証プロバイダも特定のタイプのプリンシパルをサポートします。たとえば、WebLogicプリンシパル検証プロバイダ(「カスタム・プリンシパル検証プロバイダを開発する必要があるか」を参照)はWebLogic Serverプリンシパルの署名と信頼性の検証を行います。
構成済の認証プロバイダに関連付けられているプリンシパル検証プロバイダ(「プリンシパル検証プロバイダと他のタイプのセキュリティ・プロバイダの違い」を参照)は、サブジェクトに格納されていてそのプリンシパル検証プロバイダがサポートするタイプの全プリンシパルに対して署名と検証を行います。
プリンシパル検証プロバイダと他のタイプのセキュリティ・プロバイダの違い
プリンシパル検証プロバイダは、主に認証プロバイダのヘルパーとして機能する特殊なセキュリティ・プロバイダです。プリンシパル検証プロバイダの主要な機能は、サブジェクトに格納されたプリンシパルが悪意のある個人によって改ざんされるのを防止することです。
AuthenticationProvider
SSPI (「AuthenticationProviderV2 SSPIの実装」を参照)には、getPrincipalValidator
というメソッドが含まれています。このメソッドでは、認証プロバイダとともに使用するプリンシパル検証プロバイダのランタイム・クラスを指定します。プリンシパル検証プロバイダのランタイム・クラスとしては、Oracle提供のもの(WebLogicプリンシパル検証プロバイダ)か、独自に開発したもの(カスタム・プリンシパル検証プロバイダ)を使用できます。認証プロバイダのgetPrincipalValidator
メソッドでWebLogicプリンシパル検証プロバイダを使用する例については、図3-1を参照してください。
WebLogic Server管理コンソールを使用して認証プロバイダのMBeanタイプを生成し、認証プロバイダを構成するので、プリンシパル検証プロバイダでそれらのステップを行う必要はありません。
無効なプリンシパルが原因のセキュリティ例外
認証(または認可)処理を行うときに、WebLogicセキュリティ・フレームワークはサブジェクトのプリンシパルを調べてそれが有効かどうかを確認します。プリンシパルが無効の場合、WebLogicセキュリティ・フレームワークはサブジェクトが無効であることを示すテキストを付けてセキュリティ例外をスローします。サブジェクトが無効になる原因には以下のものがあります。
-
サブジェクトのプリンシパルに対応するプリンシパル検証プロバイダが構成されていません(つまりWebLogicセキュリティ・フレームワークでそのサブジェクトを検証する手段がありません)
ノート:
サブジェクトには複数のプリンシパルを格納できるため(それぞれ異なる認証プロバイダのLoginModuleによって格納される)、プリンシパルは複数の異なるプリンシパル検証プロバイダを持つことができます。
-
このセキュリティ・ドメインとは異なる資格証明を使用する別のWebLogic Serverセキュリティ・ドメインで署名されたプリンシパルがあり、呼出し側がそれを現在のドメインで使用しようとしている
-
セキュリティを低下させる目的で作成された無効な署名を持つプリンシパルがある
-
プリンシパルが署名されていないサブジェクトがある
プリンシパル検証プロセス
図5-1に示すとおり、ユーザーはユーザー名とパスワードの組合せを使用してシステムにログインしようとします。WebLogic Serverは、構成済の認証プロバイダのLoginModuleを呼び出すことによって信頼を確立します。LoginModuleは、ユーザーのユーザー名とパスワードを検証し、JAAS (Java Authentication and Authorization Service)の要件に従って、プリンシパルが格納されたサブジェクトを返します。
WebLogic Serverは、指定されたプリンシパル検証プロバイダにサブジェクトを渡します。プリンシパル検証プロバイダは、そのプリンシパルに署名して、それらをWebLogic Serverを通じてクライアント・アプリケーションに返します。他のセキュリティ操作のためにサブジェクト内のプリンシパルが必要になった場合、同じプリンシパル検証プロバイダが、そのプリンシパルが署名時から変更されていないかどうかを検証します。
カスタム・プリンシパル検証プロバイダを開発する必要があるか
WebLogic Serverのデフォルト(アクティブ)セキュリティ・レルムには、WebLogicプリンシパル検証プロバイダが含まれます。IDアサーション・プロバイダが特定のタイプのトークンをサポートするのと同じように、プリンシパル検証プロバイダは特定のタイプのプリンシパルに対する署名と信頼性の確認を行います。WebLogicプリンシパル検証プロバイダは、WebLogic Serverプリンシパルの署名と検証を行います。言い換えると、WebLogic ServerユーザーまたはWebLogic Serverグループを表すプリンシパルに対して署名と検証を行います。
ノート:
WLSPrincipals
クラス(weblogic.security.principal
パッケージ内)を使用すると、プリンシパル(ユーザーまたはグループ)がWebLogic Serverにとって特別な意味を持つものかどうかを判断できます。(つまり、あらかじめ定義されたWebLogic ServerユーザーやWebLogic Serverグループかどうかを判断できます。)さらに、WebLogic Serverユーザーまたはグループを表すプリンシパルは、weblogic.security.spi
パッケージのWLSUser
インタフェースとWLSGroup
インタフェースを実装する必要があります。
WLSPrincipals
は、セキュリティ・フレームワークではなくPrincipalValidatorImpl
でのみ使用されます。認証プロバイダは、独自のプリンシパル検証プロバイダを実装することも、PrincipalValidatorImpl
を使用することもできます。カスタム・プリンシパル検証プロバイダで認証プロバイダを構成する場合、WLSPrincipals
インタフェースは使用されません。
認証プロバイダは、PrincipalValidatorImpl
を使用する場合、WLSPrincipals
インタフェースを実装する必要があります。
WebLogicプリンシパル検証プロバイダには、WLSUserImpl
およびWLSGroupImpl
という名前のWLSUser
インタフェースおよびWLSGroup
インタフェースの実装が含まれています。これらは、weblogic.security.principal
パッケージに定義されています。
また、PrincipalValidatorImpl
という名前のPrincipalValidator
SSPIの実装も含まれています。これはweblogic.security.provider
パッケージに定義されています。PrincipalValidatorImpl
クラスのsign()
メソッドは、ランダム・シードを生成し、そのランダム・シードに基づいてダイジェストを計算します。(「PrincipalValidator SSPIの実装」を参照。)
WebLogicプリンシパル検証プロバイダの使い方
名前が付いているだけの単純なユーザーおよびグループ・プリンシパルがある状態で、WebLogicプリンシパル検証プロバイダを使用する場合には、以下の方法があります。
-
既存の
weblogic.security.principal.WLSUserImpl
およびweblogic.security.principal.WLSGroupImpl
クラスを使用します。使用情報は、weblogic.security.spi
パッケージのWLSUser
インタフェースおよびWLSGroup
インタフェースを参照してください。 -
weblogic.security.provider.PrincipalValidatorImpl
クラスを使用します。使用情報は、PrincipalValidator
SSPIを参照してください。
名前の他に追加のデータ・メンバーがあるユーザーおよびグループ・プリンシパルがある状態で、WebLogicプリンシパル検証プロバイダを使用する場合には、以下の方法があります。
-
独自の
UserImpl
クラスとGroupImpl
クラスを記述します。 -
weblogic.security.principal.WLSAbstractPrincipal
クラスを拡張します。 -
weblogic.security.spi.WLSUser
インタフェースとweblogic.security.spi.WLSGroup
インタフェースを実装します。 -
equals()
メソッドを実装して、追加のデータ・メンバーを含めます。実装では、WLSAbstractPrincipal
が残りのデータを検証できるように、完了時にsuper.equals()
メソッドを呼び出す必要があります。ノート:
デフォルトでは、ユーザー名とグループ名だけが検証されます。追加のデータ・メンバーも検証する場合は、続いて
getSignedData()
メソッドを実装します。 -
weblogic.security.provider.PrincipalValidatorImpl
クラスを使用します。使用情報は、PrincipalValidator
SSPIを参照してください。
独自の検証スキームがあり、WebLogicプリンシパル検証プロバイダを使用しない場合や、WebLogic Serverプリンシパル以外のプリンシパルを検証する場合は、カスタム・プリンシパル検証プロバイダを開発する必要があります。
カスタム・プリンシパル検証プロバイダの開発方法
カスタム・プリンシパル検証プロバイダを開発するには、次の方法があります。
-
以下の実装を行うことによって、独自の
UserImpl
クラスとGroupImpl
クラスを記述します。-
weblogic.security.spi.WLSUserインタフェースとweblogic.security.spi.WLSGroupインタフェースを実装します。
-
java.io.Serializableインタフェースを実装します。
-
-
weblogic.security.spi.PrincipalValidator
SSPIを実装することによって、独自のPrincipalValidationImpl
クラスを記述する(「PrincipalValidator SSPIの実装」を参照。)
PrincipalValidator SSPIの実装
PrincipalValidator
SSPIを実装するには、以下のメソッドの実装を提供する必要があります。
-
validate
public boolean validate(Principal principal) throws SecurityException;
validate
メソッドは1つのプリンシパルを1つの引数として取り、その有効性を検証しようとします。すなわち、このメソッドは、そのプリンシパルが署名されてから変更されていないかどうかを確認します。 -
sign
public boolean sign(Principal principal);
sign
メソッドは1つのプリンシパルを1つの引数として取り、それに署名して信頼を保証します。これにより、validate
メソッドを使って、後でそのプリンシパルを検証できるようになります。sign
メソッドの実装は、悪意のある個人が容易に再現することのできない機密アルゴリズムでなければなりません。そのアルゴリズムをsign
メソッド自体に組み込むか、sign
メソッドがプリンシパルの署名に使用するトークンをサーバーに要求するようにするか、またはプリンシパルに署名する他の手段を実装できます。 -
getPrincipalBaseClass
public Class getPrincipalBaseClass();
getPrincipalBaseClass
メソッドは、このプリンシパル検証プロバイダが検証と署名の方法を認識しているプリンシパルのベース・クラスを返します。
PrincipalValidator SSPIについては、Oracle WebLogic Server Java APIリファレンスを参照してください。