ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server セキュリティ プロバイダの開発
11g リリース 1 (10.3.1)
B55527-01
 

目次
目次

戻る
戻る
 
次へ
次へ

13 サーブレット認証フィルタ

サーブレット認証フィルタは、ID アサーションなどの認証機能のための前処理および後処理を実行するプロバイダです。サーブレット検証フィルタは、主に認証プロバイダの「ヘルパー」として機能する特殊なセキュリティ プロバイダです。

ServletAuthenticationFilter インタフェースは、WebLogic Server にプラグインできる認証フィルタに対してセキュリティ サービス プロバイダ インタフェース (SSPI) を定義します。認証プロセスでサーブレット コンテナに呼び出させる認証フィルタが認証プロバイダにあることを通知するために、ServletAuthenticationFilter インタフェースを認証プロバイダの一部として実装します。通常、このインタフェースは認証プロバイダの ID アサーション形式の一部として実装されます。

以下の節では、サーブレット認証フィルタ インタフェースの概念と機能、およびサーブレット認証フィルタの開発手順について説明します。

認証フィルタの概念

Java サーブレット API 2.3 仕様で定義されているように、フィルタは、要求がサーブレットに届く前のプリプロセッサ、またはサーブレットから離れた応答のポストプロセッサです。フィルタを使用すると、再利用可能なユニットで反復タスクをカプセル化し、サーブレットまたは JSP ページからの応答を変換できます。

サーブレット認証フィルタは、コンテナベースの認証をフィルタが置換または拡張できるようにするフィルタ オブジェクトの拡張機能です。

フィルタが必要な理由

WebLogic Security フレームワークを使用すると、カスタム認証プロバイダを利用できます。ただし、Java サーブレット API 2.3 の仕様により、認証プロセス時は、認証プロバイダとクライアントまたは他のサーバとの間の対話は制限されます。これにより、認証メカニズムは、サーブレット コンテナが提供する認証メカニズムと互換性のある基本、フォーム、証明書の形式に制限されます。

フィルタには、アーキテクチャ依存の制限はほとんどありません。つまり、サーブレット認証フィルタは、サーブレット コンテナが提供する認証メカニズムに依存していません。認証プロセスを開始するコンテナの前にフィルタを呼び出せるようにすれば、セキュリティ レルムは、より柔軟な認証メカニズムを実装できます。たとえば、サーブレット認証フィルタを使用すると、認証用の SAML プロバイダ サイトにユーザをリダイレクトできます。

WebLogic 認証プロバイダ内の JAAS LoginModule は、ログイン プロセスのカスタマイズに使用できます。ユーザ データベースの場所のカスタマイズ、ログインの実行に必要な証明データの種類、サブジェクトへのグループの指定は、LoginModule を介して実装されます。

一方、ログインを実行するためのリモート サイトへのリダイレクト、クエリ文字列からのログイン情報の抽出、ブラウザとのログイン機能のネゴシエーションは、サーブレット認証フィルタを介して実装されます。

サーブレット認証フィルタ設計上の考慮事項

サーブレット認証フィルタを設計する際には、以下の事項を考慮する必要があります。

  • 複数のフィルタを指定可能にする必要があるか。複数のフィルタを指定可能にすると、コンフィグレーション時に管理上の決定を行うことができるようになります。

  • 特定の実行順序に依存しているか。サーブレット認証フィルタは、フィルタの実行順序に依存しないようにしてください。

  • 各フィルタが認証の前後に要求を処理できるようにすることを考えているか。その際、フィルタで呼び出しのタイミングを予測しないようにしてください。

  • フィルタの doFilter メソッドを呼び出さないことで、残りのフィルタの実行およびサーブレットの認証プロセスを停止できるようにする選択肢を各フィルタに与えること。

  • フィルタでブラウザをリダイレクトできるようにする必要があるか。

  • フィルタが一方向 SSL、双方向 SSL、ID アサーション、フォーム認証、および基本認証で機能するようにすること。たとえば、フォーム認証は双方向の要求プロセスで、フィルタはフォーム認証用に 2 回呼び出されます。

フィルタが呼び出されるしくみ

