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

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

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

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

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

1.2. LDAP とは?

LDAPLightweight Directory Access Protocol の略です。名前が示すように、 LDAP はディレクトリサービス、特に X.500 ベースのディレクトリサービスにアクセスするための軽量プロトコルです。 LDAP は TCP/IP あるいは他の接続指向の転送サービスの上で動作します。LDAP 中核となる仕様の詳細は RFC2251 "The Lightweight Directory Access Protocol (v3)" と技術仕様 RFC3377 を構成する他の文書に定義されています。この節ではユーザの観点から 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 ディレクトリツリー(伝統的な命名法)

ツリーはインターネットドメイン名を基にすることもできます。この命名法は、DNS を利用してディレクトリサービスを捜し出せるようにするものとして一般化してきています。図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 ディレクトリサービスは、クライアントサーバモデルを基にしています。一つ以上のディレクトリサーバが、ディレクトリツリー情報(Directory Information Tree: DIT)を構成するデータを保有しています。クライアントは LDAP サーバに接続し、そのサーバに対して質問します。この質問に対してサーバは回答を返したりクライアントが追加情報を探し出せる場所へのポインタ(通常は別のLDAPサーバ)を返したりします。クライアントからは、どの LDAP サーバに接続してもディレクトリは同じように見えます。ある LDAP サーバに提示した名前は別の LDAP サーバでも同じエントリを参照します。これは、LDAP のようなグローバルディレクトリサービスの重要な特性です。

1.4. X.500 とは何か?

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

LDAP はまだゲートウェイを介して X.500 ディレクトリサービスのアクセスに使われていますが、今では X.500 サービス自体で提供するようになってきています。

スタンドアローンの LDAP デーモン(あるいは slapd(8))は、 軽量の X.500 ディレクトリサーバとみなせます。つまり、 X.500 の DAP を実現していませんし、完全な X.500 モデルもサポートしていません。

既に X.500 DAP サービスを運用していて今後も継続して利用していくつもりなのであれば、このガイドを読むのをやめたほうがよいかもしれません。このガイドは slapd(8) で LDAP を動作させることについてがすべてであって、X.500 DAP を動作させることはありません。 X.500 DAP まだ利用していないか、X.500 DAP の利用を止めたいか、すぐに X.500 DAP を利用する計画がないのであれば読み進めてください。

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

1.5. LDAPv2 と LDAPv3 は何が違うのか?

LDAPv3 は、1990 年代後半に LDAPv2 に代わるものとして開発されました。 LDAPv3 は LDAP に次の機能を追加しています。

LDAPv2 はもう時代遅れです(RFC3494)。 LDAPv2 の処理系といわれているもの(slapd(8)を含む)のほとんどは、 LDAPv2 の技術仕様に従っていないので、LDAPv2 で処理系間の相互運用性を確保するのには限界があります。 LDAPv2 は LDAPv3 とかなり異なっているので、LDAPv2 と LDAPv3 の両方を同時に扱うと、かなり厄介なことになります。 LDAPv2 の利用はやめるべきです。LDAPv2 はデフォルトで無効してあります。

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

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

LDAPv3: slapdLightweight Directory Access Protocol のバージョン 3 をサポートします。slapd は IPv4 も IPv6 も Unix IPC もサポートします。

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 では、ネットワークトポロジーを基にソケットへのアクセス制限を設定できます。この機能には TCP wrappers を利用します。

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

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

データベースバックエンドの選択: slapd には選択可能なさまざまなデータベースバックエンドがあります。これらの中には、高速でトランザクション制御可能なデータベースバックエンド BDB、階層構造を持った高速でトランザクション制御可能なデータベースバックエンド HDB、軽量 DBM ベースのバックエンド LDBM、任意のシェルスクリプトに対するデータベースインタフェース SHELL、簡単なパスワードファイルデータベース PASSWD があります。BDB と HDB バックエンドは SleepycatBerkeley DB を利用します。 LDBMは Berkeley DB あるいは GDBM のどちらかを利用します。

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

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

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

複製: slapd は、ディレクトリ情報のシャドーコピー(shadow copy) を管理するように設定できます。このシングルマスター/マルチスレーブの複製機構は、シングルの slapd では、要求される可用性と信頼性を提供できないような負荷の高い状況で必要になります。 slapdLDAP Sync ベースと slurpd(8) ベースの2つの複製メソッドをサポートします。

代理キャッシュ: slapd は キャッシュ LDAP 代理サービスとなるように設定できます。

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

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

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

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

この他に LDAP-Sync ベースの複製が複製サービスを提供するために利用できます。詳しくは LDAP Sync 複製の章を参照してください。