LDAPのデータモデル
LDAP のデータは、DN で名前付けされたエントリのツリーとして表される。エントリの中身は属性の集合である。
| 用語 | 意味 |
|---|---|
| エントリ | LDAP に保存される 1 件のデータ |
| 属性 | エントリが持つ名前付きの値 |
| DN | エントリを一意に表す名前 |
| RDN | DN のうち、そのエントリ自身を表す一番左の名前 |
| DIT | Directory Information Tree。LDAP エントリ全体のツリー |
LDAP エントリは、ファイルパスに似た「場所」と、属性として保存される「中身」を分けて考えると理解しやすい。
dn: uid=ldapuser,ou=people,dc=example,dc=comobjectClass: inetOrgPersonobjectClass: posixAccountuid: ldapusercn: LDAP Usersn: UseruidNumber: 10000gidNumber: 10000homeDirectory: /home/ldapuserloginShell: /bin/bashDN は Distinguished Name の略で、エントリを一意に識別する名前である。
uid=ldapuser,ou=people,dc=example,dc=com右から左へ読むと、より大きな範囲から具体的なエントリへ進む。
dc=com └─ dc=example └─ ou=people └─ uid=ldapuserDN はエントリの住所に近いが、単なる表示用文字列ではない。LDAP 操作では、この DN を使って検索・変更・削除対象のエントリを指定する。
RDN は Relative Distinguished Name の略で、DN の中でその階層のエントリ名を表す部分である。
uid=ldapuser,ou=people,dc=example,dc=com└──────────── RDNこの例では uid=ldapuser が RDN である。
グループなら次のようになる。
dn: cn=developers,ou=groups,dc=example,dc=comcn: developersgidNumber: 10000この場合は cn=developers が RDN である。
DN内の uid=... と属性の uid: ...
Section titled “DN内の uid=... と属性の uid: ...”次の 2 つは似ているが役割が違う。
dn: uid=ldapuser,ou=people,dc=example,dc=comuid: ldapuser| 書き方 | 役割 |
|---|---|
uid=ldapuser |
DN の一部。エントリを名前付けする |
uid: ldapuser |
エントリの属性。検索やアプリケーション処理で使われる値 |
DN は「そのエントリがどこにあるか」を表す。属性は「そのエントリがどんな値を持つか」を表す。
同じ値が両方に出てくるのは、RDN を構成する属性値は、そのエントリの属性値として存在する必要があるからである。たとえば NSS クライアントがユーザー名を探すときは、DN 文字列ではなく uid 属性を検索する。
複数の属性からなるRDN
Section titled “複数の属性からなるRDN”RDN は 1 つの属性値だけでなく、複数の Attribute Value Assertion(AVA)から構成できる。
dn: uid=ldapuser+cn=LDAP User,ou=people,dc=example,dc=comuid: ldapusercn: LDAP Userこの例の RDN は uid=ldapuser+cn=LDAP User であり、RDN に使った uid と cn の両方の値がエントリ内に必要になる。通常の Linux ユーザー管理では単一値の uid=... で十分だが、RDN の定義自体は単一属性に限定されない。
DN内の cn=... と属性の cn: ...
Section titled “DN内の cn=... と属性の cn: ...”グループでも同じである。
dn: cn=developers,ou=groups,dc=example,dc=comcn: developers| 書き方 | 役割 |
|---|---|
cn=developers |
DN の一部。グループエントリを名前付けする |
cn: developers |
エントリの属性。グループ名として検索される値 |
getent group developers のような検索で重要になるのは、DN に cn=developers が含まれることではなく、クライアントの検索フィルターに合う属性があることだと考える。
DIT は Directory Information Tree の略で、LDAP エントリ全体の階層構造である。
典型的には次のように作る。
dc=example,dc=com ├─ ou=people │ └─ uid=ldapuser └─ ou=groups └─ cn=developersただし、 ou=people や ou=groups は必須ではない。Linux ユーザーとして扱われる本質は、配置場所ではなく、 RFC 2307 の objectClass と属性 、そして NSS / PAM クライアントの設定である。
- RFC 4512 LDAP のディレクトリ情報モデル、DN、RDN、属性、スキーマ。