Oracle® Fusion Middleware Oracle WebLogic Server セキュリティ プロバイダの開発 11g リリース 1 (10.3.1) B55527-01 |
|
戻る |
次へ |
「監査プロバイダ」で説明されているように、監査 とは、要求の操作とそれらの要求の結果に関する情報を、否認防止を目的として収集、格納、および配布するプロセスのことです。監査プロバイダは、コンピュータのアクティビティの電子的な記録を提供します。
各タイプのセキュリティ プロバイダは、セキュリティ関連イベントの実行前または実行後に、それらのイベントに関する情報を記録するようコンフィグレーション済みの監査プロバイダに要求できます。たとえば、あるユーザが (アクセス権を持たない) 預金口座アプリケーションの withdraw
メソッドにアクセスしようとした場合、認可プロバイダではこの操作を記録するように要求できます。セキュリティ関連イベントは、監査プロバイダのコンフィグレーションで指定されている重大度レベルと一致するか、それを超えた場合にのみ記録されます。
以下の節では、カスタム セキュリティ プロバイダに監査機能を追加する前に理解しておく必要がある基本情報と、カスタム セキュリティ プロバイダに監査機能を追加する手順について説明します。
weblogic.security.spi
パッケージの SecurityServices
インタフェースは、セキュリティ サービスのリポジトリです (現在は単なる監査サービス)。SecurityServices
インタフェースは、以下のメソッドを通じて呼び出し側に AuditorService の参照を提供します。
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 Security フレームワーク内のオブジェクトへの書き込みアクセスを提供します。event
パラメータは、監査するイベントのタイプや監査重大度レベルなどの監査条件を含む AuditEvent
オブジェクトです。監査イベントと監査重大度レベルの詳細については、それぞれ「監査イベントの作成」と「監査重大度」を参照してください。
監査サービスを呼び出すと、監査イベントの実行前または実行後にそれらのイベントを記録できますが、操作の前と後の間のコンテキストは維持されません。監査機能を持つセキュリティ プロバイダは、「監査サービスの取得、および取得した監査サービスによる監査イベントの書き込み」の説明に従って監査サービスを取得する必要があります。
注意 : 監査プロバイダがコンフィグレーションされている場合、SecurityServices インタフェースと AuditorService インタフェースの実装は起動時に WebLogic Security フレームワークによって作成されます。(監査プロバイダのコンフィグレーションについては、「Administration Console によるカスタム監査プロバイダのコンフィグレーション」を参照してください)。このため、開発者がこれらのインタフェースの実装を提供する必要はありません。また、SecurityServices オブジェクトは、セキュリティ プロバイダがコンフィグレーションされているセキュリティ レルムに固有のものです。カスタム セキュリティ プロバイダの実行時クラスは、その initialize メソッドの一部としてレルム固有の SecurityServices オブジェクトへの参照を自動的に取得します。(詳細については、「「Provider」SSPI の目的について」を参照してください)。 |
これらのインタフェースとそのメソッドの詳細については、WebLogic Server API リファレンス Javadoc の「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 値をエスケープしてください。 |
AuditEvent
SSPI とこれらのメソッドの詳細については、WebLogic Server API リファレンス Javadoc を参照してください。
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 インタフェースの詳細については、「監査コンテキスト」を参照してください。 |
AuditAtnEventV2
コンビニエンス インタフェースとこれらのメソッドの詳細については、WebLogic Server API リファレンス Javadoc を参照してください。
AuditAtzEvent
および AuditPolicyEvent
コンビニエンス インタフェースは、監査チャネルが拡張認可イベント タイプ オブジェクトのインスタンス タイプを判断するのに役立ちます。
注意 : AuditAtzEvent コンビニエンス インタフェースと AuditPolicyEvent コンビニエンス インタフェースは、後者が AuditEvent インタフェースのみを拡張する点で異なります。(後者は AuditContext インタフェースを拡張しません。) AuditContext インタフェースの詳細については、「監査コンテキスト」を参照してください。 |
AuditAtzEvent
インタフェースまたは AuditPolicyEvent
インタフェースを実装するには、「AuditEvent SSPI の実装」で説明されているメソッドと以下のメソッドの実装を提供する必要があります。
getSubject
public Subject getSubject()
getSubject
メソッドは、認可イベントに関連付けられているサブジェクト (WebLogic リソースにアクセスしようとしているサブジェクト) を返します。
getResource
public Resource getResource()
getResource
メソッドは、認可イベントに関連付けられ、サブジェクトがアクセスしようとしている WebLogic リソースを返します。
これらのコンビニエンス インタフェースおよびメソッドの詳細については、WebLogic Server API リファレンス Javadoc の「AuditAtzEvent インタフェース」または「AuditPolicyEvent インタフェース」を参照してください。
AuditMgmtEvent
は、監査チャネルが拡張セキュリティ管理イベント タイプ オブジェクトのインスタンス タイプ (セキュリティ プロバイダの MBean など) を判断するのに役立つコンビニエンス インタフェースです。このインタフェースには実装する必要があるメソッドは含まれていませんが、監査イベント実装のベスト プラクティス構造が保持されています。
AuditMgmtEvent
コンビニエンス インタフェースの詳細については、「WebLogic Server API リファレンス Javadoc」を参照してください。
AuditRoleDeploymentEvent
および AuditRoleEvent
コンビニエンス インタフェースは、監査チャネルが拡張ロール マッピング イベント タイプ オブジェクトのインスタンス タイプを判断するのに役立ちます。このインタフェースには実装する必要があるメソッドは含まれていませんが、監査イベント実装のベスト プラクティス構造が保持されています。
注意 : AuditRoleEvent コンビニエンス インタフェースと AuditRoleDeploymentEvent コンビニエンス インタフェースは、後者が AuditEvent インタフェースのみを拡張する点で異なります。(後者は AuditContext インタフェースを拡張しません。) AuditContext インタフェースの詳細については、「監査コンテキスト」を参照してください。 |
これらのコンビニエンス インタフェースの詳細については、WebLogic Server 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
public ContextHandler getContext()
getContext
メソッドは、ContextHandler
オブジェクトを返します。実行時クラス (AuditChannel
SSPI の実装) は、このオブジェクトから追加の監査情報を取得します。ContextHandler の詳細については、「ContextHandler と WebLogic リソース」を参照してください。
コード リスト 12-1 に、MyAuditRoleEventImpl.java
クラスを示します。これは、監査イベント コンビニエンス インタフェース (ここでは AuditRoleEvent
コンビニエンス インタフェース) の実装例です。このクラスには以下の実装が含まれています。
getEventType
、getFailureException
、getSeverity
、および toString
という AuditEvent
SSPI から継承された 4 つのメソッド (「AuditEvent SSPI の実装」を参照)
ContextHandler を介してコンテキストについての補足情報を返す getContext
という 1 つの追加メソッド(ContextHandler の詳細については、「ContextHandler と WebLogic リソース」を参照してください)。
コード リスト 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
) が監査サービスを取得し、そのサービスを使用して監査イベントを書き込む例を示します。
コード リスト 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
{
// このプロバイダのユーザおよびグループ定義を管理する
private UserGroupDatabase database;
// アクティブ クエリ (listUsers, listGroups, listMemberGroups を参照) を管理する
private ListManager listManager = new ListManager();
// このプロバイダを格納するレルムの名前
private String realm;
// このプロバイダの名前
private String provider;
// ユーザ/グループ管理オペレーションを監査するための監査プロバイダ。
// これは、サーバ起動時に、このプロバイダがデフォルト レルムで
// コンフィグレーションされている場合にのみ使用可能。
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 {
// 説明はサポートされていないので、これを無視する
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 イベントをポストする。