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

3. LDAP サーバの設定

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

ソフトウェアのインストールが完了したら、あなたのサイトで利用するための 設定をしましょう。slapd ラインタイム設定のすべては、slapd.conf ファイル をとおして行います。このファイルは configure スクリプトで指定した prefix ディレクトリ(デフォルトは /usr/local/etc/openldap)にインストールされて います。

この節では slapd.conf でよく使われる設定ディレクティブについて 詳しく説明します。全ディレクティブのリストについては slapd.conf(5) マニュアルページを参照してください。設定ファイルのディレクティブは、 グローバル、バックエンド固有、データ固有のカテゴリに分けています。 各ディレクティブについては、その説明とともに(もしあれば)そのデフォルト値 と設定例を示します。

3.1 設定ファイルのフォーマット

ファイル slapd.conf は、グローバル、バックエンド固有、 データベース固有の3タイプの設定情報から成ります。 まず最初に指定するのはグローバル情報であり、その後に特定の バックエンド種別に関連した情報が続き、さらにその後に特定の データベース実体に関連した情報が続きます。

グローバルディレクティブは後のバックエンドやデータベース設定のディレクティブ で上書きでき、バックエンド設定ディレクティブはデータベース設定 ディレクティブで上書きできます。

ブランク行と '#' 文字で始まるコメント行は無視されます。 行が空白で始まっている場合、前の行からの継続であるとみなされます。 slapd.conf の一般的なフォーマットは次のようになります。

# グローバル設定ディレクティブ
<グローバル設定ディレクティブ>

# バックエンド定義
backend <typeA>
<バックエンド固有ディレクティブ>

# 1番目のデータベース定義 & 設定ディレクティブ
database <typeA>
<データベース固有ディレクティブ>

# 2番目のデータベース定義 & 設定ディレクティブ
database <typeB>
<データベース固有ディレクティブ>

# 続きのデータベース定義 & 設定ディレクティブ
...

設定ディレクティブの中には引数をとるものがあります。 引数のある場合には空白で区切って並べます。引数に空白を含めたい 場合には、引数を二重引用符で囲みます。引数に二重引用符や バックスラッシュ文字 `\' を含めたい場合には、 その文字の前にバックスラッシュ文字 `\' を置きます。

OpenLDAP の配布物の中には設定ファイルのサンプルが付いてきます。 これは普通 /usr/local/etc/openldap ディレクトリに インストールされます。スキーマ定義(属性型とオブジェクトクラス)を 含んだファイルも /usr/local/etc/openldap/schema ディレクトリに提供されています。

3.2 グローバルディレクティブ

この節で説明するディレクティブは、バックエンドまたはデータベースの 定義で特に上書きしない限り、すべてのバックエンドとデータベースに 適用されます。実際のテキストで置き換えるディレクティブの引数は ブラケット <> で示します。

access to <what> [ by <who> <accesslevel> <control> ]+

このディレクティブは、エントリや属性の1セット(<what> に指定)に 対するアクセス権(<accesslevel> に指定)を1人以上の要求者(<who>に指定)に与えます。より詳しくは「アクセス制御」の例を参照してください。

attributetype <RFC2252 Attribute Type Description>

このディレクティブは属性型を定義します。

defaultaccess { none | compare | search | read | write }

このディレクティブは、access ディレクティブが指定されて いないときに、要求者に与えるデフォルトのアクセス権を指定します。 どのアクセス権レベルもより下位のアクセス権レベルを暗に与えます (たとえば read アクセス権は、search, compare アクセス権を暗に 与えますが write アクセス権は与えません)。

デフォルトの設定は次のとおりです。

    defaultaccess read

idletimeout <integer>

アイドル状態のクライアント接続を強制的に切断するまでの 秒数を指定します。idletimeout の値が 0 であると(デフォルト) この機能は無効になります。

include <filename>

このディレクティブは、slapd が現在のファイルの次の行に進む前に、与えた ファイルから追加の設定情報を読み込むことを指定します。取り込む ファイルは、通常の slapd 設定ファイルのフォーマットに従います。 ファイルの取込みは一般にスキーマ指定の記述されたファイルを取り込む のに使われます。

注記:このディレクティブの取扱いには注意してください - 入れ子になった include ディレクティブに制限はなく、include がループになった場合でも 検出されません。

loglevel <integer>

このディレクティブは、デバッグ情報と操作の統計値を syslog に出力するレベルを指定します(現在のところ、syslogd(8) の LOG_LOCAL4 ファシリティに記録されます)。 このオプションが有効になるようにするには OpenLDAP を --enable-debug 付き(デフォルト)で configure しなければなりません(統計に関する二つの レベルは例外で、これらは常に利用可能です)。どのデバックに何の数が 対応しているのかを調べるには -d ? を指定して slapd を起動するか、 以下の表を参考にしてください。<integer> に指定可能な値には 次のものがあります。

