「LDAP」- 轻量级目录访问协议 | Lightweight Directory Access Protocol

认识

研究 LDAP 之前,我们需要理解某些基础概念,例如 Directory Service(or Name service)、……

轻量级目录访问协议(LDAP,Lightweight Directory Access Protocol)是在目录访问协议 X.500 的基础上研发的,用于通过网络管理访问这些分布的目录信息服务。

组成

—— 该部分将介绍:在使用 LDAP 之前,需要了解一些基本的概念。

LDAP 目录服务是由目录数据库和一套访问协议组成的系统

数据存储结构

LDAP,其采用树状结构存储数据(类似于 DNS 服务程序),用于在 IP 网络层面实现对分布式目录的访问和管理操作。

Object

很多服务都需要对数据进行操作,比如 Database 需要对其中存储的 Record 进行增删改查操作。

在 LADP 中,同样需要管理数据,数据被称为 Object(条目,亦可用 Entity 来称呼):

  • 其为 LDAP 中最基本的元素;
  • 其是添加、删除、更改、搜索操作的基本对象;

在 LDAP 目录中,每个 Object 至少有一个与之关联的 ObjectClass。

所示如图,Object 有 ou=admin、ou=people、ou=device、cn=admin、ou=marketing、……

Attribute and Value

每个 Object 包含多个 Attribute=Value 属性,其通常用于描述 Object 的具体信息。

注意,该信息并未展示在图示中,其图示中的 ou、cn、people、admin、wiki 并非 Attribute、Value;

在 LDAP 中,很多常用 Attribute 已预定义,比如:

  • dc,DomainComponent,域组件:例如 example.com 表示为 dc=example,dc=com;
  • ou,OrganizationUnit,组织名称;
  • cn,CommonName,通用名:通常是 Object 的名字,类似于“人名”,或称“对象名”;
  • sn,Surname,用户的姓氏。
  • uid,User ID,用户唯一标识(如用户名)。
  • mail,电子邮件地址。
  • o,OrganizationName,组织名,比 ou 更高层
  • ……(有很多,需要的时候查询文档即可)

DN | Distinguished Name

LDAP DNs and RDNs

认识:其类似于数据库的主键,是 Object 的唯一标识;

组成:

  • 其由多个 RDN 组成,从叶子节点逐步追溯到根。
  • 或说,多个 Attribute 共同组成 DN,这些 Attribute 是层级关联的。

性质:每个 Object 都有一个唯一的 DN 来定位其在目录树中的位置;

所示如图,cn=wiki 其 dn 为 cn=wiki,ou=marketing,ou=people,dc=d3rm,dc=org(像条路径);

RDN | Relative DN

DN 由多个以逗号分隔的“组件”构成,这些组件被称为 RDN(Relative DN)。
这些 RDN 也是 Attribute=Value 信息;

针对 DN cn=wiki,ou=marketing,ou=people,dc=d3rm,dc=org 其有 5 个 RDN:cn=wiki、ou=marketing、ou=people、……

但是 RDN 通常是指 DN 最左侧的部分,所以 cn=wiki 为 wiki 的 rdn;

BDN | Base DN

定义

  • 是 LDAP Server 为了认证用户而搜索用户的起始点;
  • 或者,说 BDN 是个基准 DN 值,在该 DN 内搜索查找;

所示如图,dc=d3rm,dc=org 是 BDN;BDN 非 dc=d3rm,dc=org;

Object Class

在目录中,其定义 Object 的类型和属性。其可理解为:Object 的模板或蓝图、定义 Object 可包含的属性、决定 Object 的类型(如用户、组、设备等)。

ObjectClass 的类型

  • 结构型(Structural):定义 Object 主要类型,每个 Object 必须有一个且只能有一个结构型 objectClass。例如:person, organizationalUnit, inetOrgPerson
  • 辅助型(Auxiliary):为条目提供额外属性,可选。例如:mailRecipient, posixAccount
  • 抽象型(Abstract):不能直接使用,只作为其他 objectClass 的父类。例如:top(几乎所有 objectClass 都继承自 top)

ObjectClass 的继承关系 | ObjectClass 可以继承其他 ObjectClass 的属性,例如:inetOrgPerson → organizationalPerson → person → top

性质

  • 确保目录中数据的一致性和有效性
  • 控制哪些属性是必须的(MUST),哪些是可选的(MAY)
  • 帮助 LDAP 客户端理解如何处理特定类型的条目

常见 ObjectClass 示例

  • top: 最顶层的抽象类
  • person: 表示人员的基本信息
  • organizationalPerson: 组织人员的扩展信息
  • inetOrgPerson: 互联网组织人员的扩展信息
  • organizationalUnit: 组织单元(OU)
  • groupOfNames: 组对象

例如:

  • objectClass:定义条目的类别(如 person、organizationalUnit)。
  • 一个 person 类型的条目必须包含 cn 和 sn(姓),可选包含 mail 或 telephoneNumber。

