Oracle® Fusion Middleware Oracle WebLogic Serverセキュリティ・プロバイダの開発 12c 12c (12.2.1.3.0) E90323-01 |
|
![]() 前 |
![]() 次 |
「監査プロバイダ」で説明されているように、監査とは、リクエストの操作とそれらのリクエストの結果に関する情報を、否認防止を目的として収集、格納および配布するプロセスのことです。監査プロバイダは、コンピュータのアクティビティの電子的な記録を提供します。
各タイプのセキュリティ・プロバイダは、セキュリティ関連イベントの実行前または実行後に、それらのイベントに関する情報を記録するよう構成済みの監査プロバイダにリクエストできます。たとえば、あるユーザーが(アクセス権を持たない)預金口座アプリケーションのwithdraw
メソッドにアクセスしようとした場合、認可プロバイダではこの操作を記録するようにリクエストできます。セキュリティ関連イベントは、監査プロバイダの構成で指定されている重大度レベルと一致するか、それを超えた場合にのみ記録されます。
この章の内容は次のとおりです。
weblogic.security.spi
パッケージのSecurityServices
インタフェースは、セキュリティ・サービスのリポジトリです(現在は単なる監査サービス)。SecurityServices
インタフェースは、以下のメソッドを通じて呼出し側に監査サービスの参照を提供します。
getAuditorService
public AuditorService getAuditorService
getAuditorService
メソッドは、監査プロバイダが構成されている場合にAuditService
を返します。
同じくweblogic.security.spi
パッケージにあるAuditorService
インタフェースは、他のタイプのセキュリティ・プロバイダ(認証プロバイダなど)に対する限定された(書込み専用の)監査機能を提供します。つまり、監査サービスでは構成されている各監査プロバイダのwriteEvent
メソッドを呼び出します。このメソッドは渡されたAuditEvent
オブジェクトに指定されている情報に基づいて、単純に監査レコードを記述します。
「AuditChannel SSPIの実装」および「監査イベントの作成」を参照してください。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インタフェースに関する項を参照してください。
カスタム・セキュリティ・プロバイダに監査機能を追加するには、次の手順に従います。
各手順の例については、「例:AuditRoleEventインタフェースの実装」と「例:監査サービスを取得および使用してロール監査イベントの書込み」を参照してください。
注意:
カスタム・セキュリティ・プロバイダが監査イベントを記録する場合、必須のファイルに加えて、以下の手順で作成したすべてのクラスを、そのプロバイダ用のMBean JARファイル(MJF)に追加する必要があります。
セキュリティ・プロバイダは、イベントのタイプ(認証イベントなど)や監査重大度(エラーなど)といった、監査するイベントに関する情報を提供する必要があります。監査イベントには、この情報が格納されます。また、構成済みの監査プロバイダが理解できるコンテキスト・データも格納できます。監査イベントを作成するには、以下のいずれかを行います。
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
値をエスケープしてください。
Oracle WebLogic Server Java APIリファレンスを参照してください。
AuditEvent
SSPIには、ユーザーの利便を図り、監査イベントの作成に役立つサブインタフェースがいくつか用意されています。
監査チャネル(AuditChannel
SSPIを実装するランタイム・クラス)では、それらの各監査イベント・コンビニエンス・インタフェースを使用して、拡張イベント・タイプ・オブジェクトのインスタンス・タイプをより効果的に判断し、特定のタイプのセキュリティ・プロバイダを識別することができます。たとえば、AuditAtnEventV2
コンビニエンス・インタフェースを監査チャネルで使用すると、拡張認証イベント・タイプ・オブジェクトのインスタンス・タイプを判断できます。(「監査チャネル」および「AuditChannel SSPIの実装」を参照してください。)
監査イベント・コンビニエンス・インタフェースは以下のとおりです。
AuditRoleEventおよびAuditRoleDeploymentEventインタフェース
注意:
上記の監査イベント・コンビニエンス・インタフェースの1つを実装することをお薦めしますが、必須ではありません。
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インタフェースの詳細は、「監査コンテキスト」を参照してください
Oracle WebLogic Server Java APIリファレンスを参照してください。
AuditAtzEvent
およびAuditPolicyEvent
コンビニエンス・インタフェースは、監査チャネルが拡張認可イベント・タイプ・オブジェクトのインスタンス・タイプを判断するのに役立ちます。
注意:
AuditAtzEvent
コンビニエンス・インタフェースとAuditPolicyEvent
コンビニエンス・インタフェースは、後者がAuditEvent
インタフェースのみを拡張する点で異なります。(後者はAuditContext
インタフェースを拡張しません。)「監査コンテキスト」を参照してください。
AuditAtzEvent
インタフェースまたはAuditPolicyEvent
インタフェースを実装するには、「AuditEvent SSPIの実装」で説明されているメソッドおよび次のメソッドの実装を提供する必要があります。
getSubject
public Subject getSubject()
getSubject
メソッドは、認可イベントに関連付けられているサブジェクト(WebLogicリソースにアクセスしようとしているサブジェクト)を返します。
getResource
public Resource getResource()
getResource
メソッドは、認可イベントに関連付けられ、サブジェクトがアクセスしようとしているWebLogicリソースを返します。
Oracle WebLogic Server Java APIリファレンスのAuditAtzEventインタフェースに関する項またはAuditPolicyEventインタフェースに関する項を参照してください。
AuditMgmtEvent
は、監査チャネルが拡張セキュリティ管理イベント・タイプ・オブジェクトのインスタンス・タイプ(セキュリティ・プロバイダのMBeanなど)を判断するのに役立つコンビニエンス・インタフェースです。このインタフェースには実装する必要があるメソッドは含まれていませんが、監査イベント実装のベスト・プラクティス構造が保持されています。
注意:
「セキュリティ・サービス・プロバイダ・インタフェース(SSPI) MBean」を参照してください。
Oracle WebLogic Server Java APIリファレンスを参照してください。
AuditRoleDeploymentEvent
およびAuditRoleEvent
コンビニエンス・インタフェースは、監査チャネルが拡張ロール・マッピング・イベント・タイプ・オブジェクトのインスタンス・タイプを判断するのに役立ちます。このインタフェースには実装する必要があるメソッドは含まれていませんが、監査イベント実装のベスト・プラクティス構造が保持されています。
注意:
AuditRoleEvent
コンビニエンス・インタフェースとAuditRoleDeploymentEvent
コンビニエンス・インタフェースは、後者がAuditEvent
インタフェースのみを拡張する点で異なります。(後者はAuditContext
インタフェースを拡張しません。)「監査コンテキスト」を参照してください。
Oracle WebLogic Server Java APIリファレンスのAuditRoleEventインタフェースに関する項またはAuditRoleDeploymentEventインタフェースに関する項を参照してください。
監査重大度とは、セキュリティ・プロバイダが監査イベントを記録するレベルのことです。構成済みの監査プロバイダが監査リクエストを受け取ると、各監査プロバイダは実行されるイベントの重大度を調べます。イベントの重大度が監査プロバイダの構成に使用されたレベル以上であれば、監査プロバイダはその監査データを記録します。
注意:
監査プロバイダの構成は、WebLogic Server管理コンソールで行います。「管理コンソールによるカスタム監査プロバイダの構成」を参照してください。
weblogic.security.spi
パッケージに含まれるAuditSeverity
クラスは、監査重大度レベルを数値およびテキスト値として、AuditEvent
オブジェクトを介して監査チャネル(AuditChannel
SSPIの実装)に、提供します。重大度の数値はロジックで用いるためのもので、テキスト値は出力用監査記録の作成で用いるためのものです。「AuditChannel SSPIの実装」および「監査イベントの作成」をそれぞれ参照してください。
一部の監査イベント・コンビニエンス・インタフェースは、実装にコンテキスト情報も含まれていることを示すために、AuditContext
インタフェースを拡張します。コンテキスト情報は、監査チャネルによって使用されます。「監査チャネル」および「AuditChannel SSPIの実装」を参照してください。
AuditContext
インタフェースには以下のメソッドがあります。
getContext
public ContextHandler getContext()
getContext
メソッドは、ContextHandler
オブジェクトを返します。ランタイム・クラス(AuditChannel
SSPIの実装)は、このオブジェクトから追加の監査情報を取得します。「ContextHandlerとWebLogicリソース」を参照してください。
例12-1に、MyAuditRoleEventImpl.java
クラスを示します。これは、監査イベント・コンビニエンス・インタフェース(ここではAuditRoleEvent
コンビニエンス・インタフェース)の実装例です。このクラスには以下の実装が含まれています。
getEventType
、getFailureException
、getSeverity
、およびtoString
というAuditEvent
SSPIから継承された4つのメソッド(「AuditEvent SSPIの実装」を参照)
ContextHandlerを介してコンテキストについての補足情報を返すgetContext
という1つの追加メソッド(「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(); } }
カスタム・セキュリティ・プロバイダから監査サービスを取得および使用して監査イベントを書き込むには、次の手順に従います。
getAuditorService
メソッドを使用して監査サービスを返します。
注意:
SecurityServices
オブジェクトはinitializeメソッドの一部としてセキュリティ・プロバイダのProvider SSPIの実装に渡されることに注意します。(詳細は、Provider SSPIの目的を参照)。AuditorService
オブジェクトは、監査プロバイダが構成されている場合にのみ返されます。
「AuditEvent SSPIの実装」で作成した監査イベントをインスタンス化し、AuditService.providerAuditWriteEvent
メソッドを介して監査サービスに送ります。
例12-2に、カスタム・ロール・マッピング・プロバイダのランタイム・クラス(MyRoleMapperProviderImpl.java
)が監査サービスを取得し、そのサービスを使用して監査イベントを書き込む例を示します。
注意:
MyRoleMapperProviderImpl.java
クラスは、例12-1
のMyAuditRoleEventImpl.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 } ... } }
SecurityServices
オブジェクトはinitialize
メソッドの一部としてセキュリティ・プロバイダの「Provider」SSPIの実装に渡されます。(「「Provider」SSPIの目的について」を参照してください。)プロバイダはこのオブジェクトの監査プロバイダを使用して、ユーザーがログインに成功したなど、プロバイダ固有のセキュリティ・イベントを監査します。
セキュリティ・プロバイダのMBean実装には、SecurityServicesオブジェクトは渡されません。ただし、プロバイダは、作成中のユーザーなど、そのMBean操作を監査しなければならない場合があります。
これに対処するために、プロバイダの実行時実装でSecurityServicesオブジェクトをキャッシュし、プロバイダ固有のメカニズムを使用してそのキャッシュをプロバイダのMBean実装に渡すことができます。これにより、プロバイダでそのMBean操作を監査できます。
このタスクの実行方法の例が、Manageable Sample Authentication Providerに示されています。サンプル・プロバイダには、主に次の3つの実装クラスが含まれています。
ManageableSampleAuthenticationProviderImplには、セキュリティ実行時実装が含まれます。
ManageableSampleAuthenticatorImplには、MBean実装が含まれます。
UserGroupDatabaseは、ManageableSampleAuthenticationProviderImplおよびManageableSampleAuthenticatorImplで使用するヘルパー・クラス。
次に、SecurityServicesオブジェクトをキャッシュおよび取得するコード・フローを示します。
ManageableSampleAuthenticationProviderImplのinitialize
メソッドには、SecurityServicesオブジェクトが渡されます。
initialize
メソッドは、UserGroupDataBaseオブジェクトを作成し、そのUserGroupDataBaseオブジェクトにSecurityServicesオブジェクトを渡します。
UserGroupDataBaseObjectは、SecurityServicesオブジェクトをキャッシュします。また、initialize
メソッドは、レルムの名前をルックアップ・キーとして使用し、UserGroupDatabaseオブジェクトをハッシュ表に挿入します。
ManageableSampleAuhenticatorImplのinit
メソッドは、そのMBeanからレルム名を検索します。
init
メソッドは、レルム名を使用して、対応するUserGroupDataBaseオブジェクトをハッシュ表から検索します。
init
メソッドは、UserGroupDatabaseオブジェクトからSecurityServicesオブジェクトを取得し、その監査プロバイダを使用して「createUser」などの管理操作を監査します。
注意:
プロバイダの実行時実装は、サーバーの起動時に、プロバイダがデフォルト・レルムの一部である場合にのみ初期化されます。したがって、サーバーの起動時にプロバイダがデフォルト・レルム内にない場合、その実行時実装は初期化されず、プロバイダのMBean実装は、SecurityServices
オブジェクトへのアクセスを取得できません。つまり、サーバーの起動時にプロバイダがデフォルト・レルム内にない場合、プロバイダは、その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)
);
}
}
}
プロバイダの管理操作で書込み(ユーザーの作成、ユーザーの削除、データの削除など)を行うものは、操作が成功するかどうかに関係なく、監査イベントをポストする必要があります。
プロバイダがMBean操作を監査する場合は、常に以下のベスト・プラクティス・ガイドラインに留意してください。
書込み操作が成功した場合は、INFORMATION監査イベントをポストします。
パラメータが不正(ユーザーがすでに存在する、インポート・フォーマット名が不正、ファイル名が存在しない、ファイル・フォーマットが不正など)という理由で書込み操作が失敗した場合は、監査イベントをポストしないようにします。
エラー(LDAPException、RuntimeExceptionなど)のために書込み操作が失敗した場合は、FAILURE監査イベントをポストします。
インポート操作は部分的に成功できます。たとえば、一部のユーザーがインポートされたものの、プロバイダ内にすでに名前を持つその他のユーザーがスキップされる場合などです。
スキップしたデータがプロバイダ内のデータと同じであることが簡単に検出できる場合(たとえば、ユーザー名、説明、パスワードなどが同じ場合など)、WARNINGイベントをポストすることを考慮します。
一部に衝突があったためにデータをスキップする場合(たとえば、ユーザー名は同じだが、パスワードが異なっている場合など)、FAILUREイベントをポストする必要があります。
プロバイダに格納されているデータとインポート・データを区別できない場合は、FAILUREイベントをポストします。