2012/06/17

OpenLDAP2.4での設定スキームの移行

「そういえばdebianも6になったし、家のサーバも上げるか」という軽い気持ちで踏み出したdebian6。 ログをちゃんと確認しなかった自分が悪いんですが、後で見てみるとopenldapが2.3から2.4ベースに変わってる。 それよりも何よりもこのslapd.dディレクトリってなんじゃ?ってことになったので、軽く調べてみると.....。

OpenLDAP Software 2.4 Administorator's Guide: Configuring slapd
The older style slapd.conf(5) file is still supported, but its use is deprecated and support for it will be withdrawn in a future OpenLDAP release.
これまでのslapd.conf(5)形式のファイルは引き続きサポートされますが、この形式の利用は推奨されず、今後のOpenLDAPのリリースの中でいずれサポートされなくなる予定です。
がーん。slapd.conf使えなくなるんか。
これはslapd.confの保険があるうちにslapd-config(5)での設定変更方法を学んでおかなくちゃならんな。

上記ページのセクション5.1に設定用ツリーの概略が書いてあります。ってさらっと書いてあるけど、自分は実際の入っている状態を見てさわらないと理解できないおこちゃまなので、触ってみてはじめて意味が分かりました。
普段利用するdcである「dc=example,dc=com」の配下ではなく、これと独立した「cn=config」をトップとするツリーが生成・利用されるようです。

ここで疑問。「/etc/ldap/slapd.d配下にあるファイルは自分でインポートする用のテンプレートなのか?」
というわけでいろいろ試してみましたよ。

# ldapadd -x -W -D cn=admin,dc=example,dc=com -f cn\=config.ldif
Result: Insufficient access (50)
# ldapadd -x -W -D cn=config,cn=admin,dc=example,dc=com -f cn\=config.ldif
ldap_bind: Invalid credentials (49)
# ldapadd -x -W -D cn=config,cn=admin -f cn\=config.ldif
ldap_bind: Invalid credentials (49)
# ldapadd -x -W -D cn=config -f cn\=config.ldif
ldap_bind: Invalid credentials (49)

無理じゃん。どんなやったって入んないじゃん。
もう一度ドキュメントを読んでみるか。
slapd.d配下のファイルは手で直接いじるな....ですか。
ということは、net-snmpにおける/var/lib/net-snmp/snmpd.confと似たイメージで、メモリ上に保持されている各種設定の退避・保存先として使われるってことなのかな。
 もひとつ。-Fオプションと-fオプションについて。
  1. -fオプションのみの場合、slapd.confを使って動作してくれる。
  2. -Fオプションのみの場合、slapd.d配下の構成を使って動作してくれる。
  3. -fオプションと-Fオプションを併用した場合、slapd.confを使って動作し、その状態をもとにしてslapd.d配下を構築してくれる。
お。3つめがいい感じ。debianだと、/etc/default/slapdのSLAPD_CONFを空にしておくと、初期値で/etc/ldap/slapd.confを使ってくれます。また、SLAPD_CONFを設定した場合、slapd.confを与えると勝手に-fオプションで、slapd.dを与えると勝手に-Fオプションで起動してくれるようです。
ただ、3つめをやるには、上記の「SLAPD_CONFが空の場合」のロジックに乗っかりつつ、SLAPD_OPTIONSで「-F /etc/ldap/slapd.d」とするのが良さそう。ひとまずは下記のような感じで起動してみましょう。

vi /etc/default/slapd
SLAPD_CONF=
SLAPD_OPTIONS="-F /etc/ldap/slapd.d"

ちゃんと起動したようです。

 4195 ?        Ssl    0:00 /usr/sbin/slapd -g openldap -u openldap -f /etc/ldap/slapd.conf -F /etc/ldap/slapd.d

この状態になったはいいけど.....まだslapd.confから離れられない。。。そもそもcn=configのツリーはどうやって見るんだ??

で、いろいろ調べてみた結果、下記のpostが参考になりました。

http://serverfault.com/questions/272125/how-do-i-install-a-new-schema-for-openldap-on-debian-5-with-dynamic-config-cn-ba

「slapd.d/cn=config/olcDatabase{0}=config.ldif にolcRootPWを追加して起動しろ」って言ってますね。やってみました。

vi slapd.d/cn=config/olcDatabase{0}=config.ldif
olcRootPW: haraheriherihara

/etc/init.d/slapd restart

ちゃんと読めました!!!やっとconfigがいじれるようになりました!!!




で、この記事を書きながら当初のAdministrator's Guideを読み直していると、こんな記述が。。。。。

5.4. Converting old style slapd.conf(5) file to cn=config format

Before converting to the cn=config format you should make sure that the config backend is properly configured in your existing config file. While the config backend is always present inside slapd, by default it is only accessible by its rootDN, and there are no default credentials assigned so unless you explicitly configure a means to authenticate to it, it will be unusable.

cn=configフォーマットへの変換を行う前に、既存の適切な設定ファイルに対してconfigバックエンドの設定をする必要があります。configバックエンドはslapdの内部で常に存在していますが、初期設定ではrootDNでしかアクセスできず、初期クレデンシャルもないため、明示的に設定しない限り利用できません。

If you do not already have a database config section, add something like this to the end of slapd.conf
database config
rootpw VerySecret


利用中の設定ファイルにまだdatabase configセクションを追加していないなら、下記のような行をslapd.confの末尾に追加してみてください。
database config
rootpw VerySecret

な、なんだってー!ちゃんと移行方法が書いてあるじゃないか!
というわけで試してみました。
  
lennyで新規にslapdを導入すると、2.4ベースではあるものの、設定パターンは2.3を踏襲するため、slapd.confベースになっています。この状態から、適当にいくつかエントリを作成し、slapcatでも見えることを確認しておきます。エントリの作成にはphpLdapAdminを使いました。検証用のエントリなので手抜きも重要。
apt-get -y install slapd phpldapadmin
slapcat

つづいて、設定の移行をしてみます。slapd.dディレクトリ自体は作らないとダメなんですね。
/etc/init.d/slapd stop
mkdir /etc/ldap/slapd.d
chown openldap:openldap /etc/ldap/slapd.d
chmod 700 /etc/ldap/slapd.d
echo database config >>etc/ldap/slapd.conf
echo -n "rootpw " >>/etc/ldap/slapd.conf
slappasswd >>/etc/ldap/slapd.conf
New password:
Re-enter new password:

そして起動。ちゃんとslapd.d配下に設定が展開されているのが確認できます。
/etc/init.d/slapd start

この状態でldapsearchを実行。ちゃんと見えましたね。
ldapsearch -x -w haraheriherihara -D cn=config -b cn=config -s base
Enter LDAP Password:

ここまでくればしめたもんです。slapd.confからslapd.dへの完全移行の後始末をしましょう。
mv /etc/ldap/slapd.conf /etc/ldap/slapd.conf.old
vi /etc/default/slapd
SLAPD_CONF=/etc/ldap/slapd.d
SLAPD_OPTIONS=""
/etc/init.d/slapd restart

ちゃんと動きましたか?