次のページ 前のページ 目次へ

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

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

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

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

OpenLDAP ソフトウェアパッケージには ldapadd というツールが付属していて、 これは動作している LDAP サーバに対してエントリを追加するために利用します。 オンラインでデータベースを作成するつもりなら、エントリの追加に ldapadd ツールを使えます。最初にエントリを追加した後に、さらにエントリを追加 するのにも ldapadd を使えます。slapd を始動する前に slapd.conf ファイルに ある次の設定オプションを設定しておいてください。

    suffix <dn>

LDAP サーバの設定で説明したように、このオプションには、 このデータベースに格納されるエントリ群が何であるかを記述します。 これは作成しようとしているサブツリーのルートの DN に設定します。 たとえば次のように設定します。

    suffix "o=TUDelft, c=NL"

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

    directory <directory>

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

    directory /usr/local/tudelft

エントリを追加する権限を持ったユーザで slapd に接続できるように設定 する必要があります。これはデータベース定義中の二つのオプションを 用いて行います。

    rootdn <dn> 

    rootpw <passwd>   /* ここのパスワードに crypt を使うのを忘れないで !!! */ 

[訳注] 実際には /* 〜 */ でコメントを入れることはできません。

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

最後に、データベース定義に望む索引定義を含めます。

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

たとえば、cn, sn, uid, objectclass 属性に索引をつけるには、 次のような index 設定行を使います。

    index cn,sn,uid 

    index objectclass pres,eq 

    index default none 

ここまで設定したら slapd を起動して、あなたの LDAP クライアントで 接続して、エントリの追加を開始してください。たとえば、TUDelft エントリ とそれに属する Postmaster エントリを ldapadd ツールを用いて追加する には、その内容を記述した /tmp/newentry というファイルを作成します。

    o=TUDelft, c=NL 
    objectClass=organization 
    o=TUDelft
    description=Technical University of Delft Netherlands 

    cn=Postmaster, o=TUDelft, c=NL 
    objectClass=organizationalRole 
    cn=Postmaster 
    description= TUDelft postmaster - postmaster@tudelft.nl 

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

    ldapadd -f /tmp/newentry -D "cn=Manager, o=TUDelft, c=NL" -w secret 

上のコマンド利用例では、rootdn が "cn=Manager, o=TUDelft, c=NL"、 rootpw が "secret" に設定されているものとします。コマンドラインに パスワードをタイプしたくなければ、ldapadd コマンドのオプション -w "password" の代わりに -W オプションを使ってください。そうすると、 次のようにパスワードの入力が要求されるようになります。

    ldapadd -f /tmp/newentry -D "cn=Manager, o=TUDelft, c=NL" -W 
    Enter LDAP Password: 

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

[訳注] この節の説明は基本的に OpenLDAP 2.0.x に基づいています。

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

suffix <dn>

前述したように、このオプションは、このデータベースに格納されるエントリ 群が何であるかを示しています。これは作成しようとしているサブツリーの ルートの DN に設定すべきです。たとえば次のように設定します。

    suffix "o=TUDelft, c=NL" 

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

    directory <directory>

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

    directory /usr/local/tudelft 

次に、オープンされている各索引ファイルによって利用されるメモリ内 キャッシュのサイズを増やしておくとよいでしょう。索引の作成時に 最高の性能を出すためには、全体の索引がメモリに納まるようにします。 このようにするにはデータが大きすぎる、あるいはメモリが少なすぎる場合でも、 キャッシュサイズをできるだけ大きくしましょう。後はページングシステムが 作業してくれます。このサイズは次のオプションで設定します。

    dbcachesize <integer>

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

    dbcachesize 50000000 

これは 50MB というかなり大きなサイズのキャッシュを作成します(ミシガン 大学では、データベースが約 125K エントリ、最大の索引ファイルが約 45MB です)。 このキャッシュサイズと並行度(後述)を実験してみて、システムが最適に動作 するようにしてください。索引ファイルを作成したら、slapd を実行する前に キャッシュサイズを小さな値に戻しておくのを忘れないでください。

最後に、作成する索引を指定する必要があります。 これは、一つ以上の index オプションによって行われます。

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

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

index cn,sn,uid pres,eq,approx 
<p>
index default none 

