装载 LDAP 目录,并用过滤器查询
目标
亲自启动 slapd 并加载组织 LDIF,再通过组合 LDAP 搜索过滤器,准确提取所需用户和组。
为什么重要
在 SI 项目中,“请把我们系统接入公司账户”最终都会落实为 LDAP 查询。如果过滤器写得随意,停用账户和服务账户也会混入用户列表;如果不指定返回属性,面对 10 万人规模的目录就会拉取全部属性,给服务器带来压力。
此外,本实验的目录采用组指向人员(member)的结构。为了在每次登录时获取“此人所属的组”,现实中常有人编写扫描全部组的代码。用户只有 100 人时看不出问题,增长到 1 万人后,登录可能需要 3 秒。
步骤
- 在 1389 端口启动 slapd。
slapd -h ldap://127.0.0.1:1389 -F /opt/lab/ldap/slapd.d然后查询 Root DSE 并保存到/root/ldap/root-dse.txt。文件中必须包含dc=labhub,dc=co,dc=kr。 - 加载
/opt/lab/fixtures/auth/ldif/00-base.ldif。必须能够成功查询 Base DNdc=labhub,dc=co,dc=kr。 - 加载
/opt/lab/fixtures/auth/ldif/10-people.ldif。objectClass=inetOrgPersonentry 必须有 30 个。 - 加载
/opt/lab/fixtures/auth/ldif/20-groups.ldif。objectClass=groupOfNamesentry 必须有 6 个。 - 仅选出属于开发组且职级为科长的人员的
uid,每行一个、按升序保存到/root/ldap/q1.txt。(部门属性是ou,职级属性是title。) - 将职级为部长或次长且不属于总务组的人员的
uid以相同格式保存到/root/ldap/q2.txt。 - 将
uid=hong所属组的 cn 每行一个、按升序保存到/root/ldap/groups-of-hong.txt。 - 创建
/root/ldap/whois.sh。它接收一个参数(uid),并严格按以下顺序输出四行。若 uid 不存在,则以非零退出码结束。cn=<이름> ou=<부서> title=<직급> groups=<소속 그룹 수>
参考
- 基本查询:
ldapsearch -x -H ldap://127.0.0.1:1389 -b "dc=labhub,dc=co,dc=kr" -LLL "(필터)" 속성명 - 加载:
ldapadd -x -H ldap://127.0.0.1:1389 -D "cn=admin,dc=labhub,dc=co,dc=kr" -w labhub123 -f 파일.ldif - 统计数量:计算结果中以
dn:开头的行数。 - 常见错误 1:过滤器括号不配对。应像
(&(a=1)(b=2))一样再用一层括号包住整体。 - 常见错误 2:未指定返回属性,导致所有属性全部输出。
- 常见错误 3:漏掉
-b。没有 Base,服务器就不知道从哪里开始搜索。
启动 slapd 并确认 Root DSE
在 1389 端口启动 slapd。
slapd -h ldap://127.0.0.1:1389 -F /opt/lab/ldap/slapd.d
然后查询 Root DSE 并保存到 /root/ldap/root-dse.txt。
文件中必须包含 dc=labhub,dc=co,dc=kr。
本环境不能绑定 1024 以下的端口。查询 Root DSE 时,将 base 设为空字符串、scope 设为 base。它会告诉你服务器拥有哪些命名上下文。
加载 Base entry
加载 /opt/lab/fixtures/auth/ldif/00-base.ldif。
必须能够成功查询 Base DN dc=labhub,dc=co,dc=kr。
LDIF 从上到下应用,因此必须先有父 entry,才能加入子 entry。通过 ldapadd 的 -f 参数指定文件。
加载用户 entry
加载 /opt/lab/fixtures/auth/ldif/10-people.ldif。
objectClass=inetOrgPerson entry 必须有 30 个。
养成加载后统计数量的习惯。提交 LDIF 不代表所有内容都已成功加入;若 DN 重复,只有该项会失败。
加载组 entry
加载 /opt/lab/fixtures/auth/ldif/20-groups.ldif。
objectClass=groupOfNames entry 必须有 6 个。
groupOfNames 至少需要一个 member 属性。尝试创建空组而遇到 schema 违规,是第一个常见障碍。
编写复合条件过滤器
仅选出属于开发组且职级为科长的人员的 uid,
每行一个、按升序保存到 /root/ldap/q1.txt。
(部门属性是 ou,职级属性是 title。)
LDAP 过滤器采用运算符在前的前缀写法。AND 的形式为 (&(...)(...)),并且括号必须配对。
组合 OR 与 NOT
将职级为部长或次长且不属于总务组的人员的 uid
以相同格式保存到 /root/ldap/q2.txt。
在 OR 中放入多个条件,再用 AND 包住整体,并通过 NOT 排除一项。先在纸上画出括号结构,可以减少错误。
反向查询组成员关系
将 uid=hong 所属组的 cn 每行一个、按升序
保存到 /root/ldap/groups-of-hong.txt。
这个目录不是由人员指向组,而是由组指向人员。因此要查“此人所属的组”,必须从组这一侧搜索。
编写用户查询脚本
创建 /root/ldap/whois.sh。它接收一个参数(uid),并
严格按以下顺序输出四行。若 uid 不存在,则以非零退出码结束。
cn=<이름>
ou=<부서>
title=<직급>
groups=<소속 그룹 수>
针对参数传入的一个 uid 收集所需信息并输出。要从 ldapsearch 结果中只提取值,-LLL 选项会有帮助。