LDAP:轻量目录访问协议

FreeGuideOnline 最新 2026-07-03

dc=com └── dc=example ├── ou=Users │ ├── uid=alice │ └── uid=bob └── ou=Groups ├── cn=developers └── cn=admins

这种分层结构使得查询极其直观:查找“example.com 下工程部门的所有用户”,只需要在 `ou=Engineering,dc=example,dc=com` 子树下进行搜索。

## LDAP 的基本操作
LDAP 定义了十个标准的协议操作,最常用的包括绑定、查询、比较、添加、删除、修改等。客户端通过发送请求报文到 LDAP 服务器的 389(明文)或 636(TLS 加密)端口来交互。

### 认证与绑定
- **绑定(BIND)**:客户端向服务器证明身份的操作。提供 DN 和密码,类似于登录。绑定成功后,服务器会给予后续操作的访问权限。
- **简单绑定**:明文传密码,必须配合 TLS/SSL 使用。  
- **SASL 绑定**:通过外部认证机制(如 Kerberos)进行更强安全认证。

### 搜索与过滤器
搜索是 LDAP 最核心的能力,操作类型为 **SEARCH**。一个搜索请求包含以下关键部分:
- **基础 DN(base DN)**:搜索的起始点,例如 `ou=Users,dc=example,dc=com`。
- **搜索范围(Scope)**:  
  - `baseObject`:仅基础 DN 本身  
  - `singleLevel`:基础 DN 的直接子条目  
  - `wholeSubtree`:整个子树(最常用)
- **过滤器(Filter)**:定义匹配条件,语法简洁而强大。  
  常见过滤器示例:
  - `(objectClass=inetOrgPerson)` :所有用户条目  
  - `(&(uid=alice)(objectClass=person))` :逻辑与,两者都满足  
  - `(|(mail=alice@*)(mail=bob@*))` :逻辑或  
  - `(!(memberOf=cn=admins,ou=Groups,dc=example,dc=com))` :逻辑非,不是管理员组的用户  
  过滤器可以使用 `=*` 判断属性存在,用 `>=`、`<=` 做数值比较。

### 添加、修改、删除
- **ADD**:创建一个新条目,需要提供 DN 和所有必备属性。
- **MODIFY**:修改一个现有条目的属性值,可以增、删、替换某个属性。
- **DELETE**:删除某个条目。注意,只有叶子节点(没有子条目)才能被直接删除,有一些实现允许递归删除。
- **MODIFY DN / RENAME**:移动或重命名一个条目。

### 比较与放弃
- **COMPARE**:检查某个条目的属性是否具有某个值,常用于不暴露完整密码信息的前提下验证密码等。
- **ABANDON**:放弃一个尚未完成的请求。

## LDAP 与 Active Directory 的关系
许多初学者会混淆这两个概念。**Active Directory(AD)** 是微软实现的目录服务,它在底层使用 LDAP 作为通信协议之一,但远不止 LDAP。AD 内置了 Kerberos 认证、组策略、DNS 等,是一个完整的域管理方案。  

- AD 支持 LDAP 协议,任何标准 LDAP 客户端都可以查询 AD 中的信息(需要在 AD 上开启 LDAP 端口)。
- AD 的数据模型在 LDAP 的基础上做了大量扩展,定义了自己特定的对象类和属性。
- 你可以用 `ldapsearch` 命令行工具或 Python 的 `ldap3` 库直接操作 AD。  
  所以可以这样理解:**LDAP 是协议和逻辑模型,Active Directory 是采用该协议的巨型商业产品。**

## LDAP 的常见应用场景
1. **统一身份认证**  
   这是 LDAP 最常见的用途。所有内部系统(代码仓库、CI/CD、监控面板、内部 Wiki)都对接 LDAP 验证用户,用户只需记住一套凭证。配合 ACL 还能实现细粒度的授权。
2. **企业地址簿**  
   邮件客户端(Outlook、Thunderbird)通过 LDAP 查询内部人员联系方式,无需本地存储副本。
3. **单点登录(SSO)与代理认证**  
   通过 LDAP 作为后端身份源,接入 CAS、OAuth2、SAML 等 SSO 系统,实现跨应用登录。
4. **设备与策略管理**  
   存储网络设备配置、打印机信息、自动化集群节点元数据等。
5. **虚拟用户管理**  
   邮件服务器(如 Postfix、Dovecot)使用 LDAP 存储虚拟用户,无需在操作系统层创建真实用户。

## 动手实践:快速搭建一个 LDAP 服务
### 选择服务器:OpenLDAP
最流行的开源 LDAP 服务端是 **OpenLDAP**,几乎所有 Linux 发行版的官方源都包含它。同时你也可以选择 389 Directory Server、ApacheDS,或者一键部署的 Docker 镜像(如 `osixia/openldap`)。

**使用 Docker 快速体验**(推荐新手):
```bash
docker run -p 389:389 -p 636:636 \
  --name my-openldap \
  --env LDAP_ORGANISATION="Example Inc." \
  --env LDAP_DOMAIN="example.com" \
  --env LDAP_ADMIN_PASSWORD="adminpass" \
  osixia/openldap:latest

启动后,一个基础 LDAP 服务便运行在本机,管理员 DN 为 cn=admin,dc=example,dc=com

客户端与工具

  • 命令行工具ldapsearchldapaddldapmodifyldapdelete(由 OpenLDAP 包提供)。 示例查询:
    ldapsearch -x -H ldap://localhost -D "cn=admin,dc=example,dc=com" -w adminpass -b "dc=example,dc=com" "(objectClass=*)"
    
  • 图形化管理:Apache Directory Studio、phpLDAPadmin(Web 界面)、LDAP Admin 等。它们能浏览目录树、编辑条目、导入导出 LDIF 文件。

LDIF:目录交换格式

LDIF(LDAP Data Interchange Format)是纯文本文件,用于批量导入/导出目录数据。格式简单:

dn: uid=alice,ou=Users,dc=example,dc=com
objectClass: inetOrgPerson
uid: alice
cn: Alice
sn: Smith
mail: alice@example.com
userPassword: secret