18.4. LDAP の関連用語とデータ格納方式

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  8231 2007-09-19 17:38 /etc/openldap/schema/corba.schema
-r--r--r-- 1 root root 19784 2007-09-19 17:38 /etc/openldap/schema/core.schema
-r--r--r-- 1 root root 74103 2007-09-19 17:38 /etc/openldap/schema/cosine.schema
-rw-r--r-- 1 root root  5114 2007-10-25 19:45 /etc/openldap/schema/dnszone.schema
-r--r--r-- 1 root root  1553 2007-09-19 17:38 /etc/openldap/schema/dyngroup.schema
-r--r--r-- 1 root root  4541 2007-09-19 17:38 /etc/openldap/schema/extension.schema
-r--r--r-- 1 root root  6360 2007-09-19 17:38 /etc/openldap/schema/inetorgperson.schema
-r--r--r-- 1 root root 13984 2007-09-19 17:38 /etc/openldap/schema/java.schema
-r--r--r-- 1 root root  2471 2007-09-19 17:38 /etc/openldap/schema/misc.schema
-r--r--r-- 1 root root  7723 2007-09-19 17:38 /etc/openldap/schema/nis.schema
-r--r--r-- 1 root root  1601 2007-09-19 17:38 /etc/openldap/schema/openldap.schema
-r--r--r-- 1 root root 19689 2007-09-19 17:38 /etc/openldap/schema/ppolicy.schema
-rw-r--r-- 1 root root 19424 2007-10-19 21:46 /etc/openldap/schema/samba.schema

例えば、inetOrgPerson というオブジェクトクラスは inetorgperson.schema で定義されています。inetOrgPerson は、氏名、メールアドレス、電話番号など一般的なアドレス帳で使用される属性が含まれているオブジェクトクラスです。ただし、inetorgperson.schema ですべての属性を定義しているわけではなく、inetOrgPerson は core.shema ファイルで定義されている他のオブジェクトクラス organizationalPerson に属性を追加したものです。また organizationalPerson 自体も person という他のオブジェクトクラスに属性を追加することで定義されています。このようにオブジェクトクラスは、他のオブジェクトクラスの設定を継承して定義することが可能です。 LDAP サービスで使用される代表的な属性には以下のものがあげられます。

表 18-3. LDAP サービスで使用される代表的な属性

属性名意味
dcドメイン名の要素(Domain Component)
o会社名、組織名(Organization)
ou部署名(Organization Unit)
uidユーザー ID(UserID)
cn氏名(Common Name)
sn姓(Surname)
givenName
mailメールアドレス

また、LDAP で認証サーバーを構築する場合に使用される属性には以下のものがあります。これらの属性は、通常、ローカルの /etc/passwd や /etc/shadow ファイルに設定されるものですが、LDAP サーバーでユーザー情報を一元管理すると、LDAP クライアントは登録したこれらの認証情報を参照するようになります。

表 18-4. 認証サーバーを構築する場合に使用される属性

属性名意味
shadowLastChange1970/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)については、項18.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 でディレクトリサーバーを構築するには、はじめに、管理したい情報は何か、そしてどの属性を使用して、どのような構成のディレクトリツリーでデータ(エントリ)を管理するのかといった設計が非常に重要になります。