4.2. ディレクトリーツリーの設計
ディレクトリーツリーを計画するときには、次の主要な決定を行います。
- データを格納する接尾辞を選択します。
- ディレクトリーツリー構造を作成することによって、データエントリー間の階層関係を決定します。
- ディレクトリーツリー階層内のエントリーに名前を付けます。
4.2.1. 接尾辞の選択 リンクのコピーリンクがクリップボードにコピーされました!
接尾辞は、ディレクトリーツリーの root にあるエントリーの名前で、ディレクトリーデータはその下に保存されます。ディレクトリーには、複数の接尾辞を含めることができます。自然共通の root を持たない情報のディレクトリーツリーが 2 つ以上ある場合には、複数の接尾辞を使用できます。デフォルトでは、標準の Directory Server のデプロイメントには複数の接尾辞が含まれています。1 つはデータの保管用で、残りは内部ディレクトリー操作に必要なデータ (例: 設定情報、ディレクトリースキーマなど) 用です。
接尾辞の命名規則
ディレクトリー内のすべてのエントリーを、共通のベースエントリー (root 接尾辞) に配置する必要があります。root ディレクトリー接尾辞の名前を選択する場合、その名前を有効にするには次の条件を満たす必要があります。
- グローバルに一意であること
- 静的であること
- 短いこと (その下のエントリーを簡単に読めるようにするため)
- 簡単なこと (入力したり記憶したりしやすいこと)
単一のエンタープライズ環境では、エンタープライズの DNS 名またはインターネットドメイン名と対応するディレクトリー接尾辞を選択できます。たとえば、企業が example.com のドメイン名を所有する場合は、ディレクトリーの接尾辞は dc=example,dc=com になります。dc 属性は、ドメイン名をコンポーネント部分に分割することで、接尾辞を表します。通常、root 接尾辞に名前を付けるには任意の属性を使用できます。ただし、ホスト組織では、root 接尾辞を以下の属性に制限する必要があります。
dc- ドメイン名のコンポーネントを定義します。
c- ISO で定義される、国名を表す 2 桁のコードが含まれます。
l- エントリーが置かれる、またはエントリーに関連付けられる国、都市、または他の地理的エリアを識別します。
st- エントリーが所在する州または地方を識別します。
o- エントリーが属する組織の名前を識別します。
これらの属性は、サブスクライバーアプリケーションとの相互運用性を実現します。たとえば、ホスト組織はこれらの属性を使用して、クライアントの 1 つ example_a に対して root 接尾辞 o=example_a, st=Washington,c=US を作成できます。
X.500 の接尾辞命名規則では、組織名の後に国名を使用するのが一般的です。
複数接尾辞の命名
ディレクトリー内の各接尾辞は一意のディレクトリーツリーです。Directory Server が提供する個別のデータベースに保存される複数のディレクトリーツリーを作成できます。
たとえば、example_a と example_b の個別の接尾辞を作成し、それらを別々のデータベースに保存します。
リソースの制限に応じて、データベースを単一のサーバーまたは複数のサーバーに保存できます。
4.2.2. ディレクトリーツリー構造の作成 リンクのコピーリンクがクリップボードにコピーされました!
フラットなツリー構造または階層ツリー構造を使用するかどうかを決定します。ディレクトリーツリーをできるだけフラットにするようにしてください。ただし、情報を複数のデータベース間でパーティション化する場合、レプリケーションを準備する場合、またはアクセス制御を設定する場合に、ある程度の階層化が重要になります。
ツリーの構造では、以下の手順および考慮事項が必要です。
- ディレクトリーの分岐
- ブランチポイントの特定
- レプリケーションに関する考慮事項
- アクセス制御に関する考慮事項
4.2.2.1. ディレクトリーの分岐 リンクのコピーリンクがクリップボードにコピーされました!
問題のある名前の変更を避けるために、namespace は可能な限りフラットにする必要があります。ディレクトリーツリーが階層的であるほど、名前のコンポーネントが多くなり、名前が変更される可能性が高くなります。
ディレクトリーツリー階層を設計する場合は、次のガイドラインに従ってください。
- ツリーを分岐して、企業内の最大下部組織部門のみを表します。ブランチポイントは、企業情報サービス、カスタマーサポート、営業、エンジニアリングなどの部門に限定する必要があります。ディレクトリーツリーを分岐するために使用される部門が安定していることを確認します。企業が頻繁に再編成を行う場合は、この種のブランチングを実行しないでください。
-
ブランチポイントには、実際の組織名ではなく、機能名または汎用名を使用します。サブツリーの名前を変更するときに、接尾辞に多くの子がある場合、名前変更プロセスはリソースを大量に消費し、時間がかかります。たとえば、
Widget Research and Developmentの代わりにEngineeringを使用します。 -
同様の機能を実行する組織が複数ある場合は、その機能に対して単一のブランチポイントを作成してみてください。たとえば、複数のマーケティング組織があり、それぞれが特定の製品ラインを担当している場合でも、単一の
ou=Marketingサブツリーを作成します。すべてのマーケティングエントリーはそのツリーに属します。
エンタープライズ環境における分岐
変更される可能性が低い情報に基づいてディレクトリーツリー構造を計画すると、名前の変更を回避できます。たとえば、組織ではなくツリー内のオブジェクトのタイプを構造のベースとします。
構造を定義するには、次の共通オブジェクトを使用します。
-
ou=people -
ou=groups -
ou=contracts -
ou=services
次の図は、これらのオブジェクトを使用して編成されたディレクトリーツリーを示しています。
ホスト環境での分岐
ホスティング環境の場合は、root 接尾辞の下に、オブジェクトクラス organization (o) のエントリー 2 つと、オブジェクトクラス organizationalUnit (ou) のエントリー 1 つを含むツリーを作成します。たとえば、Example ISP というインターネットサービスプロバイダーは、次のようにディレクトリーを分岐します。
4.2.2.2. ブランチポイントの特定 リンクのコピーリンクがクリップボードにコピーされました!
ディレクトリーツリー内のブランチをプランニングする際に、ブランチポイントの特定に使用する属性を決定します。ブランチポイントは、ou=people、l=Japan、cn=Barbara Jansen などの属性とデータのペアになります。DN はこれらの属性とデータのペアで構成される一意の文字列であることを覚えておいてください。たとえば、Example Company の従業員である Barbara Jensen のエントリーの DN は次のようになります。
uid=bjensen,ou=people,dc=example,dc=com
次の図に、ou=people、ou=groups、cn=Barbara Jensen、cn=Billie Holiday のブランチポイントを持つ Example Company のディレクトリーツリーの例を示します。
次の図に、インターネットプロバイダー Example ISP のディレクトリーツリーの例を示します。
root 接尾辞エントリー o=example,c=US の下で、ツリーは 3 つのブランチに分割されます。o=ISP ブランチには、Example ISP の顧客データと内部情報が含まれています。o=internet ブランチはドメインツリーです。ou=groups ブランチには、管理グループに関する情報が含まれています。
ブランチポイントの属性を選択するときは、次の推奨事項を考慮してください。
一貫性を持たせる必要があります。
ディレクトリーツリー全体で DN 形式が一貫していない場合、一部の LDAP クライアントアプリケーションでは識別名 (DN) が見つからないことがあります。ディレクトリーツリーの一部で
ouがoの下にある場合は、ディレクトリーサービスの他のすべての部分でもouがoの下にあることを確認してください。従来の属性のみを使用するようにしてください。
従来の属性を使用すると、Directory Server がサードパーティーの LDAP クライアントアプリケーションと互換性を持つ可能性が高まります。従来の属性を使用するということは、デフォルトのディレクトリースキーマがそれらを認識していることも意味します。
| 従来の属性 | 説明 |
|---|---|
|
|
|
|
| 国名。 |
|
| 組織名。この属性は、企業部門、学問分野 (人文科学、科学)、子会社、または企業内のその他の主要なブランチなどの大規模な部門のブランチを表すために使用します。この属性を使用してドメイン名を表すことができます。 |
|
| 組織単位。この属性は、組織ではなく企業の小さな部門のブランチを表すために使用されます。通常、組織単位は前述の組織に従属します。 |
|
| 州または地区名。 |
|
| 都市、国、オフィス、またはファシリティー名などのローカリティー。 |
一般的な間違いは、識別名で使用される属性に基づいてディレクトリーを検索することを仮定することです。識別名はディレクトリーエントリーの一意の識別子であり、検索キーとして使用できません。代わりに、エントリー自体に保存されている属性とデータのペアに基づいてエントリーを検索します。したがって、エントリーの識別名が uid=bjensen,ou=People,dc=example,dc=com の場合、dc=example の検索は、そのエントリーの属性として dc:example が明示的に追加されない限り、そのエントリーと一致しません。
4.2.2.3. レプリケーションに関する考慮事項 リンクのコピーリンクがクリップボードにコピーされました!
レプリケートするエントリーを計画します。サブツリーの最上位の DN を指定して、その下のすべてのエントリーをレプリケートできます。このサブツリーは、ディレクトリーデータの一部を含むディレクトリー部分であるデータベースにも対応します。
たとえば、エンタープライズ環境では、ディレクトリーツリーをエンタープライズ内のネットワーク名に対応するように編成できます。ネットワーク名は 変更されない傾向 があるため、ディレクトリーツリー構造は安定しています。
たとえば、Example Company には、flightdeck.example.com、tickets.example.com、hangar.example.com という 3 つのプライマリーネットワークがあります。同社は最初に、主要な組織部門ごとにディレクトリーツリーを 3 つの主要グループに分岐します。次の図でディレクトリーツリーの最初の分岐を確認してください。
ツリーの初期構造を作成した後、同社は追加のブランチを作成します。次の図で拡張されたブランチを参照してください。
別の例では、インターネットプロバイダーの Example ISP には、プロバイダーのニーズを満たすために次の初期分岐があります。
その後、Example ISP は論理サブグループ用の追加のブランチを作成します。次の図で拡張されたブランチを参照してください。
企業の Example Company とホスティング組織の Example ISP はどちらも、頻繁に変更されない情報に基づいてデータ階層を設計します。
4.2.2.4. アクセス制御に関する考慮事項 リンクのコピーリンクがクリップボードにコピーされました!
ディレクトリーツリー内の階層を使用して、特定の種類のアクセス制御を有効にすることができます。レプリケーションと同様に、類似したエントリーをグループ化して、1 つのブランチから管理するのが簡単になります。
階層的なディレクトリーツリーを通じて管理できます。たとえば、マーケティング部門の管理者にマーケティングエントリーへのアクセス権を付与し、営業部門の管理者に営業のエントリーへのアクセス権を付与するには、これらの部門に従ってディレクトリーツリーを設計します。
さらに、ディレクトリーツリーではなくディレクトリーの内容に基づいてアクセス制御を設定することもできます。アクセス制御命令 (ACI) メカニズムを使用すると、特定のエントリーが特定の属性値を含むすべてのエントリーにアクセスできるようにすることができます。たとえば、営業管理者に属性値 ou=Sales を含むすべてのエントリーへのアクセス権を付与する ACI を設定します。
ただし、ACI の管理は難しい場合があります。アクセス制御の最適な方法 (ディレクトリーツリー階層の組織分岐、ACI、またはその 2 つの組み合わせ) を決定します。
4.2.3. エントリーの命名 リンクのコピーリンクがクリップボードにコピーされました!
ディレクトリーツリーの階層を設計した後、構造内のエントリーに名前を付けるときに使用する属性を決定する必要があります。1 つまたは複数の属性値を選択すると、相対識別名 (RDN) が形成されます。RDN は DN の一番左の部分であり、その部分に選択する属性は 命名属性 です。命名属性は、エントリーに一意の名前を設定します。たとえば、DN uid=bjensen,ou=people,dc=example,dc=com には RDN uid=bjensen があります。
選択する属性は、名前を付けるエントリーのタイプによって異なります。
エントリーに名前を付けるときは、次の点を考慮してください。
- 命名に選択した属性を変更しないでください。
- この名前は、ディレクトリー全体で一意でなければなりません。一意の名前により、DN はディレクトリー内の 1 つのエントリーのみを参照するようになります。
エントリーを作成するときは、エントリー内で RDN を定義します。エントリー内に定義された RDN を使用すると、エントリーをより簡単に見つけることができます。これは、実際の DN ではなく、エントリー自体に格納されている属性値に基づいてエントリーが検索されるためです。
属性名には意味があるため、表しているエントリーのタイプと一致する属性名を使用するようにしてください。たとえば、組織を表すのに l (location) を使用したり、組織単位を表すのに c (country) を使用したりしないでください。
4.2.3.1. ディレクトリーツリー内の person エントリーに名前を付ける リンクのコピーリンクがクリップボードにコピーされました!
person エントリー名は一意である必要があります。通常、個人エントリーに名前を付けるには、commonName または cn 属性を使用して相対識別名 (RDN) を作成します。たとえば、Babs Jensen という名前の人物のエントリーの識別名 (DN) は cn=Babs Jensen,dc=example,dc=com になります。
RDN で共通名のみを使用すると、エントリー名を一意にする際に十分ではなく、複数の同一エントリーが作成され、DN 名の衝突が発生する可能性があることに注意してください。
共通名に一意の識別子を追加して、共通名の衝突を回避します (例: cn=Babs Jensen+employeeNumber=23,dc=example,dc=com)。ただし、これにより、大規模なディレクトリーでは共通名が不便になり、管理が困難になる可能性があります。
より適切な方法は、cn 以外の属性で個人エントリーを特定することです。以下の属性のいずれかを使用することを検討してください。
- uid
-
uid属性を使用して、ユーザーログイン ID や従業員番号など、個人の一意の値を指定します。ホスティング環境内のサブスクライバーをuid属性で識別します。 -
mail属性には、常に一意である個人のメールアドレスが含まれます。この属性により、mail=bjensen@example.com,dc=example,dc=comなどの重複した属性値を含む扱いにくい DN が発生する可能性があります。uid属性の一意の値が見つからない場合にのみ、このオプションを使用します。たとえば、企業が臨時従業員または契約従業員に従業員番号やユーザー ID を割り当てない場合は、uid属性ではなくmail属性を使用します。 - employeeNumber
-
inetOrgPersonオブジェクトクラスの従業員の場合は、employeeNumber属性を使用します。
person エントリー RDN に使用される属性/データのペアに関係なく、それらが一意の永続的値であることを確認してください。person エントリー RDN も読み取り可能でなければなりません。たとえば、DN uid=bjensen,dc=example,dc=com は、uid=b12r56A,dc=example,dc=com よりも推奨され、識別名に基づいてディレクトリーエントリーを変更するなど、一部のディレクトリータスクが簡素化されます。また、一部のディレクトリークライアントアプリケーションでは、uid 属性と cn 属性に人間が判読できる名前が使用されていると想定しています。
ホストされる環境の person エントリーに関する考慮事項
person がサービスへのサブスクライバーである場合、エントリーには inetUser オブジェクトクラスが含まれ、uid 属性が含まれている必要があります。属性は、顧客サブツリー内で一意である必要があります。
個人がホスティング組織の一部である場合は、nsManagedPerson オブジェクトクラスで inetOrgPerson 属性を使用します。
ディレクトリーツリーに person エントリーを配置する
ディレクトリーツリーに person エントリーを配置する場合は、次のガイドラインに従ってください。
- ディレクトリーツリーの組織エントリーの下にある企業内の人物を見つけます。
-
ホストされている組織の
ou=peopleブランチの下で、ホストしている組織のサブスクライバーを見つけます。
4.2.3.2. ディレクトリーツリー内のグループエントリーの命名 リンクのコピーリンクがクリップボードにコピーされました!
グループを表すには、次の方法を使用できます。
静的グループ は、明示的にメンバーを定義します。
groupOfNamesまたはgroupOfUniqueNamesオブジェクトクラスには、グループのメンバーを命名する値が含まれます。静的グループは、ディレクトリー管理者のグループなど、メンバー数が少ないグループに適していますが、メンバー数が数千人のグループには適していません。uniqueMemberはgroupOfUniqueNamesオブジェクトの必須属性であるため、静的グループエントリーにはuniqueMember属性値が含まれている必要があります。このオブジェクトクラスにはcn属性が必要です。これを使用して、グループエントリーの DN を形成できます。- 動的グループ はフィルターを指定し、フィルターに一致するすべてのエントリーがこのグループのメンバーになります。
- ロール は、静的グループおよび動的グループの概念を統一します。
ホスト環境では、ディレクトリー管理で使用されるグループのメンバーに名前を付ける値を格納するために、groupOfUniqueNames オブジェクトクラスの使用を検討してください。
また、ディレクトリー管理に使用するグループエントリーを ou=Groups ブランチの下に配置します。
4.2.3.3. 組織エントリーの命名 リンクのコピーリンクがクリップボードにコピーされました!
組織エントリー名は一意である必要があります。組織の正式名称を他の属性値と一緒に使用すると、確実に一意な名前にする場合に役立ちます (例 : o=example_a+st=Washington,o=ISP,c=US)。
商標を使用することもできますが、一意ではない可能性があります。
ホスティング環境では、組織エントリーに次の属性を含めます。
-
o(organizationName) -
top、organization、およびnsManagedDomainの値を持つobjectClass
4.2.3.4. その他のエントリーの命名 リンクのコピーリンクがクリップボードにコピーされました!
ディレクトリーには、地域、州、国、デバイス、サーバー、ネットワーク情報、その他のデータタイプなど、さまざまな情報を表すエントリーが含まれています。これらのエントリーのタイプには、RDN の cn 属性を使用します。グループエントリーに cn=administrators,dc=example,dc=com という名前を付けることもできます。
エントリーオブジェクトクラスが commonName 属性をサポートしない場合があります。代わりに、エントリーオブジェクトクラスがサポートする属性を使用します。命名属性は、エントリーで実際に使用する属性に対応する必要はありません。ただし、DN 属性とエントリーで使用される属性の間に何らかの相関関係があれば、ディレクトリーツリーの管理が容易になります。
4.2.4. エントリーおよびサブツリーの名前変更 リンクのコピーリンクがクリップボードにコピーされました!
エントリー名はディレクトリーツリー構造を定義します。各ブランチポイントは階層内に新しいリンクを作成します。
エントリーの命名属性 (エントリー RDN) を変更する場合は、modrdn 操作を実行します。この変更操作により、ディレクトリーツリー内のエントリーが移動されます。リーフエントリー (子のないエントリー) の場合、modrdn 操作によって RDN 部分のみが変更され、親エントリーは変更されません。
サブツリーエントリーの場合、modrdn 操作はサブツリーエントリー自体の名前を変更し、サブツリーの下にあるすべての子エントリーの DN コンポーネントも変更します。
サブツリー modrdn 操作では、サブツリーエントリーの下にあるすべての子エントリーも移動され、名前が変更されます。サブツリーが大きい場合、これは時間とリソースを必要とするプロセスになります。ディレクトリーツリー階層の命名構造を計画し、サブツリーの名前変更操作が頻繁に要求されないようにします。
サブツリーの名前を変更する同様のアクションは、エントリーをあるサブツリーから別のサブツリーに移動することです。この modrdn 操作の拡張タイプのものは、同じ名前であってもエントリーの名前を同時に変更し、エントリーをある親から別の親に移動する newsuperior 属性を設定します。
Directory Server は、entryrdn.db インデックスを使用して、新しい上位およびサブツリーの名前変更操作を実行します。Directory Server は、各エントリーを自己リンク、親リンク、および子リンクによって識別します。entryrdn.db インデックスは、親と子をエントリーの属性として提示し、完全な DN ではなく、一意の ID とその RDN で各エントリーを記述します。
entryrdn.db インデックスの形式は次のとおりです。
numeric_id:RDN => self link
ID: ; RDN: "rdn"; NRDN: normalized_rdn P:RDN => parent link
ID: ; RDN: "rdn"; NRDN: normalized_rdn C:RDN => child link
ID: #; RDN: "rdn"; NRDN: normalized_rdn
numeric_id:RDN => self link
ID: ; RDN: "rdn"; NRDN: normalized_rdn P:RDN => parent link
ID: ; RDN: "rdn"; NRDN: normalized_rdn C:RDN => child link
ID: #; RDN: "rdn"; NRDN: normalized_rdn
たとえば、ou=people サブツリーには dc=example,dc=com 親エントリーと uid=jsmith 子エントリーがあります。entryrdn.db インデックスには次のコンテンツが含まれます。
名前変更操作を実行するときは、次の点を考慮してください。
- ルート接尾辞の名前を変更することはできません。
- レプリカ合意を再設定する必要はありません。Directory Server は、データベース内のサブツリーではなく、データベース全体にレプリカ合意を適用します。
- サブツリーの名前変更操作の後、すべての同期合意を再設定することを推奨します。同期合意は、接尾辞またはサブツリーレベルで設定されるため、サブツリーの名前を変更すると、同期が破損してしまう可能性があります。
- サブツリーに設定されているすべてのサブツリーレベルの ACI と、サブツリーの子エントリーに設定されているすべてのエントリーレベルの ACI を手動で再設定する必要があります。
- 子を持つサブツリーの名前を変更できますが、子を持つサブツリーを削除できません。
-
ouからdcに移動するなど、サブツリーのコンポーネントを変更しようとすると、スキーマ違反で失敗する可能性があります。たとえば、organizationalUnitオブジェクトクラスにはou属性が必要です。操作がorganizationalUnitオブジェクトクラスからou属性を削除しようとすると、サブツリー操作は失敗します。