ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Directory Integration Platform管理者ガイド
11g リリース1(11.1.1)
B65032-03
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

17 接続ディレクトリとの同期の構成

この章では、Oracleバックエンド・ディレクトリと接続ディレクトリを同期するための一般的な方法について説明します。内容は次のとおりです。


注意:

この章では、第16章「接続ディレクトリ統合の概念と考慮事項」の内容を理解していることを前提としています。



関連項目:

Oracleバックエンド・ディレクトリと次の接続ディレクトリ間の統合の構成に関する手順は、次の各章を参照してください。


17.1 同期要件の確認

Oracleバックエンド・ディレクトリと接続ディレクトリ間の同期を準備するには、次の手順を実行します。

  1. Oracleバックエンド・ディレクトリとその他のディレクトリが稼働していることを確認します。

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

    • 接続ディレクトリからのインポート操作: ユーザー・アカウントにサブツリー・ルートに対する読取りアクセス権限を付与します。ユーザー・アカウントは、Oracle Directory Integration Platformとの同期化が行われる接続ディレクトリ内のソース・コンテナ(サブツリー・ルート)下のすべてのオブジェクトを読み取ることができる必要があります。接続ディレクトリのユーザー・アカウントに、Oracleバックエンド・ディレクトリと同期化されるすべてのオブジェクトに対する必要な権限があるかどうかを確認するには、次のようにコマンドライン・ユーティリティ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バックエンド・ディレクトリが稼働していることと、変更ログのパージ期間が7日以上に設定されていることを確認する必要もあります。


      関連項目:

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

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


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

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


注意:

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

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

  • Oracle Directory Integration PlatformがデプロイされているOracle WebLogic管理対象サーバーは、SSLモードでこのコマンドを実行するようにSSLに対して構成されている必要があります。詳細は、『Oracle Fusion Middleware Oracle WebLogic Serverの保護』「SSLの構成」を参照してください。


17.2.1 expressSyncSetupの構文

expressSyncSetup

expressSyncSetup -h HOST -p PORT -D wlsuser -pf PROFILE 
-conDirType CONNECTED_DIRECTORY_TYPE -conDirURL CONNECTED_DIRECTORY_URL
-conDirBindDN CONNECTED_DIRECTORY_BIND_DN -conDircontainer SYNC_CONTAINER 
[-ssl -keystorePath PATH_TO_KEYSTORE -keystoreType TYPE] [-enableProfiles {true |
false}] [-help]

17.2.2 expressSyncSetupの引数

-h | -host

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

-p | -port

Oracle Directory Integration PlatformがデプロイされているOracle WebLogic管理対象サーバーのリスニング・ポート。

-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

-ssl

SSLモードでコマンドを実行します。


注意:

Oracle Directory Integration PlatformがデプロイされているOracle WebLogic管理対象サーバーは、SSLモードでこのコマンドを実行するようにSSLに対して構成されている必要があります。詳細は、『Oracle Fusion Middleware Oracle WebLogic Serverの保護』「SSLの構成」を参照してください。


-keystorePath

キーストアへのフルパス。

-keystoreType

-keystorePathで識別されるキーストアのタイプ。たとえば、-keystorePath jksまたは-keystorePath PKCS12などです。

-enableProfiles

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

-help

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

17.2.3 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 

17.2.4 expressSyncSetupコマンドの概要

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


注意:

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


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

  • Oracle Internet Directoryでは、デフォルト・レルムのユーザーのエントリはコンテナcn=users,default_realm_DN内にありますが、Oracle Unified DirectoryおよびOracle Directory Server Enterprise Editionではデフォルト・レルムのユーザーはコンテナcn=users,default_metadata_suffix内にあります。

  • デフォルト・レルムのグループのエントリは、Oracle Internet Directoryではコンテナcn=groups,default_realm_DN内にあり、Oracle Unified DirectoryおよびOracle Directory Server Enterprise Editionではコンテナdefault_metadata_suffix内にあります。

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

  • マスター・ドメイン・マッピング・ルールは、$ORACLE_HOME/ldap/odi/conf/ディレクトリにあります。

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

    Oracle Internet Directoryでは、Oracle Directory Integration Platform管理者グループは次のようになります。

    cn=dipadmingrp,cn=dipadmins,cn=directory integration platform,cn=products,cn=oraclecontext

    Oracle Unified DirectoryおよびOracle Directory Server Enterprise Editionでは、Oracle Directory Integration Platform管理者グループは次のようになります。

    cn=dipadmingrp,cn=dipadmins,cn=directory integration platform,<suffix>

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

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

  2. expressSyncSetupコマンドにより、profile_nameImportおよびprofile_nameExportという名前の2つのプロファイルが作成されます。デフォルトでは、どちらのプロファイルも無効になっています。接続ディレクトリからOracleバックエンド・ディレクトリへの同期が必要な場合はprofile_nameImportプロファイル、Oracleバックエンド・ディレクトリから接続ディレクトリへの同期が必要な場合はprofile_nameExportプロファイルを有効にします。activate操作を指定してmanageSyncProfilesコマンドを使用し、プロファイルを有効にします。

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

    $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パスワードが必要です。


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


