OpenLDAP生产环境通配符查询失效,求排查配置差异方向
排查OpenLDAP通配符查询差异的具体步骤
1. 先排除数据和客户端问题
- 确认生产环境存在符合
uid=*foobar*的条目:先用精确查询找到已知条目,核对其uid值是否确实包含"foobar"(注意大小写,OpenLDAP默认匹配规则可能区分大小写)。 - 绕开Python客户端,直接在生产服务器上用
ldapsearch测试:
如果命令行也查不到,问题在服务器端;如果能查到,就去检查Python代码的连接参数、过滤字符串转义逻辑。ldapsearch -x -b "ou=my_branch,o=my_organization" "uid=*foobar*"
2. 对比schema和全局配置
- 检查uid属性的匹配规则:两台服务器上执行以下命令,对比输出中uid属性的
SUBSTR规则是否存在且一致:
正常的uid属性定义应该包含ldapsearch -x -b "cn=schema,cn=config" "(olcAttributeTypes=*uid*)" olcAttributeTypesSUBSTR caseIgnoreSubstringsMatch这类子串匹配规则,若生产环境缺失,就会导致通配符查询失效。 - 检查
olcLimits配置:对比两台服务器的查询限制设置,看是否存在禁止子串查询、限制查询权限或超时的规则:slapcat -n 0 | grep olcLimits
3. 确认索引实际生效
- 虽然
olcDbIndex配置一致,但生产环境可能没重建索引:修改索引配置后必须重建才会生效,执行以下命令重新生成uid的子串索引(注意先停服务或确保无写入操作):slapindex -n <你的数据库编号> -v uid - 检查索引文件:去OpenLDAP数据目录(通常是
/var/lib/ldap/),查看uid_sub.db等子串索引文件是否存在,且权限和测试环境一致(所属用户应为openldap运行用户)。
4. 核对版本和补丁
- 对比两台服务器的OpenLDAP版本:
部分旧版本存在子串查询的bug,或者生产环境未安装测试环境的补丁,会导致功能差异。slapd -V
5. 检查连接权限细节
- 确认Python连接生产环境时的绑定用户权限:测试环境的绑定用户可能有更高的读取权限,而生产环境的绑定用户无法访问某些包含目标uid的条目。
- 检查Python代码中的过滤字符串是否被错误转义:确保
uid=*foobar*被原样传递给LDAP服务器,没有被转义成其他格式。
内容的提问来源于stack exchange,提问作者gnarlyninja
相关产品推荐
相关产品推荐