これは、属性 cn, sn, and uid について存在、等価性、近似の索引を作成し、 他の属性については索引を作成しません。このオプションについて詳しくは LDAP サーバの設定の設定ファイルを参照してください。

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

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

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

-l <inputfile>

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

-f <slapdconfigfile>

索引を作成する場所、作成する索引などを知らせる slapd 設定ファイルを 指定します。

-d <debuglevel>

<debuglevel> で指定したデバッグモードにします。 指定するデバッグレベルは slapd と同じです。「LDAP サーバの実行」の章の 「 コマンドラインオプション」を参照してください。 どのデータベースを更新するかを指定するオプション引数。 設定ファイル中に定義されている最初のデータベースは 1、 2番目のデータベースは 2 というように指定します。 デフォルトでは、設定ファイルに定義されている最初の ldbm データベースが使われます。オプション -b と併せて指定しては なりません。

-b <suffix>

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

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

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

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

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

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

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

5.3 LDIF フォーマットについてさらに

[訳注] この節の説明は基本的に OpenLDAP 2.0.x に基づいています。

LDAP データ交換フォーマット(LDIF - LDAP Data Interchange Format)は、 LDAP エントリを簡単なテキストフォーマットで表現するために利用されます。 エントリの基本的な形式は次のようなものです。

    # コメント
    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

<属性値> に印字できない文字が含まれていたり、スペース、コロン(':')、 小なり記号('{{EX:<}}')で始まる場合には、<属性記述子> に続けてコロンを 二つ置き、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 にもスペースを置いてはなりません。

5.4 ldapsearch, ldapdelete, ldapmodify ユーティリティ

[訳注] この節の説明は基本的に OpenLDAP 1.2.x に基づいています。 OpenLDAP 2.0.x ではオプションがいくつか追加/変更されています。

ldapsearch - ldapsearch は、ldap_search(3) ライブラルコールに対応する コマンドラインインタフェースです。このユーティリティは、LDAP データ ベースバックエンド中のエントリを検索するために使います。

ldapsearch を起動する書式は次のとおりです(各オプションの意味は ldapsearch の man ページを見てください)。

ldapsearch  [-n] [-u] [-v] [-k] [-K] [-t] [-A] [-B] [-L] [-R] [-d debuglevel]
    [-F sep] [-f file] [-D binddn] [-W] [-w bindpasswd] [-h ldaphost]
    [-p ldapport] [-b searchbase] [-s base|one|sub]
    [-a never|always|search|find] [-l timelimit] [-z sizelimit]
    filter [attrs...]

ldapsearch は LDAP サーバに対してコネクションを張り、バインドした後、 フィルタ filter を用いて検索します。この filter は、RFC 1558 に定義 されている LDAP フィルタの文字列表現に従わねばなりません。ldapsearch が 1個以上のエントリを見つけると、attrs に指定した属性が取り出され、 そのエントリと値が標準出力に印字されます。attrs の指定がなければ、 全属性が返されます。

次に ldapsearch の利用例をいくつか示します。

ldapsearch -b 'o=TUDelft,c=NL' 'objectclass=*' 

ldapsearch -b 'o=TUDelft,c=NL' 'cn=Rene van Leuken' 

ldasearch -u -b 'o=TUDelft,c=NL' 'cn=Luiz Malere' sn mail 

オプション -b は検索ベース(先頭の検索ポイント)を指定し、-u オプションは ユーザフレンドリ形式を出力に含めることを指定します。

ldapdelete - ldapdelete は、ldap_delete(3) ライブラルコールに対応する コマンドラインインタフェースです。このユーティリティは、LDAP データ ベースバックエンド中のエントリを削除するために使います。

ldapdelete を起動する書式は次のとおりです(各オプションの意味は ldapdelete の man ページを見てください)。

ldapdelete  [-n] [-v] [-k] [-K] [-c] [-d debuglevel] [-f file] [-D binddn]
    [-W] [-w passwd] [-h ldaphost] [-p ldapport] [dn]... 

