第19回 OpenLDAPの導入
2004/8/28作成
2004/9/25更新
第16回の特集でやりかけにしてあるLDAP関連ですが、LDAP導入の敷居が高くて手つかずでした。
最近はActiveDirectoryが盛んだし、sambaでもLDAP対応が進んでいるみたいです。
ちょうど時間的な余裕があったのでLDAPの勉強もかねて導入してみることにしました。
LDAPといえば、前述のActiveDirectoryがLDAP互換で動くことで有名です。
そのほかに老舗のNovelのNDSやNetscapeからiPlanet、そしてSunONEと名前を変えているDirectoryサービスが有名ですが、ここはOpenLDAPを入れてみることにしました。
1.準備
LDAPのインストールはかなり難しいようです。
最初にやったときはあきらめてRedhatのパッケージから入れたのですが、なにが起きるかわからないこのご時世なのでソースから入れられるようにしておきたいので、FreeBSDにソースからコンパイルして入れることにしました。
2.BerkeleyDBのインストール
LDAPのデータはbdbやldbmに格納されるようです。BerkeleyDBはLinuxでも*BSDでもデフォルトで入っていることが多いのですが、OpenLDAPが要求しているバージョンは4.1以上になっています。
OpenLDAPのconfigure中にBDBのバージョンが古いとかバックエンドでの動作をしないバージョンだとか文句を言われるのはたいていこのパターンです。
ちょっと新しめのディストリビューションでも古いバージョンになっている可能性があるので要注意です。
/usr/include/db.hにBerkeleyDBのヘッダファイルがあってこれにバージョン情報があるので4.1以上か確認しましょう。
たまにバージョン情報がみあたらないときがありますが、かなり古いバージョンにはそういうものがあるみたいなので、あきらめて最新版を入れましょう。
パッケージから入れられればいいのですが、今回用意したFreeBSDは古くて、4.1以上のパッケージがなかったためソースから入れました。
今回はSleepyCatのサイトからver4.2.52を持ってきました。
% fetch http://www.sleepycat.com/update/snapshot/db-4.2.52.NC.tar.gz
あとは展開してコンパイルするのですが、configureの手順が少々変わっています。
展開した先に"build_xx"というプラットフォームごとのディレクトリができているのですが、まずは自分のプラットフォームにあわせてカレントディレクトリをここに移します。
FreeBSDの場合は"build_unix"になります。
そこから、configureをたたくのですが、configureの場所はdistディレクトリの中にあります。
configureのオプションにも気を付けなければいけません。
そのままオプションなしにconfigureしてしまうとbinもlibもincludeもみんな"/usr/local/BerkeleyDB.4.2"配下に作られてしまいます。
OpenLDAPのインストール時に参照するのは/usrにあるヘッダファイルやライブラリを使うので上書きするようにprefixを"/usr"に指定します。
% tar zxvf db-4.2.52.NC.tar.gz
% cd db-4.2.52.NC/build_unix
% ../dist/configure --prefix=/usr
% make
% su
# make install
これでBerkeleyDBの準備はできました。
念のためにdb.hを見てみましょう。
# grep "DB_VERSION_STRING" /usr/include/db.h
#define DB_VERSION_STRING "Sleepycat Software: Berkeley DB 4.2.52: (December 3, 2003)"
それから、sharedライブラリのリンクが新しくなっているはずです。
# ls -la /usr/lib | grep libdb -rw-r--r-- 1 root wheel 936974 Aug 28 17:12 libdb-4.2.a -rw-r--r-- 1 root wheel 781 Aug 28 17:11 libdb-4.2.la -rwxr-xr-x 1 root wheel 747903 Aug 28 17:11 libdb-4.2.so lrwxr-xr-x 1 root wheel 12 Aug 28 17:12 libdb-4.so -> libdb-4.2.so -rw-r--r-- 1 root wheel 936974 Aug 28 17:12 libdb.a lrwxr-xr-x 1 root wheel 12 Aug 28 17:12 libdb.so -> libdb-4.2.so
次はいよいよOpenLDAPを入れます。
3.OpenLDAPのインストール
OpenLDAPのサイトからソースを入手します。
トップページの青虫は、何度見ても気持ち悪いです。
% fetch ftp://ftp.dti.ad.jp/pub/net/OpenLDAP/openldap-release/openldap-2.2.15.tgz
拡張子がtar.gzではなくtgzというのもめずらしいですね。
問題なくGNUのtarで展開できるんですけどね。
あとはふつうにmakeしてしまいます。
いろいろconfigureのオプションがあるのですが、試しに動かす程度であればなにもオプションを付けなくても動くので、今回はオプションなしのconfigureをかけます。
必要なオプションはあとあと覚えていくことにしましょう。
% tar zxvf openldap-2.2.15.tgz
% cd openldap-2.2.15
% ./configure
% make depend
% make
と、"make install"するまえにここでちょっと一息入れます。
"make install"の前に"make test"をします。
ここでは、インストール前にLDAPのポートを開きながらあわせて20以上のチェック項目について評価していきます。
非常に時間のかかるチェックなので、お茶でも飲みながらゆっくり待ちましょう。
ちなみに、Berkeley DBのエラーがでたときに強引にconfigureを通してmakeした時はここで引っかかってました。
% make test
==snip==
>>>>> Test succeeded
>>>>> ./scripts/test021-certificate completed OK.
>>>>> waiting 10 seconds for things to exit
run configure with --enable-hdb
run configure with --enable-ldbm
% su
# make install
これでインストールが終わりました。
slapaddやldapserchのようなLDAP関連のツールは"/usr/local/sbin"や"/usr/local/bin"に入っているのですが、LDAPデーモンやリプリケーションのデーモンは"/usr/local/libexec"に入っているので気を付けましょう。
これらがちゃんと新しいBerkeley DBをリンクしているかどうかの確認はこんな感じでできます。
#筆者はBerkeley DB関連でかなり手こずったので疑り深くなっています。
# ldd /usr/local/libexec/slapd
/usr/local/libexec/slapd:
libdb-4.2.so => /usr/lib/libdb-4.2.so (0x28119000)
libssl.so.3 => /usr/lib/libssl.so.3 (0x281bf000)
libcrypto.so.3 => /usr/lib/libcrypto.so.3 (0x281f0000)
libfetch.so.3 => /usr/lib/libfetch.so.3 (0x282fb000)
libcom_err.so.2 => /usr/lib/libcom_err.so.2 (0x28308000)
libc_r.so.5 => /usr/lib/libc_r.so.5 (0x2830a000)
libc.so.5 => /usr/lib/libc.so.5 (0x2832d000)
はい。OKでした。
あとはconfigを修正して実行するのですが、動作確認程度だったらconfigの修正は不要なので、試しに実行してみましょう。
# /usr/local/libexec/slapd
# ps ax | grep slapd
1100 ?? Ss 0:00.01 /usr/local/libexec/slapd
うまく動いたかをクライアントツールのldapsearchで確認してみましょう。
# ldapsearch -s base +
# extended LDIF
#
# LDAPv3
# base <> with scope base
# filter: (objectclass=*)
# requesting: +
#
#
dn:
structuralObjectClass: OpenLDAProotDSE
namingContexts: dc=my-domain,dc=com
supportedControl: 2.16.840.1.113730.3.4.18
supportedControl: 2.16.840.1.113730.3.4.2
supportedControl: 1.3.6.1.4.1.4203.1.10.1
supportedControl: 1.2.840.113556.1.4.1413
supportedControl: 1.2.840.113556.1.4.1339
supportedControl: 1.2.840.113556.1.4.319
supportedControl: 1.2.826.0.1.334810.2.3
supportedExtension: 1.3.6.1.4.1.1466.20037
supportedExtension: 1.3.6.1.4.1.4203.1.11.1
supportedExtension: 1.3.6.1.4.1.4203.1.11.3
supportedFeatures: 1.3.6.1.4.1.4203.1.5.1
supportedFeatures: 1.3.6.1.4.1.4203.1.5.2
supportedFeatures: 1.3.6.1.4.1.4203.1.5.3
supportedFeatures: 1.3.6.1.4.1.4203.1.5.4
supportedFeatures: 1.3.6.1.4.1.4203.1.5.5
supportedLDAPVersion: 3
subschemaSubentry: cn=Subschema
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
なんか動いているみたいです。
これで安心して設定をはじめられそうです。
設定をいじる前に、slapdを停止しておきましょう。
4.OpenLDAPの設定
OpenLDAPの設定ファイルはslapd.confとldap.confですが、ldap.confはとくにいじらなくても動くみたいです。
上記の手順でインストールした場合、slapd.confは"/usr/local/etc/openldap"においてあります。
slapd.confはおおざっぱに次のような構成になっています。
- スキーマのinclude
- アクセス権限の設定
- データベースの設定
アクセス権限はあとあとこだわることとして、スキーマとデータベースの設定だけやってしまいます。
# /usr/local/etc/openldap/slapd.conf
# スキーマをincludeします。
# inetorgperson.schemaくらいまではよく使うので読み込んでおきます
#
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
# slapdのpidとargumentの保存先
#
pidfile /var/run/slapd.pid
argsfile /var/run/slapd.args
# データベース情報
# BerkeleyDBをつかうのでbdb
#
database bdb
# ドメインのサフィックス
# 管理するディレクトリツリーを指定します
#
suffix "dc=example,c=JP"
# 管理者用IDのdn(Distingrish
#
rootdn "cn=Manager,dc=example,c=JP"
# rootdnのパスワード
# slappasswdで生成したパスワードハッシュをsecretに置き換えます
#
rootpw secret
# データ実体の置き場所です
# /varに変えました
# セキュリティを考慮してこのディレクトリのアクセス権は700に
# しておきましょう
# ディレクトリができていないときは作成します
#
directory /var/openldap-data
# インデックスの設定
# 使い方次第で効率のよいindexが変わると思うので、とりあえず
# 今はデフォルトのままにします
#
index objectClass eq
これでおしまいです。
5.ベースの穴空け
今後、検索したらデータを追加したりするときに、ベースが必要になります。
ベースとなるdnがなくてもその先にあるエントリを作ることはできますが、検索などの操作ができないので意味がありません。
サフィックスでは"dc=example,c=JP"を指定しましたが、dcのエントリを操作しようとするとobjectClassViorationのエラーが出てしまいます。
ということで、もう一つ掘り下げてou=groupというouを追加するためldifを作成しましょう。
organizationalUnitのobjectClassはou属性が必須になるのでこれだけ埋めていますが、他にもいろんな属性があるので一緒に埋めてしまうのもいいでしょう。
# add_ou.ldif
dn: ou=group,dc=example,c=JP
objectClass: top
objectClass: organizationalUnit
ou: group
このldifをLDAPに食わせてあげればベースができます。
# slapadd < add_ou.ldif
スーパーユーザでslapdを停止してからやりましょう。
6.エントリの作成
ベースができたのであとはエントリを追加していきます。
わかりやすいエントリとしては、ユーザを追加していくのがいいと思います。
簡単なメールのアドレス帳でも作りましょう。
# add_user.ldif
dn: cn=user01,ou=group,dc=example,c=JP
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
sn: user01
cn: user01
ou: group
mail: user01@example.jp
dn: cn=user02,ou=group,dc=example,c=JP
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
sn: user02
cn: user02
ou: group
mail: user02@example.jp
同様の手順で追加します。
# slapadd < add_user.ldif
以上で完了です。
データが入ったらslapdを立ち上げて置きましょう。
※もしデータ投入をミスしてしまったら?
データを間違って入れてしまったときは焦らずにディレクトリ配下にできたファイルを削除しましょう。
# rm -rf /var/openldap-data/*
7.確認
コマンドラインでLDAPの検索ツールが用意されているのでこれを使ってみましょう。
"-b"でベースを指定します。
# ldapsearch -h localhost -b 'ou=group,dc=example,c=JP'
# extended LDIF
#
# LDAPv3
# base <ou=group,dc=example,c=JP> with scope sub
# filter: (objectclass=*)
# requesting: ALL
#
# group, example, JP
dn: ou=group,dc=example,c=JP
objectClass: top
objectClass: organizationalUnit
ou: group
# user01, group, example, JP
dn: cn=user01,ou=group,dc=example,c=JP
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
sn: user01
cn: user01
ou: group
mail: user01@example.jp
# user02, group, example, JP
dn: cn=user02,ou=group,dc=example,c=JP
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
sn: user02
cn: user02
ou: group
mail: user02@example.jp
# search result
search: 2
result: 0 Success
# numResponses: 4
# numEntries: 3
それっぽいものがでてきました。
これだけだとなんだかつまらないので、他のLDAP対応ソフトでも見てみましょう。
メールアドレス帳なので、メールソフトのBecky! ver2でためしてみました。
まずは、「アドレス帳」を開いて、「新規アドレス帳」を作成します。
下図のように、アドレス帳のタイプをLDAPサーバーにして、サーバー名を入れ、検索開始位置にはベースを入れます。
認証のところはanonymousでやっているので、なにも入れなくてもいいです。
エントリのdn(エントリ識別名)に対応するパスワードを設定していればここも使えるようになります。
あとは検索キーを"*"などにして検索してみてください。
なんかでてくるはずです。
他にもLDAP Browser/EditorというJavaベースのソフトがあります。
これはかなり便利なツールで、LDAPの検索や更新などの操作を網羅的にカバーしています。
また、ログを表示する機能もあるため、デバッグに適しています。
日本語が化けてしまうという難点もありますが。
※文字コードの設定間違いでした。ちゃんとUTF-8で入れれば日本語が出てきます。(04/9/25修正)
8.デバッグ
操作中にエラーメッセージが出てくることがあります。
たとえば、dcのエントリを変更しようとしたとき、こんなことを言われました。
# slapadd < add_dc.ldif
slapadd: dn="dc=examplel,c=JP" (line=5): (65) no structural object class provided
ここで注目するのは(65)の部分です。
これは、LDAP共通のResultCodeになっていて、RFC2251の4.1.10にちゃんと書かれています。
それによるとobjectClassViolation (65)となっています。
こういったエラーコードはOpenLDAPのクライアントツールでもそうですが、LDAP Browser/Editorのログに出てくるコードとももちろん共通のコードなのでデバッグの手助けになると思います。
9.これからの進め方
これでとりあえずLDAPサーバーが完成しました。
日本語を使えるようにしてみたり、第16回でやり残した証明書をLDAPに登録してみたり、Apacheのmod_auth_ldapを試してみたり、最近はsambaにLDAPを入れるのが流行りみたいなのでそういったことに挑戦してみるのもいいかもしれません。
参考文献
OpenLDAP入門 技術評論社(ISBN-7741-1776-5)
LDAPハンドブック ソフトリサーチセンター(ISBN-88373-162-6)
RFC2251 Lightweight Directory Access Protocol (v3)
OpenLDAP公式サイト http://www.openldap.org
SleepycatSoftware(Berkeley DB) http://www.sleepycat.com
LDAP Browser/Editor http://www.iit.edu/~gawojar/ldap/