8. データベース作成/管理ツール

この節では、slapd データベースを 0 から作成する方法と、問題が発生したときのトラブルシューティングについて説明します。データベースを作成するのには二つの方法があります。その一つは LDAP を用いてオンラインでデータベースを作成するというものです。この方法では、単純に slapd を起動し、適当な LDAP クライアントを用いてエントリを追加します。この方法は、比較的小さなデータベース(用件に応じて数百から千程度)の作成に適しています。この方法は更新をサポートしているデータベース種別で有効です。

データベースを作成するもう一つの方法は、slapd 用に提供される特殊なユーティリティを用いてオフラインで行うというものです。この方法は、LDAP を使っていては耐えられないほどの長い時間がかかってしまうような何千以上ものエントリがある場合、もしくはデータベースの作成中にデータベースへのアクセスが無いようにすることを保証したい場合に最適な方法です。すべてのデータベース種別がこのユーティリティをサポートしているわけではないことに注意してください。

8.1. LDAP でデータベースを作成する方法

この方法では、既にあるデータベースにエントリを追加するのと同様に適当な LDAP クライアント(たとえば ldapadd(1))を使います。 slapd(8) を始動する前に設定ファイル中の次のディレクティブを設定しておいてください。

        suffix <dn>

一般データベースディレクティブの節で説明したように、このディレクティブは、このデータベースにどのエントリを格納するかを定義します。これは作成しようとしているサブツリーのルートの DN に設定します。たとえば次のように設定します。

        suffix "dc=example,dc=com"

インデックスファイルを作成するディレクトリを設定してください。

        directory <directory>

たとえば次のように設定します。

        directory /usr/local/var/openldap-data

このディレクトリを作成するときには、slapd が書き込めるような許可を与えておくことが必要です。

エントリを追加する権限を持ったディレクトリユーザで slapd に接続できるように slapd を設定する必要があります。まさにこの目的のために特殊なスーパユーザ または root ユーザをサポートするようにディレクトリを設定できます。これはデータベース定義中の二つのディレクティブを用いて行います。

        rootdn <dn>
        rootpw <passwd>

たとえば次のように設定します。

        rootdn "cn=Manager,dc=example,dc=com"
        rootpw secret

これらのディレクティブは、データベースのスーパユーザエントリ (すなわち何でもできるエントリ)として認証するのに使う DN とパスワードを指定します。これで指定する DN とパスワードは、実際にこの名前のエントリがあるか、そして指定のパスワードを持っているかにかかわらず常に有効です。これは、まだ何もエントリが無い状態での認証とエントリの追加をどうするかという「鶏と卵」問題を解決します。

最後に、データベース定義に望むインデックス定義を含めます。

        index {<attrlist> | default} [pres,eq,approx,sub,none]

たとえば cn, sn, uid, objectclass 属性にインデックスをつけるには、次のように index ディレクティブを使います。

        index cn,sn,uid pres,eq,approx,sub
        index objectClass eq

これは,属性 cn, sn, uid について存在(presence),等価性(equality),近似(approximate),部分文字列(substring)のインデックスを作成し,属性 objectClass について等価性のインデックスを作成します.すべての種類のインデックスがあらゆる属性型で使えるわけでないので注意してください。このディレクティブについてより詳しくはslapd の設定ファイルの章を参照してください。

ここまで設定したら slapd を起動して、あなたの LDAP クライアントで接続して、エントリの追加を開始してください。たとえば、組織(organization)エントリと役職(organizational role)エントリを ldapadd ツールを用いて追加するには、その内容を記述した entries.ldif という LDIF ファイルを作成します。

        # Organization for Example Corporation
        dn: dc=example,dc=com
        objectClass: dcObject
        objectClass: organization
        dc: example
        o: Example Corporation
        description: The Example Corporation

        # Organizational Role for Directory Manager
        dn: cn=Manager,dc=example,dc=com
        objectClass: organizationalRole
        cn: Manager
        description: Directory Manager

