プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle WebLogic Serverセキュリティ・プロバイダの開発
12c (12.2.1.2.0)
E82898-01
目次へ移動
目次

前
次

12 カスタム・セキュリティ・プロバイダからのイベントの監査

この章では、カスタム・セキュリティ・プロバイダに監査機能を追加する前に理解しておく必要がある基本情報と、カスタム・セキュリティ・プロバイダに監査機能を追加する手順について説明します。

「監査プロバイダ」で説明されているように、監査とは、リクエストの操作とそれらのリクエストの結果に関する情報を、否認防止を目的として収集、格納および配布するプロセスのことです。監査プロバイダは、コンピュータのアクティビティの電子的な記録を提供します。

各タイプのセキュリティ・プロバイダは、セキュリティ関連イベントの実行前または実行後に、それらのイベントに関する情報を記録するよう構成済みの監査プロバイダにリクエストできます。たとえば、あるユーザーが(アクセス権を持たない)預金口座アプリケーションのwithdrawメソッドにアクセスしようとした場合、認可プロバイダではこの操作を記録するようにリクエストできます。セキュリティ関連イベントは、監査プロバイダの構成で指定されている重大度レベルと一致するか、それを超えた場合にのみ記録されます。

この章の内容は次のとおりです。

12.1 セキュリティ・サービスと監査サービス

weblogic.security.spiパッケージのSecurityServicesインタフェースは、セキュリティ・サービスのリポジトリです(現在は単なる監査サービス)。SecurityServicesインタフェースは、以下のメソッドを通じて呼出し側に監査サービスの参照を提供します。

  • getAuditorService

    public AuditorService getAuditorService
    

    getAuditorServiceメソッドは、監査プロバイダが構成されている場合にAuditServiceを返します。

同じくweblogic.security.spiパッケージにあるAuditorServiceインタフェースは、他のタイプのセキュリティ・プロバイダ(認証プロバイダなど)に対する限定された(書込み専用の)監査機能を提供します。つまり、監査サービスでは構成されている各監査プロバイダのwriteEventメソッドを呼び出します。このメソッドは渡されたAuditEventオブジェクトに指定されている情報に基づいて、単純に監査レコードを記述します。

writeEventメソッドの詳細は、「AuditChannel SSPIの実装」を参照してくださいAuditEventオブジェクトの詳細は、「監査イベントの作成」を参照してくださいAuditorServiceインタフェースには以下のメソッドがあります。

  • providerAuditWriteEvent

    public void providerAuditWriteEvent (AuditEvent event)
    

    providerAuditWriteEventメソッドは、セキュリティ・プロバイダに対して、構成済みの監査プロバイダを呼び出すWebLogicセキュリティ・フレームワーク内のオブジェクトへの書込みアクセスを提供します。eventパラメータは、監査するイベントのタイプや監査重大度レベルなどの監査条件を含むAuditEventオブジェクトです。監査イベントと監査重大度レベルの詳細は、それぞれ「監査イベントの作成」「監査重大度」を参照してください。

監査サービスを呼び出すと、監査イベントの実行前または実行後にそれらのイベントを記録できますが、操作の前と後の間のコンテキストは維持されません。監査機能を持つセキュリティ・プロバイダは、「監査サービスの取得、および取得した監査サービスによる監査イベントの書込み」の説明に従って監査サービスを取得する必要があります

注意:

監査プロバイダが構成されている場合、SecurityServicesインタフェースとAuditorServiceインタフェースの実装は起動時にWebLogicセキュリティ・フレームワークによって作成されます。(監査プロバイダの構成の詳細は、「管理コンソールによるカスタム監査プロバイダの構成」を参照してください。)したがって、これらのインタフェースの独自の実装を提供する必要はありません。

また、SecurityServicesオブジェクトは、セキュリティ・プロバイダが構成されているセキュリティ・レルムに固有のものです。カスタム・セキュリティ・プロバイダのランタイム・クラスは、そのinitializeメソッドの一部としてレルム固有のSecurityServicesオブジェクトへの参照を自動的に取得します。(詳細は、Provider SSPIの目的を参照)。

