LDAPスキーマ
スキーマ定義
ディレクトリサービスを提供するにあたり、各エントリにどのような情報を持たせるかを定義する必要があります。
OpenLDAPが扱うデータの型定義として、標準的に利用される定義ファイルが、予めOpenLDAPのソースコード中に格納(Openldap 2.4.23 では、openldap-2.4.23/servers/slapd/schema/README)されています。

OpenLDAPのスキーマでは、objectClassと属性を定義しています。
基本的な属性とオブジェクトクラスは、core.schema(コアスキーマ)に定義されており、OpenLDAPの動作に必要なスキーマが定義されています。
従って、core.schemaは必ず指定されていなければなりません。
その他のスキーマに関しては、登録しようとしているデータが必要とする型が含まれている定義ファイルを必要なだけ指定します。
目的にあった定義が見つからない場合、利用者自ら独自のスキーマファイルをルールに沿った上で作成し、利用することが可能です。
LDAPでユーザログイン情報を管理する際に良く利用されるのが、人の情報を保存するために使われるinetorgperson.schema(inetOrgPersonスキーマ)になります。
inetorgperson.schema を利用するためには、cosine.schema内で定義されている情報が必要となるため、併せて組み込む必要があります。
スキーマの書式
スキーマの書式に関する詳細は、RFC4512に規定されています。
【属性型定義】
属性型定義は、次の要素から構成されます。

属性型はAttributeTypeDescription構文で書かれています。
AttributeTypeDescriptionは、以下のBNF (Backus-Naur Form)に従って符号化されます。
リスト: 属性型(BNF)
AttributeTypeDescription = LPAREN WSP
	Numericoid                     ; 属性型のOID
	[ SP "NAME" SP qdescrs ]       ; 属性型の名前
	[ SP "DESC" SP qdstring ]      ; 簡単な説明
	[ SP "OBSOLETE" ]              ; 互換性に関する定義
	[ SP "SUP" SP oid ]            ; 基底属性型
	[ SP "EQUALITY" SP oid ]       ; 等価性の照合規則
	[ SP "ORDERING" SP oid ]       ; 順序性の照合規則
	[ SP "SUBSTR" SP oid ]         ; 部分文字列一致の照合規則
	[ SP "SYNTAX" SP noidlen ]     ; 属性構文
	[ SP "SINGLE-VALUE" ]          ; 単一値
	[ SP "COLLECTIVE" ]            ; 集合属性
	[ SP "NO-USER-MODIFICATION" ]  ; 利用者の書き換え禁止
	[ SP "USAGE" SP usage ]        ; 属性型種別
	extensions WSP RPAREN          ; 拡張
凡例は次の通りです。


属性型の名前(NAME)は「’(シングルクォーテーション)」で括ります。一つの属性型定義で複数の名前を指定することも可能です。
その場合、名前をスペース(空白)で区切り、「()」で括ります。
以下に、複数の名前を定義している例を挙げますのでご確認下さい。
リスト: 属性型(名前の複数定義例)
attributetype ( 2.5.4.4 NAME ( 'sn' 'surname' )
      DESC 'RFC2256: last (family) name(s) for which the entity is known by'
        SUP name )
- 簡単な説明(DESC)には、用途が分かるように簡潔に説明を記載します。
 - 互換性のための定義(OBSOLETE)では、互換性のために定義を残しておく場合に指定します。この場合、利用は推奨しないという意になります。
 - 基底属性型(SUP)に指定したオブジェクトクラスの属性を継承して利用できます。
 - 照合規則には、照合規則のOIDか照合規則の名前を指定します。
各照合規則のOID、及び名前は以下を参照して下さい。 



- 属性構文(SYNTAX)には、OIDを指定します。
 

キーワード(SINGLE-VALUE)は、単一値のみ指定可能な場合に設定します
(下記の例を参照して下さい)。デフォルトでは、複数の値を指定可能としています。
リスト: SINGLE-VALUEが設定された例
attributetype ( 2.5.4.6 NAME ( 'c' 'countryName' )
      DESC 'RFC4519: two-letter ISO-3166 country code'
        SUP name
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.11
        SINGLE-VALUE )
- キーワード(COLLECTIVE)は、複数のエントリに共通する値を持つ属性を指定します。デフォルトでは、未設定としています。
 - キーワード(NO-USER-MODIFICATION)は、LDAPのサービス利用者による値の更新を禁止し、システムのみが更新できることを表します。
