ディレクトリの情報は、基本的な情報となるエントリと別名エントリ、およびこの基本的な情報の構造を決めるインフラ情報からなります。
「ディレクトリエントリ」は、一連の「属性」とその「値」からなります。各エントリは「オブジェクトクラス」という属性を持ち、これがそのエントリに記述されているオブジェクトの種類を指定し、そこに含まれる属性のセットを定義します。オブジェクトクラスの属性には、必須のものと任意のものがあります。たとえば、オブジェクトクラス country は、必須属性 countryName と任意属性 description および searchGuide で記述します。
スキーマは、オブジェクトクラスエントリの必須属性と任意属性を定義します。スキーマは継承階層も定義します。すべてのオブジェクトクラスは、自分より上のオブジェクトクラスの特性を継承します。たとえば、オブジェクトクラス organizationalPerson はオブジェクトクラス Person のサブクラスなので、必須属性と任意属性をオブジェクトクラス Person から継承します。
すべてのオブジェクトクラスは、オブジェクトクラス top から属性を継承します。オブジェクトクラス top には必須属性 objectClass があるため、すべてのエントリには少なくとも 1 つのオブジェクトクラス属性があります。
オブジェクトクラスの種類として「構造」と「補助」があります。構造オブジェクトクラスは、エントリの種類を定義します。1 つのエントリには、1 つの構造オブジェクトクラスしか指定できません。補助オブジェクトクラスは、それだけではエントリの種類を定義できませんが、構造オブジェクトクラスを指定すれば定義できます。たとえば、補助オブジェクトクラス uidObject を使えば、ディレクトリの任意のエントリに uid を割り当てることができます。
ディレクトリ情報は、エントリがツリー構造に編成された階層になっています。各エントリには必ず親エントリがあり、子エントリがある場合とない場合があります。階層の一番上は「ルートエントリ」といいます。
エントリは、その「識別名」(DN) で識別されます。識別名は一連の属性と値からなります。最初の属性とその値がエントリの「相対識別名」(RDN) で、残りの部分が親エントリの識別名です。識別名は、ディレクトリサービス全体で固有の値です。
図 1-1 に、ディレクトリ情報の構造例を示します。黒く塗ったエントリの識別名と相対識別名を示します。
識別名の一部となることができる属性を「名前付き属性」と呼びます。Sun Directory Services で提供するデフォルトのスキーマでは、名前付き属性は次のようになります。
countryName または c
localityName または l
organizationName または o
organizationalUnitName または ou
commonName または cn
channelName または ch
domainComponent または dc
stateOrProvinceName または st
streetAddress または street
uid
ref
別名リストを定義できます。別名リストのエントリは識別名 (DN) で識別され、エントリが表すディレクトリエントリ名 (別名のオブジェクト名) を持っています。別名リストとそのエントリは、同じルートエントリの下になければなりません。別名オブジェクトクラスの定義については、「オブジェクトクラスのリファレンス」を参照してください。
バインドと検索の操作では、ディレクトリが別名識別名を実際のエントリの識別名に変換するように指定できます。これを別名の「参照」と呼びます。これ以外の操作では、別名エントリを通常のエントリとして扱う必要があります。たとえば、別名のオブジェクトではなく、別名エントリそのものの相対識別名を変更する場合には、別名の参照は行いません。
別名エントリを伴う検索や読み取り操作の結果は、別名の参照を行うかどうかによって異なります。別名の参照は LDAP クライアントが指定します。別名の参照フラグには、次の 4 つの設定が可能です。
別名の参照をしない
エントリが別名エントリであっても、すべての操作が指定の識別名を持つエントリに適用されます。これがデフォルトの設定です。
ベースオブジェクトを検索するときに別名の参照を行う
ベースオブジェクトは、検索するエントリサブツリーの一番上のエントリです。この設定では、ベースオブジェクトとして別名を指定すると別名の参照が行われますが、検索の間に得られる他のすべての別名には別名の参照は行われません。
検索のときに別名の参照を行う
検索操作を行なっている場合には、検索で指定または使用するすべての別名エントリに対し、ベースオブジェクトを除き、別名の参照が行われます。検索の結果が別名エントリなら、別名エントリの代わりに別名のオブジェクトが返されます。そのため、識別名の内容に基づく検索で予期しない結果になることがあります。つまり、要求した識別名条件に含まれるエントリが別名であったため、それに対し別名の参照が行われ、返されたいくつかのエントリの中に要求した情報がないのです。
常に別名の参照を行う
操作で指定または使用するすべての別名に対し、別名の参照が行われます。
たとえば、ディレクトリに次の対のエントリがあるとします。
cn=Stan Smith, role=Personnel Administrator, ou=Personnel, o=XYZ, c=US |
|
次の属性を持つ |
objectclass=orgPerson |
|
cn=Stan Smith |
|
telephoneNumber=123 456 7890 |
|
mail=dtmail |
cn=personnel, o=XYZ, c=US |
|
次の属性を持つ |
objectclass=alias objectclass=aliasObject |
|
cn=personnel aliasedObjectName="cn=Stan Smith, role=Personnel Administrator, ou=Personnel, o=XYZ, c=US" |
検索時に別名の参照を行う場合、サブツリー o=XYZ、c=US で cn=personnel の電話番号を検索すると、Stan Smith の電話番号が得られます。別名の参照を行わない場合、電話番号は得られません。
役割に対し別名を定義すると、役割の担当者がしばしば変わるような場合 (たとえば、時間外に呼び出される当直のネットワークマネージャのような場合)、特に便利です。ユーザーはいつも同じ名前で照会できるからです。aliasedObjectName の値はスクリプトで変更できます。このスクリプトは、スケジュールに従って実行され、ldapmodify を呼び出して変更を行います。
ldapsearch で別名の参照の使い方を指定する方法については、ldapsearch(1) のマニュアルぺージを参照してください。
ディレクトリに対してある種の操作を行うには、ユーザーの認証が必要です。たとえば、ディレクトリ内容の変更やエントリの userPassword 属性の読み取りが行われるようなときです。許されるアクセスレベルは、バインドプロセスで確立されます。詳細は、「ディレクトリとのバインド」を参照してください。
バインド要求に指定された識別名が別名エントリの識別名であることがあります。別名の参照を使用する場合には、別名エントリの ailiasedObjectName に指定されている識別名とユーザーはバインドされ、その識別名を持つエントリに定義されているアクセス権が与えられます。
バインド操作での別名の参照は、LDAP サーバーに対して行う必要がある構成選択の 1 つです。別名の参照を使用せずに別名エントリの識別名でバインドすると、パスワード属性がないため、アクセスは拒否されます。これは、別名の参照を許可すると、ユーザーはパスワードなしにバインドできることを意味します。
Sun Directory Services に対し別名の参照を指定する方法については、「LDAP パラメータの構成」を参照してください。