ヘッダーをスキップ
Oracle Fusion Middleware Oracle Identity Management統合ガイド
11gリリース1(11.1.1)
B55920-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

17 サード・パーティ・ディレクトリとの同期の構成

この章では、Oracle Internet Directoryとサード・パーティ・ディレクトリとの同期の一般的な方法について説明します。内容は次のとおりです。


注意:

この章を読む前に、第16章「サード・パーティ・ディレクトリ統合の概念と考慮事項」の内容を理解しておく必要があります。


関連項目:

Oracle Internet Directoryと特定のサード・パーティ・ディレクトリ間の統合の構成に関する手順は、次の各章を参照してください。

同期要件の確認

Oracle Internet Directoryとサード・パーティ・ディレクトリ間の同期を準備するには、次のようにします。

  1. Oracle Internet Directoryとサード・パーティ・ディレクトリが稼働していることを確認します。

  2. 同期化するコンテナ内の関連エントリの読取りおよび書込みに十分な権限を持つユーザー・アカウントをサード・パーティ・ディレクトリに作成します。ディレクトリでtombstoneがサポートされている場合、アカウントにはtombstoneエントリの読取りに十分な権限も必要です。

    • サード・パーティ・ディレクトリからのインポート操作: ユーザー・アカウントにサブツリー・ルートに対する読取りアクセス権限を付与します。ユーザー・アカウントは、Oracle Directory Integration Platformとの同期化が行われるサード・パーティ・ディレクトリ内のソース・コンテナ(サブツリー・ルート)下のすべてのオブジェクトを読み取ることができる必要があります。サード・パーティ・ディレクトリのユーザー・アカウントに、Oracle Internet Directoryと同期化されるすべてのオブジェクトに対する必要な権限があるかどうかを確認するには、次のようにコマンドライン・ユーティリティldapsearchを使用してサブツリー検索を実行します。

      $ORACLE_HOME/bin/ldapsearch -h directory host-p directory port \
      -b "DN of subtree" -s sub -D binddn "objectclass=*" -q
      

      注意:

      権限のあるディレクトリ・ユーザーのパスワードを要求されます。

      ldapsearchユーティリティから返される結果には、同期化されるすべての属性および値を含む、対象の全オブジェクトが含まれている必要があります。

    • サード・パーティ・ディレクトリへのエクスポート操作: ユーザー・アカウントに、Oracle Directory Integration Platformからユーザーをエクスポートする全コンテナの親であるサブツリー・ルートに対する、次の権限を付与します。

      • 書込み

      • すべての子オブジェクトの作成

      • すべての子オブジェクトの削除


      関連項目:

      ユーザー・アカウントに対する権限の付与方法については、使用しているサード・パーティ・ディレクトリのドキュメントを参照してください。

      変更ロギングが有効な状態でOracle Internet Directoryが稼働していることと、変更ログのパージ期間が7日以上に設定されていることを確認する必要もあります。


      関連項目:

      • 変更ロギングを有効にしてOracleディレクトリ・サーバーを起動する方法は、『Oracle Identity Managementユーザー・リファレンス』のOracle Internet Directoryサーバー管理ツールに関する章を参照してください。

      • 変更ログのパージ期間の設定方法は、『Oracle Identity Managementユーザー・リファレンス』orclPurgeTargetAgeに関する項を参照してください。


expressSyncSetupを使用したインポートおよびエクスポートの同期プロファイルの作成

ORACLE_HOME/binディレクトリにあるexpressSyncSetupコマンドを使用すると、同期プロファイルのために、接続ディレクトリとOracle Internet Directory間の初期のデータ移行を実行できます。


注意:

  • 最良のセキュリティ・プラクティスは、コマンドからの要求への応答としてのみ、パスワードを入力することです。

  • Oracle Directory Integration Platformコマンドのいずれかを実行するには、あらかじめWL_HOME環境変数とORACLE_HOME環境変数を設定しておく必要があります。


expressSyncSetupの構文

expressSyncSetup

expressSyncSetup -h hostName -p PORT -D wlsuser -pf profile
-conDirType connectedDirectoryType -conDirURL connected_directory_url 
-conDirBindDN connected_directory_bind_dn -conDircontainer syncContainer
[-enableProfiles {true | false}] [-help]

expressSyncSetupの引数

-h | -host

Oracle Directory Integration PlatformがデプロイされているOracle WebLogic Serverホスト。

-p | -port

Oracle Directory Integration PlatformがデプロイされているOracle WebLogic Managed Serverのリスニング・ポート。

-D | wlsusser

Oracle WebLogic ServerのログインID。


注意:

Oracle WebLogic Serverのログイン・パスワードを要求されます。パスワードをコマンドライン引数として指定することはできません。最良のセキュリティ・プラクティスは、コマンドからの要求への応答としてのみ、パスワードを入力することです。スクリプトからexpressSyncSetupを実行する必要がある場合、Oracle WebLogic Serverパスワードを含むファイルから、入力をリダイレクトできます。ファイル権限を使用してファイルを保護し、不要になったら権限を削除します。expressSyncSetupに複数のパスワードを入力する必要がある場合、接続ディレクトリ・バインドDNパスワード、Oracle WebLogic Serverログイン・パスワードの順で、ファイル内の別々の行に記載します。

-pf | -profile

プロファイル名。ASCII文字のみでプロファイルの名前を指定します。プロファイル名では、ASCII以外の文字はサポートされません。

-conDirType

接続ディレクトリのタイプ。サポートされている値は、ActiveDirectoryEDirectoryiPlanetOpenLDAPADAMTivoliOIDおよびExchangeServer2003です。

-conDirUrl

接続ディレクトリが稼働しているURL。host:portという形式です。

-conDirBindDN

接続ディレクトリ・サーバーのバインドDN。たとえば、次のようになります。

administrator@idm2003.net

cn=orcladmin, cn=Directory Manager


注意:

接続ディレクトリのバインドDNパスワードを要求されます。パスワードをコマンドライン引数として指定することはできません。最良のセキュリティ・プラクティスは、コマンドからの要求への応答としてのみ、パスワードを入力することです。スクリプトからexpressSyncSetupを実行する必要がある場合、接続ディレクトリ・バインドDNパスワードを含むファイルから、入力をリダイレクトできます。ファイル権限を使用してファイルを保護し、不要になったら権限を削除します。expressSyncSetupに複数のパスワードを入力する必要がある場合、接続ディレクトリ・バインドDNパスワード、Oracle WebLogic Serverログイン・パスワードの順で、ファイル内の別々の行に記載します。

-conDirContainer

同期コンテナ。たとえば、次のようになります。

ou=sales,dc=us,dc=com

OU=Groups,DC=imtest,DC=com

CN=Users,DC=imtest,DC=com

-enableProfiles

作成されたプロファイルを有効にする場合はtrue、有効にしない場合はfalseを指定します。

-help

コマンドの使用方法のヘルプを提供します。

expressSyncSetupのタスクおよび例

expressSyncSetup -h myhost.mycompany.com -p 7005 -D login_ID -pf myProfile \
  -conDirType ACTIVEDIRECTORY -conDirUrl server.mycompany.com:5432 \
  -conDirBindDN administrator@idm2003.net -conDirContainer ou=sales,dc=us,dc=com \
  -enableProfiles false \
