LDAP には、データを管理するバックエンドデータベースにいくつかの種類がありますが、通常は、LDBM と呼ばれるデータベースでツリー状にデータを管理します。このときディレクトリサービスの基点となるディレクトリは、ベース DN(suffix)と呼ばれています。そして、このベース DN を基点にツリー状にデータを格納していきますが、LDAP ではそれらのデータをエントリと呼びます。また、各エントリは DN(Distinguished Name)と呼ばれる識別名によって一意に識別されます。

エントリには属性が含まれます。属性とは、エントリに関連付けられた情報を意味します。例えば、エントリが組織であるとすると、そのエントリの属性には、会社名が考えられます。また、エントリが人や社員であるとすると、そのエントリの属性には氏名、メールアドレス、内線番号などが考えられます。

このようにエントリに何の属性を含めるかを定義するために、オブジェクトクラスと呼ばれる特殊な属性をエントリに指定します。オブジェクトクラスとは属性の集合体であり、エントリにオブジェクトクラスを指定することにより、そのオブジェクトクラスで定義されている属性をエントリで使用できるようになります。なお、オブジェクトクラスには、必須の属性とオプションの属性があり、必ずそのエントリで使用しなければならないという属性も存在します。オブジェクトクラスは、ユーザーが自由に作成することもできますが、一般的に利用されている標準的なオブジェクトクラスは、OpenLDAP に含まれていますので、通常はそれらを使用します。オブジェクトクラスを定義したファイルはスキーマファイルと呼ばれており、/etc/openldap/schema/ ディレクトリに格納されています。
# ls -l /etc/openldap/schema/*.schema -r--r--r-- 1 root root 8253 Sep 8 01:14 /etc/openldap/schema/corba.schema -r--r--r-- 1 root root 19592 Sep 8 01:14 /etc/openldap/schema/core.schema -r--r--r-- 1 root root 74049 Sep 8 01:14 /etc/openldap/schema/cosine.schema -r--r--r-- 1 root root 1272 Sep 8 01:14 /etc/openldap/schema/dyngroup.schema -r--r--r-- 1 root root 4541 Sep 8 01:14 /etc/openldap/schema/extension.schema -r--r--r-- 1 root root 6360 Sep 8 01:14 /etc/openldap/schema/inetorgperson.schema -r--r--r-- 1 root root 13984 Sep 8 01:14 /etc/openldap/schema/java.schema -r--r--r-- 1 root root 2409 Sep 8 01:14 /etc/openldap/schema/misc.schema -r--r--r-- 1 root root 7691 Sep 8 01:14 /etc/openldap/schema/nis.schema -r--r--r-- 1 root root 1601 Sep 8 01:14 /etc/openldap/schema/openldap.schema -rw-r--r-- 1 root root 15560 Sep 22 17:14 /etc/openldap/schema/samba.schema |
例えば、inetOrgPerson というオブジェクトクラスは inetorgperson.schema で定義されています。inetOrgPerson は、氏名、メールアドレス、電話番号など一般的なアドレス帳で使用される属性が含まれているオブジェクトクラスです。ただし、inetorgperson.schema ですべての属性を定義しているわけではなく、inetOrgPerson は core.shema ファイルで定義されている他のオブジェクトクラス organizationalPerson に属性を追加したものです。また organizationalPerson 自体も person という他のオブジェクトクラスに属性を追加することで定義されています。このようにオブジェクトクラスは、他のオブジェクトクラスの設定を継承して定義することが可能です。 LDAP サービスで使用される代表的な属性には以下のものがあげられます。
表 17-3. LDAP サービスで使用される代表的な属性
| 属性名 | 意味 |
|---|---|
| dc | ドメイン名の要素(Domain Component) |
| o | 会社名、組織名(Organization) |
| ou | 部署名(Organization Unit) |
| uid | ユーザー ID(UserID) |
| cn | 氏名(Common Name) |
| sn | 姓(Surname) |
| givenName | 名 |
| メールアドレス |
また、LDAP で認証サーバーを構築する場合に使用される属性には以下のものがあります。これらの属性は、通常、ローカルの /etc/passwd や /etc/shadow ファイルに設定されるものですが、LDAP サーバーでユーザー情報を一元管理すると、LDAP クライアントは登録したこれらの認証情報を参照するようになります。
表 17-4. 認証サーバーを構築する場合に使用される属性
| 属性名 | 意味 |
|---|---|
| shadowLastChange | 1970/01/01 から最後にパスワードを変更した日までの日数 |
| shadowMax | ユーザーに新しいパスワードを保持させる日数 |
| shadowMin | ユーザーが同じパスワードを使用できる日数 |
| shadowWarning | パスワードの使用期限が近づいたことを、何日前からユーザーに通知するかを指定 |
| loginshell | ログインシェル |
| uidNumber | ユーザー ID |
| gidNumber | グループ ID |
| homeDirectory | ユーザーのホームディレクトリ |
| userPassword | ユーザーのパスワード |
LDAP のディレクトリツリーには、各エントリを一意に識別するために、これらの属性を使用した識別名を定義します。この識別名は、DN(Distinguished Name)と呼ばれ、エントリに指定した属性をカンマ(,)で連結することによって表します。たとえば、ディレクトリツリーの基点となるベース DN(suffix)を LDAP サーバーに登録するには、LDIF と呼ばれるフォーマットで以下のように定義します。LDIF(LDAP Data Interchange Format)については、項17.5.2 で解説します。
dn: dc=turbolinux,dc=example,dc=com objectclass: dcObject objectClass: organization dc: turbolinux o: turbolinux |
最初の行が、エントリの識別名 DN(Distinguished Name)の定義です。この例では、dn: dc=turbolinux,dc=example,dc=com を定義してます。DN は、エントリで定義された属性であれば、どの属性を使用しても構いません。しかし、エントリの DN をインターネット上において一意にするために、通常は、DNS サービスのドメインと同じ識別名をベース DN(suffix)に指定します。このエントリでは、dcObject と organization という 2 つのオブジェクトクラスの使用を定義し、dc(Domain Component)属性の値に turbolinux、o(Organization)属性の値に Turbolinux を指定していますので、これらの属性を DN に使用することができます。したがって、dn: o=turbolinux,dc=example,dc=com のように o 属性を使用してベース DN のエントリを定義することも可能です。
以下は架空の会社(ドメイン名 example.com)の組織図を LDAP ツリーであらわしたものです。

このように、OpenLDAP でディレクトリサーバーを構築するには、はじめに、管理したい情報は何か、そしてどの属性を使用して、どのような構成のディレクトリツリーでデータ(エントリ)を管理するのかといった設計が非常に重要になります。