20 接続ディレクトリとの同期の構成
Oracleバックエンド・ディレクトリと接続ディレクトリを同期化できます。
トピック:
ノート:
この章では、「接続ディレクトリ統合の概念と考慮事項」の内容を理解していることを前提としています。
関連項目:
Oracleバックエンド・ディレクトリと次の接続ディレクトリ間の統合の構成に関するステップは、次の各章を参照してください。
20.1 同期要件の確認
Oracleバックエンド・ディレクトリと接続ディレクトリを同期化する前に、この項で説明する前提条件が満たされている必要があります。
Oracleバックエンド・ディレクトリと接続ディレクトリ間の同期を準備するには、次の手順を実行します。
20.2 expressSyncSetupを使用したインポートおよびエクスポートの同期プロファイルの作成
expressSyncSetup
コマンドを使用して、Express同期のためにインポートおよびエクスポート同期プロファイルを作成します。
トピック:
20.2.1 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コマンド」を参照してください。
20.3 拡張統合オプションの構成
Oracle Directory Integration Platformをインストールすると、サポート対象のOracleおよびサード・パーティの接続ディレクトリごとにインポートおよびエクスポートの同期プロファイルのサンプルが自動的に作成されます。
インストール・プロセス時またはexpressSyncSetup
コマンドによって作成されたインポートおよびエクスポートの同期プロファイルは、Oracleバックエンド・ディレクトリと接続ディレクトリの統合をデプロイする際に使用する開始点としてのみ利用されます。デフォルトの同期プロファイルは事前定義の仮定を使用して作成されるため、次の項目で説明されているように、環境に合せてそれらをさらにカスタマイズする必要があります。
関連項目:
インストール・プロセス時に作成されたサンプルの同期プロファイルの詳細は、個々の接続ディレクトリ統合に関する章を参照してください。
インストール・プロセス時に作成された同期プロファイルのサンプルをカスタマイズするには、manageSyncProfiles
コマンドのcopy
操作でそれらのプロファイルをコピーし、manageSyncProfiles
コマンドのactivate
操作でそのコピーを有効にします。
20.3.1 レルムの構成
Oracle Directory Integration Platformには、レルムを構成するためのオプションがあります。
ノート:
Oracleバックエンド・ディレクトリがOracle Unified DirectoryまたはOracle Directory Server Enterprise Editionである場合、これらのディレクトリのデフォルト・コンテナは、メタデータの接尾辞となります。このため、cn=users,
<metadata_suffix>およびcn=groups,
<metadata_suffix>エントリを追加して、ドメイン・マッピング・ルールを更新することが必要となる場合があります。
レルムを構成する手順は、次のとおりです。
20.3.2 Access制御リストのカスタマイズ
この項では、インポート・プロファイル、エクスポート・プロファイルおよびその他のOracleコンポーネント用に、ACLをカスタマイズする方法を説明します。この項の内容は、次のとおりです。
20.3.2.1 インポート・プロファイル用ACLのカスタマイズ
インポート・プロファイルは、Oracle Directory Integration Platformによって使用されるアイデンティティを使用して、Oracleバックエンド・ディレクトリにアクセスします。ACLにより、ユーザー・コンテナおよびグループ・コンテナ、またはアクセスするエントリのあるサブツリーで、インポート・プロファイルによるオブジェクトの追加、変更および削除ができるようにする必要があります。デフォルトでは、インポート・プロファイルは、DIP管理者グループ(cn=dipadmingrp,cn=DIPadmins,cn=Directory Integration Platform,cn=Products,cn=OracleContext
)およびインポート・プロファイル・グループ(cn=odipigroup,cn=DIPadmins,cn=Directory Integration Platform,cn=Products,cn=OracleContext
)に含まれます。これらのグループは、cn=oraclecontext接尾辞に対する適切な権限を持っていますが、インポート・プロファイルに対して必須アクションを実行するための適切な権限を付与する必要があります。このグループは、デフォルト・レルムの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 "Entry-level DIP permissions"; allow (all,proxy) groupdn="ldap:///cn=dipadmingrp,cn=DIPadmins,cn=Directory Integration Platform,cn=Products,cn=OracleContext"; allow (all,proxy) groupdn="ldap:///cn=odipigroup,cn=DIPadmins,cn=Directory Integration Platform,cn=Products,cn=OracleContext"; ) - add: aci aci: (targetattr="*")(version 3.0; acl "Attribute-level DIP permissions"; allow (all,proxy) groupdn="ldap:///cn=dipadmingrp,cn=DIPadmins,cn=Directory Integration Platform,cn=Products,cn=OracleContext"; allow (all,proxy) groupdn="ldap:///cn=odipigroup,cn=DIPadmins,cn=Directory Integration Platform,cn=Products,cn=OracleContext";)
Oracle Unified DirectoryまたはOracle Directory Server Enterprise Editionバックエンド・ディレクトリ用のLDIF ACLのカスタマイズ
前述のACLの例を参照してください。<Container DN>
は、必要に応じて操作が実行されるDNに置き換えてください。
次のldapmodify
コマンドを使用して、LDIFファイルをアップロードできます。
$ORACLE_HOME/bin/ldapmodify -h <backend-host> -p <backend-port> -D <binddn> -f <ldif-file>
コマンドを実行すると、権限のあるディレクトリ・ユーザーのパスワードを要求されます。
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管理者ガイド』のアクセス制御に関する章
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 <backend-host> -p <backend-port> -D <binddn> -f <ldif-file>
コマンドを実行すると、権限のあるディレクトリ・ユーザーのパスワードを要求されます。
20.3.2.2 エクスポート・プロファイル用ACLのカスタマイズ
Oracle Directory Integration Platformから接続ディレクトリにアクセスできるようにするには、接続ディレクトリでアイデンティティを作成する必要があります。このアイデンティティは、各エクスポート・プロファイルで構成されます。
デフォルト・レルム外にあるユーザー・レコードの同期をサポートするためのACLのカスタマイズ方法
Oracleバックエンド・ディレクトリがOracle Internet Directoryであり、Oracle Internet Directoryデフォルト・レルム外にあるユーザー・レコードを同期する必要がある場合は、LDIFファイルを使用して、次のようにACLを変更します。
ノート:
このACLの変更は、DIP同期を使用して、デフォルト・レルム外にあるOIDユーザー・パスワードを接続ディレクトリにエクスポートする場合に必要です。
20.3.3 マッピング・ルールのカスタマイズ
同期プロファイルの重要な要素であるマッピング・ルールは、同期化されるディレクトリ情報、および同期化されたときのディレクトリ情報の変換方法を決定します。マッピング・ルールは、要件にあわせて実行時に変更できます。
サンプルの同期プロファイルには、それぞれデフォルトのマッピング・ルールが含まれています。これらのルールには、デフォルトで同期用に構成された、最小限のデフォルトのユーザー属性およびグループ属性が含まれています。
ノート:
進行中の同期は、ディレクトリ内の変更より前に構成されたマッピング・ルールに依存します。マッピングの一貫性を確実にするには、同期化済のエントリを削除するか、完全同期を実行することが必要な場合があります。
マッピング・ルールにより、ソース・ディレクトリと宛先ディレクトリが同期化されるときに、データを変換する方法が決定されます。次の変更を行う必要がある場合は、サンプル・プロファイルにあるデフォルトのマッピング・ルールをカスタマイズします。
-
識別名マッピングの変更。識別名マッピングにより、接続ディレクトリのDITをOracleバックエンド・ディレクトリのDITにマップする方法を決定します。
-
同期化する必要がある属性の変更。
-
同期時に発生する変換(マッピング・ルール)の変更。
宛先ディレクトリで変換の結果得られたデータがそのディレクトリのスキーマに一致すれば、どのようなマッピングでも実行できます。
関連項目:
-
マッピング・ルールの詳細は、「マッピング・ルールの構成」を参照してください
-
一方のディレクトリから他方のディレクトリに同期化する際に、属性値がどのように変換されるかの例は、「サポートされている属性マッピング・ルールと例」を参照してください
-
インポート・マッピング・ルールの例は、$ORACLE_HOME
/ldap/odi/conf/activeimp.map.master
ファイルを参照してください。
Oracleバックエンド・ディレクトリと接続ディレクトリ間の同期を確立すると、同期プロファイルの属性マッピング・ルールを、デプロイの要件を満たすようにカスタマイズできます。
同期プロファイルの属性マッピング・ルールをカスタマイズするには:
20.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モードで実行します。
-
「Oracle Directory Integration Platformのセキュリティ機能」の説明に従って、SSLモードでOracle Directory Integration Platformを実行します。Directory Integration PlatformのSSLモードは、Oracleバックエンド・ディレクトリ・サーバーが起動したときに使用されていたモードと同一である必要があります。SSLモード1は認証なし、SSLモード2はサーバー認証です。
ノート:
-
Oracleバックエンド・ディレクトリがOracle Internet Directoryである場合、Oracle Directory Integration Platformでは、認証なしSSLモード(SSLモード1)とSSLサーバー認証(SSLモード2)の両方がサポートされます。Oracle Unified DirectoryまたはOracle Directory Server Enterprise EditionがOracleバックエンド・ディレクトリである場合、使用できるSSLはSSLサーバー認証(SSLモード2)のみとなります。
-
認証なし(SSLモード1)の使用は推奨されません。
-
-
接続ディレクトリ・サーバーをSSLモードで実行します。SSLを介した接続ディレクトリとの通信では、SSLサーバー認証が必要です。これには、Oracleバックエンド・ディレクトリとOracle Directory Integration Platformの両方をSSLサーバー認証モードで実行する必要があります。
次のステップを実行し、SSLモードでの接続ディレクトリとの通信を構成します。
-
接続されているディレクトリ用の証明書を生成します。サーバーからのトラスト・ポイント証明書のみ必要です。接続されているディレクトリの証明書ストアに証明書を格納します。
-
信頼できる認証局(CA)証明書をBase 64エンコードされた形式にエクスポートします。
-
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_JKS \ -keystore PATH_TO_JKS
-keystore
PATH_TO_JKS
オプションで特定されたJKSを初めて使用する場合、パスワードを指定し、次のステップ3.aおよび3.bも実行する必要があります。-
manageDIPServerConfigコマンドを使用して、ステップ
3
で使用した場所とパスワードを用いてDirectory Integration Platformの構成を更新します。たとえば:manageDIPServerConfig set -h HOST –p PORT -D WLS_USER \ -attribute keystorelocation -value PATH_TO_JKS
-
次のWLSTコマンドを使用して、PASSWORD変数を、キーストアの作成時に使用したパスワードに置き換え、資格証明ストア・フレームワーク(CSF)の資格証明を更新します。
createCred(map="dip", key="jksKey", user="jksUser", password="PASSWORD",desc="jks password")
-
-
manageSyncProfilesコマンドの変更操作を使用して、ホスト名、プロファイルおよび
connectedDirectoryURL
属性を含む接続ディレクトリ接続情報を変更します。manageSyncProfiles update -profile profile_name -file myMapFile
connectedDirectoryURL
属性を構成する場合、次の形式を使用します。host:port:sslmode
sslmode
に対してサポートされる値は次のとおりです。表20-1 connectedDirectoryURL属性のsslmodeに対してサポートされる値
サポートされるsslmode値 説明 0
SSLなしモード。すべてのディレクトリ・タイプに対してサポートされます。
1
認証なしモード。証明書はありません。Oracle Internet Directoryに対してのみサポートされます。
ノート:
認証なし(SSLモード1)の使用は推奨されません。2
サーバーのみの認証モード。証明書が必要です。すべてのディレクトリ・タイプに対してサポートされます。
-
ステップ3で新規JKSを使用した場合、Oracle Directory Integration PlatformをSSLモードで再起動する必要があります。ステップ3で既存のJKSを使用した場合、6に進みます。
-
テスト・ユーザーを追加し、正常に同期することを確認します。テスト・ユーザーが正常に同期しない場合、SSL構成のトラブルシューティングを行います。
ノート:
-
Oracle Directory Integration Platformでは、クライアント/サーバー認証モードでのSSLはサポートされていません。
「バックエンド・ディレクトリと接続ディレクトリのSSL証明書の管理」を参照してください。
-
Oracle Directory Integration Platform 12cでは、接続ディレクトリとの通信でTransport Layer Security (TLS) v1.2プロトコルがサポートされます。
「Transport Layer Securityプロトコルと暗号スイート」を参照してください。
20.3.6 外部認証プラグインの構成
Oracle Internet Directoryでは、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
ツールでは、単一ドメインで機能するようにしか外部認証プラグインを構成しません。複数ドメインで機能するように外部認証プラグインを設定するには、「複数のドメインに対する外部認証の構成」に記載されているステップを実行する必要があります。
外部認証プラグインを構成するには、次のステップを実行します。
ノート:
外部認証プラグインのデフォルトの属性名を変更しないでください。たとえば、orclpluginflexfield
のデフォルトの属性名を変更すると、エラーがスローされます。
20.3.7 複数のドメインに対する外部認証の構成
外部認証プラグインを設定して複数の外部認証ドメインで動作させる場合は、外部構成ツールを実行した後にいくつかの手順を手動で実行する必要があります。次のように実行します。
-
「外部認証プラグインの構成」で説明されているように、外部認証プラグインを構成します。
-
ステップ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
が表示されます。表20-2に示すように、構成したプラグインのタイプに正しいプラグインのcn
を使用します。例に示すように、*
をワイルドカードとして使用できます。ノート:
複数のMicrosoft Active Directoryドメインまたはサーバーの外部認証プラグインの場合、ユーザーの各Microsoft Active Directoryサーバー・セットを個別のOracle Internet Directoryコンテナまたはツリーと同期し、対応するプラグインの
orclpluginsubscriberdnlist
値に適切なDNがリストされることを確認してください。たとえば、
cn=oidexplg_bind_ad,cn=plugin,cn=subconfigsubentry
やcn=oidexplg_compare_ad,cn=plugin,cn=subconfigsubentry
のようなデフォルト・プラグインの場合、orclpluginsubscriberdnlist=cn=ad1,cn=users,dc=mycompany,dc=com
が含まれる必要があります。cn=oidexplg_bind_ad2,cn=plugin,cn=subconfigsubentry
やcn=oidexplg_compare_ad2,cn=plugin,cn=subconfigsubentry
のような新しいプラグインの場合、orclpluginsubscriberdnlist=cn=ad2,cn=users,dc=mycompany,dc=com
が必要です。デフォルト・プラグインの場合はデフォルト名を保持し、新しいプラグインには一意の名前を指定できます。
表20-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
-
出力ファイルを調べます。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: myhost.us.example.com orclpluginflexfield;port2: 636 orclpluginflexfield;isssl2: 1 orclpluginflexfield;host: myhost.us.example.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: myhost.us.example.com orclpluginflexfield;port2: 636 orclpluginflexfield;isssl2: 1 orclpluginflexfield;host: myhost.us.example.com orclpluginenable: 0 orclpluginsecuredflexfield;walletpwd: password orclpluginsecuredflexfield;walletpwd2: password orclpluginsubscriberdnlist: cn=users,dc=us,dc=oracle,dc=com
-
次のように、出力ファイルからLDIFファイルを新規作成します。
-
エントリ名を変更します。前のステップで示した例では、
cn=oidexplg_compare_ad,cn=plugin, cn=subconfigsubentry
をcn=oidexplg_compare_
ad1
, cn=plugin,cn=subconfigsubentry
に、cn=oidexplg_bind_ad, cn=plugin,cn=subconfigsubentry
をcn=oidexplg_bind_
ad1
, cn=plugin,cn=subconfigsubentry
に変更します。 -
orclpluginenable
の値を変更します。有効にする場合は値1
を、無効にする場合は値0
を使用します。 -
外部ディレクトリのホスト名とポート番号について、
orclpluginflexfield;host
とorclpluginflexfield;port
の値を変更します。 -
orclpluginflexfield;isssl
の値を変更します。外部ディレクトリに対してSSL接続を有効にする場合は値1
を、無効にする場合は値0
を使用します。値1
を使用する場合は、ウォレット・ロケーションとパスワードについて、orclpluginflexfield;walletloc
とorclpluginsecuredflexfield;walletpwd
の値も変更する必要があります。 -
orclpluginflexfield;isfailover
の値を変更します。バックアップ外部ディレクトリに対してフェイルオーバーを設定する場合は、値1
を使用します。値1
を使用する場合は、ホスト名とポート番号について、orclpluginflexfield;host2
とorclpluginflexfield;port2
の値も変更する必要があります。バックアップ・ディレクトリ・サーバーに対してSSL接続を使用するには、orclpluginflexfield;walletloc2
とorclpluginsecuredflexfield;walletpwd2
の値を変更する必要があります。 -
プラグインの起動ネーミング・コンテキストについて、
orclpluginsubscriberdnlist
を変更します。 -
プラグインのリクエスト・グループについて、
orclPluginRequestGroup
を変更します。この属性が検索結果の出力にない場合は、LDIFファイルに属性と値を追加します。
-
-
変更したプラグイン構成エントリをOracle Internet Directoryサーバーに追加します。次のようなコマンドを使用します。
$ORACLE_HOME/ldap/bin/ldapadd -h host -p port -D binddn -q \ -v -f input.ldif
ノート:
パスワードを要求されます。
20.4 カスタム同期コネクタの記述
Oracle Directory Integration Platformは、カスタム同期コネクタをサポートします。この項では、カスタム・コネクタの記述に役立つ情報を提供します。
トピック:
20.4.1 インバウンド・コネクタの記述
カスタム同期コネクタのインバウンド・コネクタを記述できます。
インバウンド・コネクタを記述するには、次のステップを実行します。
-
リーダーを実装します。リーダーは、一般的にターゲット・システムのコネクタ・クラスを拡張してDISReadInterfaceを実装します。DISReadInterfaceの様々なメソッドは、javadoc内で指定されます。
リーダーの実装例を確認するには、「インバウンド・コネクタのサンプル・リーダー」を参照してください。
-
構成ファイルのサンプルを作成します。一般的な構成ファイルを次に示します。
[INTERFACEDETAILS] Reader: Complete_classname_including_packageName SkipErrorToSyncNextChange: false SearchDeltaSize: 500 UpdateSearchCount: 100
-
一連のマッピング・ルールを含むマップ・ファイルを作成します。
-
configfileパラメータ、mapfileパラメータおよびfilterパラメータを設定してプロパティ・ファイルを作成します。
インバウンド・コネクタのテストするには:
- manageSyncProfilesコマンドのregister操作を使用して、テスト・プロファイルを作成します。詳細は、「manageSyncProfilesを使用した同期プロファイルの管理」を参照してください。
- ロギング・メッセージを検証します。
- Oracle Internet Directoryを調べ、発生した同期を検証して、適切なエントリが作成されたか確認します。
20.4.2 アウトバウンド・コネクタの記述
カスタム同期コネクタのアウトバウンド・コネクタを記述できます。
アウトバウンド・コネクタを記述するには、次のステップを実行します。
-
ライターを実装します。ライターは、一般的にターゲット・システムのコネクタ・クラスを拡張してDISWriteInterfaceを実装します。DISWriteInterfaceの様々なメソッドは、Javadoc内で指定されます。
リーダーの実装例を確認するには、「アウトバウンド・コネクタのサンプル・ライター」を参照してください。
-
構成ファイルのサンプルを作成します。一般的な構成ファイルを次に示します。
[INTERFACEDETAILS] Reader: Complete_classname_including_packageName SkipErrorToSyncNextChange: false SearchDeltaSize: 500 UpdateSearchCount: 100
-
一連のマッピング・ルールを含むマップ・ファイルを作成します。
-
configfileパラメータ、mapfileパラメータおよびfilterパラメータを設定してプロパティ・ファイルを作成します。
アウトバウンド・コネクタのテストするには:
- manageSyncProfilesコマンドのregister操作を使用して、テスト・プロファイルを作成します。詳細は、「manageSyncProfilesを使用した同期プロファイルの管理」を参照してください。
- ロギング・メッセージを検証します。
- Oracle Internet Directoryを調べ、発生した同期を検証して、適切なエントリが作成されたか確認します。
20.5 インバウンド・コネクタのサンプル・リーダー
次の例は、インバウンド・コネクタのサンプル・リーダーを示しています。
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. } }
20.6 アウトバウンド・コネクタのサンプル・ライター
次の例は、アウトバウンド・コネクタのサンプル・ライターを示しています。
*/ 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 }
20.7 expressSyncSetupコマンド
ORACLE_HOME/bin
ディレクトリにあるexpressSyncSetup
コマンドを使用すると、Express同期のためにインポートおよびエクスポート同期プロファイルを作成できます。
ノート:
-
最良のセキュリティ・プラクティスは、コマンドからの要求への応答としてのみ、パスワードを入力することです。
-
Oracle Directory Integration Platformコマンドのいずれかを実行するには、あらかじめ
WLS_HOME
環境変数とORACLE_HOME
環境変数を設定しておく必要があります。 -
Oracle Directory Integration PlatformがデプロイされているOracle WebLogic管理対象サーバーは、SSLモードでこのコマンドを実行するようにSSLに対して構成されている必要があります。詳細は、『Oracle Fusion Middleware Oracle WebLogic Serverの保護』の「SSLの構成」を参照してください。
-
Oracle Directory Integration Platform 12cでは、接続ディレクトリとの通信でTransport Layer Security (TLS) v1.2プロトコルがサポートされます。「Transport Layer Securityプロトコルと暗号スイート」を参照してください。
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]
expressSyncSetupコマンドの引数
表20-3 dipStatusユーティリティの引数
引数 | 説明 |
---|---|
-h | -host |
Oracle Directory Integration PlatformがデプロイされているOracle WebLogic Server。 |
-p | -port |
Oracle Directory Integration PlatformがデプロイされているOracle WebLogic管理対象サーバーのリスニング・ポート。 |
-D | -wlsuser |
Oracle WebLogic ServerのログインID。 ノート: Oracle WebLogic Serverのログイン・パスワードを要求されます。パスワードをコマンド行引数として指定することはできません。最良のセキュリティ・プラクティスは、コマンドからの要求への応答としてのみ、パスワードを入力することです。スクリプトから |
-pf | -profile |
プロファイル名。ASCII以外の文字は「プロファイル名」ではサポートされていないため、プロファイルの名前をASCII文字のみを使用して指定します。 |
-conDirType |
接続ディレクトリのタイプ。サポートされている値は、 |
-conDirUrl |
接続ディレクトリが稼働しているURL。host:portという形式です。 |
-conDirBindDN |
接続ディレクトリ・サーバーのバインドDN。たとえば:
ノート: 接続ディレクトリのバインドDNパスワードを要求されます。パスワードをコマンド行引数として指定することはできません。最良のセキュリティ・プラクティスは、コマンドからの要求への応答としてのみ、パスワードを入力することです。スクリプトから |
-conDirContainer |
同期コンテナ。たとえば:
|
-ssl |
SSLモードでコマンドを実行します。 ノート: Oracle Directory Integration PlatformがデプロイされているOracle WebLogic管理対象サーバーは、SSLモードでこのコマンドを実行するようにSSLに対して構成されている必要があります。詳細は、『Oracle Fusion Middleware Oracle WebLogic Serverの保護』の「SSLの構成」を参照してください。 |
-enableProfiles |
作成されたプロファイルを有効にするには |
-keystorePath |
キーストアへのフルパス。 |
-keystoreType |
|
-help |
コマンドの使用方法のヘルプを提供します。 |
-search-size-limit |
Oracle Directory Server Enterprise Editionがバックエンド・ディレクトリの場合、エントリ・サイズの制限として |
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