expressSyncSetup -help

expressSyncSetupコマンドの概要

expressSyncSetupコマンドは、事前定義の仮定を使用して2つの同期プロファイル(インポート用およびエクスポート用)を作成することを可能にします。Oracle Directory Integration Platformがすでに稼働している場合は、プロファイルを有効にすると、ユーザーおよびグループがサード・パーティ・ディレクトリに格納されているコンテナとOracle Internet Directory内のcn=users,default_realm/ cn=groups,default_realmとの間で、ユーザーおよびグループの同期化をすぐに開始できます。

構成を簡単にするために、expressSyncSetupコマンドでは次のことを仮定します。

  • Oracle Internet Directoryのデフォルト・レルムのユーザー・エントリは、cn=users,default_realm_DNコンテナにあります。

  • Oracle Internet Directoryのデフォルト・レルムのグループ・エントリは、cn=groups,default_realm_DNコンテナにあります。

  • インストール時に作成されたOracle Directory Integration Platformマスター・マッピング・ルール・ファイルは、$ORACLE_HOME/ldap/odi/confにあります。

  • マスター・ドメイン・マッピング・ルールは$ORACLE_HOME/ldap/odi/samplesにあります。

  • ログオン資格証明は、Oracleディレクトリ・サーバー内のユーザー・コンテナに対して、プロファイル、レルムおよびアクセス制御を構成するための十分な権限を持つOracle Directory Integration Platform管理者のものです。Oracle Directory Integration Platform管理者グループのメンバー(cn=dipadmingrp,cn=dipadmin,cn=directory integration platform,cn=products,cn=oraclecontext)には、必要な権限があります。

次の手順に従い、expressSyncSetupコマンドを実行し、サード・パーティ・ディレクトリのcn=users,default_naming_contextとOracle Internet Directoryのcn=users,default_realmとの間で、ユーザーとグループが同期していることを確認します。

  1. 「expressSyncSetupの構文」を使用してExpress構成を実行します。

  2. expressSyncSetupコマンドにより、profile_nameImportおよびprofile_nameExportという2つのプロファイルが作成されます。デフォルトでは、プロファイルはいずれも無効になっています。サード・パーティ・ディレクトリからOracle Internet Directoryへの同期が必要な場合は、profile_nameImportプロファイルを有効にします。Oracle Internet Directoryからサード・パーティ・ディレクトリへの同期が必要な場合は、profile_nameExportプロファイルを有効にします。プロファイルを有効にするには、manageSyncProfilesコマンドでactivate操作を使用します。

  3. Oracle Directory Integration Platformを起動します。

  4. スケジューリングの間隔が経過するまで待ち、次のコマンドを入力して同期が開始されたことを確認します。コマンドを実行すると、権限のあるディレクトリ・ユーザーのパスワードを要求されます。

    $ORACLE_HOME/bin/ldapsearch -h OID host -p OID port \
    -D binddn -q \
    -b "orclodipagentname=import profile,cn=subscriber profile,cn=changelog
    subscriber,cn=oracle internet directory" -s base "objectclass=*"
    orclodipsynchronizationstatus orclodiplastsuccessfulexecutiontime
    

    注意:

    デフォルトのスケジューリング間隔は60秒(1分)です。Oracle Enterprise Manager Fusion Middleware Controlを使用すると、デフォルトのスケジューリング間隔を変更できます。Oracle Enterprise Manager Fusion Middleware Controlの使用方法は、第7章「ディレクトリ同期プロファイルの管理」を参照してください。

    同期が正常に開始された場合は、次のようになります。

    • 「同期ステータス」属性の値は、「同期成功」です。

    • 「最終正常実行時間」属性の値は、その実行の具体的な日時です。この値は、現在の日時に近い値である必要があります。

    次に、正常な同期を示す結果の例を示します。

    Synchronization successful 20060515012615
    

    注意:

    • 日時は、現在の日時に近い値である必要があります。

    • ldapsearchコマンドを実行する場合は、インストール時に指定された、orcladminパスワードと同一のdipadminパスワードが必要です。


  5. 同期が開始されていることを確認した後、Oracle Internet Directoryとサード・パーティ・ディレクトリ内のエントリを調べ、サード・パーティ・ディレクトリのcn=users,default_naming_contextとOracle Internet Directoryのcn=users,default_realm間で、ユーザーおよびグループが同期していることを確認します。


注意:

自分の環境用の同期プロファイルをカスタマイズする際に、デプロイ作業を容易にするためにテスト・ユーザーとテスト・グループを追加することが必要になる場合があります。同期プロファイルのカスタマイズとテストが終了したときには、必ずテスト・ユーザーとテスト・グループを削除してください。


注意:

インポートとエクスポートの同期プロファイルをうまくカスタマイズするためには、その他の構成タスクがすべて終了するまで、SSLを有効にしないでください。


拡張統合オプションの構成

Oracle Directory Integration Platformをインストールすると、サポート対象のサード・パーティ・ディレクトリごとにインポートおよびエクスポートの同期プロファイルのサンプルが自動的に作成されます。インストール・プロセス時またはexpressSyncSetupコマンドによって作成されたインポートおよびエクスポートの同期プロファイルは、Oracle Internet Directoryとサード・パーティ・ディレクトリの統合をデプロイする際に使用する開始点としてのみ利用されます。デフォルトの同期プロファイルは事前定義の仮定を使用して作成されるため、次の項目で説明されているように、環境に合せてそれらをさらにカスタマイズする必要があります。


関連項目:

インストール・プロセス時に作成されたサンプルの同期プロファイルの詳細は、個々のサード・パーティ・ディレクトリ統合に関する章を参照してください。

インストール・プロセス時に作成された同期プロファイルのサンプルをカスタマイズするには、manageSyncProfilesコマンドのcopy操作でそれらのプロファイルをコピーし、manageSyncProfilesコマンドのactivate操作でそのコピーを有効にします。

レルムの構成