これらのインタフェースとそのメソッドの詳細は、Oracle WebLogic Server Java APIリファレンスSecurityServicesインタフェースに関する項およびAuditorServiceインタフェースに関する項を参照してください。

12.2 カスタム・セキュリティ・プロバイダからの監査方法

カスタム・セキュリティ・プロバイダに監査機能を追加するには、次の手順に従います。

各手順の例については、「例:AuditRoleEventインタフェースの実装」「例:監査サービスを取得および使用してロール監査イベントの書込み」を参照してください。

注意:

カスタム・セキュリティ・プロバイダが監査イベントを記録する場合、必須のファイルに加えて、以下の手順で作成したすべてのクラスを、そのプロバイダ用のMBean JARファイル(MJF)に追加する必要があります。

12.2.1 監査イベントの作成

セキュリティ・プロバイダは、イベントのタイプ(認証イベントなど)や監査重大度(エラーなど)といった、監査するイベントに関する情報を提供する必要があります。監査イベントには、この情報が格納されます。また、構成済みの監査プロバイダが理解できるコンテキスト・データも格納できます。監査イベントを作成するには、以下のいずれかを行います。

12.2.1.1 AuditEvent SSPIの実装

AuditEvent SSPIを実装するには、以下のメソッドの実装を提供する必要があります。

  • getEventType

    public java.lang.String getEventType()
    

    getEventTypeメソッドは、監査するイベント・タイプの文字列表現を返します。この文字列表現は、監査チャネル(AuditChannel SSPIを実装するランタイム・クラス)によって使用されます。たとえば、Oracle提供の実装のイベント・タイプはAuthentication Audit Eventです。詳細については、「監査チャネル」および「AuditChannel SSPIの実装」を参照してください

  • getFailureException

    public java.lang.Exception getFailureException()
    

    getFailureExceptionメソッドは、Exceptionオブジェクトを返します。監査チャネルは、tostringメソッドから提供される情報に加えて、このオブジェクトから監査情報を取得します。

  • getSeverity

    public AuditSeverity getSeverity()
    

    getSeverityメソッドは、監査するイベント・タイプに関連付けられている重大度レベル値を返します。この値は、監査チャネルによって使用されます。監査チャネルはこの値を使用して、監査するかどうかを判定します。詳細については、「監査重大度」を参照してください

  • toString

    public java.lang.String toString()
    

    toStringメソッドは、あらかじめフォーマットされた監査情報を監査チャネルに返します。

    注意:

    toStringメソッドは、任意の文字を生成できます。その際、エスケープは使用されません。監査プロバイダが、構文に文字を使用するフォーマットにtoString値を書き込む場合は、その前にtoString値をエスケープしてください。

AuditEvent SSPIと前述のメソッドの詳細は、Oracle WebLogic Server Java APIリファレンスを参照してください。

12.2.1.2 監査イベント・コンビニエンス・インタフェースの実装

AuditEvent SSPIには、ユーザーの利便を図り、監査イベントの作成に役立つサブインタフェースがいくつか用意されています。

監査チャネル(AuditChannel SSPIを実装するランタイム・クラス)では、それらの各監査イベント・コンビニエンス・インタフェースを使用して、拡張イベント・タイプ・オブジェクトのインスタンス・タイプをより効果的に判断し、特定のタイプのセキュリティ・プロバイダを識別することができます。たとえば、AuditAtnEventV2コンビニエンス・インタフェースを監査チャネルで使用すると、拡張認証イベント・タイプ・オブジェクトのインスタンス・タイプを判断できます。(詳細については、「監査チャネル」および「AuditChannel SSPIの実装」を参照してください)

監査イベント・コンビニエンス・インタフェースは以下のとおりです。

12.2.1.2.1 AuditAtnEventV2インタフェース

AuditAtnEventV2は、監査チャネルが拡張認証イベント・タイプ・オブジェクトのインスタンス・タイプを判断するのに役立つコンビニエンス・インタフェースです。

