5.6. 一意の数値を動的に割り当てる方法について

エントリー属性によっては、uidNumbergidNumber などの一意の番号が必要です。Directory Server は、DNA (Distributed Numeric Assignment) プラグインを使用して、指定された属性に一意の番号を自動的に生成して提供できます。
多くの状況では、UID/GID 番号や PIN 番号などの一意の数値の属性が必要になります。このサーバーは DNA プラグインインスタンスを使用して、数字を生成する属性を指定します。これにより、その属性がエントリーに追加されるたびに、一意の値を割り当てることができます。
注記
属性の一意性 は、DNA プラグインで維持されるとは限りません。プラグインは、重複しない範囲のみを割り当てますが、管理属性に手動で数字を割り当てることができ、手動で割り当てられた番号が一意であることを検証したり要求したりすることはありません。

5.6.1. Directory Server の一意の番号の管理方法

一意の番号を割り当てる際に問題となるのは、番号を生成することではなく、エントリーが複製されたときに他の割り当てられた番号と競合しないように、また、すべてのサーバーが割り当てにおいて十分な範囲の番号を持つように、番号を効果的に管理することです。
サーバーの DNA プラグインは、インスタンスが発行することのできる利用可能な番号の範囲を割り当てます。範囲の定義は非常にシンプルで、サーバーの次に利用可能な番号 (範囲の下限) と最大値 (範囲の最後) の 2 つの属性で設定されます。初期の下限範囲は、プラグインインスタンスを設定する際に設定されます。その後、下部の値はプラグインによって更新されます。利用可能な番号を範囲に分割すると、サーバーはすべて、互いに重複せずに、継続的に番号を割り当てることができます。
サーバーは、内部的にソートされた検索を実行し、次に指定された範囲がすでに取得されているかどうかを確認し、管理属性に適切な順序のマッチングルールと同じインデックスを割り当てる必要があります。
マルチサプライヤーのレプリケーションでは、各サプライヤーにしきい値を設定できるため、その範囲内の数字を使い果たしたら、他のサプライヤーから追加の範囲を要求できます。各サプライヤーは、別の設定エントリーで現在の範囲を追跡します。設定エントリーは他のすべてのサプライヤーに複製されるため、各サプライヤーが設定を確認して、新しい範囲で問い合わせるサーバーを見つけることができます。
個々のサーバーに設定した範囲と範囲設定エントリーは、Directory Server がエントリーに対して効率的に番号を 分散 する方法になります。
DNA プラグインは、1 つの属性タイプに、または一意の番号の 1 つの範囲から複数の属性タイプにまたがって、一意の番号を割り当てることができます。
これにより、属性に一意の数字を割り当てるためのオプションが複数提供されます。
  • 一意の番号の 1 つの範囲から、1 つの属性タイプに割り当てられた 1 つの番号。
  • 1 つのエントリーの 2 つの属性に割り当てられた同じ一意の番号。
  • 2 つの異なる属性は、同じ範囲の一意の数字から 2 つの異なる数字を割り当てていました。
多くの場合は、属性タイプごとに一意の番号を割り当てるだけで十分です。新しい従業員エントリーに employeeID を割り当てる際には、各従業員エントリーに一意の employeeID が割り当てられます。
ただし、同じ範囲の数字から複数の属性に一意の番号を割り当てることが役に立つ場合もあります。たとえば、uidNumbergidNumberposixAccount エントリーに割り当てる場合、両方の属性に同じ数を割り当てるように DNA プラグインを設定できます。
DNA プラグインは、常にディレクトリーツリーの特定領域 (スコープ) と、そのサブツリー内の特定のエントリータイプ (フィルター) に適用されます。
よくあるのは、まったく別のユーザーがディレクトリーツリーの異なるブランチに保存されていることです。たとえば、ホストサービスは、ou=Example Corp. ブランチに 1 つのクライアントのユーザーがあり、ou=Acme Company ブランチに別のクライアントのユーザーが存在する場合があります。この場合、割り当てられた番号は サブツリー内 で一意である必要がありますが、ディレクトリー全体で一意である必要はありません。この場合、ou=Example Corp. ブランチの Barbara Jensen に、herエントリーに uidNumber:5 が、ou=Acme Company ブランチに uidNumber:5 が含まれるのは、これらは別々の組織であるためです。特定のサブツリーへの範囲の適用は、dnaScope: ou=people,dc=example,dc=com のように DNA スコープに設定されます。
一意の番号は、接頭辞を使用して異なる種類のユーザーエントリーを特定することで、範囲間で区別することもできます。たとえば、DNA 接頭辞が acme に設定されている場合、Acme Company ブランチの一意の番号には、uid: acme 5 のように、番号の前に acme があります。