レルムを構成する手順は、次のとおりです。

  1. 「ディレクトリ情報ツリーの構造の選択」での説明や、「デプロイの計画」でのより具体的な説明に従って、レルム識別名構造を選択します。

  2. ユーザーのログイン名の属性を選択します。この属性には、ログインに使用される属性の名前が含まれます。デフォルトではuidです。詳細は、「ログイン名の属性の選択」を参照してください。

    • Microsoft Active Directoryと統合して、userprincipalname属性をログインに使用する場合は、userprincipalnameをOracle Internet Directoryのuid属性にマップします。

    • Novell eDirectoryまたはOpenLDAPと統合して、mail属性をログインに使用する場合は、mailをOracle Internet Directoryのuid属性にマップします。

  3. Oracle Internet Directoryでusersearchbase値とgroupsearchbase値を設定します。これらの値によって、Oracle Internet Directory内でユーザーおよびグループを検索する場所が、各種Oracleコンポーネントに指定されます。これらの値は、インストール時にデフォルトの値に設定されます。ただし、2つのディレクトリ内のDIT構造に対応するように、これらの値をリセットすることが必要になる場合があります。これらを正しく設定してください。間違って設定すると、同期が正常に機能していても、コンポーネントがOracle Internet Directoryのユーザーやグループにアクセスできないままになる可能性があります。

    ユーザー検索ベースとグループ検索ベースの構成方法の説明: 図16-2の例で、usersearchbaseの値をcn=users,dc=us,dc=MyCompany,dc=comまたはその親のいずれかに設定する必要があります。同様に、DITにgroupsというサブツリーがあるとすると、複数の値のあるgroupsearchbase属性は、次の両方に設定します。

    • cn=groups,dc=us,dc=MyCompany,dc=comまたはその親の1つ

    • cn=users,dc=us,dc=MyCompany,dc=com

    ユーザー検索ベースとグループ検索ベースを構成するには、Oracle Internet Directoryセルフ・サービス・コンソールを使用します。

  4. Oracle Internet Directoryでusercreatebase値とgroupcreatebase値を設定します。これらの値は、各種Oracleコンポーネントに、ユーザーおよびグループを作成できる場所を指定します。これらの値は、インストール時にデフォルトの値に設定されます。

    ユーザー作成ベースとグループ作成ベースの構成方法の説明: 図16-2の例で、usercreatebaseの値をcn=users,dc=us,dc=MyCompany,dc=comまたはその親のいずれかに設定する必要があります。同様に、groupcreatebasecn=groups,dc=us, dc=MyCompany,dc=comまたはその親の1つに設定します。

    ユーザー作成ベースとグループ作成ベースを構成するには、Oracle Internet Directoryセルフ・サービス・コンソールを使用します。


関連項目:

『Oracle Fusion Middleware Guide to Delegated Administration for Oracle Identity Management』のアイデンティティ管理レルムのコンフィギュレーション・セットの変更に関する項

Access制御リストのカスタマイズ

この項では、インポート・プロファイル、エクスポート・プロファイルおよびその他のOracleコンポーネント用に、ACLをカスタマイズする方法を説明します。内容は次のとおりです。

インポート・プロファイル用ACLのカスタマイズ

インポート・プロファイルは、Oracle Directory Integration PlatformでOracle Internet Directoryへのアクセスに使用されるアイデンティティです。ACLにより、ユーザー・コンテナおよびグループ・コンテナ、またはアクセスするエントリのあるサブツリーで、インポート・プロファイルによるオブジェクトの追加、変更および削除ができるようにする必要があります。デフォルトでは、インポート・プロファイルは、デフォルト・レルムのレルム管理者グループ(cn=RealmAdministrators, cn=groups,cn=OracleContext,realm_DN)の一部です。このグループは、デフォルト・レルムの識別名の下にある任意のエントリに対してあらゆる操作を実行する権限を持ちます。

Oracle Internet Directory 11gリリース1(11.1.1)でインストールされるデフォルト・レルムとのインポート同期のために、ACLをカスタマイズする必要はありません。それより前のリリースのOracle Internet Directoryからアップグレードする場合、あるいはデフォルト以外のOracle Internet Directoryレルムと同期が行われる場合、適切なサブツリーまたはコンテナで必要な権限が、同期を処理するインポート・プロファイルに付与されていることを確認します。

LDIF形式のACLテンプレートは、$ORACLE_HOME/ldap/schema/oid/oidRealmAdminACL.sbsファイルを参照してください。デフォルト・レルムでACLを変更しなかった場合、このテンプレート・ファイルは、置換変数をインスタンス化し、%s_SubscriberDN%をOracle Internet Directoryのデフォルト・レルム識別名で、%s_OracleContextDN%cn=OracleContext,default_realm_DNでそれぞれ置換すると、直接適用できます。たとえば、realmacl.ldifがインスタンス化されたファイルの場合、次のldapmodifyコマンドを使用して、このファイルをアップロードできます。コマンドを実行すると、権限のあるディレクトリ・ユーザーのパスワードを要求されます。

$ORACLE_HOME/bin/ldapmodify -h OID host -p OID port
-D binddn -q -v -f realmacl.ldif

関連項目:

『Oracle Fusion Middleware Oracle Internet Directory管理者ガイド』のアクセス制御に関する章

エクスポート・プロファイル用ACLのカスタマイズ

Oracle Directory Integration Platformでサード・パーティ・ディレクトリにアクセスできるようにするには、サード・パーティ・ディレクトリでアイデンティティを作成する必要があります。このアイデンティティは、各エクスポート・プロファイルで構成されます。

その他のOracleコンポーネント用ACL

デフォルトのACLにより、ユーザーおよびグループの作成、変更、削除ができますが、それはデフォルト・レルムの下のユーザー・コンテナとグループ・コンテナに限られます。その他のコンテナのオブジェクトを同期化するには、ACLをカスタマイズする必要があります。

Oracleコンポーネント用にACLをカスタマイズするために使用できるサンプルACLファイルがあります。これらのサンプル・ファイルは、$ORACLE_HOME/ldap/schema/oidディレクトリにインストールされています。これには、次のようなものがあります。

  • oidUserAdminACL.sbs: Oracleコンポーネントのサブツリーに対して、ユーザーの管理やアクセスに必要な権限を付与します。

  • oidGroupAdminACL.sbs: Oracleコンポーネントのサブツリーに対して、グループの管理やアクセスに必要な権限を付与します。

  • oidUserAndGroupAdminACL.sbs: Oracleコンポーネントでサブツリー内のユーザーとグループを管理およびアクセスするための権限を付与します。

コンテナごとに必要な権限を付与するように、ACLポリシーをカスタマイズできます。


関連項目:

ACLをカスタマイズする方法は、『Oracle Fusion Middleware Oracle Internet Directory管理者ガイド』のアクセス制御に関する章を参照してください。

マッピング・ルールのカスタマイズ

同期プロファイルの重要な要素であるマッピング・ルールは、同期化されるディレクトリ情報、および同期化されたときのディレクトリ情報の変換方法を決定します。マッピング・ルールは、要件にあわせて実行時に変更できます。

サンプルの同期プロファイルには、それぞれデフォルトのマッピング・ルールが含まれています。これらのルールには、デフォルトで同期用に構成された、最小限のデフォルトのユーザー属性およびグループ属性が含まれています。


注意:

進行中の同期は、ディレクトリ内の変更より前に構成されたマッピング・ルールに依存します。マッピングの一貫性を確実にするには、同期化済のエントリを削除するか、完全同期を実行することが必要な場合があります。

マッピング・ルールにより、ソース・ディレクトリと宛先ディレクトリが同期化されるときに、データを変換する方法が決定されます。次の変更を行う必要がある場合は、サンプル・プロファイルにあるデフォルトのマッピング・ルールをカスタマイズします。

  • 識別名マッピングの変更。識別名マッピングにより、サード・パーティ・ディレクトリのDITをOracle Internet DirectoryのDITにマップする方法を決定します。

  • 同期化する必要がある属性の変更。

  • 同期時に発生する変換(マッピング・ルール)の変更。

宛先ディレクトリで変換の結果得られたデータがそのディレクトリのスキーマに一致すれば、どのようなマッピングでも実行できます。


関連項目:


Oracle Internet Directoryとサード・パーティ・ディレクトリ間の同期を確立すると、同期プロファイルの属性マッピング・ルールを、デプロイの要件を満たすようにカスタマイズできます。