[訳注] OpenLDAP 2.0.x では slapd の -d ? 指定が無くなりました。

    -1      すべてのデバッグレベルを有効にする
    0       デバッグしない
    1       関数呼出しのトレース
    2       パケット処理のデバッグ
    4       詳細なデバッグトレース
    8       接続管理
    16      パケット送受信の印字
    32      検索フィルタ処理
    64      設定ファイル処理
    128     アクセス制御リスト処理
    256     接続/操作/結果の統計ログ
    512     エントリ送信の統計ログ
    1024    shell バックエンドとの通信の印字
    2048    エントリ解析のデバッグ印字

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

    loglevel 255 あるいは loglevel -1
このように設定すると、大量のデバッグ情報が記録されます。

デフォルトの設定は次のとおりです。

    loglevel 256

objectclass <RFC2252 Object Class Description>

このディレクティブはオブジェクトクラスを定義します。

referral <URI>

このディレクティブは、要求を処理するためのローカルデータベースを見つけられ なかった場合に、クライアントに戻す紹介先を指定します。

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

    referral ldap://root.openldap.org
これは、OpenLDAP プロジェクトのグローバルルート LDAP サーバに 非ローカルな問合せを紹介することを指定します。賢い LDAP クライアント なら戻されるサーバに再要求をするでしょうが、そのようなクライアントの ほとんどは、ホスト名の部分とオプションの識別名の部分とを持った 単純な LDAP URL の処理方法を知っているだけです。

sizelimit <integer>

このディレクティブは、検索操作から返すエントリの最大数を指定します。

デフォルトの設定は次のとおりです。

    sizelimit 500

timelimit <integer>

このディレクティブは、slapd が検索要求の応答に使う最大秒数(実時間)を 指定します。この時間内に要求が達せられなければ、時間制限を超過した ことを示す結果を返します。

デフォルトの設定は次のとおりです。

    timelimit 3600

3.3 一般バックエンドディレクティブ

この節のディレクティブは、そのディレクティブが定義されている バックエンドにのみ適用されます。これらのディレクティブは全種別の バックエンドでサポートされます。バックエンドディレクティブは、 同種別のすべてのデータベース実体に適用しますが、ディレクティブ によってはデータベースディレクティブで上書きされます。

backend <type>

このディレクティブは、バックエンド定義の始まりを示します。 <type> には、ldbm, shell, passwd などサポートされている バックエンド種別のどれかを指定します。

3.4 一般データベースディレクティブ

この節のディレクティブは、そのディレクティブが定義されている データベースにのみ適用されます。これらのディレクティブは全種別の データベースでサポートされます。

database <type>

このディレクティブは新しいデータベース実体定義の始まりを 示します。<type> には、ldbm, shell, passwd など、 サポートされているデータベースの種別のいずれかを指定します。

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

    database ldbm

この設定は、新しい LDBM バックエンドデータベース実体定義の始まりを 示します。

readonly { on | off }

このディレクティブは、データベースを「読取り専用」モードにします。 このモードでデータベースを更新しようとすると "unwilling to perform" エラーが返ります。

デフォルトの設定は次のとおりです。

    readonly off

replica

<-- [orig] replica host=<hostname>[:<port>] [bindmethod={ simple | kerberos | sasl }] ["binddn=<DN>"] [mech=<mech>] [authcid=<identity>] [authzid=<identity>] [credentials=<password>] [srvtab=<filename>] -->

  replica host=<hostname>[:<port>]
          [bindmethod={ simple | kerberos | sasl }]
          ["binddn=<DN>"]
          [mech=<mech>]
          [authcid=<identity>]
          [authzid=<identity>]
          [credentials=<password>]
          [srvtab=<filename>]
このディレクティブは、このデータベースの複製サイトを指定します。パラメータ host= は、スレーブ slapd の実体があるホストとポート(オプション)を 指定します。<hostname> はドメイン名あるいは IP アドレスを使って指定しま す。<port> が与えられていなければ、標準の LDAP ポート番号(389)が 使われます。

パラメータ binddn= は、スレーブ slapd の更新でバインド するための DN を与えます。これは、スレーブ slapd のデータベースに 対してアクセス権 read/write を持った DN にしなければなりません。 通常はスレーブ slapd の設定ファイルにある rootdn に指定して あるものを与えます。またこの DN は、スレーブ slapd 設定ファイルの updatedn ディレクティブに指定したものと一致していなければなりません。 DN にはスペースが入っていることが多いので、"binddn=<DN>" 文字列は 二重引用符で囲っておくとよいでしょう。

