WebLogic Security サービスの開発
「監査プロバイダ」で説明したように、監査とは、リクエストの操作とそれらのリクエストの結果に関する情報を、否認防止を目的として収集、格納、および配布するプロセスのことです。監査プロバイダは、コンピュータのアクティビティの電子的な記録を提供します。
各タイプのセキュリティ プロバイダは、セキュリティ関連イベントの実行前または実行後に、それらのイベントに関する情報を記録するようコンフィグレーション済みの監査プロバイダに要求できます。たとえば、あるユーザが預金口座アプリケーションの (アクセス権を持たない) withdraw
メソッドにアクセスしようとした場合、認可プロバイダはこの操作を記録するよう要求できます。セキュリティ関連イベントは、監査プロバイダのコンフィグレーションで指定されている重大度レベルと一致するか、それを超えた場合にのみ記録されます。
以下の節では、カスタム セキュリティ プロバイダに監査機能を追加する前に理解しておく必要がある基本情報と、カスタム セキュリティ プロバイダに監査機能を追加する手順について説明します。
weblogic.security.spi
パッケージの SecurityServices
インタフェースは、セキュリティ サービスのリポジトリです (現在は単なる監査サービス)。SecurityServices
インタフェースは、以下のメソッドを通じて呼び出し側に AuditorService の参照を提供します。
同じく weblogic.security.spi
パッケージにある AuditorService
インタフェースは、制限された (書き込み専用の) 監査機能を持つ他のタイプのセキュリティ プロバイダ (認証プロバイダなど) を提供します。つまり、監査サービスはコンフィグレーション済みの各監査プロバイダの writeEvent
メソッドの呼び出しを展開します。writeEvent
メソッドは、渡された AuditEvent
オブジェクト内に指定されている情報に基づいて監査記録を書き込みます。writeEvent
メソッドの詳細については、「AuditChannel SSPI を実装する」を参照してください。AuditEvent
オブジェクトの詳細については、「監査イベントを作成する」を参照してください。AuditorService
インタフェースには以下のメソッドが定義されています。
providerAuditWriteEvent
メソッドは、セキュリティ プロバイダに対して、コンフィグレーション済みの監査プロバイダを呼び出す WebLogic Security フレームワーク内のオブジェクトへの書き込みアクセスを提供します。event
パラメータは、監査するイベントのタイプや監査重大度レベルなどの監査条件を含む AuditEvent
オブジェクトです。監査イベントと監査重大度レベルの詳細については、それぞれ「監査イベントを作成する」と「監査重大度」を参照してください。
監査サービスを呼び出すと、監査イベントの実行前または実行後にそれらのイベントを記録できますが、操作の前と後の間のコンテキストは維持されません。監査機能を持つセキュリティ プロバイダは、「監査サービスを取得および使用して監査イベントを書き込む」の説明に従って監査サービスを取得する必要があります。
注意 : 監査プロバイダがコンフィグレーションされている場合、SecurityServices
インタフェースと AuditorService
インタフェースの実装は起動時に WebLogic Security フレームワークによって作成されます。監査プロバイダのコンフィグレーションについては、「Administration Console によるカスタム監査プロバイダのコンフィグレーション」を参照してください。このため、開発者がこれらのインタフェースの実装を提供する必要はありません。
また、SecurityServices
オブジェクトは、セキュリティ プロバイダがコンフィグレーションされているセキュリティ レルムに固有のものです。カスタム セキュリティ プロバイダの実行時クラスは、その initialize
メソッドの一部としてレルム固有の SecurityServices
オブジェクトへの参照を自動的に取得します。詳細については、「「Provider」SSPI の目的を理解する」を参照してください。
上記インタフェースとそれらのメソッドの詳細については、『WebLogic Server 8.1 API リファレンス Javadoc』の「SecurityServices インタフェース と AuditorService インタフェース」を参照してください。
カスタム セキュリティ プロバイダに監査機能を追加するには、次の手順に従います。
各手順の例については、「例 : AuditRoleEvent インタフェースの実装」と「例 : 監査サービスを取得および使用してロール監査イベントを書き込む」を参照してください。
注意 : カスタム セキュリティ プロバイダが監査イベントを記録する場合、必須のファイルに加えて、以下の手順で作成したすべてのクラスを、そのプロバイダ用の MBean JAR ファイル (MJF) に追加する必要があります。
セキュリティ プロバイダは、イベントのタイプ (認証イベントなど) や監査重大度 (「エラー」など) といった、監査するイベントに関する情報を提供する必要があります。監査イベントには、この情報が格納されます。また、コンフィグレーション済みの監査プロバイダが理解できるコンテキスト データも格納できます。監査イベントを作成するには、以下のいずれかを行います。
getEventType
メソッドは、監査するイベント タイプの文字列表現を返します。この文字列表現は、監査チャネル (AuditChannel
SSPI を実装する実行時クラス) によって使用されます。たとえば、BEA 提供の実装のイベント タイプは "Authentication Audit Event"
です。詳細については、「監査チャネル」および「AuditChannel SSPI を実装する」を参照してください。
getFailureException
メソッドは、Exception
オブジェクトを返します。監査チャネルは、toString メソッドから提供される情報に加えて、このオブジェクトから監査情報を取得します。
getSeverity
メソッドは、監査するイベント タイプに関連付けられている重大度レベル値を返します。この値は、監査チャネルによって使用されます。監査チャネルはこの値を使用して、監査するかどうかを判定します。詳細については、「監査重大度」を参照してください。
AuditEvent
SSPI とこのメソッドの詳細については、「WebLogic Server 8.1 API リファレンス Javadoc」を参照してください。
AuditEvent
SSPI には、ユーザの利便を図り、監査イベントの作成に役立つサブインタフェースがいくつか用意されています。
監査チャネル (AuditChannel
SSPI を実装する実行時クラス) では、それらの各監査イベント コンビニエンス インタフェースを使用して、拡張イベント タイプ オブジェクトのインスタンス タイプをより効果的に決定し、特定のタイプのセキュリティ プロバイダを識別することができます。たとえば、AuditAtnEvent
コンビニエンス インタフェースは、拡張認証イベント タイプ オブジェクトのインスタンス タイプを決定する監査チャネルで使用できます。詳細については「監査チャネル」と「AuditChannel SSPI を実装する」を参照してください。
監査イベント コンビニエンス インタフェースは以下のとおりです。
注意 : 上記の監査イベント コンビニエンス インタフェースの 1 つを実装することをお勧めしますが、これは必須ではありません。
AuditAtnEvent
は、監査チャネルが拡張認証イベント タイプ オブジェクトのインスタンス タイプを決定するためのコンビニエンス インタフェースです。
AuditAtnEvent
インタフェースを実装するには、「AuditEvent SSPI を実装する」で説明されているメソッドと以下のメソッドの実装を提供する必要があります。
AtnEventType
メソッドは、認証イベントをより具体的に表すイベント タイプを返します。具体的な認証イベント タイプは以下のとおりです。
IMPERSONATEIDENTITY
- 指定されたクライアント ユーザ名を使用してクライアント ID が確立された (kernal ID が必要)
AuditAtnEvent
コンビニエンス インタフェースとこのメソッドの詳細については、「WebLogic Server 8.1 API リファレンス Javadoc」を参照してください。
AuditAtzEvent
および AuditPolicyEvent
コンビニエンス インタフェースは、監査チャネルが拡張認可イベント タイプ オブジェクトのインスタンス タイプを決定するのに役立ちます。
注意 : AuditAtzEvent
コンビニエンス インタフェースと AuditPolicyEvent
コンビニエンス インタフェースは、後者が AuditEvent
インタフェースのみを拡張する点で異なります。AuditPolicyEvent コンビニエンス インタフェースは AuditContext
インタフェースを拡張しません。AuditContext
インタフェースの詳細については、「監査コンテキスト」を参照してください。
AuditAtzEvent
または AuditPolicyEvent
インタフェースを実装するには、「AuditEvent SSPI を実装する」で説明されているメソッドと以下のメソッドの実装を提供する必要があります。
これらのコンビニエンス インタフェースとメソッドの詳細については、『WebLogic Server 8.1 API リファレンス Javadoc』の「AuditAtzEvent インタフェースまたはAuditPolicyEvent インタフェース」を参照してください。
AuditMgmtEvent
は、監査チャネルが拡張セキュリティ管理イベント タイプ オブジェクトのインスタンス タイプ (セキュリティ プロバイダの MBean など) を決定するためのコンビニエンス インタフェースです。このインタフェースには実装する必要があるメソッドは含まれていませんが、監査イベント実装のベスト プラクティス構造が保持されています。
注意 : MBean の詳細については、「セキュリティ サービス プロバイダ インタフェース (SSPI) MBean」を参照してください。
AuditMgmtEvent
コンビニエンス インタフェースの詳細については、「WebLogic Server 8.1 API リファレンス Javadoc」を参照してください。
AuditRoleDeploymentEvent
および AuditRoleEvent
コンビニエンス インタフェースは、監査チャネルが拡張ロール マッピング イベント タイプ オブジェクトのインスタンス タイプを決定するのに役立ちます。このインタフェースには実装する必要があるメソッドは含まれていませんが、監査イベント実装のベスト プラクティス構造が保持されています。
注意 : AuditRoleEvent
コンビニエンス インタフェースと AuditRoleDeploymentEvent
コンビニエンス インタフェースは、後者が AuditEvent
インタフェースのみを拡張する点で異なります。AuditRoleDeploymentEvent コンビニエンス インタフェースは AuditContext
インタフェースを拡張しません。AuditContext
インタフェースの詳細については、「監査コンテキスト」を参照してください。
これらのコンビニエンス インタフェースの詳細については、『WebLogic Server 8.1 API リファレンス Javadoc』の「AuditRoleEvent インタフェースまたは AuditRoleDeploymentEvent インタフェース」を参照してください。
監査重大度とは、セキュリティ プロバイダが監査イベントを記録するレベルのことです。コンフィグレーション済みの監査プロバイダが監査リクエストを受け取ると、各監査プロバイダは実行されるイベントの重大度を調べます。イベントの重大度が監査プロバイダのコンフィグレーションに使用されたレベル以上であれば、監査プロバイダはその監査データを記録します。
注意 : 監査プロバイダのコンフィグレーションは、WebLogic Server Administration Console で行います。詳細については、「Administration Console によるカスタム監査プロバイダのコンフィグレーション」を参照してください。
weblogic.security.spi
パッケージに含まれる AuditSeverity
クラスは、監査重大度レベルを数値およびテキスト値として、AuditEvent
オブジェクトを介して監査チャネル (AuditChannel
SSPI の実装) に、提供します。重大度の数値はロジックで用いるためのもので、テキスト値は出力用監査記録の作成で用いるためのものです。AuditChannel
SSPI と AuditEvent
オブジェクトの詳細については、それぞれ「AuditChannel SSPI を実装する」および「監査イベントを作成する」を参照してください。
一部の監査イベント コンビニエンス インタフェースは、実装にコンテキスト情報も含まれていることを示すために、AuditContext
インタフェースを拡張します。コンテキスト情報は、監査チャネルによって使用されます。詳細については、「監査チャネル」および「AuditChannel SSPI を実装する」を参照してください。
AuditContext
インタフェースには以下のメソッドが定義されています。
getContext
メソッドは、ContextHandler
オブジェクトを返します。実行時クラス (AuditChannel
SSPI の実装) は、このオブジェクトから追加の監査情報を取得します。ContextHandler の詳細については、「ContextHandler と WebLogic リソース」を参照してください。
コード リスト 11-1 に、MyAuditRoleEventImpl.java
クラスを示します。これは、監査イベント コンビニエンス インタフェース (ここでは AuditRoleEvent
コンビニエンス インタフェース) の実装例です。このクラスには以下の実装が含まれています。
getEventType
、getFailureException
、getSeverity
、および toString
という AuditEvent
SSPI から継承された 4 つのメソッド (「AuditEvent SSPI を実装する」を参照)getContext
という 1 つの追加メソッド (ContextHandler の詳細については、「ContextHandler と WebLogic リソース」を参照)注意 : コード リスト 11-1 の太字のコードは、クラス宣言とメソッド シグネチャを示しています。
コード リスト 11-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();
}
}
カスタム セキュリティ プロバイダから監査サービスを取得および使用して監査イベントを書き込むには、次の手順に従います。
注意 : SecurityServices
オブジェクトは initialize
メソッドの一部としてセキュリティ プロバイダの「Provider」SSPI の実装に渡されることに注意してください。詳細については、「「Provider」SSPI の目的を理解する」を参照してください。AuditorService
オブジェクトは、監査プロバイダがコンフィグレーションされている場合にのみ返されます。
AuditService.providerAuditWriteEvent
メソッドを介して監査サービスに送ります。コード リスト 11-2 に、カスタム ロール マッピング プロバイダの実行時クラス (MyRoleMapperProviderImpl.java
) が監査サービスを取得し、そのサービスを使用して監査イベントを書き込む例を示します。
注意 : MyRoleMapperProviderImpl.java
クラスは、コード リスト 11-1 の MyAuditRoleEventImpl.java
クラスに依存します。
コード リスト 11-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); // 例外が発生しなかった
}
...
}
}
注意 : コード リスト 11-2 のコードは、セキュリティ プロバイダの実行時クラスから監査イベントをポストする方法の例です。管理メソッドから監査イベントをポストすることもできます。管理メソッドから監査イベントをポストする例については、dev2dev Web サイトの「Code Samples: WebLogic Server」から入手できるサンプル セキュリティ プロバイダの 1 つである「Manageable Sample Authentication Provider」を参照してください。