OpenLDAPの設定をしてたら死にそうだった話
以下の環境でのメモ。2012-09-27 時点。毎度のことだけど古い情報が残るWebにおいては情報の鮮度は重要なのだ。
- CentOS release 6.3 (Final)
- OpenLDAP: slapd 2.4.23 (Aug 8 2012 16:29:21)
○ 興味があんまりない人向けの説明
Aというソフトを利用したBというソフトと戯れようとしていた。ら、そのAが前提としているB上の設定ファイルが古いもので、新しいバージョンでは違う方法を取れと言われる。A側のマニュアルはどうもメンテされてないようで、そこに書かれてる内容をBの新しい仕組みに基づいて書き換えないとあかん。ところでBってソフト、初めて触れる気がするよ?
○ OpenLDAP 2.4 より導入された OLC (cn=config) とかいう仕組み
このページが最終的には最も使える情報を提供している気がした。
Chapter 6.1.1: OpenLDAP using OLC (cn=config)
OpenLDAPをリブートすると阿鼻叫喚なので、そうせずに設定ファイル読み直せるように、仕組みを変えたよ。OLC は On-Line Configurationだよ。古い仕組みであるslapd.confも「一応」残ってるけど使わないほうが身のためだよ、という話。
例えばCentOS 6.3では、パッケージでインストールした時点で全ての設定が /etc/openldap/slapd.d/ 下にDIT (Directory Information Tree) の形で収められている。つまりファイルシステムにべったり設定が書かれてる。平文で。うん。
混在時にどういう挙動を示すかは怖いので調べたくない (とある記事によると slapd.d しか読まれないとかあったが、ポインタを保存し忘れたので省略)。理想的には混在させるべきではない、はず。
ということは、自分で今後運用するのなら、当然新しい仕組みを元にやるよね普通、という話。というか、yumでインストールした時点ですでに色々入ってて、ならそれはそのまま使いたいよね、と思うよ普通。
今使用している某ソフトの設定ガイドは全て古い仕組みを前提としており、しかも解説がない。私がOpenLDAPを知っていればまだしも何も知らない状態から始めたので酷いめに会うことになったのであーる。
○ やることの概要
OpenLDAPを使いたがっているという具体的なソフト名は省略するけど以下のように書かれていた
- (古いフォーマットの) スキーマはこれを使ってね
- (古いフォーマットの) suffixとrootdnとrootpwはこういう風に設定してね
- 最後にこれ(test.ldifとする)をldapaddでデータベースに追加してね
基本的にやったのはこの古いスキーマをldifフォーマットに変換してcn=admin,cn=config経由でslapd.d 下にぶちこみ、最後に#3をやるという作業。ldif自体は既存の仕組みなので、#3は#1と#2が正しければ自然と通るわけ。
ここまでで、スキーマ、rootdn、rootpwとは何か,ldapaddで失敗したら何が起こってどうしたらリカバリできるのか、そもそもゴールが何か、といった説明は本家には一切なかった。ああ、確かに古いOSならそのまま使えばいいんだけどな。
○ やったこと
古いスキーマ形式で渡されたファイルをldifフォーマットに直す。上記のサイトにも方法が書いてある。すでにインストール済のスキーマ群が/etc/openldap/schema 下に今でも残っているので、これを参考に。
次にそれをldapaddで読みこませる……前に slapd.d/cn=config/olcDatabase={0}config.ldif を編集して olcRootDN と olcRootPW を編集及び追加。これは上記の#2とは関係がない。また、セキュリティが重要でなければ必要でもたぶんない。
こういう感じ。二行目の生成にはolcRootDN: cn=admin,cn=configolcRootPW: {SSHA}xwd0OrrW2VVbw
ldif形式に直したスキーマを読みこませる。
ldapadd -x -D cn=admin,cn=config -W -f schema/newschema.ldifなおこの方法だとパスワードを聞かれるので上で設定したものを入れる。よおし入ったぞ。
はいここでマッター。newschema.ldifのフォーマットが間違ってたらどうなるんでしょ。ちなみに実際間違えました。後になってから酷い状態になってることが発覚しました。
確認のために ldapsearch でスキーマがちゃんとアップデートされてたかをここでチェック。
ldapsearch -LLL -x -W -D cn=admin,cn=config -b "cn=schema,cn=config"ここで末尾に上記のnewschema.ldifが入っているかチェック。なおファイルとして slapd.d/cn=config/cn=schema/ 下に連番付きでこのファイルが保存される。
私の場合にハマったのは
- 要らない空行を解釈されてなんかおかしかった (RFC嫁)
- スペルミス (olcAttributeTypes, olcObjectClasses)
一つ目、ldifフォーマットは空行に意味があり、一つのデータの塊の間に空行を入れてはいけないというのに空行を適当に入れた結果、間違ったコンフィグを保存された結果正常終了してcn=configが書き換わってしまう。それに気づかずに次のステップに行くとあじゃーん、そこで「このattributeしらんの」とか出て、中途半端な状態で次のldifファイルまで読み込まれてしまい泥沼。ここでちゃんとチェックする。
もし変なスキーマがここでインポートされてしまった場合には、(上記のサイトに書かれている通りに) スキーマを強制的に消してやりなおす。slapdを止める。ファイルを消す。slapdを起動する。それだけさ!
スキーマ読み込ませたら、#2に移る (スキーマを読みこませる前でも実は良いっぽかった)
こんどは slapd.d/cn=config/olcDatabase={2}bdb.ldif を編集して、olcSuffix, olcRootDN, olcRootPW を指定通りに設定する。ただしまず前提として、上記の#2で指示しているsuffix, rootdn, rootpwがBDBに対する設定であるという確信が必要。くわしくはあなたが参照しているマニュアルを御覧ください。
ここまででrootdnとrootpwは二回設定した。一回目はcn=configに対するもの (cn=admin,cn=config)、二回目はBDBに対するもの。普通LDAPを使ったソフトなら後者の設定について連携したいはずだから、もしslapd.confを書き換えてねと言っていたらこっちのパスワードなどを指定するはず。というわけで以上のようにした。
はいはいわろす。
最後に指定されたldifファイルを読む (#3)
ldapadd -x -D (ここに指定されたdnを書く) -W -f test.ldifここで聞かれるパスワードは2つ目のものになる。
○ LDAPのエントリを見れるか検証
とりあえずLDAPを内外から叩けるかチェック。中から
ldapsearch -x -W -LLL -D (bdbのrootdn) -b 調べたいもの外から
ldapsearch -h (host) -x -W -LLL -D (bdbのrootdn) -b 調べたいもの
○ わかりにくいよばかー
私の説明がな
基本的に「スキーマをcn=configに認識させて、そのあとインポートする」という点でslapd.confを使ってやることと何ら変わりない。ただし方法が全く違い、ネット上にも古い方法が蔓延しているため非常に混乱させられた、という話。
○ 途中で感じた疑問と結局理解した内容
Q: slapd.d 内部は直接いじっちゃだめなんじゃ
A: 結局大丈夫らしい。いまのところ
Q: bdbの位置が分からん。データ消したい
A: slapd.d/cn=config/olcDatabase={2}bdb.ldif に書いてあるよ。でもそのまえに ldapsearch と ldapdelete に熟達するべきだよ
○ そのほか参考に出来たページ
- http://www.linuxquestions.org/questions/linux-server-73/how-to-add-a-new-schema-to-openldap-2-4-11-a-700452/
- http://lists.debian.or.jp/debian-users/200601/msg00171.html
- http://l-w-i.net/t/openldap/ldapadd_100.txt
○ まとめ
間違っていたら、知り合いの方はご連絡ください。検索でたどり着いた方は、より深みにはまってより新しい記事を書くよう、お願いします。
オープンウェブって辛いわ。
○ なお
OpenLDAPに依存しているソフト側との連携はためしてもいません。あじゃーん。
○ 追記
- /usr/share/openldap-servers に古いslapd.confが置いてある、slapd.conf.obsolete という名前で。ここには他に (Berkley DBの) 設定ファイル例であるDB_CONFIGもある。