■環境は以下。
別に初期化しなくても良い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'
■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