1. OpenLDAP ディレクトリサービスの紹介

この文書は、ディレクトリサービスを提供する OpenLDAP ソフトウェアの インストール、設定、操作の方法について説明します。この文書は、 スタンドアローン LDAP デーモン(slapd)と スタンドアローン更新複製デーモン(slurpd)の詳細を載せています。 対象とする読者は、初心者および経験豊富な管理者の両方です。 この節では、ディレクトリサービス、特に slapd(8) によって 提供されるディレクトリサービスの概要について説明します。

1.1. ディレクトリサービスとは?

ディレクトリは、読取り、ブラウズ、検索の用途に最適化された特殊な データベースです。ディレクトリは、記述的で属性ベースの情報を保持し、 洗練されたフィルター機能をサポートしています。大量の複雑な更新を 処理するように設計されたデータベース管理システムにあるような複雑な トランザクションやロールバック機構は、ディレクトリでは一般にサポート しません。ディレクトリの更新は、普通は all-or-nothing の単純な 書換えに過ぎません。ディレクトリは、大量の照会あるいは検索操作に 即応できるように最適化されています。稼働率と信頼性を向上、かつ レスポンスタイムを減らすために、ディレクトリには情報を広く複製する 能力があります。ディレクトリ情報が複製されている場合、一時的な 不整合が発生するかもしれませんが、定期的に同期をとるようにして おけば問題ありません。

ディレクトリサービスの提供方法には色々な種類があります。このため、 ディレクトリに保存する情報の種類が多様になり、一方では情報の参照、 問合せ、更新や、認証されないアクセスからどのように情報を守るかなどに 関して色々な要求が生じます。ローカルで限られた対象(たとえば、 単一のマシンの finger サービスなど)のみへのサービスを提供するような ディレクトリサービスがある一方、グローバルではるかに広い対象(たとえば、 インターネット全体)にサービスを提供するようなサービスもあります。 グローバルサービスはたいてい分散しています。すなわち、データが 多くのマシン(そのすべてがディレクトリサービスを提供するよう協調して いる)に分割して格納されています。通常、グローバルサービスはデータ自体に 関して、あなたがどこにいても問題のない同じデータのビューを与えるよう 一定の名前空間を定義しています。インターネット Domain Name System は、グローバルな分散ディレクトリサービスの一例です。

1.2. LDAP とは?

slapd のディレクトリサービスのモデルは LDAP という グローバルディレクトリモデルを基にしています。LDAP は Lightweight Directory Access Protocol の略です。LDAP は TCP/IP 上で動作する ディレクトリサービスプロトコルです。LDAP 中核となる仕様の詳細は、 RFC2251 "The Lightweight Directory Access Protocol (v3)" に定義されています。この節では、利用者の観点から LDAP の概要を 説明します。

ディレクトリにはどんな情報を格納できるのか?  LDAP のディレクトリサービスのモデルはエントリを基にしています。 エントリとは、識別名 (Distinguished Name: DN)というグローバルに 一意な名前を持った属性の集まりです。DN はエントリを一意に参照する ために使われます。エントリが持つ属性にはそれぞれと一つ以上の があります。型にはたいてい憶えやすい名前がついています。 たとえば一般名(common name)には "cn"、電子メールアドレス (email address)には "mail" という名前がついています。 値のシンタックスは属性の型がなんであるかに依存します。たとえば属性 cnBabs Jensen を値にできますし、属性 mail は "babs@example.com" という値を保有できます。属性 jpegPhoto は、JPEG (バイナリ)フォーマットで画像を保有します。

情報はどのようになっているのか? LDAP においてディレクトリのエントリは、階層ツリー構造に配置されます。 伝統的に、この階層ツリーには地理、組織などの境界が反映されます。 ツリーの最上位には国を表すエントリがあり、その下には全国的な組織を 表すエントリがあり、さらにその下には組織単位、人、プリンタ、文書など、 考えられるほとんどのものを表すエントリを置きます。伝統的な命名法を 使った LDAP ディレクトリツリーの例を図1.1に示します。

図1.1:LDAP ディレクトリツリー(伝統的な命名法)

ツリーはインターネットドメイン名を基にすることもできます。 この命名法は、Domain Name System を利用してディレクトリサービス を捜し出せるようにするものとして一般化してきています。 図1.2はドメインベースの命名法使った LDAP ディレクトリの例です。

図1.2:LDAP ディレクトリツリー(インターネット命名法)

さらに、LDAP では objectClass という特殊な属性を用いて、 エントリに必要な属性と保有できる属性を制御できます。 属性 objectClass の値は、エントリが従わなければならない スキーマ規則を決定します。

