WebLogic Security サービスの開発
認証プロバイダは、プリンシパル検証プロバイダを利用して、サブジェクトに格納されるプリンシパル (ユーザとグループ) に署名し、信頼性を検証します。こうした検証によって、信頼度は向上し、悪意のあるプリンシパルによる改ざんの可能性を低くすることができます。サブジェクトのプリンシパルの検証は、WebLogic Server で各呼び出しの RMI クライアント リクエストがデマーシャリングされる際に行われます。サブジェクトのプリンシパルの信頼性も、認可判定の際に検証されます。
以下の節では、プリンシパル検証プロバイダの概念と機能、およびカスタム プリンシパル検証プロバイダの開発手順について説明します。
プリンシパル検証プロバイダを開発する前に、以下の概念を理解しておく必要があります。
ID アサーション プロバイダが特定のタイプのトークンをサポートするように、プリンシパル検証プロバイダも特定のタイプのプリンシパルをサポートします。たとえば、WebLogic プリンシパル検証プロバイダ (「カスタム プリンシパル検証プロバイダを開発する必要があるか」を参照) は WebLogic Server プリンシパルの署名と信頼性の検証を行います。
コンフィグレーション済みの認証プロバイダに関連付けられているプリンシパル検証プロバイダ (「プリンシパル検証プロバイダと他のタイプのセキュリティ プロバイダの違い」を参照) は、サブジェクトに格納され、そのプリンシパル検証プロバイダがサポートするタイプのすべてのプリンシパルに対して署名と検証を行います。
プリンシパル検証プロバイダは、主に認証プロバイダの「ヘルパー」として機能する特殊なセキュリティ プロバイダです。プリンシパル検証プロバイダの主要な機能は、サブジェクトに格納されたプリンシパルが悪意のある個人によって改ざんされるのを防止することです。
AuthenticationProvider
SSPI (「AuthenticationProvider SSPI を実装する」を参照) には、getPrincipalValidator
というメソッドが含まれています。このメソッドでは、認証プロバイダと共に使用するプリンシパル検証プロバイダの実行時クラスを指定します。プリンシパル検証プロバイダの実行時クラスとしては、BEA 提供のもの (WebLogic プリンシパル検証プロバイダ) か、独自に開発したもの (カスタム プリンシパル検証プロバイダ) を使用できます。認証プロバイダの getPrincipalValidator
メソッドで WebLogic プリンシパル検証プロバイダを使用する例については、コード リスト 3-1 を参照してください。
WebLogic Server Administration Console を使用して認証プロバイダの MBean タイプを生成し、認証プロバイダをコンフィグレーションするので、プリンシパル検証プロバイダでそれらの手順を行う必要はありません。
認証 (または認可) 処理を行うときに、WebLogic Security フレームワークはサブジェクトのプリンシパルを調べてそれが有効かどうかを確認します。プリンシパルが無効の場合、WebLogic Security フレームワークはサブジェクトが無効であることを示すテキストを付けてセキュリティ例外を送出します。サブジェクトが無効になる原因には以下のものがあります。
注意 : サブジェクトには複数のプリンシパルを格納できるため (それぞれ異なる認証プロバイダの LoginModule によって格納される)、プリンシパルは複数の異なるプリンシパル検証プロバイダを持つことができます。
図 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 グループを表すプリンシパルに対して署名と検証を行います。
注意 : weblogic.security
パッケージの WLSPrincipals
クラスを使用すると、プリンシパル (ユーザまたはグループ) が 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 の詳細については、「PrincipalValidator SSPI を実装する」を参照してください。
名前が付いているだけの単純なユーザおよびグループ プリンシパルがある状態で、WebLogic プリンシパル検証プロバイダを使用する場合には、以下の方法があります。
weblogic.security.principal.WLSUserImpl
クラスと weblogic.security.principal.WLSGroupImpl
クラスを使用するweblogic.security.provider.PrincipalValidatorImpl
クラスを使用する名前の他に追加のデータ メンバーがあるユーザおよびグループ プリンシパルがある状態で、WebLogic プリンシパル検証プロバイダを使用する場合には、以下の方法があります。
UserImpl
クラスと GroupImpl
クラスを記述するweblogic.security.principal.WLSAbstractPrincipal
クラスを拡張するweblogic.security.spi.WLSUser
インタフェースと weblogic.security.spi.WLSGroup
インタフェースを実装するequals()
メソッドを実装して、追加のデータ メンバーを含める。実装では、WLSAbstractPrincipal
が残りのデータを検証できるように、完了時に super.equals()
メソッドを呼び出す必要があります。注意 : デフォルトでは、ユーザ名とグループ名だけが検証されます。追加のデータ メンバーを検証する場合は、続いて getSignedData()
メソッドを実装します。
weblogic.security.provider.PrincipalValidatorImpl
クラスを使用する独自の検証スキームがあり、WebLogic プリンシパル検証プロバイダを使用しない場合や、WebLogic Server プリンシパル以外のプリンシパルを検証する場合は、カスタム プリンシパル検証プロバイダを開発する必要があります。
カスタム プリンシパル検証プロバイダを開発するには、以下の方法があります。
UserImpl
クラスと GroupImpl
クラスを記述するweblogic.security.spi.WLSUser
インタフェースと weblogic.security.spi.WLSGroup
インタフェースの実装 java.io.Serializable
インタフェースの実装weblogic.security.spi.PrincipalValidator
SSPI を実装することによって、独自の PrincipalValidationImpl
クラスを記述する (「PrincipalValidator SSPI を実装する」を参照)public boolean validate(Principal principal) throws SecurityException;
validate
メソッドはプリンシパルを 1 つ引数に取り、その有効性を検証しようとします。すなわち、このメソッドは、そのプリンシパルが署名されてから変更されていないかどうかを確認します。
sign
メソッドはプリンシパルを 1 つ引数に取り、それに署名して信頼を保証します。これにより、validate
メソッドを使って、後でそのプリンシパルを検証できるようになります。
sign
メソッドの実装は、悪意のある個人が容易に再現することのできない機密アルゴリズムでなければなりません。そのアルゴリズムを sign
メソッド自体に組み込むか、sign
メソッドがプリンシパルの署名に使用するトークンをサーバに要求するようにするか、またはプリンシパルを署名する他の手段を実装できます。
PrincipalValidator
SSPI と上記メソッドの詳細については、「WebLogic Server 8.1 API リファレンス Javadoc」を参照してください。