注意:

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


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

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


関連項目:

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


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

17.3.1 レルムの構成


注意:

Oracleバックエンド・ディレクトリがOracle Unified DirectoryまたはOracle Directory Server Enterprise Editionのいずれかである場合、これらのディレクトリのデフォルト・コンテナは、メタデータの接尾辞となります。このため、cn=users, <metadata_suffix>およびcn=groups,<metadata_suffix>エントリを追加して、ドメイン・マッピング・ルールを更新することが必要となる場合があります。


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

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

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

    • Microsoft Active Directoryと統合して、userprincipalname属性をログインに使用する場合は、userprincipalnameをOracleバックエンド・ディレクトリのuid属性にマップします。

    • Novell eDirectoryまたはOpenLDAPと統合して、mail属性をログインに使用する場合は、mailをOracleバックエンド・ディレクトリのuid属性にマップします。

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

    ユーザー検索ベースとグループ検索ベースを構成する場合、例のように、usersearchbaseの値は、cn=users,dc=us,dc=MyCompany,dc=comまたはその親の1つに設定する必要があります。同様に、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バックエンド・ディレクトリでusercreatebase値とgroupcreatebase値を設定します。これらの値は、各種Oracleコンポーネントに、ユーザーおよびグループを作成できる場所を指定します。これらの値は、インストール時にデフォルトの値に設定されます。

    ユーザー作成ベースとグループ作成ベースを構成する場合、例のように、usercreatebaseの値は、cn=users,dc=us,dc=MyCompany,dc=comまたはその親の1つに設定する必要があります。同様に、groupcreatebasecn=groups,dc=us, dc=MyCompany,dc=comまたはその親の1つに設定します。

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


関連項目:

Oracle Fusion Middleware Oracle Identity Management委任管理ガイドのアイデンティティ管理レルムのコンフィギュレーション・セットの変更に関する項


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

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

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

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

Oracle Unified DirectoryまたはOracle Directory Server Enterprise Editionバックエンド・ディレクトリ用のACLのカスタマイズ

Oracleバックエンド・ディレクトリがOracle Unified DirectoryまたはOracle Directory Server Enterprise Editionのいずれかである場合、インポート・プロファイルでは、メタデータの接尾辞のDNの下にあるユーザーおよびグループを追加、変更および削除できます。メタデータ以外の接尾辞の場合は、ACLを次のように設定して、コンテナが他のソースからユーザーおよびグループをインポートできるようにする必要があります。