同期プロファイルの属性マッピング・ルールをカスタマイズする手順は、次のとおりです。

  1. サンプルのマッピング・ルール・ファイルの複製を作成します。サンプルのマッピング・ルール・ファイルは、$ORACLE_HOME/ldap/odi/confディレクトリにあり、各種プロファイル用にmap.masterの拡張子が付いています。

  2. 前述の変更を行うために、サンプル・マッピング・ルール・ファイルを編集します。マッピング・ルールの編集方法は、「マッピング・ルールの構成」を参照してください。

  3. 変更後、manageSyncProfilesコマンドのupdate操作を使用してプロファイルを更新します。たとえば、次のコマンドは、プロファイル名myImportProfileをmyPropertiesFileという名前のプロパティ・ファイルで更新します。

    manageSyncProfiles update -profile profile_name -file myPropertiesFile
    

    関連項目:

    『Oracle Identity Managementユーザー・リファレンス』のOracle Directory Integration Platformツールの章のmanageSyncProfilesに関する項

  4. スケジューリングの間隔が経過するまで待ってから、同期化されたユーザーおよびグループをチェックし、属性マッピング・ルールが要件を満たしていることを確認します。


    ヒント:

    属性マッピング・ルールをカスタマイズする際に、テスト・ユーザーとテスト・グループをOracle Internet Directoryまたはサード・パーティ・ディレクトリに追加すると便利です。

SSLモードでの同期用サード・パーティ・ディレクトリ・コネクタの構成

デフォルトでは、expressSyncSetupコマンドにより作成されたインポートおよびエクスポート同期プロファイルに対して、SSLは使用できません。SSLモードで同期化するかどうかは、デプロイ要件によって決まります。たとえば、SSLは、パブリック・データの同期化には必要ありませんが、パスワードなどの機密情報の同期化には必要です。Oracle Internet Directoryとサード・パーティ・ディレクトリ間で、パスワードの変更を同期化するには、SSLサーバー認証モードを使用する必要があります。


注意:

同期プロファイルをSSL用に構成する前に、非SSLモードでユーザーを正常に同期化できることを確認してください。

チャネルを保護するには、次のことが必要です。

  • Oracle Internet DirectoryとOracle Directory Integration Platform間のSSLの有効化

  • Oracle Directory Integration Platformとサード・パーティ・ディレクトリ間のSSLの有効化

Oracle Internet DirectoryとOracle Directory Integration Platform間のSSLまたはそのサーバーとサード・パーティ・ディレクトリ間のSSLを有効にできますが、機密情報を同期化する前に、完全にチャネルを保護することをお薦めします。パスワードの同期化などの場合は、SSLを介してのみ同期化を行うことができます。

SSLを構成するには、次のことを実行する必要があります。

  • 『Oracle Fusion Middleware Oracle Internet Directory管理者ガイド』のSecure Sockets Layer(SSL)に関する章の説明に従って、Oracleディレクトリ・サーバーをSSLモードで実行します。

  • 第2章「Oracle Directory Integration Platformのセキュリティ機能」の説明に従って、Oracle Directory Integration PlatformをSSLモードで実行します。Directory Integration PlatformのSSLモードは、Oracle Internet Directoryサーバーが起動したときに使用されていたモードと同一である必要があります。SSLモード1は認証なし、SSLモード2はサーバー認証です。

  • サード・パーティ・ディレクトリ・サーバーをSSLモードで実行します。SSLを介したサード・パーティ・ディレクトリとの通信では、SSLサーバー認証が必要です。これには、Oracle Internet DirectoryとOracle Directory Integration Platformの両方をSSLサーバー認証モードで実行する必要があります。

次の手順を実行し、SSLモードでの接続ディレクトリとの通信を構成します。

  1. 統合プロファイルで、通信モードがSSLであることを示すには、connectedDirectoryURL属性をhost:port:1の形式で構成します。ポート番号がSSLポートであることを確認します。デフォルトのSSLポート番号は3133です。

  2. 接続ディレクトリから証明書を生成します。サーバーからのトラスト・ポイント証明書が必要です。外部の証明書サーバーを使用する必要はありません。

  3. 証明書をBASE64エンコード形式にエクスポートします。

  4. keytoolコマンドを使用して、Javaキーストア(JKS)に証明書をインポートします。たとえば、次のようになります。

    keytool –importcert –trustcacerts –alias mycert –file PATH_TO_CERTIFICATE \
    -keystore PATH_TO_KEYSTORE
    

    注意:

    • キーストアを始めて使用する場合は、パスワードを入力する必要があります。

    • コマンドで-keystoreオプションが使用されているとき、キーストアがない場合はkeytoolによって新規作成されます。


  5. manageDIPServerConfigコマンドを使用して、手順4で使用した場所とパスワードを用いてDirectory Integration Platformの構成を更新します。たとえば、次のようになります。

    manageDIPServerConfig set -h HOST –p PORT -D WLS_USER \
    -attribute keystorelocation -value PATH_TO_CERTIFICATE
    

    関連項目:

    manageDIPServerConfigコマンドの詳細は、「manageDIPServerConfigを使用したOracle Directory Integration Platformの管理」を参照してください。

  6. 次のWLSTコマンドを使用して、PASSWORD変数を、キーストアの作成時に使用したパスワードに置き換え、資格証明ストア・フレームワーク(CSF)の資格証明を更新します。

    createCred(map="dip", key="jksKey", user="jksUser",
    password="PASSWORD",desc="jks password")
    
  7. 次のようにmanageSyncProfilesコマンドのmodify操作を使用して、サード・パーティ・ディレクトリの接続情報(ホスト名、プロファイルなど)を変更します。

    manageSyncProfiles update -profile profile_name -file myMapFile
    
  8. Oracle Directory Integration PlatformをSSLモードで再起動します。

  9. テスト・ユーザーを追加し、正常に同期することを確認します。テスト・ユーザーが正常に同期しない場合、SSL構成のトラブルシューティングを行います。


注意:

Oracle Directory Integration Platformでは、クライアント/サーバー認証モードでのSSLはサポートされていません。

Oracle Internet Directoryからサード・パーティ・ディレクトリへのパスワードの同期の有効化

Oracle Internet Directoryからサード・パーティ・ディレクトリにパスワードを同期化するには、Oracle Internet Directoryサーバーでパスワード・ポリシーとパスワードの可逆暗号化を有効にする必要があります。それには、該当するコンテナのorclPwdPolicyEnable属性およびorclpwdEncryptionEnable属性に値1を割り当てます。


注意:

Oracle Internet Directory 10g(10.1.4.0.1)の時点では、Oracle Internet Directoryは各レルムで複数のパスワード・ポリシーをサポートします。これは一般に、ファイングレイン・パスワード・ポリシーと呼ばれます。

ファイングレイン・パスワード・ポリシーの詳細は、『Oracle Fusion Middleware Oracle Internet Directory管理者ガイド』を参照してください。


たとえば、あるレルムで、デフォルト・ポリシーに基づくパスワード・ポリシーとパスワードの可逆暗号化を有効化するには、次のエントリで、orclPwdPolicyEnable属性およびorclpwdEncryptionEnable属性に値1を割り当てます。

cn=default,cn=PwdPolicyEntry,cn=common,cn=products,cn=oraclecontext,Realm_DN

そのためには、ldapmodifyを使用して次の内容のLDIFファイルをアップロードします。

