ldapsearch超过了分页和证书的大小限制

时间:2016-06-23 16:00:22

标签: pagination ldap ldap-query

我尝试使用证书对带有分页的ldapsearch执行LDAP:

export LDAPTLS_CACERT=/home/test/ssl.pem
ldapsearch -x -H ldaps://test.test.com:636 -b "dc=test,dc=com" -E pr=100/noprompt

500结果后的上述命令,ldapsearch返回超出大小限制

search: 6
result: 0 Success
control: 1.2.840.113556.1.4.319 false MA0CAQAECOYFAAAAAAAA
pagedresults: cookie=5gUAAAAAAAA=
# extended LDIF
#
# LDAPv3
# base <dc=test,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
# with pagedResults control: size=100
#

# search result
search: 7
result: 4 Size limit exceeded

# numResponses: 506
# numEntries: 500

但是,当我不仅传递证书而且传递用户名/密码时,事情也完美无缺:

export LDAPTLS_CACERT=/home/test/ssl.pem    
ldapsearch -x -H ldaps://test.test.com:636 -b "dc=test,dc=com" \ 
-E pr=100/noprompt -D "cn=admin,dc=test,dc=com" -w myamazingpassword

1006结果后的上述命令,ldapsearch返回成功

# search result
search: 12
result: 0 Success
control: 1.2.840.113556.1.4.319 false MAUCAQAEAA==
pagedresults: cookie=

# numResponses: 1017
# numEntries: 1006

为什么会这样?为什么我没有用户名/密码就无法在ldap上执行分页搜索?

2 个答案:

答案 0 :(得分:0)

大多数服务器对不同用户实施不同的大小限制(管理员与普通用户和匿名用户)。 运行纯LDAPS搜索时,没有LDAP身份验证。服务器可能会将匿名用户的条目数限制为500.

如果要使用证书在LDAP级别对客户端进行身份验证,则应使用选项#include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 4 void fillWithStrings( char* (foo)[SIZE][SIZE] ){ for( int i = 0; i < SIZE; i++ ) { for( int j = 0; j < SIZE; j++ ) { char * temp = malloc( 3 ); //sizeof(char) is always 1 if (j % 2) strcpy(temp, "lo"); else strcpy(temp,"hi"); foo[i][j] = temp; } } } int main(){ char * foo[SIZE][SIZE]; fillWithStrings( foo ); for( int i = 0; i < SIZE; i ++) for (int j = 0; j < SIZE; j++) printf("[%d][%d] = %s\n", i, j, foo[i][j]); return 0; } 请求SASL EXTERNAL身份验证。

答案 1 :(得分:-1)

如果您向Active Directory(AD)请求大量结果,则会收到“超出大小限制”错误消息:在不分页的情况下执行的Active Directory搜索仅限于返回前1000条记录中的最大值。

一种解决此搜索大小限制的方法是也通过ldapsearch获取“页面”结果。

ldapsearch提供了-E选项,可以执行分页搜索。

我们只需提供正确的分页策略即可要求提供大型结果集的所有项目。

例如,我们可以使用-E并提供值pr=1000/noprompt来返回所有页面,每页包含1000个结果项,而无需进一步的用户交互(无提示)。

ldapsearch -E pr=1000/noprompt -x
              -h adhost.domain.com
              -p 389
              -D  cn=administrator,cn=users,dc=domain,dc=com
              -w password
              -s sub -b  "OU=Users,DC=domain,DC=com"
              "(objectClass=user)" dn