注意:

AuditAtnEventインタフェースは、このリリースのWebLogic Serverで非推奨になりました。

AuditAtnEventV2インタフェースを実装するには、「AuditEvent SSPIの実装」で説明されているメソッドおよび次のメソッドの実装を提供する必要があります。

  • getUsername

    public String getUsername()
    

    getUsernameメソッドは、認証イベントに関連付けられているユーザー名を返します。

  • getAtnEventType

    public AuditAtnEventV2.AtnEventTypeV2 getAtnEventType()
    

    getAtnEventTypeメソッドは、認証イベントをより具体的に表すイベント・タイプを戻します。具体的な認証イベント・タイプは次のとおりです。

    AUTHENTICATE - ユーザー名とパスワードを使用する単純な認証が発生しました。

    ASSERTIDENTITY - トークンに基づく境界認証が発生しました。

    CREATEDERIVEDKEY - 派生キーの作成を表します。

    CREATEPASSWORDDIGEST - パスワード・ダイジェストの作成を表します。

    IMPERSONATEIDENTITY - 指定されたクライアント・ユーザー名を使用してクライアントIDが確立されました(カーネルIDが必要です)。

    USERLOCKED - 無効なログインの試行によってユーザー・アカウントがロックされました。

    USERUNLOCKED - ユーザー・アカウントのロックが解除されました。

    USERLOCKOUTEXPIRED - ユーザー・アカウントのロックが期限切れになりました。

    VALIDATEIDENTITY - 指定されたサブジェクト内のプリンシパルの信頼性が検証されました。

  • toString

    public String toString()
    

    toStringメソッドは、文字列で表された特定の認証情報を監査に返します。

    注意:

    toStringメソッドは、任意の文字を生成できます。その際、エスケープは使用されません。監査プロバイダが、構文に文字を使用するフォーマットにtoString値を書き込む場合は、その前にtoString値をエスケープしてください。

    AuditAtnEventV2というコンビニエンス・インタフェースを使用すると、AuditEventインタフェースとAuditContextインタフェースの両方を拡張できます。AuditContextインタフェースの詳細は、「監査コンテキスト」を参照してください

AuditAtnEventV2コンビニエンス・インタフェースと前述のメソッドの詳細は、Oracle WebLogic Server Java APIリファレンスを参照してください。

12.2.1.2.2 AuditAtzEventおよびAuditPolicyEventインタフェース

AuditAtzEventおよびAuditPolicyEventコンビニエンス・インタフェースは、監査チャネルが拡張認可イベント・タイプ・オブジェクトのインスタンス・タイプを判断するのに役立ちます。

注意:

AuditAtzEventコンビニエンス・インタフェースとAuditPolicyEventコンビニエンス・インタフェースは、後者がAuditEventインタフェースのみを拡張する点で異なります。(後者はAuditContextインタフェースを拡張しません。)AuditContextインタフェースの詳細は、「監査コンテキスト」を参照してください

AuditAtzEventインタフェースまたはAuditPolicyEventインタフェースを実装するには、「AuditEvent SSPIの実装」で説明されているメソッドおよび次のメソッドの実装を提供する必要があります。

  • getSubject

    public Subject getSubject()
    

    getSubjectメソッドは、認可イベントに関連付けられているサブジェクト(WebLogicリソースにアクセスしようとしているサブジェクト)を返します。

  • getResource

    public Resource getResource()
    

    getResourceメソッドは、認可イベントに関連付けられ、サブジェクトがアクセスしようとしているWebLogicリソースを返します。

これらのコンビニエンス・インタフェースとメソッドの詳細は、Oracle WebLogic Server Java APIリファレンスAuditAtzEventインタフェースに関する項またはAuditPolicyEventインタフェースに関する項を参照してください。

12.2.1.2.3 AuditMgmtEventインタフェース

