前提
CentOS7.5の同梱版のOpenLDAPを使用
indexとは
LDAPで検索を行う際に、対象エントリを高速に検索することができます。
<具体的に言うと>
キャッシュを使用してインデックス情報を作成しておくことで、それを用いて対応するエントリを直ちに探すことができます。
indexの種類
indexはslapd.conf内のindexディレクティブで指定します。
対象属性名と種類を指定します。
等価インデックス
属性検索の際に値が完全一致するエントリを検索するのに用いられる。
例えば検索時に「uid=hogehoge」など完全一致する検索を多くするのであればこの指定方法が有効です。
指定方法
index uid eq
存在インデックス
ある属性を持つすべてのエントリを検索するのに用いられます。
例えば検索時に「displayName=*」などの指定方法で検索をかけることが多い場合はこの指定方法が有効です。
指定方法
index displayName pres
部分文字列インデックス
属性の値の一部に、指定した値が含まれるかを検索するのに用いられます。
例えば検索時に「cn=hoge」のような指定方法で検索をかけることが多い場合はこの指定方法が有効です。
指定方法
index cn sub
これらを組み合わせてこのような指定もできます。
index uid eq,pres,sub
どの属性をインデックス指定すればよい?
基本的には以下2パターンで判断します。
logファイルを確認
通常は/var/log/slapd.log などにログを出力するよう指定しているかと思います。
ログファイルの中で以下のような記述がある場合は、対象の属性のインデックスが足りていないと判断できます。
<= bdb_equality_candidates: (uid) not indexed
この場合はuidをインデックス設定すると、検索速度が速くなります。
3日分ほどのログを確認し、同様のログが出ていないか確認します。
よく使うLDAPフィルタ条件
これは運用によりけりなのですが、検索時に多用する属性がある場合その属性もインデックス指定してあげたほうがより速度が向上します。
例えば、以下のようなフィルタで日次処理を行っていたりする場合は
対象の属性はインデックス指定したほうがよいです。
(&(uid=*)(xxxFlag=1))
設定方法
slapd.confの編集
先の例のように、indexディレクティブで追加したい属性と種類を記述します。
~
index uid eq,pres,sub
index uidNumber pres
~
slapindexコマンドの実施
まずldapのサービスを止めます。
systemctl stop slapd
slapindexコマンドを実行します。
slapindex
すると、以下のようなエラーが出るかと思います。
WARNING!
Runnig as root!
There's a fair chance slapd will fail to start.
Check file permissions!
このコマンドを実行した際に、root権限でインデックスが作られます。
基本的にOpenLDAPで使用するDBの所有権はldapで動かす必要があるので
/var/lib/ldap 配下の所有権をldapに変更する必要があります。
chown -R ldap. /var/lib/ldap/*
サービスを起動します。
systemctl start slapd
念のため、数日間ログをチェックしてインデックスエラーが出ていないかチェックしておくと尚いいです。