情報はどのように参照するのか? エントリはその識別名で参照されます。識別名は、 相対識別名(Relative Distinguished Name: RDN)というエントリ自体の名前に 上位のエントリの名前を連結したものから成ります。たとえば先のインターネット 命名法の例にある Barbara Jensen のエントリは、uid=babs という RDN と uid=babs,ou=People,dc=example,dc=com という DN を 持ちます。DN のフォーマットについての完全な説明は RFC2253 "Lightweight Directory Access Protocol (v3): UTF-8 String Representation of Distinguished Names" にあります。

情報にはどうアクセスするのか? LDAP はディレクトリに対する質問と更新を行う操作を定義しています。 提供される操作には、ディレクトリへのエントリの追加と削除、 既存のエントリの変更、エントリの名前の変更があります。 しかしほとんどの場合、LDAP はディレクトリ中の情報の検索に使われます。 LDAP の検索操作では、ディレクトリのある部分に対して検索フィルタで指定 する条件に一致するエントリを検索できます。条件に一致したエントリの それぞれに対して情報を要求できます。

たとえば名前が Barbara Jensen である人を dc=example,dc=com のサブツリー全体から検索して、見つかったエントリのそれぞれの電子メール アドレスを取り出したいとします。LDAP でこれを行うのは簡単です。また、 名前に Acme という文字列を含み、FAX 番号を持った組織を st=California,c=US エントリの直下から検索したいとします。 LDAP でこれを行うのも簡単です。次の節では、LDAP で何ができるのか、 なんの役に立つのかをより詳しく説明します。

認められないアクセスからどう情報を守るのか? ディレクトリサービスによっては何も保護しないで、だれでも情報を参照できる ようにしています。LDAP は、クライアントに認証の機構を提供するか、 クライアントの身元をディレクトリサーバに証明してもらうことにより、 サーバが保有する情報を保護するための高度なアクセス制御を容易にしています。 LDAP は、機密性と一貫性のセキュリティサービスもサポートしています。

1.3. LDAP はどのように動作するのか?

LDAP ディレクトリサービスは、クライアントサーバモデルを基にしています。 一つ以上のディレクトリサーバが、LDAP ディレクトリツリーあるいは LDAP バックエンドデータベースを構成するデータを保有しています。 LDAP クライアントは LDAP サーバに接続し、そのサーバに対して質問します。 この質問に対してサーバは回答を返したりクライアントが追加情報を探し出せる 場所へのポインタ(通常は別のLDAPサーバ)を返したりします。クライアントからは、 どの LDAP サーバに接続してもディレクトリは同じように見えます。 ある LDAP サーバに提示した名前は別の LDAP サーバでも同じエントリを参照します。 これは、LDAP のようなグローバルディレクトリサービスの重要な特性です。

1.4. slapd とは何か、何ができるのか?

slapd は多くのプラットフォームで動作する LDAP ディレクトリ サーバです。これを使えば独自のディレクトリサービスを提供できます。 ディレクトリには置きたいもののほとんどを入れておけます。 グローバル LDAP ディレクトリサービスに接続されるようにすることも、 ローカルにサービスをすべて提供することもできます。 slapd の興味深い機能と能力のいくつかを次にあげます。

LDAPv2LDAPv3: slapdLightweight Directory Access Protocol の バージョン 2 と 3 をサポートしています。slapd は既存のクライアント との互換性を維持しつつ最新の機能をサポートしています。slapd は IPv4 と IPv6 の両方をサポートします。

Simple Authentication and Security Layer: slapd は SASL を利用した強力な認証 サービスをサポートします。slapd の SASL の実装は、DIGEST-MD5, EXTERNAL, GSSAPI などの機構をサポートする Cyrus SASL ソフトウェアを利用しています。

Transport Layer Security: slapd は TLS (あるいは SSL)を利用して 機密性と一貫性の保護を提供します。slapd の TLS の実装は OpenSSL ソフトウェアを利用しています。

アクセス制御: slapd は高度で強力なアクセス制御機能を 提供します。この機能によりデータベース内の情報へのアクセスを制御 できます。LDAP の認証情報、IP アドレス、ドメイン名などと いった基準を基にしてエントリへのアクセスを制御できます。slapd は、静的動的 の両方のアクセス制御情報をサポートします。

国際化: slapd は Unicode と言語タグをサポートしています。

データベースの選択: slapd には選択可能なさまざまな バックエンドデータベースがあります。バックエンドデータベースには 次のようなものがあります。

