3.4. スキーマのカスタマイズ
Directory Server の Web コンソールを使用して属性とオブジェクトクラスを追加することで、標準スキーマを拡張できます。LDIF ファイルを作成し、スキーマ要素を手動で追加することもできます。
スキーマをカスタマイズする際には、次のルールが適用できます。
- スキーマはシンプルに保つ必要があります。
- スキーマ要素を再利用する必要があります。
- 各オブジェクトクラスに定義される必須属性の数を最小限に抑える必要があります。
- 複数のオブジェクトクラスまたは属性を同じ目的 (データ) に定義しないでください。
- 属性またはオブジェクトクラスの既存の定義は変更しないでください。
スキーマをカスタマイズするときに、標準スキーマを削除または置き換えることはできません。これを行うと、他のディレクトリーまたは LDAP クライアントアプリケーションとの互換性の問題が発生する可能性があります。
カスタムオブジェクトクラスおよび属性は 99user.ldif
ファイルで定義されます。各インスタンスは、/etc/dirsrv/slapd-<instance_name>/schema/
ディレクトリーに独自の 99user.ldif
ファイルを維持します。カスタムスキーマファイルを作成し、スキーマをサーバーに動的に再ロードすることもできます。
特定のオブジェクトクラスが組織に関する特殊な情報を格納できない場合はスキーマを拡張できますが、Directory Server で提供されるオブジェクトクラスと属性は、最も一般的な企業のニーズを満たす必要があります。また、スキーマを拡張して、LDAP 対応アプリケーションの固有のデータニーズに必要なオブジェクトクラスと属性をサポートすることもできます。
3.4.1. オブジェクト識別子の割り当て リンクのコピーリンクがクリップボードにコピーされました!
各 LDAP オブジェクトクラスまたは属性に一意の名前と object identifier
(OID) を割り当てる必要があります。スキーマを定義する場合、要素には組織固有のベース OID が必要です。別の階層レベルを追加して、属性とオブジェクトクラスの新規ブランチを作成します。スキーマで OID を取得して割り当てるには、以下のステップが必要です。
-
Internet Assigned Numbers Authority
(IANA) または国家的な組織から OID を取得します。国によっては、企業に OID がすでに割り当てられています。 - OID 割り当てを追跡する OID レジストリーを作成します。OID レジストリーは、OID と、ディレクトリースキーマで使用される OID の説明のリストです。これにより、OID が複数の目的に使用されないようにします。次に、スキーマに OID レジストリーをパブリッシュします。
-
スキーマ要素に対応するために OID ツリーでブランチを作成します。OID ブランチまたはディレクトリースキーマの下に、属性に OID.
1
、オブジェクトクラスに OID.2
を使用して、少なくとも 2 つのブランチを作成します。必要に応じて新しいブランチを追加し、カスタム一致ルールまたはコントロール (OID.`3 など) を定義します。
3.4.2. 新規オブジェクトクラスを定義するストラテジー リンクのコピーリンクがクリップボードにコピーされました!
新しいオブジェクトクラスは次の 2 つの方法で作成できます。
- 属性を追加できるオブジェクトクラス構造ごとに 1 つずつ、新しいオブジェクトクラスを作成します。
- ディレクトリー用に作成されたすべてのカスタム属性をサポートする単一のオブジェクトクラスを作成します。このオブジェクトクラスは、補助オブジェクトクラスとして定義することで作成できます。
2 つの方法を組み合わせることもできます。たとえば、exampleDateOfBirth
、examplePreferredOS
、exampleBuildingFloor
、および exampleVicePresident
という属性を作成するとします。簡単なソリューションは、これらの属性のサブセットを許可する複数のオブジェクトクラスを作成することです。
-
examplePerson
オブジェクトクラスでは、exampleDateOfBirth
とexamplePreferredOS
が許可されます。examplePerson
の親はinetOrgPerson
です。 -
exampleOrganization
オブジェクトクラスでは、exampleBuildingFloor
とexampleVicePresident
が許可されます。exampleOrganization の親はorganization
オブジェクトクラスです。
新しいオブジェクトクラスは、以下のように LDAPv3 スキーマ形式で表示されます。
objectclasses: ( 2.16.840.1.117370.999.1.2.3 NAME 'examplePerson' DESC 'Example Person Object Class' SUP inetorgPerson MAY (exampleDateOfBirth $ examplePreferredOS) ) objectclasses: ( 2.16.840.1.117370.999.1.2.4 NAME 'exampleOrganization' DESC 'Organization Object Class' SUP organization MAY (exampleBuildingFloor $ exampleVicePresident) )
objectclasses: ( 2.16.840.1.117370.999.1.2.3 NAME 'examplePerson' DESC 'Example Person Object Class'
SUP inetorgPerson MAY (exampleDateOfBirth $ examplePreferredOS) )
objectclasses: ( 2.16.840.1.117370.999.1.2.4 NAME 'exampleOrganization' DESC 'Organization Object Class'
SUP organization MAY (exampleBuildingFloor $ exampleVicePresident) )
あるいは、これらすべての属性を許可する単一のオブジェクトクラスを作成し、それらを必要とするエントリーで使用することもできます。単一のオブジェクトクラスは以下のようになります。
objectclasses: (2.16.840.1.117370.999.1.2.5 NAME 'exampleEntry' DESC 'Standard Entry Object Class' SUP top AUXILIARY MAY (exampleDateOfBirth $ examplePreferredOS $ exampleBuildingFloor $ exampleVicePresident) )
objectclasses: (2.16.840.1.117370.999.1.2.5 NAME 'exampleEntry' DESC 'Standard Entry Object Class' SUP top
AUXILIARY MAY (exampleDateOfBirth $ examplePreferredOS $ exampleBuildingFloor $ exampleVicePresident) )
新しい exampleEntry
オブジェクトクラスには AUXILIARY
というマークが付き、構造的なオブジェクトクラスとは無関係に任意のエントリーと共に使用できることを意味します。
組織環境に応じて新しいオブジェクトクラスを編成できます。新しいオブジェクトクラスの実装を決定するときは、次の点を考慮してください。
- スキーマに 2 つまたは 3 つ以上のオブジェクトクラスを追加する場合は、単一のオブジェクトクラスを使用する必要があります。
- 複数のオブジェクトクラスには厳密なデータ設計が必要です。厳密なデータ設計により、すべてのデータが置かれるオブジェクトクラス構造に注意を払うことが強制されます。これには、便利な面と面倒な面があります。
-
データを人やアセットエントリーなどの複数のタイプのオブジェクトクラスに適用できる場合は、単一のオブジェクトクラスを使用してデータを使用できます。たとえば、person エントリーと group エントリーの両方にカスタムの
preferredOS
属性を設定できます。単一のオブジェクトクラスは、両方のタイプのエントリーでこの属性を許可できます。 -
新しいオブジェクトクラスでは必須属性を避ける必要があります。新しいオブジェクトクラスの属性に対して
allow
ではなくrequire
を指定すると、スキーマが柔軟性を失う可能性があります。新しいオブジェクトクラスを定義したら、許可および必要な属性、ならびに属性を継承するオブジェクトクラスを決定します。
3.4.3. 新規属性を定義する際のストラテジー リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションの互換性と長期的なメンテナンスの両方のために、標準属性を使用する必要があります。デフォルトのディレクトリースキーマにすでに存在する属性を検索し、それを新しいオブジェクトクラスで使用するか、Directory Server スキーマガイドを確認する必要があります。ただし、標準スキーマに必要な情報がすべて含まれていない場合は、新しい属性と新しいオブジェクトクラスを追加します。
たとえば、person エントリーでは、デフォルトで person、organizationalPerson
、または inetOrgPerson
オブジェクトクラスがサポートするよりも多くの属性が必要になる可能性があります。標準の Directory Server スキーマ内には、生年月日を保存するための属性は存在しません。新しい補助オブジェクトクラス examplePerson
内の許可属性として、新しい属性 dateOfBirth
を作成して設定できます。
attributetypes: ( dateofbirth-oid NAME 'dateofbirth' DESC 'For employee birthdays' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Example defined') objectclasses: ( 2.16.840.1.117370.999.1.2.3 NAME 'examplePerson' DESC 'Example Person Object Class' SUP inetorgPerson MAY (exampleDateOfBirth $ cn) X-ORIGIN 'Example defined')
attributetypes: ( dateofbirth-oid NAME 'dateofbirth' DESC 'For employee birthdays'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Example defined')
objectclasses: ( 2.16.840.1.117370.999.1.2.3 NAME 'examplePerson' DESC 'Example Person Object Class'
SUP inetorgPerson MAY (exampleDateOfBirth $ cn) X-ORIGIN 'Example defined')
標準スキーマ要素にカスタム属性を追加または削除することはできません。ディレクトリーにカスタム属性が必要な場合は、カスタムオブジェクトクラスを追加してそれらを含めます。
3.4.4. スキーマ要素の削除 リンクのコピーリンクがクリップボードにコピーされました!
Directory Server にデフォルトで含まれているスキーマ要素を削除することはできません。未使用のスキーマ要素は、操作や管理のオーバーヘッドを表しません。標準の LDAP スキーマの一部を削除すると、Directory Server およびその他のディレクトリー対応アプリケーションの今後のインストールとの間で互換性の問題が発生する可能性があります。
ただし、使用されていないカスタムスキーマ要素は削除できます。スキーマからオブジェクトクラス定義を削除する前に、オブジェクトクラスを使用して各エントリーを変更します。最初に定義を削除すると、オブジェクトクラスを使用するエントリーが後で変更されなくなる可能性があります。不明なオブジェクトクラス値がエントリーから削除されない限り、変更されたエントリーのスキーマチェックも失敗します。
3.4.5. カスタムスキーマファイルの作成 リンクのコピーリンクがクリップボードにコピーされました!
Directory Server で提供される 99user.ldif
ファイルに加えて、Directory Server 用のカスタムスキーマファイルを作成して使用することができます。これらのスキーマファイルには、組織固有の新しいカスタム属性とオブジェクトクラスが含まれます。新しいスキーマファイルは、スキーマディレクトリー /etc/dirsrv/slapd-instance_name/schema/
に配置されています。標準属性とオブジェクトクラスはすべて、カスタムスキーマ要素が読み込まれた後にのみロードされます。
カスタムスキーマファイルは、数字順またはアルファベット順で 99user.ldif
より大きくすることはできません。
カスタムスキーマファイルを作成したら、次の方法でスキーマの変更をすべてのサーバーに配布できます。
-
これらのカスタムスキーマファイルをインスタンスのスキーマディレクトリー
/etc/dirsrv/slapd-instance/schema
に手動でコピーしてスキーマをロードしたり、サーバーを再起動したり、schema-reload.pl
スクリプトを実行してスキーマを動的に再ロードしたりすることができます。 -
Web コンソールなどの LDAP クライアントまたは
ldapmodify
コマンドを使用して、サーバー上のスキーマを変更できます。 -
レプリケーションでは、レプリケートされたスキーマ要素はすべてコンシューマーサーバーの
99user.ldif
ファイルにコピーされます。90example_schema.ldif
などのカスタムスキーマファイルにスキーマを維持するには、このファイルを手動でコンシューマーサーバーにコピーする必要があります。レプリケーションは、スキーマファイルをコピーしません。
これらのカスタムスキーマファイルをすべてのサーバーにコピーしない場合は、サプライヤーサーバー上のスキーマに変更が加えられたときにのみ、スキーマ情報がコンシューマーサーバーにレプリケートされます。スキーマの定義がまだ存在しないコンシューマーサーバーにレプリケートされると、それらは 99user.ldif
ファイルに保存されます。
このディレクトリーは、スキーマ定義の保存場所を追跡しません。スキーマがサプライヤーサーバー上でのみ維持される場合は、コンシューマーの 99user.ldif
ファイルにスキーマ要素を保存できます。
3.4.6. カスタムスキーマのベストプラクティス リンクのコピーリンクがクリップボードにコピーされました!
次の提案は、互換性があり管理しやすいカスタムスキーマを定義するのに役立ちます。
スキーマファイルの命名
カスタムスキーマファイルには、数字順とアルファベット順で 99user.ldif
より小さい名前を付けます。99user.ldif file
には、X-ORIGIN
値が 'user defined' の属性が含まれています。Directory Server は、すべての 'ユーザー定義' スキーマ要素を、数字順、次にアルファベット順に、最も名前の大きいファイルに書き込みます。スキーマファイルの名前が 99zzz.ldif
で、スキーマが更新されると、X-ORIGIN
値が 'user defined' であるすべての属性が 99zzz.ldif
ファイルに書き込まれます。その結果、重複した情報を含む LDIF ファイルと、99zzz.ldif file
内の一部の情報が消去される可能性があります。
カスタムスキーマファイルに名前を付ける場合は、[00-99]yourName.ldif
という命名形式を使用します。
Origin としての 'user defined' の使用
カスタムスキーマファイル (例: 60example.ldif
) の X-ORIGIN
フィールドでは 'user defined' を使用しないでください。これは、スキーマが LDAP 経由で追加されるときに、Directory Server によって 'user defined' が内部的に使用されるためです。
カスタムスキーマ要素を 99user.ldif
に手動で直接追加する場合は、X-ORIGIN
の値として 'user defined' を使用します。異なる X-ORIGIN
値が設定されている場合、サーバーはそれを上書きする可能性があります。
値が 'user defined' の X-ORIGIN
を使用すると、Directory Server によって 99user.ldif
ファイル内のスキーマ定義が削除されなくなります。
以下に例を示します。
attributetypes: ( exampleContact-oid NAME 'exampleContact' DESC 'Example Corporate contact' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Example defined')
attributetypes: ( exampleContact-oid NAME 'exampleContact'
DESC 'Example Corporate contact'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
X-ORIGIN 'Example defined')
Directory Server がスキーマエントリーを読み込むと、以下のように表示されます。
attributetypes: ( exampleContact-oid NAME 'exampleContact' DESC 'Example Corporate contact' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN ('Example defined' 'user defined') )
attributetypes: ( exampleContact-oid NAME 'exampleContact'
DESC 'Example Corporate contact'
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
X-ORIGIN ('Example defined' 'user defined') )
オブジェクトクラスの前の属性の定義
新しいスキーマ要素を追加するときは、オブジェクトクラスで使用される前にすべての属性を定義します。属性とオブジェクトクラスを同じスキーマファイルに定義できます。
単一ファイルでのスキーマの定義
各カスタム属性またはオブジェクトクラスを 1 つのスキーマファイルに定義して、サーバーが最後に作成されたスキーマをロードするときに以前の定義がオーバーライドされるのを阻止します。サーバーは、まず数値順に、次にアルファベット順にスキーマをロードします。重複するファイルにスキーマを確保しない方法を決定します。
- 各スキーマファイルにどのスキーマ要素が含まれているかに注意してください。
-
スキーマファイルの命名および更新には注意が必要です。スキーマ要素が LDAP ツールを使用して編集されると、変更は最後のファイルにアルファベット順に自動的に書き込まれます。ほとんどのスキーマ変更は、
60example.ldif
などのカスタムスキーマファイルではなく、デフォルトの99user.ldif
ファイルに書き込まれます。99user.ldif
ファイル内のスキーマ要素は、他のスキーマファイル内の重複する要素をオーバーライドします。 -
Web コンソールを使用してスキーマを管理する場合は、すべてのスキーマ定義を
99user.ldif
ファイルに追加します。