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)の要件に従って、プリンシパルが格納されたサブジェクトを返します。

図5-1 プリンシパル検証プロセス

図5-1の説明が続きます
「図5-1 プリンシパル検証プロセス」の説明

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リファレンスを参照してください。