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。
客户端与工具
- 命令行工具:
ldapsearch、ldapadd、ldapmodify、ldapdelete(由 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