実際にエントリを作成するには次のようにコマンドを使います。

        ldapadd -f entries.ldif -x -D "cn=Manager, dc=example, dc=com" -w secret

上のコマンド利用例は上記の設定例を前提にしています。

8.2. オフラインでデータベースを作成する方法

データベースを作成する第2の方法は、後述する slapd データベースツールを用いてオフラインで行うことです。何千以上ものエントリを格納する必要があり、前述の LDAP を利用した方法を使ったのでは時間がかかりすぎるような場合には、オフラインで生成するのが最適です。このツールは、slapd の設定ファイルと、追加するエントリのテキスト表現が書かれた入力ファイルを読み込みます。このツールをサポートしているデータベース種別においては、データベースファイルを直接作成します(ツールをサポートしていないデータベースについては前述のオンラインの方法を使わなければなりません)。まずは、設定ファイルのデータベース定義に設定しておくべき重要な設定ディレクティブがいくらかあります。

        suffix <dn>

一般データベースディレクティブの節で説明したように、このディレクティブは、このデータベースにどのエントリを格納するかを定義します。これは作成しようとしているサブツリーのルートの DN に設定します。たとえば次のように設定します。

        suffix "dc=example,dc=com"

インデックスファイルを作成するディレクトリを設定してください。

        directory <directory>

たとえば次のように設定します。

        directory /usr/local/var/openldap-data

最後に、作成するインデックスを指定する必要があります。これは、一つ以上の index ディレクティブによって行われます。

        index {<attrlist> | default} [pres,eq,approx,sub,none]

たとえば次のように設定します。

        index cn,sn,uid pres,eq,approx,sub
        index objectClass eq

これは、属性 cn, sn, uid について存在、等価性、近似部分文字列のインデックスを作成し、属性 objectClass については等価性のインデックスを作成します。すべての種類のインデックスがあらゆる属性型で使えるわけでないので注意してください。このディレクティブについてのさらなる情報は slapd の設定ファイルの章を参照してください。

8.2.1. slapadd プログラム

ここまで設定したら、slapadd(8) プログラムを実行して主データベースと関連するインデックスを作成します。

        slapadd -l <inputfile> -f <slapdconfigfile>
                [-d <debuglevel>] [-n <integer>|-b <suffix>]

引数の意味は次のとおりです。

        -l <inputfile>

追加するエントリをテキスト形式で記述した LDIF 入力ファイルを指定します(LDIF については LDIF テキストエントリフォーマットの節に後述します)。

        -f <slapdconfigfile>

インデックスを作成する場所、作成するインデックスなどを知らせる slapd 設定ファイルを指定します。

        -d <debuglevel>

<debuglevel> で指定したデバッグモードにします。指定するデバッグレベルは slapd と同じです。slapd の実行コマンドラインオプションの節を参照してください。

        -n <databasenumber>

どのデータベースを更新するかを指定するオプション引数。設定ファイル中に定義されている最初のデータベースは 1、2番目のデータベースは 2 というように指定します。デフォルトでは、設定ファイルに定義されている最初のデータベースが使われます。オプション -b と併せて指定してはなりません。

        -b <suffix>

どのデータベースを更新するかを指定するオプション引数。与えるサフィックスは、データベース番号を決定するために、データベースの suffix ディレクティブと照合されます。オプション -n と併せて指定してはなりません。

8.2.2. slapindex プログラム

時にはインデックスの再作成が必要になることもあります(slapd.conf(5) を変更した後など)。このようなことは、slapindex(8) プログラムを使ってできます。slapindex は次の書式で起動します。

        slapindex -f <slapdconfigfile>
                [-d <debuglevel>] [-n <databasenumber>|-b <suffix>]

オプション -f, -d, -n, -b の意味は slapadd(1) プログラムと同じです。slapindex は、現在のデータベースの内容を基にすべてのインデックスを再作成します。

