如何通过reqStart属性查询OpenLDAP accesslog,解决过滤失效问题
我来帮你搞定这个头疼的问题——你遇到的情况核心原因是OpenLDAP accesslog里的reqStart属性的语法类型和匹配规则限制,咱们一步步拆解:
为什么相等过滤有效,范围/通配符不行?
- 当你用
(reqStart=20180213144256.000008Z)能成功,是因为完全匹配了reqStart存储的GeneralizedTime格式字符串(这是LDAP标准的时间格式,带时区后缀Z)。 - 范围过滤(
>=)失效:大概率是你没使用符合标准的GeneralizedTime格式,或者服务器对reqStart的顺序匹配规则没配置好。 - 通配符过滤(
*)失效:reqStart的语法默认不支持子字符串匹配,除非在schema里明确指定了substringsMatch规则,所以这种方式本身就不适用。
具体解决步骤
1. 用标准GeneralizedTime格式做范围查询
把你的范围过滤值补全为完整的GeneralizedTime格式,加上时区后缀Z,试试这个过滤器:
(reqStart>=20180213000000Z)
服务器需要完整的时间格式才能正确解析并做顺序比较,不带Z的部分时间字符串会被判定为格式非法,导致过滤失败。
2. 确认reqStart的匹配规则配置
用ldapsearch查询accesslog相关的schema定义,检查是否包含顺序匹配规则:
ldapsearch -x -b "cn=schema,cn=config" "(olcAttributeTypes=*reqStart*)"
返回结果里,你需要看到类似这样的配置:
SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
MATCHING RULES 2.5.13.2
其中2.5.13.2就是orderingMatch(顺序匹配)规则,没有这个的话,范围过滤根本无法工作。如果缺失,你需要修改accesslog的schema配置,添加这个匹配规则。
3. 确保reqStart有正确的索引
如果匹配规则没问题,但范围查询还是慢或者失效,可能是没给reqStart创建支持范围查询的索引。在accesslog的数据库配置(通常是cn=config,olcDatabase={X}hdb,cn=config这类条目)里添加:
olcDbIndex: reqStart eq,pres,order
添加后重启OpenLDAP服务,然后重新生成索引:
slapindex -n <accesslog_db_number>
(<accesslog_db_number>是accesslog数据库的编号,比如你可以用ldapsearch -x -b cn=config olcDatabase=*找到)
4. 放弃通配符,用范围查询替代
既然reqStart不支持子字符串匹配,要查询某一天的所有条目,直接用范围查询覆盖当天的时间区间就好:
(& (reqStart>=20180213000000Z) (reqStart<=20180213235959Z) )
总结
核心就是抓住reqStart的GeneralizedTime属性特性:必须用完整格式做范围查询,确保匹配规则和索引配置正确,通配符方式本身就不适合这个属性的语法设计。
内容的提问来源于stack exchange,提问作者virullius

