Ubuntu
LDAP
openldap
replication
translucent

translucentを有効にしたopenldapでのreplicationの設定について

Translucent設定とReplication設定の課題

Ubuntu 16.04や18.04 Beta2でのslapdパッケージや、2.4.46ソースコードからビルドしたバージョンを確認した範囲では、slapd.dなどのディレクトリに設定を保存し、ldapaddやldapmodifyから設定を変更するOnLine Configuration (OLC)を利用した場合に、translucent overlayとsyncprov overlayを同時に有効にすることができませんでした。

何か他に手段があるかもしれませんが、ここでは、その前提でワークアラウンドとこれまでの情報をまとめていきます。

正常に動作する例

translucentとsyncprovによるレプリケーション設定自体は成功例があります。
Ubuntu系のopenldap 2.4.xはOLCがデフォルトで有効ですが、以下のようなslapd.confを準備することで動作しています。

slapd.conf
include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/cosine.schema
include         /etc/ldap/schema/nis.schema
include         /etc/ldap/schema/inetorgperson.schema
include         /etc/ldap/schema/ppolicy.schema

pidfile         /var/run/slapd/slapd.pid
argsfile        /var/run/slapd/slapd.args

# Load dynamic backend modules:
modulepath      /usr/lib/ldap
moduleload      back_mdb.la
moduleload      back_ldap.la
moduleload      translucent.la
moduleload      ppolicy.la
moduleload      pcache.la
moduleload      syncprov.la

database  mdb
suffix  dc=example,dc=com
rootdn  cn=admin,dc=example,dc=com
rootpw  secretpasswd
directory  /var/lib/ldap
index  objectClass,entryCSN,entryUUID eq

overlay  translucent
translucent_local  jpegPhoto,roomNumber,telephoneNumber
uri  ldap://ldap001m.example.com:389/
lastmod on

overlay syncprov
syncprov-checkpoint      64 30
syncprov-sessionlog      1024

access  to * by * read

slapdのバージョンが若干古い事に起因するのかとも思いましたが、最新版の2.4.46をコンパイルして動作させてみた限りでは同様の挙動をします。

LDIFファイルがまずいのかとも思いましたが、修正することができませんでした。

OLCを利用したtranslucentの設定とsyncprov設定について

作業のためにldapadd_cnconfig.shスクリプトファイルを準備しました。

ldapadd_cnconfig.sh
#!/bin/bash

if test "$@" && test -f "$@" ; then
  sudo ldapadd -Q -Y EXTERNAL -H ldapi:/// -f "$@"
else
  echo "Usage: $0 <file>"
fi

このスクリプトを利用して、次のようなLDIFファイルを順番に実行していきます。
前提として、slapd導入直後のデフォルトDBなどのファイルが削除された状態から始めています。

command-line
$ sudo apt-get install -y slapd
$ sudo /etc/init.d/slapd stop
$ sudo rm -rf /var/lib/ldap/*
$ sudo find /etc/ldap/slapd.d/cn\=config/ -name 'olcDatabase={*}mdb*' -exec rm -rf {} \;
$ sudo /etc/init.d/slapd start
ldap_01_add_modules.ldif
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: back_ldap
-
add: olcModuleLoad
olcModuleLoad: translucent
-
add: olcModuleLoad
olcModuleLoad: ppolicy
-
add: olcModuleLoad
olcModuleLoad: pcache
-
add: olcModuleLoad
olcModuleLoad: syncprov
ldap_02_create_mdb.ldif
dn: olcDatabase=mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: mdb
OlcDbMaxSize: 1073741824
olcSuffix: dc=example,dc=com
olcRootDN: cn=admin,dc=example,dc=com
olcRootPW: secretpassword
olcDbDirectory: /var/lib/ldap
olcDbIndex: objectClass,entryCSN,entryUUID eq
olcAccess: to * by * read
ldap_03_translucent_local.ldif
Overlay=translucent,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcTranslucentConfig
olcOverlay: translucent
olcTranslucentLocal: jpegPhoto,roomNumber,telephoneNumber
ldap_04_add_translucent_back_ldap.ldif
dn: olcDatabase=ldap,olcOverlay={0}translucent,olcDatabase={1}mdb,cn=config
objectClass: olcLDAPConfig
objectClass: olcTranslucentDatabase
olcDatabase: ldap
olcDbURI: ldap://ldap001m.example.com:389/
ldap_05_add_syncprov.ldif
dn: olcOverlay={1}syncprov,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: {1}syncprov
olcSpCheckpoint: 64 30
olcSpSessionLog: 1024

ここで、最後のsyncprov設定を追加すると、エラーメッセージが表示されて、エントリを追加することができません。

adding new entry "olcOverlay={1}syncprov,olcDatabase={1}mdb,cn=config"
ldap_add: Other (e.g., implementation specific) error (80)
        additional info: <olcSpSessionlog> failed startup

failed startupメッセージが表示される可能性

openldapのコードを眺めると、failed startupはbconfig.cの中で定義されています。

./servers/slapd/bconfig.c
snprintf( ca->cr_msg, sizeof( ca->cr_msg ), "<%s> failed startup", ca->argv[0] );

Ubuntu(debian系) slapdのデバッグ

デフォルトではsyslogのLOCAL4にメッセージを書き出すので、受け口を準備します。

/etc/rsyslog.d/70-ldap.conf
local4.* /var/log/ldap.log

/etc/default/slapdファイルにデバッグ情報を追加します。

/etc/default/slapd
...
# Additional options to pass to slapd
SLAPD_OPTIONS="-s -1"

結果的にはsyslogの出力をみても、あまりおもしろくありません。
BackendDBオブジェクトにSLAP_LASTMODマクロを適用して、結果がネガティブなので、エラーを出力している様子だけが分かりました。

Apr 10 13:22:52 localhost slapd[91862]: slapd starting
Apr 10 13:23:01 localhost slapd[91862]: syncprov_db_open: invalid config, lastmod must be enabled
Apr 10 13:23:01 localhost slapd[91862]: olcSpSessionlog: value #0: <olcSpSessionlog> failed startup (<D8>)!

とりあえず、ここまで

SLAP_LASTMODで親DBのフラグをチェックしているのに、なぜ正しく判定されないのかは、現時点では分からないままです。

また、問題が発生するのは、syncprovのProducerのみで、SyncReplを使うConsumer側は正常に動きます。

ワークアラウンドとしては、次のようになるかと思います。

  1. パッケージでslapdを導入し、
  2. slapd.confを別に用意し、
  3. /etc/default/slapdの変数で、/etc/init.d/slapdからは起動しないようにし、
  4. systemd用に別途スクリプトを用意して稼動させる

とりあえずは、このように対応してみます。

以上