ldap 検索時に、nidNumber をイコール(=) で検索していれば思う通りの結果が得られるが
小なりイコール( LE / ≦ / <=) や大なりイコール( GE / ≧ / >= )で検索すると思うように結果を
得られなかった。

# ldapsearch -LLL -x "uidNumber=10000" uid
dn: uid=Administrator,ou=Users,dc=example,dc=com
uid: Administrator
# ldapsearch -LLL -x "uidNumber=10001" uid
dn: uid=guest,ou=Users,dc=example,dc=com
uid: guest
# ldapsearch -LLL -x "uidNumber=10002" uid
dn: uid=user01,ou=Users,dc=example,dc=com
uid: user01
# ldapsearch -LLL -x "uidNumber=10003" uid
dn: uid=user02,ou=Users,dc=example,dc=com
uid: user02
# ldapsearch -LLL -x "uidNumber=10004" uid
dn: uid=user03,ou=Users,dc=example,dc=com
uid: user03
# ldapsearch -LLL -x "uidNumber>=10002" uid

以下の2つの方法で比較演算子を使用したldap検索が可能かを確認した。

1. nis.schema の builtin 属性の設定を変更
2. schema_prep.c を変更

1. nis.schema の builtin 属性の設定を変更
この方法はうまくいかなかったので参考として記述
/etc/openldap/schema/nis.schema の uidNumber と gidNumber に関する記述をコメントイン。
かつ、ORDERING を追加した。

# cd /etc/openldap/schema/
# cp -p nis.schema nis.schema.org
# vi nis.schema
attributetype ( 1.3.6.1.1.1.1.0 NAME 'uidNumber'
       DESC 'An integer uniquely identifying a user in an administrative domain'
       EQUALITY integerMatch
       ORDERING integerOrderingMatch
       SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
attributetype ( 1.3.6.1.1.1.1.1 NAME 'gidNumber'
       DESC 'An integer uniquely identifying a group in an administrative domain'
       EQUALITY integerMatch
       ORDERING integerOrderingMatch
       SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
# slaptest
/etc/openldap/schema/nis.schema: line 42: Duplicate attributeType: "1.3.6.1.1.1.1.0"
slaptest: bad configuration file!

builtin の属性の変更方法が不明、あきらめて設定を戻す。

# mv nis.schema.org nis.schema

2. schema_prep.c を変更
次に、ソースから手がかりを入れるため、openldap のsrc.rpm を取得。

# wget http://vault.centos.org/5.7/os/SRPMS/openldap-2.3.43-12.el5_6.7.src.rpm

ディレクトリが存在しない場合は作成。

# mkdir /usr/src/redhat/

展開。

# rpm -i openldap-2.3.43-12.el5_6.7.src.rpm

ソースを変更する。

# cd /usr/src/redhat/SOURCES
# tar zxvf openldap-2.3.43.tgz
# vi openldap-2.3.43/servers/slapd/schema_prep.c
{ "uidNumber", /* for ldapi:// */
 "( 1.3.6.1.1.1.1.0 NAME 'uidNumber' "
 "DESC 'An integer uniquely identifying a user "
 "in an administrative domain' "
 "EQUALITY integerMatch "
 "ORDERING integerOrderingMatch "
 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )",
{ "gidNumber", /* for ldapi:// */
 "( 1.3.6.1.1.1.1.1 NAME 'gidNumber' "
 "DESC 'An integer uniquely identifying a group "
 "in an administrative domain' "
 "EQUALITY integerMatch "
 "ORDERING integerOrderingMatch "
 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )",
# mv openldap-2.3.43.tgz openldap-2.3.43.tgz.org
# tar zcvf openldap-2.3.43.tgz openldap-2.3.43/*
# rpmbuild -ba ../SPECS/openldap.spec
# (cd ../RPMS/x86_64/ ; 
 rpm -Uvh openldap-*rpm compat-openldap-2.3.43_2.2.29-12.7.x86_64.rpm)

比較演算子を使用して検索。

# ldapsearch -LLL -x "uidNumber>=10002" uid
dn: ou=Idmap,dc=example,dc=com

dn: uid=user01,ou=Users,dc=example,dc=com
uid: user01

dn: uid=user02,ou=Users,dc=example,dc=com
uid: user02

dn: uid=user03,ou=Users,dc=example,dc=com
uid: user03

これが正解かは不明だが、検索できるようになった。

環境:
CentOS 5.7 (x86_64)
OpenLDAP 2.3.43-12