複数のデータベース実体: slapd は同時に複数のデータベース を扱うように設定できます。つまり、LDAP ツリーの論理的に異なる部分に ついての要求に単一の slapd で応答できます。この LDAP ツリーの 各部には、同じバックエンドデータベースを使ってもよいですし、 違うバックエンドデータベースを使ってもかまいません。

汎用モジュール API: さらなるカスタム化が必要な場合を想定して、 slapd では容易に独自のモジュールを書けるようになっています。 slapd はフロントエンドとモジュールの二つの部分から成っています。 フロントエンドは LDAP クライアントとのプロトコル通信を処理します。 モジュールはデータベース操作のような特定の作業を処理します。 これら二つの部分の間では、よくできた C API を 使ってやりとりされるので、多くの手段で slapd を拡張する独自の カスタムモジュールを開発できます。また、プログラム可能なデータベース も提供されています。これを使えば、人気のあるプログラミング言語 (Perl, Shell, SQL, TCL)を使って 外部のデータソースを slapd で扱えるようにできます。

スレッド: slapd は高速化のためにスレッドに対応しています。 マルチスレッドを使った単一の slapd プロセスがクライアントの すべての要求を処理し、システムのオーバヘッドを減らします。

複製: slapd は、そのデータベースの複製を管理するように 設定できます。このシングルマスター/マルチスレーブの複製機構は、 シングルの slapd では、要求される可用性と信頼性を提供できない ような負荷の高い状況で必要になります。また slapd では、 マルチマスタ複製の試験的サポートも実装しています。

設定: slapd は高度に設定が可能です。設定は単一の設定 ファイルをとおして行い、変更したいとこだけを変更できるように なっています。設定ディレクティブには妥当なデフォルト値を持って いるので、設定作業が実に容易になっています。

もちろん slapd にも制限はあります。メインの LDBM データベース バックエンドは、範囲問合せや否定問合せをうまく処理できません。 これらの機能をはじめとして、さらなる機能が将来のリリースでサポート されるでしょう。

1.5. X.500 とは何か?

技術的に見れば LDAP は、OSI のディレクトリサービスである X.500 ディレクトリサービスに対するディレクトリアクセス プロトコルです。初期の LDAP サーバは LDAP と X.500 Directory Access Protocol (DAP)の間のゲートウェイでした。 DAP は完全な OSI プロトコルスタックの上で動作し、 大量のコンピュータリソースを必要とする重量プロトコルです。 LDAP は TCP/IP の上で動作するよう設計されていて、 DAP の機能のほとんどをかなりの低コストで提供します。

このように LDAP を利用すると X.500 ディレクトリのアクセスは 容易になりますが、それでも開発されている多くの LDAP クライアントで データを利用できるようにするには、完全な X.500 サービスが必要です。 完全な X.500 DAP クライアントと同様、完全な X.500 DAP サーバの操作に かかるソフトウェアは小さくありません。

スタンドアローンの LDAP デーモン(あるいは slapd(8))は、 LDAP 自体がクライアントの負担を大きく軽減したように、 サーバ側の負担を大きく軽減するために作られました。 既に X.500 DAP サービスを動作させていて今後も継続して利用していく つもりなのであれば、このガイドを読むのをやめたほうがよいかもしれません。 このガイドは slapd で LDAP を動作させることについてが すべてであって、X.500 DAP を動作させることはありません。 X.500 DAP まだ利用していないか、X.500 DAP の利用を止めたいか、 すぐに X.500 DAP を利用する計画がないのであれば読み進めてください。

LDAP ディレクトリサーバから X.500 DAP DSA にデータを 複製することは可能です。これには LDAP/DAP ゲートウェイが必要 となります。OpenLDAP ではそのようなゲートウェイを用意していませんが、 OpenLDAP の複製はそのようなゲートウェイに複製するのに使えるように なっています。複製についての情報は、この文書の slurpd を利用した複製の章を参照してください。

1.6. slurpd とは何か、何ができるのか?

slurpd(8) は、slapd が提供する複製サービスを支援する デーモンです。slurpd の役割は、マスターの slapd データベース に起きた変更を他の複製の slapd に配送することです。slurpd では、変更を送るときに複製の slapd がダウンしていたり 通信できない場合はどうするかといった心配もありません。 なぜなら slurpd は失敗した要求の再トライを自動的に処理する からです。slapdslurpd は変更を記録する単純なテキスト ファイルをとおして情報をやりとりします。

slurpd(8) を設定、実行する方法についての情報は slurpd を利用した複製の章を参照してください。