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 という
# 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>
追加するエントリをテキスト形式で記述した
-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 プログラムはデータベースを
slapcat -l <filename> -f <slapdconfigfile> [-d <debuglevel>] [-n <databasenumber>|-b <suffix>]
オプション -n または -b は、-f で指定する slapd.conf(5) に設定されているデータベースを選ぶのに使います。相当する
8.3. LDIF テキストエントリフォーマット
エントリの基本的な形式は次のようなものです。
# コメント dn: <識別名> <属性記述子>: <属性値> <属性記述子>: <属性値> ...
文字 '#' で始まる行はコメントです。属性記述子は、 cn, objectClass, 1.2.3 (属性型の
行を単一のスペースまたはタブ文字で開始すると前の行に継続できます。たとえば次のようにできます。
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=
属性値を保持した
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 にもスペースを置いてはなりません。