dn: cn=default,cn=PwdPolicyEntry,cn=common,cn=products,cn=oraclecontext,Realm_DN
changetype: modify
replace: orclpwdpolicyenable
orclpwdpolicyenable: 1
-
replace: orclpwdencryptionenable
orclpwdencryptionenable: 1

関連項目:

Oracle Internet Directoryのパスワード・ポリシーの詳細は、『Oracle Fusion Middleware Oracle Internet Directory管理者ガイド』を参照してください。

外部認証プラグインの構成

Oracle Directory Integration Platformでは、Javaベースの外部認証プラグインがサポートされます。Microsoft Active DirectoryとSun Java System Directory Serverにしか対応していない以前のPL/SQLベースのプラグインのかわりに、Javaプラグインを使用することをお薦めします。

プラグイン用の構成ツールはoidexcfgというJavaプログラムです。このプログラムを使用して、Microsoft Active Directory、Sun Java System Directory Server、Novell eDirectory、IBM Tivoli Directory ServerおよびOpenLDAPのJavaベースの外部認証プラグインを構成します。


注意:

oidexcfgツールでは、単一ドメインで機能するようにしか外部認証プラグインを構成しません。複数ドメインで機能するように外部認証プラグインを設定するには、「複数のドメインに対する外部認証の構成」に記載されている手順を実行する必要があります。

外部認証プラグインを構成するには、次の手順を実行します。

  1. java CLASSPATH環境変数にoidexcfg.jarを設定します。環境変数を設定するには、次のようにします。

    UNIX/Linux環境:

    setenv CLASSPATH=$ORACLE_HOME/jlib/oidexcfg.jar:$CLASSPATH
    

    Windows環境:

    set CLASSPATH=%ORACLE_HOME%/jlib/oidexcfg.jar;%CLASSPATH%
    
  2. 次のコマンドを入力します。

    java -classpath $CLASSPATH oracle.ldap.extplg.oidexcfg -h OID_Host
    -p OID_Port -D BindDN -w password -t Directory_Type
    

    ディレクトリのタイプを指定する-tオプションは、次の値をサポートしています。

    • ad: Microsoft Active Directory

    • adam: Microsoft Active Directory Application Mode

    • iplanet: Sun Java System Directory Server

    • edirectory: Novell eDirectory

    • openldap: OpenLDAP

    • tivoli: IBM Tivoli Directory Server

複数のドメインに対する外部認証の構成

複数の外部認証ドメインで機能するように外部認証プラグインを設定する場合は、外部構成ツールの実行後にいくつかの手順を手動で実行する必要があります。次のように設定を続行します。

  1. 「外部認証プラグインの構成」で説明されているように、外部認証プラグインを構成します。

  2. 手順1で構成ツールにより作成されたプラグイン構成エントリを検索し、検索結果をファイルに出力します。次のようなldapsearchコマンドを使用します。

    ldapsearch -p 3060 -D binddn -q -s sub -L \
        -b "cn=plugin,cn=subconfigsubentry" cn="oidexplg_*_ad" >> output.ldif
    

    注意:

    パスワードを要求されます。

    この例では、Microsoft Active Directoryのcnが表示されます。表17-1に示すように、構成したプラグインのタイプに正しいプラグインのcnを使用します。例に示すように、*をワイルドカードとして使用できます。

    表17-1 外部認証プラグインの識別名

    プラグイン・タイプ 識別名

    Microsoft Active Directory

    cn=oidexplg_compare_ad, cn=plugin,cn=subconfigsubentry

    cn=oidexplg_bind_ad, cn=plugin,cn=subconfigsubentry

    Sun Java System Directory Server

    cn=oidexplg_compare_iplanet, cn=plugin,cn=subconfigsubentry

    cn=oidexplg_bind_iplanet, cn=plugin,cn=subconfigsubentry

    Novell eDirectory

    cn=oidexplg_compare_Novell eDirectory, cn=plugin,cn=subconfigsubentry

    cn=oidexplg_bind_Novell eDirectory, cn=plugin,cn=subconfigsubentry

    OpenLDAP

    cn=oidexplg_compare_openldap, cn=plugin,cn=subconfigsubentry

    cn=oidexplg_bind_openldap, cn=plugin,cn=subconfigsubentry


  3. 出力ファイルを調べます。Microsoft Active Directoryプラグインの場合、出力ファイルは次のようになります。

    dn: cn=oidexplg_compare_ad,cn=plugin,cn=subconfigsubentry
    cn: oidexplg_compare_ad
    objectclass: orclPluginConfig
    objectclass: top
    orclpluginname: oidexplg.jar
    orclplugintype: operational
    orclpluginkind: Java
    orclplugintiming: when
    orclpluginldapoperation: ldapcompare
    orclpluginsecuredflexfield;walletpwd: password
    orclpluginsecuredflexfield;walletpwd2: password
    orclpluginversion: 1.0.1
    orclpluginisreplace: 1
    orclpluginattributelist: userpassword
    orclpluginentryproperties: (!(&(objectclass=orcladobject)(objectclass=orcluserv2)))
    orclpluginflexfield;host2: host.domain.com
    orclpluginflexfield;port2: 636
    orclpluginflexfield;isssl2: 1
    orclpluginflexfield;host: host.domain.com
    orclpluginflexfield;walletloc2: /location/wallet
    orclpluginflexfield;port: 389
    orclpluginflexfield;walletloc: /tmp
    orclpluginflexfield;isssl: 0
    orclpluginflexfield;isfailover: 0
    orclpluginclassreloadenabled: 0
    orclpluginenable: 0
    orclpluginsubscriberdnlist: cn=users,dc=us,dc=oracle,dc=com
    
    dn: cn=oidexplg_bind_ad,cn=plugin,cn=subconfigsubentry
    cn: oidexplg_bind_ad
    objectclass: orclPluginConfigobjectclass: top
    orclpluginname: oidexplg.jar
    orclplugintype: operational
    orclpluginkind: Java
    orclplugintiming: when
    orclpluginldapoperation: ldapbind
    orclpluginversion: 1.0.1
    orclpluginisreplace: 1
    orclpluginentryproperties: (!(&(objectclass=orcladobject)(objectclass=orcluserv2)))
    orclpluginclassreloadenabled: 0
    orclpluginflexfield;walletloc2: /location/wallet
    orclpluginflexfield;port: 389
    orclpluginflexfield;walletloc: /tmp
    orclpluginflexfield;isssl: 0
    orclpluginflexfield;isfailover: 0
    orclpluginflexfield;host2: host.domain.com
    orclpluginflexfield;port2: 636
    orclpluginflexfield;isssl2: 1
    orclpluginflexfield;host: host.domain.com
    orclpluginenable: 0
    orclpluginsecuredflexfield;walletpwd: password
    orclpluginsecuredflexfield;walletpwd2: password
    orclpluginsubscriberdnlist:
    cn=users,dc=us,dc=oracle,dc=com
    
  4. 次のように、出力ファイルからLDIFファイルを新規作成します。

    1. エントリ名を変更します。前の手順で示した例では、cn=oidexplg_compare_ad,cn=plugin, cn=subconfigsubentrycn=oidexplg_compare_ad1, cn=plugin,cn=subconfigsubentryに、cn=oidexplg_bind_ad, cn=plugin,cn=subconfigsubentrycn=oidexplg_bind_ad1, cn=plugin,cn=subconfigsubentryに変更します。

    2. orclpluginenableの値を変更します。有効にする場合は値1を、無効にする場合は値0を使用します。

    3. 外部ディレクトリのホスト名とポート番号について、orclpluginflexfield;hostorclpluginflexfield;portの値を変更します。

    4. orclpluginflexfield;issslの値を変更します。外部ディレクトリに対してSSL接続を有効にする場合は値1を、無効にする場合は値0を使用します。値1を使用する場合は、ウォレット・ロケーションとパスワードについて、orclpluginflexfield;walletlocorclpluginsecuredflexfield;walletpwdの値も変更する必要があります。

    5. orclpluginflexfield;isfailoverの値を変更します。バックアップ外部ディレクトリに対してフェイルオーバーを設定する場合は、値1を使用します。値1を使用する場合は、ホスト名とポート番号について、orclpluginflexfield;host2orclpluginflexfield;port2の値も変更する必要があります。バックアップ・ディレクトリ・サーバーに対してSSL接続を使用するには、orclpluginflexfield;walletloc2orclpluginsecuredflexfield;walletpwd2の値を変更する必要があります。

    6. プラグインの起動ネーミング・コンテキストについて、orclpluginsubscriberdnlistを変更します。

    7. プラグインのリクエスト・グループについて、orclPluginRequestGroupを変更します。この属性が検索結果の出力にない場合は、LDIFファイルに属性と値を追加します。

  5. 変更したプラグイン構成エントリをOracle Internet Directoryサーバーに追加します。次のようなコマンドを使用します。

    $ORACLE_HOME/ldap/bin/ldapadd -h host -p port -D binddn -q \
          -v -f input.ldif
    

    注意:

    パスワードを要求されます。