bindmethod は、スレーブ slapd への接続に使う認証が パスワードベースのものか、Kerberos か、SASL かによって simple か kerberos か sasl になります。

簡易認証は十分な一貫性と機密性の保護(TLS や IPSEC など)がなければ 使うべきではありません。簡易認証は binddn と credentials パラメータの指定を必要とします。

Kerberos 認証は、SASL 認証のせいで時代遅れになっています。 (特に KERBEROS_V4 と GSSAPI)。Kerberos 認証は binddn と srvtab パラメータの指定を必要とします。

一般には SASL 認証を使うことを勧めます。SASL 認証は mech パラメータを使った機構の指定が必要です。指定する機構に依存して、 認証アイデンティティや証明書を authcid と credentials を使って指定できます。認証アイデンティティの指定には authzid パラメータを使うかもしれません。

replogfile <filename>

このディレクティブは、slapd が 変更を記録する複製ログファイルの 名前を指定します。複製ログは通常 slapd が書き出し、slurpd が 読み取ります。通常このディレクティブは、データベースを複製する ために slurpd が使われている場合にのみ利用します。しかし slurpd を実行していなくても、トランザクションログの生成に使えます。この場合、 複製ログファイルは無限に増え続けるので定期的に切り詰める必要があります。

rootdn <dn>

このディレクティブは、このデータベースに対するアクセス権制御あるいは 管理限度の制限に従わない DN を指定します。この DN はディレクトリ中の エントリである必要はありません。この DN には SASL アイデンティティ を使えます。

エントリベースの例:

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

SASL ベースの例:

    rootdn "uid=root@EXAMPLE.COM"

rootpw <password>

このディレクティブは、上のオプションで与えた DN のエントリが 存在するか、そのエントリがパスワードを持っているかにかかわらず、 常に適用するパスワードを指定します。 このディレクティブは SASL 認証のせいで時代遅れになっています。

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

    rootpw secret

suffix <dn suffix>

このディレクティブは、このバックエンドデータベースに渡す問合せの DN 接尾辞を指定します。複数の suffix 行を与えてもよいですが、 各データベース定義に少なくとも一つは必要です。

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

    suffix "dc=example,dc=com"

この指定では、DN の末尾に "dc=example, dc=com" の付いた 問合せがこのバックエンドに渡されます。

注記:問合せを渡すバックエンドが選択されるとき、slapd は各データベースの suffix 行を設定ファイルに現れる順番に見ていきます。したがって、あるデー タベースの接尾辞が別のデータベースの接頭辞になっている場合には、設定ファ イルのより後のほうに現れるようにしなければなりません。

updatedn <dn>

このディレクティブはスレーブの slapd にのみ適用できます。 このディレクティブは複製の変更を許す DN を指定します。 これには、複製の変更をするときに slurpd(8) がバインドする DN、 あるいは SASL アイデンティティと関連した DN を指定します。

エントリベースの例:

    updatedn "cn=Update Daemon,dc=example,dc=com"

SASL ベースの例:

    updatedn "uid=slurpd@EXAMPLE.COM"

updateref <URL>

このディレクティブはスレーブの slapd にのみ適用できます。 これは複製の更新要求を送るクライアントに戻す URL を指定します。 このディレクティブはいくつも指定でき、各 URL が戻されます。

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

    updateref  ldap://master.example.net

3.5 LDBM バックエンド固有ディレクティブ

このカテゴリのディレクティブは、LDBM バックエンドデータベースにのみ適用され ます。すなわち、"database ldbm" とある行の後で、次の "database" 行が現れ る前になければなりません。

cachesize <integer>

このディレクティブは、LDBM バックエンドデータベースの実体によって管理される メモリ内キャッシュのエントリ数を指定します。

デフォルトの設定は次のとおりです。

    cachesize 1000

dbcachesize <integer>

このディレクティブは、オープンされている索引ファイルそれぞれと関連づ けられているメモリ内キャッシュのサイズをバイト数で指定します。基板のデー タベース方式でサポートされなければ、このディレクティブは黙って無視されます。 この数を増やすとより多くのメモリを使いますが、劇的な性能の向上が得られま す。特に 更新と索引の作成で性能の向上が顕著です。

デフォルトの設定は次のとおりです。

    dbcachesize 100000

dbnolocking

このディレクティブが指定されるとデータベースのロックが 無効になります。このディレクティブは、データのセキュリティを 犠牲にしてでも性能を上げたい場合に使います。