サーブレット認証フィルタ インタフェースを使用すると、認証プロバイダは 0 個以上のサーブレット認証フィルタ クラスを実装できます。フィルタは以下の手順で呼び出されます。

  1. 認証が発生する前に、サーブレット コンテナがサーブレット認証フィルタを呼び出します。

    サーブレット コンテナが、サーブレット認証フィルタのコンフィグレーション済みチェーンを WebLogic Security フレームワークから取得します。

    WebLogic Security フレームワークは、認証プロバイダの順序に従ってサーブレット認証フィルタを返します。1 つのプロバイダに複数のサーブレット認証フィルタがある場合、WebLogic Security フレームワークは、ServletAuthenticationFilter の getAuthenticationFilters メソッドで返された javax.servlet.Filter の順序付けされたリストを使用します。

    場合によっては、要求を適切に処理するために複数回実行する必要もあるので、フィルタが重複していても構いません。

  2. サーブレット コンテナは、フィルタの init メソッドをフィルタごとに呼び出し、フィルタがサービス内に適切に配置されるようにします。

  3. チェーンの最後にあるリソースに対するクライアント要求があるため、要求/応答のペアがチェーン内を通るたびに、サーブレット コンテナは、最初のフィルタに対してフィルタの doFilter メソッドを呼び出します。

    このメソッドに渡される FilterChain オブジェクトを使用すると、フィルタは、要求と応答をチェーン内の次のエンティティに渡すことができます。フィルタは、FilterChain オブジェクトを使用して、チェーン内の次のフィルタを呼び出します。または、フィルタの呼び出しがチェーン内の最後のフィルタの場合、チェーンの最後のリソースを呼び出します。

  4. すべてのサーブレット認証フィルタがフィルタの doFilter メソッドを呼び出す場合、最後のサーブレット認証フィルタが doFilter メソッドを呼び出すと、サーブレット コンテナは、フィルタが存在しない場合と同じように認証を実行します。

    ただし、サーブレット認証フィルタが doFilter メソッドを呼び出さない場合、残りのフィルタ、サーブレット、およびサーブレット コンテナの認証手順は呼び出されません。これにより、フィルタは、サーブレットの認証プロセスを置き換えることができます。通常、これには認証の失敗か、別の認証用 URL へのリダイレクトが伴います。

認証プロバイダからサーブレット認証フィルタを呼び出さない

サーブレット認証フィルタ インタフェースを認証プロバイダの一部として実装しても、認証プロバイダは、サーブレット認証フィルタを直接呼び出すわけではありません。サーブレット認証フィルタの実装は、フィルタを配置して呼び出す方法を認識する WebLogic Security フレームワークの特定の機能に依存します。

カスタム サーブレット認証フィルタを開発する場合は、カスタム認証プロバイダが WLS 固有のクラス (weblogic.servlet.* など) および Java EE 固有のクラス (javax.servlet.* など) を呼び出さないようにしてください。このルールに従うと、WebLogic Enterprise Security のポータビリティが最大限に高められます。

図 13-1 にこの要件を示します。

図 13-1 認証プロバイダがサーブレット認証フィルタを呼び出さない

図 13-1 の説明は図の下のリンクをクリックしてください。
「図 13-1 認証プロバイダがサーブレット認証フィルタを呼び出さない」の説明

フィルタを実装するプロバイダの例

WebLogic Server には、SPNEGO (Simple and Protected Negotiate) に必要なヘッダ操作を処理するサーブレット認証フィルタが含まれます。「ネゴシエート サーブレット認証フィルタ」と呼ばれるこのサーブレット認証フィルタは、WWW-Authenticate ヘッダおよび Authorization HTTP ヘッダをサポートするようにコンフィグレーションされています。

ネゴシエート サーブレット認証フィルタは、ネゴシエート プロトコルの認可されていない応答に対して適切な WWW-Authenticate ヘッダを生成し、以降の要求に対して Authorization ヘッダを処理します。このフィルタは、ネゴシエート ID アサーション プロバイダを介して使用できます。

デフォルトでは、ネゴシエート ID アサーション プロバイダは使用可能ですが、WebLogic デフォルト セキュリティ レルムにはコンフィグレーションされていません。ネゴシエート ID アサーション プロバイダは、WebLogic ID アサーション プロバイダの代わりとして使用したり、WebLogic ID アサーション プロバイダと併用したりできます。

カスタム サーブレット認証フィルタの開発方法