カスタム同期コネクタの記述

Oracle Directory Integration Platformでは、カスタム同期コネクタがサポートされます。この項では、カスタム・コネクタの記述に役立つ情報を提供します。内容は次のとおりです。

インバウンド・コネクタ

インバウンド・コネクタを記述するには、次の手順を実行します。

  1. リーダーを実装します。リーダーは、一般的にターゲット・システムのコネクタ・クラスを拡張してDISReadInterfaceを実装します。DISReadInterfaceの様々なメソッドは、javadoc内で指定されます。リーダーの実装例は、「サンプル・リーダー」を参照してください。

  2. 構成ファイルのサンプルを作成します。一般的な構成ファイルを次に示します。

    [INTERFACEDETAILS]
    Reader: Complete_classname_including_packageName
    SkipErrorToSyncNextChange: false
    SearchDeltaSize: 500
    UpdateSearchCount: 100
    
  3. 一連のマッピング・ルールを含むマップ・ファイルを作成します。

  4. configfileパラメータ、mapfileパラメータおよびfilterパラメータを設定してプロパティ・ファイルを作成します。

インバウンド・コネクタのテスト手順:

  1. manageSyncProfilesコマンドのregister操作を使用して、テスト・プロファイルを作成します。詳細は、「manageSyncProfilesを使用した同期プロファイルの管理」を参照してください。

  2. ロギング・メッセージを検証します。

  3. Oracle Internet Directoryを調べ、発生した同期を検証して、適切なエントリが作成されたか確認します。

サンプル・リーダー

package oracle.ldap.odip.gsi;
import oracle.ldap.odip.engine.AttrHandler;
import oracle.ldap.odip.engine.ChangeRecord;
import oracle.ldap.odip.engine.Connector;
import oracle.ldap.odip.engine.ConfigReader;
import oracle.ldap.odip.engine.Constants;
import oracle.ldap.odip.engine.DISReadInterface;
import oracle.ldap.odip.engine.DISFilterInterface;
import oracle.ldap.odip.engine.ODIException;
import oracle.ldap.odip.engine.Debug;
import oracle.ldap.odip.map.MapRules;
import oracle.ldap.odip.map.OrclFilter;
import oracle.ldap.odip.util.Utils;
 //Imports added for ODLLogger
import oracle.core.ojdl.logging.ODLLogger;
import oracle.dms.context.ExecutionContext;
import oracle.core.ojdl.logging.ODLLevel;
import oracle.core.ojdl.logging.ODLHandler;
import java.util.logging.Handler;
import java.util.logging.Level;

import oracle.ldap.odip.DIPLogger;

public class SampleReader implements DISReadInterface
{

  /*
  ** Member variables used
  */
  protected  NamingEnumeration  mEnumerate;
  protected  Attributes         mAttribs;
  protected  Attribute          mAttrib;
  protected  Attribute          mAttribAllValues;
  protected  SearchResult       mResult;
  protected  MapRules           mMapRules;
  /*
  ** Vector to store the list of required attributes
  */
  protected  Vector             mReqAttrList = new Vector();

  /*
  ** List of source attributes whose changes need to be mapped
  */
  protected  Vector             mSrcAttrList = new Vector();
  protected  String             mMapFilter;
  protected  int                mAppliedChangeNum = 0;
  protected  int                mAvailableChangeNum = 700;
  protected  DISFilterInterface mFilter;

  /*
  ** LastChangeNumber that is read
  */

  protected  String            mReadChangeNum;

  /*
  ** List of attributes to be returned in changelog LDAPSearch
  */
  protected  String[]           mRetAttribs;
  private    int                mErrorCode = 0;


  /*
  ** Constructor
  */
  public SampleReader()
  {
  }

  /**
  ** Constructor with the connector
  */
  public SampleReader( Connector conn )
  {
    super(conn);

  }

  /**
  ** Get the last change key value
  **
  * @param   boolean Operation is success/failure
  * @return  Object  lastkeyvalue to be stored
  */
  public Object getLastChangeKey(boolean val)
  {
      if ( val == false )
      {
          int nval = Integer.parseInt(mReadChangeNum);
          if ( nval > 0 )
          {
            nval--;
          }
          mReadChangeNum = String.valueOf(nval);
      }
      return (mReadChangeNum);
  }

  /**
  ** Initializes required values from hashtable passed from Profile
  **
  ** @param   Connector   connection details with credentials
  ** @param   Hashtable   with the required parameters
  ** @throws  ODIException Indicating connection failure
  */
  public void initialise(Connector conn,Hashtable pHash)
      throws ODIException
  {
       m_logger.finest ( "Entry: SampleReaders.initialise");
      setValues(conn);
      mMapRules = (MapRules)pHash.get(Constants.MAPRULE_STR);

      readCtx = connect();

      pHash.put("READCONTEXT", readCtx);
      pHash.put(Constants.READERCHANGEKEY_STR, Constants.CHANGE_NUM);
      String key = (String)pHash.get(Constants.LASTAPPLIEDCHG_STR);
      String val = null;
      if ( key != null )
          val = (String)pHash.get(key);
      if ( val != null )
          mAppliedChangeNum = Integer.parseInt((String)pHash.get(key));
      mReadChangeNum = (String)pHash.get(key);
      pHash.put(key, mReadChangeNum);
      mFilter = (DISFilterInterface)pHash.get(Constants.MATCHRULE_STR);
      mAvailableChangeNum = Integer.parseInt(initAvailableChgKey());
      mSaveLastChgNum = mAppliedChangeNum;

      try {
        SearchControls pControls = new SearchControls();
        pControls.setSearchScope(SearchControls.OBJECT_SCOPE);
        pControls.setReturningAttributes(mRetAttribs);
        pControls.setTimeLimit(3000000);

        mEnumerate = mLdapCtx.search("","objectclass=*",pControls);
        while ( mEnumerate.hasMoreElements() )
        {
          mResult = (SearchResult)mEnumerate.nextElement();
          mAttribs = mResult.getAttributes();
        }
        // END INFEASIBLE
        ConfigReader configInfo = (ConfigReader) pHash.get(Constants.CONFINFO_STR);

        if (configInfo != null) {
            mUpdateSearchCount = configInfo.getUpdateSearchCount();
            mSearchDelta = configInfo.getSearchDeltaSize();
        }
      } catch (Exception ex)
      // BEGIN INFEASIBLE
      {

        throw new ODIException(ODIException.LDAP_INITIALIZATION_EXCEPTION,ex);
      }
      // END INFEASIBLE
      m_logger.finest ( "Exit: SampleReaders.initialise");
  }