8.2.3. slapcat プログラム

slapcat プログラムはデータベースを LDIF ファイルにダンプするのに使います。これは、データベースの可読性のあるバックアップをとりたいとき、データベースをオフラインで編集したいときなどに有用です。このプログラムは次の書式で起動します。

        slapcat -l <filename> -f <slapdconfigfile>
                [-d <debuglevel>] [-n <databasenumber>|-b <suffix>]

オプション -n または -b は、-f で指定する slapd.conf(5) に設定されているデータベースを選ぶのに使います。相当する LDIF 出力は、標準出力か -l オプションで指定するファイルに書き出されます。

8.3. LDIF テキストエントリフォーマット

LDAP Data Interchange Format (LDIF) は、LDAP エントリを簡単なテキストフォーマットで表現するために利用されます。この節では、ldif(5) と技術的な仕様 RFC2849 の補足として LDIF エントリフォーマットについて概説します。

エントリの基本的な形式は次のようなものです。

        # コメント
        dn: <識別名>
        <属性記述子>: <属性値>
        <属性記述子>: <属性値>

        ...

文字 '#' で始まる行はコメントです。属性記述子は、 cn, objectClass, 1.2.3 (属性型の OID) のような単なる属性型であり、cn;lang_en_US, userCertificate;binary のようにオプションも付けられます。

行を単一のスペースまたはタブ文字で開始すると前の行に継続できます。たとえば次のようにできます。

        dn: cn=Barbara J Jensen,dc=example, dc=
         com
        cn: Barbara J
          Jensen

これは次のものと同等です。

        dn: cn=Barbara J Jensen,dc=example,dc=com
        cn: Barbara J Jensen

属性値が複数ある場合は行を分けて指定します。たとえば次のようになります。

        cn: Barbara J Jensen
        cn: Babs Jensen

<属性値> に印字できない文字が含まれていたり、スペース、コロン(':')、小なり記号('<')で始まる場合には、 <属性記述子> に続けてコロンを二つ置き、base64 表記でエンコードした値を書きます。たとえば、値が " begins with a space" であるときは次のようになります。

        cn:: IGJlZ2lucyB3aXRoIGEgc3BhY2U=

属性値を保持した URL を指定することもできます。次に示す例は、jpegPhoto の値をファイル /path/to/file.jpeg から得ることを指定します。

        cn:< file:///path/to/file.jpeg

同じ LDIF 中の複数のエントリは空行で分離します。次に示すのは、三つのエントリを含んだ LDIF ファイルの例です。

        # Barbara's Entry
        dn: cn=Barbara J Jensen,dc=example,dc=com
        cn: Barbara J Jensen
        cn: Babs Jensen
        objectClass: person
        sn: Jensen

        # Bjorn's Entry
        dn: cn=Bjorn J Jensen,dc=example,dc=com
        cn: Bjorn J Jensen
        cn: Bjorn Jensen
        objectClass: person
        sn: Jensen
        # Base64 encoded JPEG photo
        jpegPhoto:: /9j/4AAQSkZJRgABAAAAAQABAAD/2wBDABALD
         A4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQ
         ERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVG

        # Jennifer's Entry
        dn: cn=Jennifer J Jensen,dc=example,dc=com
        cn: Jennifer J Jensen
        cn: Jennifer Jensen
        objectClass: person
        sn: Jensen
        # JPEG photo from file
        jpegPhoto:< file:///path/to/file.jpeg

ここで、Bjorn のエントリ中の jpegPhoto が base 64 エンコードで、Jennifer のエントリ中の jpegPhoto が URL によって示された場所から取得されることに注目してください。


注記:LDIF ファイルにおいて、値の後に続くスペースが切捨てられることはありません。また、値の中のスペースが縮められることもありません。データ中にスペースを置きたくない場合は、LDIF にもスペースを置いてはなりません。