dbnosync

このディレクティブは、変更に対するメモリ内の変更をディスク上の内容と すぐには同期をとらないようにします。このディレクティブは、データの セキュリティを犠牲にしてでも性能を上げたい場合に使います。

directory <directory>

このディレクティブは、データベースと関連する索引を含んだ LDBM ファイル郡を 置くディレクトリを指定します。

デフォルトの設定は次のとおりです。

    directory /usr/local/var/openldap-ldbm

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

このディレクティブは、与えた属性について管理する索引を指定します。 <attrlist> だけが与えられた場合、デフォルトの索引が管理されます。 たとえば次のように指定します。

    index default pres,eq
    index objectClass,uid
    index cn,sn eq,sub,approx
1行目は、索引のデフォルトセットを存在と等価性を管理するように設定します。 2行目は、objectClass と uid 属性型についてデフォルトの索引(pres, eq)を 管理するように設定します。3行目は、cn と sn 属性型について等価性、 部分文字列、近似の索引を管理するように設定します。

mode <integer>

このディレクティブは、新たに作成されるデータベース索引ファイル の持つファイル保護モードを指定します。

デフォルトの設定は次のとおりです。

    mode 0600

3.6 他のバックエンドデータベース

slapd は、デフォルトの LDBM の他にもいくつもの バックエンドデータベース種別をサポートしています。

詳しくは {{slapd.conf}}(5) manpage を参照してください。

3.7 アクセス制御の例

グローバルディレクティブの説明にあるアクセス制御 機能は実に強力です。この節では、アクセス制御の利用例をいくつか示します。 まずは、簡単な例から。

access to * by * read 

この access ディレクティブは、あらゆる人に読取り(read)アクセス権を与えます。 これだけを指定した場合には、次の defaultaccess 行と同じことになります。

defaultaccess read 

次の例は、DN でエントリを選択するのに正規表現を利用しているところを 示しています。この二つのアクセス権宣言の順番は重要です。

access to dn=".*, o=U of M, c=US" 
    by * search 
access to dn=".*, c=US" 
    by * read 

この例では、読取り(read)アクセス権が c=US サブツリー配下のエントリに 与えられますが、"o=U of M, c=US" サブツリー配下に限っては検索(search) アクセス権しか与えられません。このアクセス権指定の順序を逆にすると、 すべての "U of M" エントリは "c=US" エントリでもあるので、 "U of M" の方の指定が全く適用されなくなってしまいます。

次の例も順序の重要性を示していますが、今度はアクセス権指定の他に "by" 節の 順序についても示しています。 またこの例では、特定の属性へのアクセス権を与える属性セレクタと、 さまざまな <who> セレクタの利用法についても示しています。

access to dn=".*, o=U of M, c=US" attr=homePhone 
    by self write 
    by dn=".*, o=U of M, c=US" search 
    by domain=.*\.umich\.edu read 
    by * compare 
access to dn=".*, o=U of M, c=US" 
    by self write 
    by dn=".*, o=U of M, c=US" search 
    by * none 

この例は、"o=U of M, c=US" サブツリーのエントリに適用されます。 属性 homePhone を除くすべての属性に対し、当該エントリ自体には 書込み権(write)を与え、他の "U of M" 配下のエントリには 検索権(search)を与え、その他のエントリにはアクセス権を与えません。 属性 homePhone に対しては、当該エントリ自体には書込み権(write)を与え、 他の "U of M" エントリには検索権(search)を与え、umich.edu ドメイン内の どこからか接続するクライアントには読取り権を与え、その他のエントリには 比較権(compare)を与えます。

特定の DN に属性の追加と除去を許すことが有用なことがあります。 たとえば、あるグループを作成し、人々に member 属性への追加と 除去を自分自身の DN に限ってできるようにしたい場合、 次のようなアクセス権宣言で実現できます。

access to attr=member,entry 
    by dnattr=member selfwrite 

セレクタ dnattr <who> は、アクセス権が member 属性にリストされている エントリに適用されることを指定します。アクセス権セレクタ selfwrite は、 そのような member 達が自分自身の DN だけを属性から追加/削除できることを指定 します。また、entry 属性を追加しておくことが必要です。なぜなら、 エントリのどの属性にアクセスするにせよ、エントリへのアクセス権が必要に なるからです。

[訳注] "entry" はエントリ内に実在しない特殊な属性で、 属性へのアクセス権指定でエントリへのアクセス権を指定するために 使うものです。

<what> 節の中の attr=member 構成要素は、節 "dn=* attr=member" の 省略形であることに注目してください(すなわち、すべてのエントリの member 属性に一致します)。

