slapd.logの「bdb_equality_candidates: (uid) not indexed」の対処

■環境は以下。
 別に初期化しなくても良いw。

 WheezyでLDAP認証、SSHログイン
 http://d.hatena.ne.jp/labunix/20130418

 slapdのDBのバックアップ(3パターン+1)、DBの初期化、リストア
 http://d.hatena.ne.jp/labunix/20130419

 slapdのログをsyslogに渡す
 http://d.hatena.ne.jp/labunix/20130420

■「slapd.log」に「index」を作成した方が良いというアドバイスのログが出る。

<= bdb_equality_candidates: (uid) not indexed

$ ps -ef | grep slapd | sed s/".*\:[0-9]* "//g
/usr/sbin/slapd -h ldap:/// ldapi:/// -g openldap -u openldap -F /etc/ldap/slapd.d -s -1
grep slapd

$ sudo find /etc/ldap/slapd.d/ -type f | sudo xargs grep -i index
/etc/ldap/slapd.d/cn=config/olcDatabase={1}hdb.ldif:olcDbIndex: objectClass eq

■変更前のチェック
 ログインも出来るし、認証も正常なのでエラーというわけでは無い。

$ sudo /etc/init.d/slapd stop
$ sudo -u openldap slaptest
config file testing succeeded
$ sudo -u openldap slapindex
$ sudo /etc/init.d/slapd start

■アドバイスのとおり、indexを作成したいなら、
 以下の通り「手動で直すな、ldapmodifyを使え」である。

 後述の「おまけ」以降の手順は、戻すまでの手順を書いた(実際、時系列としてはこっちが先)が、
 少なくともDebinユーザは真似しないで欲しい。

$ sudo head -1 '/etc/ldap/slapd.d/cn=config/olcDatabase={1}hdb.ldif'
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.

■slapdログの該当のメッセージ(bdb_equality_candidates: (uid) not indexed」)と、
 余計な「checksumのエラーを出すこと無く」解決する手順。

■以下のように「cn=config」のグローバル設定にあるので。

$ sudo ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config -W olcDatabase={1}hdb "olcDbIndex"
Enter LDAP Password:
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: olcDatabase={1}hdb,cn=config
olcDbIndex: objectClass eq

■LDIFを作成して「ldapmodify」で変更する。

$ cat index.ldif
dn: olcDatabase={1}hdb,cn=config
changeType: modify
add: olcDbIndex
olcDbIndex: uid eq
-

$ sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f index.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}hdb,cn=config"

$ sudo ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config -W olcDatabase={1}hdb "olcDbIndex"
Enter LDAP Password:
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: olcDatabase={1}hdb,cn=config
olcDbIndex: objectClass eq
olcDbIndex: uid eq

■uid.bdbの動作確認
 以下のように「db_stat」で確認出来る。

$ sudo apt-get install -y db-util
$ sudo env DB_HOME=/var/lib/ldap db_stat -m | grep Pool
2MB 520KB	Pool individual cache size
Pool File: uid.bdb
Pool File: id2entry.bdb
Pool File: dn2id.bdb
Pool File: objectClass.bdb

$ sudo db_dump /var/lib/ldap/uid.bdb
VERSION=3
format=bytevalue
type=btree
duplicates=1
dupsort=1
db_pagesize=4096
HEADER=END
 7fc923a0
 0000000000000005
DATA=END

--------------------------------------------------------------------------------
■おまけ

■以下の参考手順はslapd自体は動くが、DBのchecksumのエラーが直せない。

 HOWTO solve OpenLDAP bdb_equality_candidates errors
 http://blog.remibergsma.com/2012/03/05/howto-solve-openldap-bdb_equality_candidates-errors/

■「openldap」ユーザで編集しているが、
 念の為「/etc/ldap/slapd.d/」配下をopenldapユーザに変更する。

 使用しているHDBのインデックス用の設定が不足しているということのようだ。
 ただし、「uid」についてだけなので、本来は「uid eq」だけ追加すればよい。

$ sudo /etc/init.d/slapd stop
[ ok ] Stopping OpenLDAP: slapd.

$ sudo grep eq '/etc/ldap/slapd.d/cn=config/olcDatabase={1}hdb.ldif'
olcDbIndex: objectClass eq

$ sudo -u openldap sed -i \
  s/"olcDbIndex: objectClass eq"/"&\nolcDbIndex: cn eq\nolcDbIndex: gidNumber eq\nolcDbIndex: memberUid eq\nolcDbIndex: uid eq\n"/g \
  '/etc/ldap/slapd.d/cn=config/olcDatabase={1}hdb.ldif'

$ sudo grep eq '/etc/ldap/slapd.d/cn=config/olcDatabase={1}hdb.ldif'
olcDbIndex: objectClass eq
olcDbIndex: cn eq
olcDbIndex: gidNumber eq
olcDbIndex: memberUid eq
olcDbIndex: uid eq

$ sudo -u openldap slaptest
51737d8f ldif_read_file: checksum error on "/etc/ldap/slapd.d/cn=config/olcDatabase={1}hdb.ldif"
config file testing succeeded

$ sudo chown -R openldap:openldap /etc/ldap/slapd.d/

$ sudo /etc/init.d/slapd start
[ ok ] Starting OpenLDAP: slapd.

■ログインチェック
 「<= bdb_equality_candidates: (uid) not indexed」のログは出なくなった。

$ ssh ldapuser@localhost

■checksumがおかしい方が気になるので。。。

$ sudo /etc/init.d/slapd stop
$ sudo grep "olcDbIndex: [cgmu].*eq" '/etc/ldap/slapd.d/cn=config/olcDatabase={1}hdb.ldif'
olcDbIndex: cn eq
olcDbIndex: gidNumber eq
olcDbIndex: memberUid eq
olcDbIndex: uid eq

$ sudo grep -v "olcDbIndex: [cgmu].*eq" '/etc/ldap/slapd.d/cn=config/olcDatabase={1}hdb.ldif' | \
  "olcDbIndex: [cgmu].*eq" '/etc/ldap/slapd.d/cn=config/olcDatabase={1}hdb.ldif.back'

$ sudo cat "olcDbIndex: [cgmu].*eq" '/etc/ldap/slapd.d/cn=config/olcDatabase={1}hdb.ldif.back' | \
  sudo tee "olcDbIndex: [cgmu].*eq" '/etc/ldap/slapd.d/cn=config/olcDatabase={1}hdb.ldif'

$ sudo chown -R openldap:openldap /etc/ldap/slapd.d/cn\=config
$ sudo -u openldap slaptest
config file testing succeeded
$ sudo -u openldap slapindex
$ sudo /etc/init.d/slapd start