5.6.2. DNA を使用した値の属性への割り当て

Directory Server が属性値の生成を処理する方法が複数あります。
最も単純なケースでは、属性のない unique-number 属性を必要とするオブジェクトクラスのディレクトリーにユーザーエントリーが追加されます。値を持たない管理属性を追加する (または必要とする) と、DNA プラグインによる値の割り当てが発生します。エントリーが追加されると、プラグインは、プラグインに設定されたスコープおよびフィルターに基づいて、エントリーが定義された範囲に一致するかどうかを確認します。エントリーが範囲と一致し、その範囲に対して DNA が管理している属性が、追加されるエントリーにない場合は、DNA プラグインは次の値を割り当てます。このオプションは、一意の値を 1 つの属性に割り当てるように DNA プラグインが設定されている場合に限り機能します。
たとえば、posixAccount オブジェクトクラスには uidNumber 属性が必要です。uidNumber 属性が DNA プラグインで管理されており、フィルターの範囲内で uidNumber 属性なしでユーザーエントリーが追加されると、サーバーは新しいエントリーをチェックし、マネージドの uidNumber 属性が必要であることを確認し、自動的に割り当てられた値で属性を追加します。
 ldapmodify -a -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

 dn: uid=jsmith,ou=people,dc=example,dc=com
 objectClass: top
 objectClass: person
 objectClass: posixAccount    
 uid: jsmith
 cn: John Smith
 ....
プラグインは不足している属性を処理し、次に利用可能な番号をサーバーに要求し、エントリーの値を提供します
同様の管理可能なオプションは、マジック番号 を使用することです。このマジック番号は、マネージド属性のテンプレート値であり、数字または単語などのサーバーの範囲外のもので、プラグインが新しい割り当て値に置き換える必要があると認識しているものです。その番号でエントリーが追加され、エントリーが設定された DNA プラグインの範囲およびフィルター内にある場合は、マジック番号を使用することで、プラグインが自動的にトリガーされ、新しい値を生成します。
DNA プラグインが uidNumbergidNumber の両方に同じ一意の番号を posixAccount エントリーに割り当てるように設定されていると、DNA プラグインは同じ番号を両方の属性に割り当てます。これを行うには、マジック番号を指定して、変更操作に両方の管理属性を渡します。以下に例を示します。
 ldapmodify -a -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

 dn: uid=jsmith,ou=people,dc=example,dc=com
 objectClass: top
 objectClass: person
 objectClass: posixAccount
 uid: jsmith
 cn: John Smith
 uidNumber: magic    
 gidNumber: magic    
 ....
マジック番号は、LDIF からエントリーをインポートする場合や、複数の異なる属性に対して一意の番号を生成するために DNA プラグインをトリガーする際に、非常に便利です。
DNA プラグインは、新規の一意の値のみを生成します。DNA プラグインが制御する属性に特定の値を使用するためにエントリーを追加または変更した場合には、指定した番号が使用されます。DNA プラグインは、その番号を上書きしません。
注記
属性の一意性 は、DNA プラグインで維持されるとは限りません。プラグインは、重複しない範囲のみを割り当てますが、管理属性に手動で数字を割り当てることができ、手動で割り当てられた番号が一意であることを検証したり要求したりすることはありません。

5.6.3. レプリケーションでの DNA プラグインの使用

マルチサプライヤーのレプリケーションでは、サーバーが参照するエントリーが 2 つあります。
  • DNA プラグインのマネージド範囲
  • サーバーで利用可能な範囲に関する情報を保存する共有設定エントリー
プラグインインスタンスが作成されると、DNA プラグインによって、サプライヤー設定のある共有設定エントリーの下にエントリーが自動的に作成されます。以下に例を示します。
dn: dnaHostname=ldap1.example.com+dnaPortNum=389,cn=Account UIDs,ou=Ranges,dc=example,dc=com
objectClass: extensibleObject
objectClass: top
dnahostname: ldap1.example.com
dnaPortNum: 389
dnaSecurePortNum: 636
dnaRemainingValues: 1000
サーバーに新しい番号の範囲が必要な場合は、コンテナーエントリーの下にある設定エントリーを検索します。利用可能な範囲が最も大きいサーバーを見つけると、その範囲の一部を割り当ててもらうために拡張操作要求を送信します。2 番目のサーバーが同意すると、2 番目のサーバーが要求サーバーへ新しい範囲の割り当てを送信します。