AuditMgmtEventは、監査チャネルが拡張セキュリティ管理イベント・タイプ・オブジェクトのインスタンス・タイプ(セキュリティ・プロバイダのMBeanなど)を判断するのに役立つコンビニエンス・インタフェースです。このインタフェースには実装する必要があるメソッドは含まれていませんが、監査イベント実装のベスト・プラクティス構造が保持されています。

AuditMgmtEventコンビニエンス・インタフェースの詳細は、Oracle WebLogic Server Java APIリファレンスを参照してください。

12.2.1.2.4 AuditRoleEventおよびAuditRoleDeploymentEventインタフェース

AuditRoleDeploymentEventおよびAuditRoleEventコンビニエンス・インタフェースは、監査チャネルが拡張ロール・マッピング・イベント・タイプ・オブジェクトのインスタンス・タイプを判断するのに役立ちます。このインタフェースには実装する必要があるメソッドは含まれていませんが、監査イベント実装のベスト・プラクティス構造が保持されています。

注意:

AuditRoleEventコンビニエンス・インタフェースとAuditRoleDeploymentEventコンビニエンス・インタフェースは、後者がAuditEventインタフェースのみを拡張する点で異なります。(後者はAuditContextインタフェースを拡張しません。)AuditContextインタフェースの詳細は、「監査コンテキスト」を参照してください

これらのコンビニエンス・インタフェースの詳細は、Oracle WebLogic Server Java APIリファレンスAuditRoleEventインタフェースに関する項またはAuditRoleDeploymentEventインタフェースに関する項を参照してください。

12.2.1.3 監査重大度

監査重大度とは、セキュリティ・プロバイダが監査イベントを記録するレベルのことです。構成済みの監査プロバイダが監査リクエストを受け取ると、各監査プロバイダは実行されるイベントの重大度を調べます。イベントの重大度が監査プロバイダの構成に使用されたレベル以上であれば、監査プロバイダはその監査データを記録します。

注意:

監査プロバイダの構成は、WebLogic Server管理コンソールで行います。詳細については、「管理コンソールによるカスタム監査プロバイダの構成」を参照してください

weblogic.security.spiパッケージに含まれるAuditSeverityクラスは、監査重大度レベルを数値およびテキスト値として、AuditEventオブジェクトを介して監査チャネル(AuditChannel SSPIの実装)に、提供します。重大度の数値はロジックで用いるためのもので、テキスト値は出力用監査記録の作成で用いるためのものです。AuditChannel SSPIとAuditEventオブジェクトの詳細は、「AuditChannel SSPIの実装」および「監査イベントの作成」を参照してください。

12.2.1.4 監査コンテキスト

一部の監査イベント・コンビニエンス・インタフェースは、実装にコンテキスト情報も含まれていることを示すために、AuditContextインタフェースを拡張します。コンテキスト情報は、監査チャネルによって使用されます。詳細については、「監査チャネル」および「AuditChannel SSPIの実装」を参照してください

AuditContextインタフェースには以下のメソッドがあります。

  • getContext

    public ContextHandler getContext()
    

    getContextメソッドは、ContextHandlerオブジェクトを返します。ランタイム・クラス(AuditChannel SSPIの実装)は、このオブジェクトから追加の監査情報を取得します。ContextHandlerの詳細は、「ContextHandlerとWebLogicリソース」を参照してください

12.2.1.5 例: AuditRoleEventインタフェースの実装

例12-1に、MyAuditRoleEventImpl.javaクラスを示します。これは、監査イベント・コンビニエンス・インタフェース(ここではAuditRoleEventコンビニエンス・インタフェース)の実装例です。このクラスには以下の実装が含まれています。

  • getEventTypegetFailureExceptiongetSeverity、およびtoStringというAuditEvent SSPIから継承された4つのメソッド(「AuditEvent SSPIの実装」を参照)

  • ContextHandlerを介してコンテキストについての補足情報を返すgetContextという1つの追加メソッド(ContextHandlerの詳細は、「ContextHandlerとWebLogicリソース」を参照してください)

    注意:

    例12-1の太字のコードは、クラス宣言とメソッド・シグネチャを示しています。