注記:LDAP のアクセス制御についてもっと知りたければ OpenLDAP Administrator's Guide ( http://www.openldap.org) を調べてください。

3.8 設定ファイルの例

以下は設定ファイルの例です。例の所々には説明をつけてあります。 これは二つのデータベースを定義していて、それぞれ X.500 ツリーの別々の部分を処理します。両方ともデータベースには LDBM を使っています。説明の都合上、例には行番号をつけていますが、 実際のファイルには行番号をつけません。まずはグローバル設定セクション から説明します。

  1.    # example config file - global configuration section
  2.    include /usr/local/etc/schema/core.schema
  3.    referral ldap://root.openldap.org
  4.    access to * by * read

行 1 はコメントです。行 2 は core スキーマ定義を含んだ 別の設定ファイルを取り込みます。行 3 の referral ディレクティブは、後に定義するデータベースのどれかにローカル でない問合せについて、ホスト root.openldap.org で動作している標準ポート(389)の LDAP サーバを参照することを意味します。

行 4 はグローバルなアクセス制御です。これは、データベースのアクセス制御に 一致するものがない場合、あるいは、アクセスの対象となるオブジェクトが (Root DSE のように)どのデータベースの制御下にもない場合にのみ使われます。

設定ファイルの例の次の部分は、ツリーの "dc=example,dc=com" 配下 にあるものについての問合せを処理する LDBM バックエンドを定義します。 このデータベースは二つのスレーブ slapd に複製されます。 スレーブの一つは truelies で、もう一つは judgmentday です。 いくつかの属性について索引が管理され、userPassword 属性は認証されていないものからのアクセスから保護されます。

  5.    # ldbm definition for the example.com
  6.    database ldbm
  7.    suffix "dc=example, dc=com"
  8.    directory /usr/local/var/openldap
  9.    rootdn "cn=Manager, dc=example, dc=com"
 10.    rootpw secret
 11.    # replication directives
 12.    replogfile /usr/local/var/openldap/slapd.replog
 13.    replica host=slave1.example.com:389
 14.            binddn="cn=Replicator, dc=example, dc=com"
 15.            bindmethod=simple credentials=secret
 16.    replica host=slave2.example.com
 17.            binddn="cn=Replicator, dc=example, dc=com"
 18.            bindmethod=simple credentials=secret
 19.    # indexed attribute definitions
 20.    index uid pres,eq
 21.    index cn,sn,uid pres,eq,approx,sub
 22.    index objectClass eq
 23.    # ldbm access control definitions
 24.    access to attr=userPassword
 25.            by self write
 26.            by anonymous auth
 27.            by dn="cn=Admin,dc=example,dc=com" write
 28.            by * none
 29.    access to *
 30.            by self write
 31.            by dn="cn=Admin,dc=example,dc=com" write
 32.            by * read

行 5 はコメントです。データベース定義の始まりは、 行 6 の database キーワードで示します。行 7 は、このデータベース に渡す問合せのための DN 接尾辞を指定します。行 8 は、 データベースファイルを置くディレクトリを指定します。

行 9 と 10 は、このデータベースの「スーパユーザ」エントリと そのパスワードを指定します。このエントリは アクセス制御あるいはサイズ/時間制限に従いません。

行 11 から 18 は複製の設定です。行 11 は複製ログファイルを 指定します(データベースの変更が記録されます - このファイルには slapd が書き込み、slurpd が読み出します)。行 12 から 14 は 複製が作られるホスト、更新を行うときのバインドのための DN、 バインド方法(簡易認証)、binddn のための証明書(パスワード)を 指定します。行 15 から 18 は、第2の複製サイトを指定します。

行 20 から 22 は、さまざまな属性のために管理する索引を指定します。

行 24 から 32 は、データベース内のエントリのためのアクセス制御を 指定します。すべてのエントリの {{EX:userPassword}} 属性は、 そのエントリ自身および "admin" エントリから更新可能です。 この属性は認証の目的には使えますが読み取れません。 その他すべての属性は、そのエントリ自身および "admin" エントリから 更新可能で、認証されたユーザから読み取れます。

設定ファイルの例の次の部分は、別の LDBM データベースを定義します。 この LDBM データベースは dc=example,dc=net サブツリーに 関する問合せを処理します。行 38 がないと、行 4 のグローバルアクセス 規則により読み取りアクセスが許可されることに注意してください。

 33.    # ldbm definition for example.net
 34.    database ldbm
 35.    suffix "dc=example, dc=net"
 36.    directory /usr/local/var/ldbm-example-net
 37.    rootdn "cn=Manager, dc=example, dc=com"
 38.    access to * by users read


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