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

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

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

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

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

        suffix <dn>

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

        suffix "dc=example,dc=com"

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

        directory <directory>

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

        directory /usr/local/var/openldap-ldbm

このディレクトリを作成するときには、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
        index objectClass pres,eq

このディレクティブについてより詳しくは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

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

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

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

        suffix <dn>

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

        suffix "dc=example,dc=com"

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

        directory <directory>

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

        directory /usr/local/var/openldap-ldbm

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

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

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

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

これは、属性 cn, sn, uid について存在、等価性、 近似の索引を作成し、属性 objectClass については等価性の索引を 作成します。このディレクティブについてのさらなる情報は設定ファイルの 章を参照してください。

7.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 というように指定します。 デフォルトでは、設定ファイルに定義されている最初の ldbm データベースが使われます。オプション -b と併せて指定しては なりません。

        -b <suffix>

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

7.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 は、 現在のデータベースの内容を基にすべての索引を再作成します。

7.2.3. slapcat プログラム

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

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

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

7.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 にもスペースを置いてはなりません。