dn: <Container DN>
changetype:modify
add: aci
aci: (target="ldap:///<Container DN>")(version 3.0; acl "Anonymous read-search
access"; allow (read,add,delete,search,write,compare,proxy) 
groupdn="ldap:///cn=dipadmingrp,cn=DIPadmins,cn=Directory Integration
Platform,<metadata suffix>"; allow (read,add,delete,search,write,compare,proxy)  
groupdn="ldap:///cn=odipigroup,cn=DIPadmins,cn=Directory Integration
Platform,<metadata suffix>"; )
-
add: aci
aci: (targetattr="*")(version 3.0; acl "Anonymous read-search access"; 
allow (search,read,write,compare,add)
groupdn="ldap:///cn=dipadmingrp,cn=DIPadmins,cn=Directory Integration
Platform,<metadata suffix>"; allow (search,read,write,compare,add)
groupdn="ldap:///cn=odipigroup,cn=DIPadmins,cn=Directory Integration
Platform,<metadata suffix>";

Oracle Unified DirectoryまたはOracle Directory Server Enterprise Editionバックエンド・ディレクトリ用のLDIF ACLのカスタマイズ

前述のACLの例を参照してください。必要に応じて、操作を実行するDNで<Container DN>を置き換え、DIP構成中にDIPメタデータを格納するために指定した接尾辞で<metadata suffix>を置き換えます。

次のldapmodifyコマンドを使用して、LDIFファイルをアップロードできます。

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

コマンドを実行すると、権限のあるディレクトリ・ユーザーのパスワードを要求されます。

Oracle Internet Directoryバックエンド・ディレクトリ用のACLのカスタマイズ

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


関連項目:

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


Oracle Internet Directoryバックエンド・ディレクトリ用のLDIF ACLのカスタマイズ

LDIF形式のACLテンプレートは、$ORACLE_HOME/ldap/schema/oid/oidRealmAdminACL.sbsファイルを参照してください。Oracleバックエンド・ディレクトリがOracle Internet Directoryであり、デフォルト・レルムでACLを変更していない場合、このテンプレート・ファイルは、置換変数をインスタンス化し、%s_SubscriberDN%をOracle Internet Directoryのデフォルト・レルムDNで、%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

コマンドを実行すると、権限のあるディレクトリ・ユーザーのパスワードを要求されます。

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

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

デフォルト・レルム外にあるユーザー・レコードの同期をサポートするためのACLのカスタマイズ方法

Oracleバックエンド・ディレクトリがOracle Internet Directoryであり、Oracle Internet Directoryデフォルト・レルム外にあるユーザー・レコードを同期する必要がある場合は、LDIFファイルを使用して、次のようにACLを変更します。


注意:

このACLの変更は、DIP同期を使用して、デフォルト・レルム外にあるOIDユーザー・パスワードを接続ディレクトリにエクスポートする場合に必要です。


  1. ルート・ディレクトリ固有のエントリでACIを問い合せ、出力をLDIFファイルにバックアップとして保存します。

    ldapsearch -h OID host -p port -D cn=orcladmin -w password -s base -L
    -b "" objectclass=* orclaci orclentrylevelaci > /tmp/orig-root-acis.ldif
    
  2. 次のACIを探します。

    orclaci: access to
    attr=(userpkcs12,orclpkcs12hint,userpassword,pwdhistory,orclrevpwd) by
     group="cn=OracleUserSecurityAdmins,cn=Groups,cn=OracleContext"
     (search,read,write,compare) by self (search,read,write,compare) by * (none)
    
  3. DIP DNを含めるようにACIを変更し、new-root-acis.ldifという名前でファイルを保存します。

    変更されたファイルは次のようになります。

    orclaci: access to
    attr=(userpkcs12,orclpkcs12hint,userpassword,pwdhistory,orclrevpwd) by
    group="cn=OracleUserSecurityAdmins,cn=Groups,cn=OracleContext"
    (search,read,write,compare) by self (search,read,write,compare) by
    dn="cn=odisrv,cn=Registered Instances,cn=Directory Integration
    Platform,cn=products,cn=oraclecontext" (search,read)* by * (none)
    
  4. ファイルの最初の行の後に次の2行を追加します。

    changetype: modify
    replace: orclaci
    

    ファイルの先頭の正しい内容は次のとおりです。

    dn: Container DN
    changetype: modify
    replace: orclaci
    orclaci: access to
    ...
    
  5. ldapmodifyコマンドを使用して、変更されたACIを適用します。

    $ORACLE_HOME/bin/ldapmodify -h OID host -p OID port -D cn=orcladmin -w password -v -f /tmp/new-root-acis.ldif
    

17.3.2.3 その他の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管理者ガイド』のアクセス制御に関する章を参照してください。


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

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

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


注意:

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


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

  • 識別名マッピングの変更。識別名マッピングにより、接続ディレクトリのDITをOracleバックエンド・ディレクトリのDITにマップする方法を決定します。

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

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

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


関連項目:


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

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

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

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

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

    manageSyncProfiles update -profile profile_name -file myPropertiesFile
    

    関連項目:

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


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


    ヒント:

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


17.3.4 SSLモードでの同期用接続ディレクトリ・コネクタの構成

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


注意:

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


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

  • Oracleバックエンド・ディレクトリとOracle Directory Integration Platform間でのSSLの有効化

  • Oracle Directory Integration Platformと接続ディレクトリ間でのSSLの有効化

Oracleバックエンド・ディレクトリと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バックエンド・ディレクトリ・サーバーの起動時に使用されたものと同じモードである必要があります。SSLモード1は認証なし、SSLモード2はサーバー認証です。


    注意:

    Oracleバックエンド・ディレクトリがOracle Internet Directoryである場合、Oracle Directory Integration Platformでは、認証なしのSSLモード(SSLモード1)のみをサポートします。Oracle Unified DirectoryまたはOracle Directory Server Enterprise EditionがOracleバックエンド・ディレクトリである場合、使用できるSSLはSSLサーバー認証(SSLモード2)のみとなります。


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

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

  1. 接続されているディレクトリ用の証明書を生成します。サーバーからのトラスト・ポイント証明書のみ必要です。接続されているディレクトリの証明書ストアに証明書を格納します。

  2. 信頼できる認証局(CA)証明書をBase 64エンコードされた形式にエクスポートします。

  3. keytoolコマンドを使用して信頼できるCA証明書をJavaキーストア(JKS)にインポートします。Oracle Directory Integration Platformで既存のJKSをすでに使用している場合、-keystore PATH_TO_JKSオプションを使用して、その場所を特定します。Oracle Directory Integration Platformにまだ使用するJKSがない場合、-keystore PATH_TO_JKSオプションで特定した場所にkeytoolによって作成されます。

    次に例を示します。

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

    -keystore PATH_TO_JKSオプションで特定されたJKSを初めて使用する場合、パスワードを指定し、次のステップaおよびbも実行する必要があります。

    1. manageDIPServerConfigコマンドを使用して、手順3で使用した場所とパスワードを用いてDirectory Integration Platformの構成を更新します。次に例を示します。

      manageDIPServerConfig set -h HOST –p PORT -D WLS_USER \
      -attribute keystorelocation -value PATH_TO_CERTIFICATE
      
    2. 次のWLSTコマンドを使用して、PASSWORD変数を、キーストアの作成時に使用したパスワードに置き換え、資格証明ストア・フレームワーク(CSF)の資格証明を更新します。

      createCred(map="dip", key="jksKey", user="jksUser", 
      password="PASSWORD",desc="jks password")
      
  4. manageSyncProfilesコマンドの変更操作を使用して、ホスト名、プロファイルおよびconnectedDirectoryURL属性を含む接続ディレクトリ接続情報を変更します。

    manageSyncProfiles update -profile profile_name -file myMapFile
    

    connectedDirectoryURL属性を構成する場合、次の形式を使用します。

    host:port:sslmode
    

    sslmodeに対してサポートされる値は次のとおりです。

    表17-1 connectedDirectoryURL属性のsslmodeに対してサポートされる値

    サポートされるsslmode値 説明

    0

    SSLなしモード。すべてのディレクトリ・タイプに対してサポートされます。

    1

    認証なしモード。証明書はありません。Oracle Internet Directoryに対してのみサポートされます。

    2

    サーバーのみの認証モード。証明書が必要です。すべてのディレクトリ・タイプに対してサポートされます。


  5. ステップ3で新規JKSを使用した場合、Oracle Directory Integration PlatformをSSLモードで再起動する必要があります。ステップ3で既存のJKSを使用した場合、6に進みます。

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


注意:

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


17.3.5 Oracleバックエンド・ディレクトリから接続ディレクトリへのパスワードの同期の有効化

Oracle Unified Directoryバックエンド・ディレクトリまたはOracle Directory Server Enterprise Editionバックエンド・ディレクトリから接続ディレクトリへのパスワードの同期化はサポートされていません。

Oracle Internet Directoryから接続ディレクトリにパスワードを同期化するには、Oracle Internet Directoryサーバーでパスワード・ポリシーを有効にする必要がある以外に、パスワードの可逆暗号化を有効にする必要がある場合があります。

Oracle Internet Directoryと接続ディレクトリとの間のハッシュ・アルゴリズムに互換性がないか、サポートされていない場合のみ、Oracle Internet Directoryサーバーで可逆パスワード暗号化を有効にします。

たとえば、IBM Tivoli Directory ServerとOracle Directory Server Enterprise Edition(以前のSun Java System Directory Server)は、Oracle Internet Directoryと同様のハッシング・アルゴリズムをサポートします。したがって、Oracle Internet DirectoryからIBM Tivoli Directory ServerまたはOracle Directory Server Enterprise Editionへパスワードを同期するには、Oracle Internet Directoryサーバーでパスワード・ポリシーのみ有効にする必要があります。

しかし、Oracle Internet DirectoryからMicrosoft Active DirectoryまたはNovell eDirectoryへパスワードを同期する場合、両方ともOracle Internet Directoryと同様のハッシュ・アルゴリズムをサポートしないため、Oracle Internet Directoryサーバーでパスワード・ポリシー可逆パスワード暗号化を有効にする必要があります。


注意:

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

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


パスワード・ポリシーを有効にするには、適切なコンテナのorclPwdPolicyEnable属性に値1を割り当てます。Oracle Internet Directoryサーバーでパスワードの可逆暗号化を有効にするには、適切なコンテナのorclpwdEncryptionEnable属性に値1を割り当てます。

たとえば、あるレルムで、デフォルト・ポリシーに基づくパスワード・ポリシーとパスワードの可逆暗号化を有効化するには、次のエントリで、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管理者ガイド』を参照してください。


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

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

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


注意:

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


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

  1. (オプション) SSLを使用して認証プラグインと外部LDAPディレクトリ間との通信を保護する場合にのみ、この手順を実行します。通信を保護しない場合は、手順2に進みます。

    SSLを使用して認証プラグインと外部LDAPディレクトリ間の通信を保護するには、外部の認証ディレクトリの信頼できる証明書がファイル・システム上のウォレットに存在する必要があります。手順3oidexcfgを使用してプラグインを構成すると、外部LDAPディレクトリ構成に関する情報の入力を要求され、このウォレットの場所を識別できます。

    SSLを使用する場合、ここで証明書を新規または既存のウォレットに配置します。


    注意:

    証明書は、認証プラグインと外部LDAPディレクトリ間の通信をSSLによって保護できるようにします(手順3oidexcfgを実行した場合は、Oracleバックエンド・ディレクトリとの通信は保護されません)。


  2. JavaのCLASSPATH環境変数にoidexcfg.jarおよびldapjclnt11.jarを含めます。環境変数を設定するには、次のようにします。

    UNIX/Linux環境:

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

    Windows環境:

    set CLASSPATH=%ORACLE_HOME%/ldap/jlib/oidexcfg.jar;%ORACLE_HOME%/ldap/jlib/ldapjclnt11.jar;%CLASSPATH% 
    
  3. 次のコマンドを実行し、oidexcfgを使用してプラグインを構成します。SSLに必要な信頼できる証明書を含むウォレットの場所など、外部LDAPディレクトリ構成に関する情報の入力を要求されます。


    注意:

    次のように、完全修飾パスを使用してウォレットの場所を指定する必要があります。

    /etc/ORACLE_HOME/wallets/ewallet.p12
    

    次のコマンドを実行し、oidexcfgを使用してプラグインを構成します。

    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: Oracle Directory Server Enterprise EditionおよびSun Java System Directory Server

    • edirectory: Novell eDirectory

    • openldap: OpenLDAP

    • tivoli: IBM Tivoli Directory Server

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

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

  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-2に示すように、構成したプラグインのタイプに正しいプラグインのcnを使用します。例に示すように、*をワイルドカードとして使用できます。

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

    プラグイン・タイプ DN

    Microsoft Active Directory

    cn=oidexplg_compare_ad, cn=plugin,cn=subconfigsubentry

    cn=oidexplg_bind_ad, cn=plugin,cn=subconfigsubentry

    Oracle Directory Server Enterprise Edition
    (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
    

    注意:

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


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

Oracle Directory Integration Platformは、カスタム同期コネクタをサポートします。このトピックにはカスタム・コネクタの記述に役立つ情報が説明されおり、次の項が含まれます。

17.4.1 インバウンド・コネクタ

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

  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を調べ、発生した同期を検証して、適切なエントリが作成されたか確認します。

17.4.1.1 サンプル・リーダー

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.
 
   }
 
}

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

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

  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を調べ、発生した同期を検証して、適切なエントリが作成されたか確認します。

17.4.2.1 サンプル・ライター

 */
 
 
 
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
}