  /**
  ** Search the changelog
  ** @throws ODIException
  */
  public int searchChanges()
      throws ODIException
  {

        int  temp;
        int searchDelta = (int) mSearchDelta;
        if ( mAvailableChangeNum <= mAppliedChangeNum ) return -1;
        int  minChgNum = mAppliedChangeNum+1;
        if ( mAvailableChangeNum -  mAppliedChangeNum >= searchDelta)
            temp = mAppliedChangeNum + searchDelta;
        else
            temp = mAvailableChangeNum;

        String searchF = "";
        if ( mFilter != null ) {
          searchF = mFilter.getSearchFilter();
          m_logger.log(ODLLevel.NOTIFICATION,"SEARCHF", searchF );
        }

        StringBuffer filter = new StringBuffer(300);

        /**
         * SearchChanges is called to get all changes
         *
         */
        try {

           mEnumerate = mReadCtx.search(
                                        filter.toString());

        }
        catch ( Exception ex )
        // BEGIN INFEASIBLE
        {
            throw ( new ODIException(ODIException.LDAP_SEARCH_EXCEPTION,
                                      ex) );
        }
        finally {

        m_logger.log(ODLLevel.NOTIFICATION, "SEARCH_SUCCESSFUL" ,new Integer( temp ));

        mAppliedChangeNum = temp;
      return mErrorCode;
  }

  public boolean hasMore()
      throws ODIException
  {
    boolean  retval = false;
    int count =0;

    try {
      if ( mEnumerate.hasMoreElements() )
      {
        retval = true;
      }
      else
      {
        while ( mAvailableChangeNum > mAppliedChangeNum ) {
          if ( count >= mUpdateSearchCount )
              break;

          searchChanges();
          count++;
          if (mEnumerate.hasMoreElements())
          {
            retval = true;
            break;
          }
          else
            mReadChangeNum = String.valueOf(mAppliedChangeNum);
        }
      }
    }
    catch( Exception ex )
    // BEGIN INFEASIBLE
    {
      throw (new ODIException(ODIException.LDAP_HASMORE_EXCEPTION,ex));
    }
    // END INFEASIBLE
    if (retval == false) {  // no more results
      mReadChangeNum = (new Integer(mAvailableChangeNum)).toString();
    }
    return retval;
  }


   /**
  ** Read the next change from the source
  **
  ** @return  Object  the header part of the changes read.
  */
  public Object getNextChange()
      throws ODIException
  {
    try {

      if ( mEnumerate.hasMoreElements() )
      {
        mResult = (SearchResult)mEnumerate.nextElement();
        mAttribs = mResult.getAttributes();

    }
    catch ( Exception e )
    // BEGIN INFEASIBLE
    {
      throw (new ODIException (ODIException.LDAP_GETNEXT_EXCEPTION, e));
    }
    // END INFEASIBLE

    return mAttribs;
  }

  /**
  ** Create the change record from the data read from the file.
  **
  ** @returns  ChangeRecord
  */
  public ChangeRecord createChangeRecord(String dn)
      throws ODIException
  {

      // Create the changerecord based on the mAttribs which contains all the attributes.

  }

  public String initAvailableChgKey() throws ODIException
  {
      // set the available changekey value. This reads the value equivalent to the 
latest changelog number in the ldap world.

   }

}

アウトバウンド・コネクタ

アウトバウンド・コネクタを記述するには、次の手順を実行します。

  1. ライターを実装します。ライターは、一般的にターゲット・システムのコネクタ・クラスを拡張してDISWriteInterfaceを実装します。DISWriteInterfaceの様々なメソッドは、javadoc内で指定されます。リーダーの実装例は、「サンプル・ライター」を参照してください。

  2. 構成ファイルのサンプルを作成します。一般的な構成ファイルを次に示します。

    [INTERFACEDETAILS]
    Reader: Complete_classname_including_packageName
    SkipErrorToSyncNextChange: false
    SearchDeltaSize: 500
    UpdateSearchCount: 100
    
  3. 一連のマッピング・ルールを含むマップ・ファイルを作成します。

  4. configfileパラメータ、mapfileパラメータおよびfilterパラメータを設定してプロパティ・ファイルを作成します。

アウトバウンド・コネクタのテスト手順:

  1. manageSyncProfilesコマンドのregister操作を使用して、テスト・プロファイルを作成します。詳細は、「manageSyncProfilesを使用した同期プロファイルの管理」を参照してください。

  2. ロギング・メッセージを検証します。

  3. Oracle Internet Directoryを調べ、発生した同期を検証して、適切なエントリが作成されたか確認します。

サンプル・ライター

 */



import oracle.ldap.odip.engine.AttrHandler;
import oracle.ldap.odip.engine.ChangeRecord;
import oracle.ldap.odip.engine.ConfigReader;
import oracle.ldap.odip.engine.Connector;
import oracle.ldap.odip.engine.Constants;
import oracle.ldap.odip.engine.DISWriteInterface;
import oracle.ldap.odip.engine.ODIException;
import oracle.ldap.odip.map.MapRules;
import oracle.ldap.odip.util.Utils;

import oracle.core.ojdl.logging.ODLLogger;
import oracle.core.ojdl.logging.ODLLevel;
import oracle.core.ojdl.logging.ODLHandler;
import java.util.logging.Handler;
import java.util.logging.Level;

import oracle.ldap.odip.DIPLogger;


public class SampleWriter  implements DISWriteInterface {
    protected Hashtable mProfile;
    protected int mErrorCode = 0;
    protected String mLastKeyValue;
    protected String mLastWrittenKey;
    protected Vector mWriteFilter = new Vector();
    protected MapRules mMapRules;
    protected String mNamingContext = "";
    private String mOrigDstDn = "";
    protected boolean mHandleModAsAdd = false;

    /* Constructor */
    public LDAPWriter() {
    }

    public LDAPWriter(Connector conn) {
        super(conn);
    }

    public void initialise(Connector conn, Hashtable pHash)
        throws ODIException {
            m_logger.finest("Entry: LDAPWriter.initialise");
        setValues(conn);
        mProfile = pHash;
        mMapRules = (MapRules) pHash.get(Constants.MAPRULE_STR);

        connect();
       ConfigReader configInfo = (ConfigReader) pHash.get(Constants.CONFINFO_STR);

        if (configInfo != null) {
            //mSearchDelta = configInfo.getSearchDeltaSize();
            mHandleModAsAdd = configInfo.getHandleModAsAdd();
        }

        mLastWrittenKey = (String) pHash.get(Constants.READERCHANGEKEY_STR);
        pHash.put("WRITECONTEXT", mLdapCtx);

        NamingEnumeration filter = (NamingEnumeration) pHash.get("WriteFilter");

        try {
            while (filter.hasMoreElements()) {
                mWriteFilter.add((String) filter.next());
            }
        } catch (Exception ex) {
            //System.out.println("Error in initializing filter");
        }

        /*
        ** Get the lastapplied changekey value from the profile
        ** and use that string to determine the 'lastappliedchangenum'
        ** or lastappliedchangetime to be stored as the 'lastkeyvalue'
        **
        ** Each of the insert/modify/delete routines, if the operation is
        ** successful, that lastkeyvalue is updated correspondingly. Otherwise
        ** it has the previous successful operation value
        */
        m_logger.finest ( "Exit: LDAPWriter.initialise" );
    }

    public void setChanges(ChangeRecord chgrec) {
        mChanges = chgrec;
    }

    public ChangeRecord getChanges() {
        return mChanges;
    }

    public String getLastChangeKey() {
        return mLastKeyValue;
    }

    public int writeChanges() throws ODIException {
            m_logger.finest("Entry: LDAPWriter.writeChanges");
        mErrorCode = 0;

        m_logger.log(ODLLevel.FINE,
            "\n Output ChangeRecord " + mChanges.toString());

        String dn = mChanges.getChangeKey();

       if ( mHandleModAsAdd && (mChanges.getChangeType() == Constants.CHGTYPE_MODIFY)) {
            try {
              mLdapCtx.getAttributes( mChanges.getChangeKey() );

            }
            catch (NameNotFoundException nnfe) {
              m_logger.log(ODLLevel.ERROR,"ERROR_DN_CONN_DIR");
              mChanges.setChangeType(Constants.CHGTYPE_MODRADD);
            }
            catch (NamingException ne) {
              m_logger.log(ODLLevel.ERROR,"LDAP_WNAMING_EXCEPTION" , ne);
            }

       }
        m_logger.log(ODLLevel.FINE,
                     "Changetype is " + mChanges.getChangeType());
        mChanges.setChangeKey(ndn);

        if (dn.length() > 1) {
            //testnew(dn);
            switch (mChanges.getChangeType()) {
            case Constants.CHGTYPE_ADD:

                if (mChanges.size() > 0) {
                    insert();
                }

                break;

            case Constants.CHGTYPE_MODIFY:
                // non-changelog-based changes
                if (mChanges.size() > 0) {
                                     modify();
                }
                else {
                    mErrorCode = -1;
                }

                break;

            case Constants.CHGTYPE_DELETE:
                delete();

                break;

            case Constants.CHGTYPE_MODRADD:

                // non-changelog-based changes
                if (mChanges.size() > 0) {
                    modifyRadd();
                }

                break;

            case Constants.CHGTYPE_MODRDN:
                modRDNchangelog(dn);

                break;

            case Constants.CHGTYPE_MODDN:
                m_logger.log(ODLLevel.FINE,
                             "Processing moddn");
                modDNchangelog(dn);
                break;

            default:

                //INFEASIBLE
                break;
            }
        } else // BEGIN INFEASIBLE
         {
            m_logger.log(ODLLevel.ERROR,
                "ENTRY_NOT_EXISTS_DELETE");
            m_logger.log(ODLLevel.FINE,
                "Synchrozing a deletion, entry to delete is not found. Ignore.");
            mErrorCode = 99;

            return mErrorCode;
        }

        // END INFEASIBLE
        Object chgInfo = mChanges.getChangeInfo();

        try {
            if (chgInfo instanceof Attributes) {
                Attributes attrs = (Attributes) chgInfo;
                mLastKeyValue = (String) ((Attribute) attrs.get(mLastWrittenKey)).get();
            }
        } catch (Exception ex) {
            //System.out.println("Caught the exception here " + mErrorCode);
            if (mErrorCode != 0) {
                m_logger.log(ODLLevel.ERROR,
                    "EXCEPTION_FOR_DN", new Object [] { dn, new Integer ( mErrorCode ) , ex.toString()});
            }
        }

        mChanges.setChangeKey(mOrigDstDn);

        return mErrorCode;
    }

    public void insert() throws ODIException {
            m_logger.finest("Entry: LDAPWriter.insert");
        String dn = mChanges.getChangeKey();
        Enumeration attrdtls = mChanges.getAll();

        m_logger.log(ODLLevel.FINE,
            "Processing Insert Operation ..");

        while (attrdtls.hasMoreElements()) {
            AttrHandler temp = (AttrHandler) attrdtls.nextElement();
            attr = attrHandlerToAttr((AttrHandler) temp);
            if (attr != null && temp.getAttrChgType() != Constants.ATTRCHGTYPE_DELETE) {
                attrs.put(attr);
            }
        }
        createEntry(dn, attrs);
        m_logger.finest("Exit: LDAPWriter.insert");
    }

    public void modify() throws ODIException {
            m_logger.finest("Entry: LDAPWriter.modify");
        String attrname = mChanges.getChangeKey();

        m_logger.log(ODLLevel.FINE,
            "Processing Modify Operation ..");

        int pos = attrname.indexOf('=');

        String naming = null;

        if (pos > 0) {
            naming = attrname.substring(0, pos).trim();
        }

    }


    /**
    * Delete the entry
    */
    public void delete() {
            m_logger.finest("Entry: LDAPWriter.delete");
        try {
            m_logger.log(ODLLevel.FINE,
                "Processing Delete Operation ..");

         }

    /**
    ** Handle the ModRDN operation
    **
    ** @throws ODIException
    */
    protected void modDNchangelog(String newDn) throws ODIException {
      String newDN = null;
      m_logger.log(ODLLevel.FINE,
            "Processing change log based ModRDN operation .." +
            " DN passed in: " + newDn);

      String dn = mChanges.getChangeKey();


    }

    /**
    ** Handle the ModRDN operation
    **
    ** @throws ODIException
    */
    protected void modRDNchangelog(String newDn) throws ODIException {

    }

    protected void performModDN(String oldDN, String newDN)
        throws ODIException {
    }

    /*
    ** First check whether the 'dn' already exists.
    ** If exists,
    **     do a modify.
    ** else
    **     construct objectclasses and do a add
    */

    // public void modifyRadd(boolean rdn) throws ODIException
    public void modifyRadd() throws ODIException {
            m_logger.finest("Entry: LDAPWriter.modifyRadd");

    }

    /**
    ** Compare the value with the old value, and replace it, if the new value
    ** is different from the old value
    */
    public void checkNReplace(String dn, Attributes attrs)
        throws ODIException {

    }

    //BEGIN INFEASIBLE
    public int getErrorCode() {
        return mErrorCode;
    }


    public int getChangeType() {
        return mChanges.getChangeType();
    }

    public String getEventType() {
        return "";
    }

    //END INFEASIBLE
}