LabHub
学习 学习路径 课程

企业认证对接

装载 LDAP 目录,并用过滤器查询

在 LabHub 中继续学习

目标

亲自启动 slapd 并加载组织 LDIF,再通过组合 LDAP 搜索过滤器,准确提取所需用户和组。

为什么重要

在 SI 项目中,“请把我们系统接入公司账户”最终都会落实为 LDAP 查询。如果过滤器写得随意,停用账户和服务账户也会混入用户列表;如果不指定返回属性,面对 10 万人规模的目录就会拉取全部属性,给服务器带来压力。

此外,本实验的目录采用组指向人员(member)的结构。为了在每次登录时获取“此人所属的组”,现实中常有人编写扫描全部组的代码。用户只有 100 人时看不出问题,增长到 1 万人后,登录可能需要 3 秒。

步骤

  1. 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
  2. 加载 /opt/lab/fixtures/auth/ldif/00-base.ldif。必须能够成功查询 Base DN dc=labhub,dc=co,dc=kr
  3. 加载 /opt/lab/fixtures/auth/ldif/10-people.ldifobjectClass=inetOrgPerson entry 必须有 30 个
  4. 加载 /opt/lab/fixtures/auth/ldif/20-groups.ldifobjectClass=groupOfNames entry 必须有 6 个
  5. 仅选出属于开发组且职级为科长的人员uid,每行一个、按升序保存到 /root/ldap/q1.txt。(部门属性是 ou,职级属性是 title。)
  6. 职级为部长或次长且不属于总务组的人员uid 以相同格式保存到 /root/ldap/q2.txt
  7. uid=hong 所属组的 cn 每行一个、按升序保存到 /root/ldap/groups-of-hong.txt
  8. 创建 /root/ldap/whois.sh。它接收一个参数(uid),并严格按以下顺序输出四行。若 uid 不存在,则以非零退出码结束。
    cn=<이름>
    ou=<부서>
    title=<직급>
    groups=<소속 그룹 수>
    

参考

启动 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.ldifobjectClass=inetOrgPerson entry 必须有 30 个

养成加载后统计数量的习惯。提交 LDIF 不代表所有内容都已成功加入;若 DN 重复,只有该项会失败。

加载组 entry

加载 /opt/lab/fixtures/auth/ldif/20-groups.ldifobjectClass=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 选项会有帮助。