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