デフォルトでは、値の更新が可能です。 - 属性型の種別(USAGE)を指定する場合、次の中から選択します。
デフォルトは、ユーザ属性となります。 

【オブジェクトクラス定義】
オブジェクトクラス定義は、次の要素から構成されます。

- オブジェクトクラス定義の構文をBNFで示すと次の通りとなります。
 
リスト: オブジェクトクラス定義(BNF)
ObjectClassDescription = LPAREN WSP
	Numericoid                  ; オブジェクトクラスのOID
	[ SP "NAME" SP qdescrs ]    ; オブジェクトクラスの名前
	[ SP "DESC" SP qdstring ]   ; 簡単な説明
	[ SP "OBSOLETE" ]           ; 互換性に関する定義
	[ SP "SUP" SP oids ]        ; 基底オブジェクトクラス
	[ SP kind ]                 ; オブジェクトクラスの種類
	[ SP "MUST" SP oids ]       ; 必須属性
	[ SP "MAY" SP oids ]        ; オプション属性
	extensions WSP RPAREN       ; 拡張
- オブジェクトクラスの名前(NAME)は「’」で括ります。一つの属性型定義で複数の名前を指定することも可能です。
その場合、名前をスペース(空白)で区切り、「()」で括ります。
以下に、複数の名前を定義している例を挙げますのでご確認下さい。 
リスト: 一つの属性定義での複数設定例
objectclass ( 0.9.2342.19200300.100.4.4
      NAME ( 'pilotPerson' 'newPilotPerson' )
      SUP person STRUCTURAL
      MAY ( userid $ textEncodedORAddress $ rfc822Mailbox $
              favouriteDrink $ roomNumber $ userClass $
              homeTelephoneNumber $ homePostalAddress $ secretary $
              personalTitle $ preferredDeliveryMethod $ businessCategory $
              janetMailbox $ otherMailbox $ mobileTelephoneNumber $
              pagerTelephoneNumber $ organizationalStatus $
              mailPreferenceOption $ personalSignature )
      )
- 簡単な説明 (DESC)には、用途が分かるように簡潔に説明を記載します。
 - 互換性のための定義 (OBSOLETE)では、互換性のために定義を残しておく場合に指定します。この場合、利用は推奨しないという意味になります。
 - オブジェクトクラスの定義の基となるオブジェクトクラスを基底オブジェクトクラス(SUP)といいます。派生オブジェクトクラスは基底オブジェクトクラスから必須属性、およびオプション属性を継承します。
 - オブジェクトクラスの種類 (kind)には、抽象型 (ABSTRACT)/ 構造型 (STRUCTURAL)/ 補助型 (AUXILIARY)のどれか一つを指定します。
 

- 必須属性(MUST)及びオプション属性(MAY)の指定には、属性型の名前かOIDを指定します。
複数の属性を指定する場合には、属性を$(ドル記号)で区切り、「()」で括ります。
以下に、複数の属性を定義している例を挙げますのでご確認下さい。 
リスト: 必須属性の複数指定例
objectclass ( 2.5.6.6 NAME 'person'
      DESC 'RFC2256: a person'
      SUP top STRUCTURAL
      MUST ( sn $ cn )
        MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )
【オブジェクトクラスの継承】
オブジェクトクラスの継承とは、既存のオブジェクトクラスから新しいオブジェクトクラスを作成する際の概念です。
- 新しいオブジェクトクラスは、親となるオブジェクトクラスのサブクラスとして定義されます。
 - サブクラスとは、他のクラスから継承するクラスのことであり、親オブジェクトより構成要素を継承します。 親オブジェクトクラスは、新しいオブジェクトクラスのスーパークラスとなります。
 - スーパークラスとは、他のオブジェクトクラスから、一つ以上の情報を継承される基となるクラスのことです。
 
例えば、「organizationalPerson」を基に、新しいオブジェクトクラス「inetOrgPerson」を作成しようとした際、以下の図のような関係となります。

なお、「inetOrgPerson」を利用する際、継承基となる「organizationalPerson」と「person」の必須属性の指定が必要となりますので、スキーマ設計の際にはオブジェクトクラスが持つ制約事項も確認する必要があります。