カスタム サーブレット認証フィルタを開発するには、以下の手順に従います。

  1. 適切な SSPI による実行時クラスの作成

  2. WebLogic MBeanMaker による MBean タイプの生成

  3. Administration Console による認証プロバイダのコンフィグレーション

適切な SSPI による実行時クラスの作成

実行時クラスを作成する前に、以下の作業が必要です。

この情報を理解し、設計に関する判断を下したら、次の手順でサーブレット認証フィルタの実行時クラスを作成します。

カスタム サーブレット認証フィルタ プロバイダの実行時クラスの作成例については、「WebLogic MBeanMaker による MBean タイプの生成」を参照してください。

サーブレット認証フィルタ SSPI の実装

認証プロセスでサーブレット コンテナに呼び出させる認証フィルタが認証プロバイダにあることを通知するために、ServletAuthenticationFilter インタフェースを認証プロバイダの一部として実装します。

サーブレット認証フィルタ SSPI を実装する際には、以下のメソッドの実装を提供する必要があります。

  • getServletAuthenticationFilters

    public Filter[] getServletAuthenticationFilters
    

    getServletAuthenticationFilters メソッドは、サーブレット コンテナの認証プロセスで実行される javax.servlet.Filter の順序付けられたリストを返します。コンテナは、サーブレット認証フィルタの複数のインスタンスを取得するために、このメソッドを複数回呼び出すことがあります。このメソッドは、呼び出しごとに、フィルタの新しいインスタンスのリストを返す必要があります。

フィルタ インタフェース メソッドの実装

フィルタ インタフェース メソッドを実装するには、以下のメソッドの実装を提供する必要があります。通常は、init() を 1 回呼び出し、doFilter() を必要に応じた回数呼び出してから、destroy() を 1 回呼び出します。

  • destroy

    public void destroy()
    

    destroy メソッドは、フィルタをサービスから取り除くよう指示するために Web コンテナによって呼び出されます。このメソッドは、フィルタの doFilter メソッド内のすべてのスレッドが終了した場合、またはタイムアウト期間が過ぎた場合にのみ一度だけ呼び出されます。Web コンテナは、このメソッドを呼び出した後に、フィルタのこのインスタンスに対して再び doFilter メソッドを呼び出しません。

    このメソッドを使用すると、フィルタで保持されているリソース (メモリ、ファイル ハンドル、スレッドなど) をクリーンアップし、永続的なステートをメモリ内のフィルタの現在のステートと同期させることができます。

  • doFilter

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
    

    チェーンの最後にあるリソースに対するクライアント要求があるため、要求/応答のペアがチェーン内を通るたびに、フィルタの doFilter メソッドがコンテナによって呼び出されます。このメソッドに渡される FilterChain を使用すると、フィルタは、要求と応答をチェーン内の次のエンティティに渡すことができます。

    通常、このメソッドの実装は以下のパターンに従います。

    1. 要求を調べます。

    2. 必要に応じてカスタム実装で要求オブジェクトをラップし、入力フィルタ用に内容とヘッダをフィルタ処理します。

    3. 必要に応じてカスタム実装で応答オブジェクトをラップし、出力フィルタ用に内容とヘッダをフィルタ処理します。

    4. FilterChain オブジェクトを使用してチェーン内の次のエンティティを呼び出すか (chain.doFilter())、フィルタ チェーン内の次のエンティティに要求/応答のペアを渡さずに要求の処理をブロックします。

    5. フィルタ チェーン内の次のエンティティの呼び出し後に、応答のヘッダを直接設定します。

  • init

    public void init(FilterConfig filterConfig) 
    

    init メソッドは、フィルタをサービス内に配置するよう指示するために Web コンテナによって呼び出されます。サーブレット コンテナは、フィルタのインスタンス化の後で init メソッドを一度だけ呼び出します。init メソッドは、フィルタ処理をフィルタに指示する前に正常に完了している必要があります。

フィルタからのチャレンジ ID アサーションの実装

ID アサーション プロバイダ」で説明したとおり、チャレンジ ID アサーション インタフェースは、複数のチャレンジ、応答メッセージ、および状態を必要とするチャレンジ応答スキーマをサポートします。チャレンジ ID アサーション プロバイダ インタフェースを使用すると、ID アサーション プロバイダは、Microsoft の Windows NT チャレンジ/応答 (NTLM) や SPNEGO (Simple and Protected GSS-API Negotiation) などのチャレンジ/応答認証メカニズムを採用した認証プロトコルをサポートできます。