例12-1 MyAuditRoleEventImpl.java

package mypackage;
import javax.security.auth.Subject;
import weblogic.security.SubjectUtils;
import weblogic.security.service.ContextHandler;
import weblogic.security.spi.AuditRoleEvent;
import weblogic.security.spi.AuditSeverity;
import weblogic.security.spi.Resource;
/*package*/ class MyAuditRoleEventImpl implements AuditRoleEvent
{
   private Subject subject;
   private Resource resource;
   private ContextHandler context;
   private String details;
   private Exception failureException;
   /*package*/ MyAuditRoleEventImpl(Subject subject, Resource resource, 
      ContextHandler context, String details, Exception
      failureException) {
         this.subject = subject;
         this.resource = resource;
         this.context = context;
         this.details = details;
         this.failureException = failureException;
   }
   public Exception getFailureException()
   {
      return failureException;
   }
   public AuditSeverity getSeverity()
   {
      return (failureException == null) ? AuditSeverity.SUCCESS :
         AuditSeverity.FAILURE;
   }
   public String getEventType()
   {
      return "MyAuditRoleEventType";
   }
   public ContextHandler getContext()
   {
      return context;
   }
   public String toString()
   {
      StringBuffer buf = new StringBuffer();
      buf.append("EventType:" + getEventType() + "\n");
      buf.append("\tSeverity: " +
         getSeverity().getSeverityString());
      buf.append("\tSubject: " +
         SubjectUtils.displaySubject(getSubject());
      buf.append("\tResource: " + resource.toString());
      buf.append("\tDetails: " + details);
      if (getFailureException() != null) {
         buf.append("\n\tFailureException:" +
            getFailureException());
      }
      return buf.toString();
   }
}

12.2.2 監査サービスの取得、および取得した監査サービスによる監査イベントの書込み

カスタム・セキュリティ・プロバイダから監査サービスを取得および使用して監査イベントを書き込むには、次の手順に従います。

  1. getAuditorServiceメソッドを使用して監査サービスを返します。

    注意:

    SecurityServicesオブジェクトはinitializeメソッドの一部としてセキュリティ・プロバイダのProvider SSPIの実装に渡されることに注意します。(詳細は、Provider SSPIの目的を参照)。AuditorServiceオブジェクトは、監査プロバイダが構成されている場合にのみ返されます。

  2. 「AuditEvent SSPIの実装」で作成した監査イベントをインスタンス化し、AuditService.providerAuditWriteEventメソッドを介して監査サービスに送ります。

12.2.2.1 例: 監査サービスを取得および使用したロール監査イベントの書込み

例12-2に、カスタム・ロール・マッピング・プロバイダのランタイム・クラス(MyRoleMapperProviderImpl.java)が監査サービスを取得し、そのサービスを使用して監査イベントを書き込む例を示します。

注意:

MyRoleMapperProviderImpl.javaクラスは、例12-1MyAuditRoleEventImpl.javaクラスに依存します。

例12-2 MyRoleMapperProviderImpl.java

package mypackage;
import javax.security.auth.Subject;
import weblogic.management.security.ProviderMBean;
import weblogic.security.SubjectUtils;
import weblogic.security.service.ContextHandler;
import weblogic.security.spi.AuditorService;
import weblogic.security.spi.RoleMapper;
import weblogic.security.spi.RoleProvider;
import weblogic.security.spi.Resource;
import weblogic.security.spi.SecurityServices;
public final class MyRoleMapperProviderImpl implements RoleProvider, RoleMapper 
{
   private AuditorService auditor;
   public void initialize(ProviderMBean mbean, SecurityServices 
      services) 
   {
      auditor = services.getAuditorService();
      ...
   }
   public Map getRoles(Subject subject, Resource resource,
      ContextHandler handler)
   {
      ...
      if (auditor != null) 
      {
         auditor.providerAuditWriteEvent(
            new MyRoleEventImpl(subject, resource, context, 
            "why logging this event", 
            null);                // no exception occurred
      }
      ...
   }
}

12.2.2.2 プロバイダのMBeanから管理操作の監査

SecurityServicesオブジェクトはinitializeメソッドの一部としてセキュリティ・プロバイダの「Provider」SSPIの実装に渡されます。(詳細は、Provider SSPIの目的を参照)。プロバイダはこのオブジェクトの監査プロバイダを使用して、ユーザーがログインに成功したなど、プロバイダ固有のセキュリティ・イベントを監査します。

セキュリティ・プロバイダのMBean実装には、SecurityServicesオブジェクトは渡されません。ただし、プロバイダは、作成中のユーザーなど、そのMBean操作を監査しなければならない場合があります。

これに対処するために、プロバイダの実行時実装でSecurityServicesオブジェクトをキャッシュし、プロバイダ固有のメカニズムを使用してそのキャッシュをプロバイダのMBean実装に渡すことができます。これにより、プロバイダでそのMBean操作を監査できます。

このタスクの実行方法の例が、Manageable Sample Authentication Providerに示されています。サンプル・プロバイダには、主に次の3つの実装クラスが含まれています。

  • ManageableSampleAuthenticationProviderImplには、セキュリティ実行時実装が含まれます。

  • ManageableSampleAuthenticatorImplには、MBean実装が含まれます。

  • UserGroupDatabaseは、ManageableSampleAuthenticationProviderImplおよびManageableSampleAuthenticatorImplで使用するヘルパー・クラス。

次に、SecurityServicesオブジェクトをキャッシュおよび取得するコード・フローを示します。

  1. ManageableSampleAuthenticationProviderImplのinitializeメソッドには、SecurityServicesオブジェクトが渡されます。

  2. initializeメソッドは、UserGroupDataBaseオブジェクトを作成し、そのUserGroupDataBaseオブジェクトにSecurityServicesオブジェクトを渡します。

  3. UserGroupDataBaseObjectは、SecurityServicesオブジェクトをキャッシュします。また、initializeメソッドは、レルムの名前をルックアップ・キーとして使用し、UserGroupDatabaseオブジェクトをハッシュ表に挿入します。

  4. ManageableSampleAuhenticatorImplのinitメソッドは、そのMBeanからレルム名を検索します。

  5. initメソッドは、レルム名を使用して、対応するUserGroupDataBaseオブジェクトをハッシュ表から検索します。

  6. initメソッドは、UserGroupDatabaseオブジェクトからSecurityServicesオブジェクトを取得し、その監査プロバイダを使用して「createUser」などの管理操作を監査します。

    注意:

    プロバイダの実行時実装は、サーバーの起動時に、プロバイダがデフォルト・レルムの一部である場合にのみ初期化されます。したがって、サーバーの起動時にプロバイダがデフォルト・レルム内にない場合、その実行時実装は初期化されず、プロバイダのMBean実装は、SecurityServicesオブジェクトへのアクセスを取得できません。つまり、サーバーの起動時にプロバイダがデフォルト・レルム内にない場合、プロバイダは、そのMBean操作を監査できません。

12.2.2.3 例:プロバイダのMBeanから管理操作の監査

例12-3では、ManageableSampleAuhenticatorImplのinitメソッドが、MBeanからレルム名を検索する方法、レルム名を使用して対応するUserGroupDataBaseオブジェクトを(UserGroupDatabaseヘルパー・クラスを介して)ハッシュ表から検索する方法、およびUserGroupDatabaseオブジェクトからSecurityServicesオブジェクトを取得する方法を示します。

また、例12-3では、ManageableSampleAuhenticatorImplがその監査プロバイダを使用してcreateUserなどの管理操作を監査する方法も示します。

例12-3 ManageableSampleAuthenticatorImpl.java

package examples.security.providers.authentication.manageable;
import java.util.Enumeration;
import javax.management.MBeanException;
import javax.management.modelmbean.ModelMBean;
import weblogic.management.security.authentication.AuthenticatorImpl;
import weblogic.management.utils.AlreadyExistsException;
import weblogic.management.utils.InvalidCursorException;
import weblogic.management.utils.NotFoundException;
import weblogic.security.spi.AuditorService;
import weblogic.security.spi.SecurityServices;

public class ManageableSampleAuthenticatorImpl extends AuthenticatorImpl
{
// Manages the user and group definitions for this provider:
private UserGroupDatabase database;

// Manages active queries (see listUsers, listGroups, listMemberGroups):
private ListManager listManager = new ListManager();

// The name of the realm containing this provider:
private String realm;

// The name of this provider:
private String provider;

// The auditor for auditing user/group management operations.
// This is only available if this provider was configured in
// the default realm when the server was booted.
private AuditorService auditor;

public ManageableSampleAuthenticatorImpl(ModelMBean base) throws MBeanException
{
super(base);
}

private synchronized void init() throws MBeanException
{
if (database == null) {
try {
ManageableSampleAuthenticatorMBean myMBean = (ManageableSampleAuthenticatorMBean)getProxy();
database = UserGroupDatabase.getDatabase(myMBean);
realm    = myMBean.getRealm().getName();
provider = myMBean.getName();
SecurityServices services = database.getSecurityServices();
auditor = (services != null) ? services.getAuditorService() : null;
}
catch(Exception e) {
throw new MBeanException(e, "SampleAuthenticatorImpl.init failed");
}
}
}
...
public void createUser(String user, String password, String description)
throws MBeanException, AlreadyExistsException
{
init();
String details = (auditor != null) ?
"createUser(user = " + user + ", password = " + password + ", 
description = " + description + ")" : null;
try {
// we don't support descriptions so just ignore it
database.checkDoesntExist(user);
database.getUser(user).create(password);
database.updatePersistentState();
auditOperationSucceeded(details);
}
catch (AlreadyExistsException   e) { auditOperationFailed(details, e); throw e; }
catch (IllegalArgumentException e) { auditOperationFailed(details, e); throw e; }
}
...
private void auditOperationSucceeded(String details)
{
if (auditor != null) {
auditor.providerAuditWriteEvent(
new ManageableSampleAuthenticatorManagementEvent(realm, provider, details, null)
);
}
}
...
private void auditOperationFailed(String details, Exception failureException)
{
if (auditor != null) {

auditor.providerAuditWriteEvent(
new ManageableSampleAuthenticatorManagementEvent(realm, provider, details, failureException)
);
}
}
}

12.2.3 ベスト・プラクティス:プロバイダのMBeanからの監査イベントのポスト

プロバイダの管理操作で書込み(ユーザーの作成、ユーザーの削除、データの削除など)を行うものは、操作が成功するかどうかに関係なく、監査イベントをポストする必要があります。

プロバイダがMBean操作を監査する場合は、常に以下のベスト・プラクティス・ガイドラインに留意してください。

  • 書込み操作が成功した場合は、INFORMATION監査イベントをポストします。

  • パラメータが不正(ユーザーがすでに存在する、インポート・フォーマット名が不正、ファイル名が存在しない、ファイル・フォーマットが不正など)という理由で書込み操作が失敗した場合は、監査イベントをポストしないようにします。

  • エラー(LDAPException、RuntimeExceptionなど)のために書込み操作が失敗した場合は、FAILURE監査イベントをポストします。

  • インポート操作は部分的に成功できます。たとえば、一部のユーザーがインポートされたものの、プロバイダ内にすでに名前を持つその他のユーザーがスキップされる場合などです。

  • スキップしたデータがプロバイダ内のデータと同じであることが簡単に検出できる場合(たとえば、ユーザー名、説明、パスワードなどが同じ場合など)、WARNINGイベントをポストすることを考慮します。

  • 一部に衝突があったためにデータをスキップする場合(たとえば、ユーザー名は同じだが、パスワードが異なっている場合など)、FAILUREイベントをポストする必要があります。

  • プロバイダに格納されているデータとインポート・データを区別できない場合は、FAILUREイベントをポストします。