ldapdelete は LDAP サーバに対してコネクションを張り、バインドした後、 1個以上のエントリを削除します。1個以上の dn 引数が与えられていれば、 その識別名を持つエントリが削除されます。個々の dn は、RFC 1779 に定義 されている文字列表現の DN でなければなりません。引数 dn が与えられて いなければ、標準入力(あるいは -f フラグで指定したファイル file)から DN のリストを読み込みます。

次に ldapdelete の利用例をいくつか示します。

ldapdelete 'cn=Luiz Malere,o=TUDelft,c=NL' 

ldapdelete -v 'cn=Rene van Leuken,o=TUDelft,c=NL' -D 'cn=Luiz Malere,o=TUDelft,c=NL' -W 

オプション -v は冗長モードにすることを指定し、-D オプションはバインド する dn (認証の対象となる dn)を指定し、-W オプションはパスワードの 入力を要求することを指定します。

ldapmodify - ldapmodify は、ldap_modify(3) と ldap_add(3) のライブラリ コールに対応するコマンドラインインタフェースです。このユーティリティは、 LDAP データベースバックエンド中のエントリを更新するために使います。

ldapmodify を起動する書式は次のとおりです(各オプションの意味は ldapmodify の man ページを見てください)。

ldapmodify  [-a] [-b] [-c] [-r] [-n] [-v] [-k] [-d debuglevel] [-D binddn]
    [-W] [-w passwd] [-h ldaphost] [-p ldapport] [-f file] 

ldapadd  [-b] [-c] [-r] [-n] [-v] [-k] [-K] [-d debuglevel] [-D binddn]
    [-w passwd] [-h ldaphost] [-p ldapport] [-f file] 

ldapadd は、ldapmodify ツールへのハードリンクになっています。ldapadd と して起動されると、フラグ -a (新しいエントリの追加)が暗黙に指定されたもの とみなします。ldapmodify は LDAP サーバへに対してコネクションを張り、 バインドした後、エントリを更新/追加します。エントリ情報は標準入力 あるいは -f オプションで指定したファイル file から読み込まれます。

次に ldapmodify の利用例をいくつか示します。

ファイル /tmp/entrymods があり、その内容は次のようになっているとします。

dn: cn=Modify Me, o=University of Michigan, c=US 
changetype: modify 
replace: mail 
mail: modme@terminator.rs.itd.umich.edu 
- 
add: title 
title: Grand Poobah 
- 
add: jpegPhoto 
jpegPhoto: /tmp/modme.jpeg 
- 
delete: description 
- 

次のコマンドを実行します。

ldapmodify -b -r -f /tmp/entrymods 

これにより、エントリ "Modify Me" の mail 属性の内容を値 "modme@terminator.rs.itd.umich.edu" で置換し、 "Grand Poobah" の title を追加して、ファイル "/tmp/modme.jpeg" の内容を jpegPhoto として追加して、description 属性を完全に除去します。

次の古い ldapmodify 入力フォーマットを用いても、上と同じ更新が行えます。

cn=Modify Me, o=University of Michigan, c=US 
mail=modme@terminator.rs.itd.umich.edu 
+title=Grand Poobah 
+jpegPhoto=/tmp/modme.jpeg 
-description 

この場合も同様に ldapmodify を起動します。

ldapmodify -b -r -f /tmp/entrymods 

ファイル /tmp/newentry があり、その内容は次のようになっているとします。

dn: cn=Barbara Jensen, o=University of Michigan, c=US 
objectClass: person 
cn: Barbara Jensen 
cn: Babs Jensen 
sn: Jensen 
title: the world's most famous manager 
mail: bjensen@terminator.rs.itd.umich.edu 
uid: bjensen 

次のコマンドを実行します。

ldapadd -f /tmp/entrymods 

ファイル /tmp/newentry があり、その内容は次のようになっているとします。

dn: cn=Barbara Jensen, o=University of Michigan, c=US 
changetype: delete 

次のコマンドを実行します。

ldapmodify -f /tmp/entrymods 

これは、Babs Jensen のエントリを除去します。

オプション -f は(標準入力の代わりに更新情報を読み込む) ファイルを指定し、-b オプションはバイナリを指定し (入力ファイル中で '/' で始まる値はバイナリであると 解釈される)、-r は更新(デフォルトで既存の値を更新)を指定します。


次のページ 前のページ 目次へ