サーブレット認証フィルタを使用すると、サーブレット コンテナと互換性のある認証メカニズムに制限されることなくチャレンジ/応答プロトコルを実装できます。ただし、サーブレット認証フィルタは、WebLogic Security フレームワークで提供されている認証環境の外側で機能するので、WebLogic Security フレームワークを利用してプロバイダのコンテキストを判別することはできません。また、サーブレット認証フィルタでは、API でチャレンジ回数が複数の ID アサーション プロセスを駆動させる必要があります。

weblogic.security.services.Authentication クラスが拡張され、サーブレット認証フィルタからの複数のチャレンジ/応答 ID アサーションが可能になりました。メソッドおよびインタフェースでは、ChallengeIdentityAsserterV2 SSPI インタフェースと ProviderChallengeContext SSPI インタフェースのラッパーが提供されるので、サーブレット認証フィルタから呼び出すことができます。

これ以外に、WebLogic Security フレームワークのコンテキスト内でサーブレット認証フィルタから複数チャレンジ/応答ダイアログを実行する方法はドキュメント化されていません。サーブレット認証フィルタは、ChallengeIdentityAsserterV2 インタフェースおよび ProviderChallengeContext インタフェースを直接呼び出すことはできません。

したがって、複数のチャレンジ/応答 ID アサーションをフィルタから実装する場合、ChallengeIdentityAsserterV2 インタフェースと ProviderChallengeContext インタフェースを実装してから、weblogic.security.services.Authentication メソッドと AppChallengeContect インタフェースを使用して、サーブレット認証フィルタから目的のフィルタを呼び出す必要があります。

このプロセスを行う手順については、「ID アサーション プロバイダ」で説明されています。ここでは、概要を示します。

WebLogic MBeanMaker による MBean タイプの生成

認証プロバイダ」の説明に従ってカスタム認証プロバイダの MBean タイプを生成する際には、使用しているサーブレット認証フィルタの MBean も実装する必要があります。

ServletAuthenticationFilter MBean は AuthenticationProvider MBean を拡張します。ServletAuthenticationFilter MBean はマーカー インタフェースなので、メソッドはありません。

<?xml version="1.0" ?>
<!DOCTYPE MBeanType SYSTEM "commo.dtd">
<MBeanType

Name          = "ServletAuthenticationFilter"
Package       = "weblogic.management.security.authentication"
Extends       = "weblogic.management.security.authentication.AuthenticationProvider"
PersistPolicy = "OnUpdate"
Abstract      = "true"
Description   = "The SSPI MBean that all Servlet Authentication   Filter providers must extend. 
この MBean は単なるマーカ インタフェース。It has no methods on it."
>
</MBeanType>

WebLogic MBeanMaker を使用して MBean JAR ファイル (MJF) の作成

WebLogic MBeanMaker を使用して MDF を実行して中間ファイルを生成し、MBean 実装ファイルを編集して適切なメソッドの実装を提供したら、サーブレット認証フィルタを含むカスタム認証プロバイダの MBean ファイルと実行時クラスを MBean JAR ファイル (MJF) にパッケージ化する必要があります。

カスタム認証プロバイダの場合、この手順は、「WebLogic MBeanMaker を使用して MBean JAR ファイル (MJF) の作成」で説明します。

Administration Console による認証プロバイダのコンフィグレーション

サーブレット認証フィルタを実装するカスタム認証プロバイダをコンフィグレーションするということは、そのカスタム認証プロバイダをセキュリティ レルムに追加するということです。追加されたカスタム認証プロバイダには、認証サービスを必要とするアプリケーションからアクセスできます。

カスタム セキュリティ プロバイダのコンフィグレーションは管理タスクですが、カスタム セキュリティ プロバイダの開発者が行うこともできます。

WebLogic Server Administration Console を使用してカスタム認可プロバイダをコンフィグレーションする手順は、『Oracle Fusion Middleware Oracle WebLogic Server のセキュリティ』の「WebLogic セキュリティ プロバイダのコンフィグレーション」で説明されています。