Each object in an LDAP directory has at least one object class associated with it. The object class determines the characteristics of this object, in particular the set of attributes which the object can have (and the ones it must have).

The object classes are defined in the LDAP directory schema – they constitute a class hierarchy there, there is one central top level class (which is called ‘top’), all other classes are derived from that.

This leads to the fact that normally each object of a certain class has actually all the parent classes also as associated classes. You see this if you look at the ‘objectClass’ attribute which exists for all objects in all LDAP directories.

LDIF and Schema

Understanding LDAP Schema

在 LDAP 中,使用 LDIF(LDAP Interchange Format)格式来保存信息,而 LDIF 是一种标准的文本文件且可以随意的导入导出,所以我们需要有一种“格式”标准化 LFID 文件的写法,该格式叫做 Schema。Schema 用于指定一个目录中所包含对象的类型,以及每一个类型中的可选属性;

我们将 Schema 理解为面向对象程序设计中的“类”,类是个“模板”,通过“类”定义出具体的对象;
我们将 Schema 也能够类比为数据库的表结构,而 LDIF 类似 SQL 语句,而 Object 则为数据记录;

协议信息 | 交互原理

Port Number

  • LDAP port 389 is the default port for unencrypted LDAP communication, typically used for directory-related data exchange.
  • In contrast, LDAP port 636 is the encrypted counterpart, ensuring secure transmission of data related to network accounts. It’s generally recommended that port 636 is used for enhanced security.

LDAP 基于客户端-服务器模型,客户端通过 TCP/IP 协议与服务器通信。

其工作流程包括以下步骤:

  1. 连接:客户端建立与服务器的 TCP 连接。
  2. 绑定(Bind):客户端通过认证(匿名、简单认证或 SASL)获得访问权限。
  3. 操作:客户端执行查询(Search)、添加(Add)、修改(Modify)或删除(Delete)等操作。
  4. 解绑(Unbind):客户端关闭连接。

Search:最核心的操作,用于检索符合条件的条目。

参数包括:基准 DN、搜索范围(base/one/sub)、过滤器和返回属性。

示例:查询所有 objectClass=person 的条目。

Modify:更新条目的属性值。

Add/Delete:增加或移除条目。

vs. Active Directory

The Difference Between Active Directory and LDAP
What are the differences between LDAP and Active Directory?

Microsoft Active Directory 其实是微软对目录服务数据库的实现,Active Directory 里面存放着整个域里的所有配置信息(用户、计算机等)而 LDAP 则是对整个目录数据库的访问协议。

Root DSE

目录树的起点称为 Root DSE(Directory System Agent Specific Object),它存储服务器的元信息,例如支持的协议版本、命名上下文(namingContexts)等。通过查询根 DSE,可以了解服务器的能力。

成员关系 | Membership

成员关系,Membership,是指目录服务中对象之间的关联关系,特别是用户与组之间的从属关系。

组成员关系:最典型的 membership 是用户作为组成员的关系
目录结构:LDAP 使用树状结构组织数据,membership 定义了对象间的横向关联

在 LDAP 中,主要有两种方式表示成员关系:

  • 组成员属性 (Group Membership):
    • 针对 Group 的 member 属性,其包含组中成员的 DN (Distinguished Name)
    • 针对 Group 的 uniqueMember 属性:与 member 类似,但值必须是唯一的
  • 成员资格属性 (Membership Attribute):
    • 针对 memberOf 属性:其存在于用户条目中,表示该用户属于哪些组

查询语法

LDAP 查询依赖于过滤器,语法类似于逻辑表达式:

基本过滤器:(attribute=value),如 (cn=John Doe)。

通配符:(sn=Sm*),匹配以 “Sm” 开头的姓。

组合过滤器:

  • &(与):(&(objectClass=person)(sn=Smith))
  • |(或):(|(cn=John)(cn=Jane))
  • !(非):(!(objectClass=group))

搜索范围

  • base:仅查询指定 DN 的条目。
  • one:查询直接子条目。
  • sub:递归查询整个子树。

构建

OpenLDAP
Light LDAP

性质

  • 集中管理帐号与认证,不再单纯依靠维护主机的 /etc/passwd 文件;
  • 集中存储用户家目录数据,而不是保存在主机中;
  • 存储 DNS 记录;
  • 可作为“黄页”,集中存储组织的地址、用户、部门、联系方式等等信息;

注意,虽然 LDAP 是协议标准,但是,在实现时,某些 LDAP Server 可能仅实现部分功能,详细性质需要参考官方文档。

参考

LDAP Server & User Details
Wikipedia/Lightweight Directory Access Protocol
Wikipedai/Directory service
Wikipedia/Name server
LDAP 轻量目录访问协议详解
LDAP Object Classes
深入浅出:LDAP 协议全面解析
DeepSeek / 介绍 ldap membership 概念
DeepSeek / 在 ldap 中,dc ou cn 是什么