前述
木子原本计划直接撰写 Samba 相关内容,但由于 Samba 篇涉及 LDAP 认证,因此在编写 Samba 认证章节时,决定先补充一篇关于 LDAP 账号统一管理的内容。实际上,在传统企业环境中,采用 Linux LDAP 认证服务器的情况相对较少,大多数企业更倾向于使用 Windows Active Directory。当前,SMB 共享服务的主流实现有两种方案:
- Linux LDAP + Samba
- Windows Active Directory + SMB
本章节将重点介绍 Linux LDAP,后续 Samba 章节,将结合 LDAP 来实现统一认证管理。
LDAP 简介
LDAP(Lightweight Directory Access Protocol,轻型目录访问协议)是一种用于访问和维护分布式目录信息的开放标准协议。它允许用户在企业内网或公共互联网中,查找和管理关于组织、个人、设备、文件等资源的结构化数据。
LDAP 最初作为 X.500 目录访问协议(DAP)的简化和轻量级版本而设计,旨在减少复杂性,便于在现代计算环境中广泛应用。LDAP 通常被用于实现目录服务(Directory Service),这类服务为网络中的用户和应用程序提供统一的身份认证、信息查询和资源管理功能。
LDAP 的核心目标有两大方面:
- 数据存储:以树形分层结构(通常称为目录信息树,DIT)存储大量静态或较少变动的数据,如用户名、密码、电子邮件、部门、设备等;
- 身份验证:为访问目录服务的用户或系统提供认证机制,确保数据访问的安全性和合规性。
作为企业 IT 基础架构的关键组成部分,LDAP 提供以下优势:
- 集中管理:可作为统一的身份和访问管理(IAM)中心,方便企业集中存储和管理用户信息、权限以及设备数据,简化账户的创建、变更和删除流程。
- 高效检索:采用分层结构,支持灵活的查询方式和高效检索,即使在大规模用户和资源环境下也能快速定位所需信息。
- 安全性强:支持多种安全机制,包括基于用户名/密码的简单认证、SASL(简单认证安全层)、SSL/TLS 加密协议,以及与 Kerberos 集成的安全认证,保障数据传输和访问过程中的安全可靠。
- 高兼容性:LDAP 协议为众多操作系统、应用程序和服务所支持,如 Microsoft Active Directory、OpenLDAP、Apache Directory Server 等。它也常用于实现单点登录(SSO)等统一身份验证和授权解决方案。
总之,LDAP 是连接用户、资源与应用,提供集中化身份管理和目录信息查询的标准协议,是现代企业 IT 架构中不可或缺的基础技术之一。
LDAP 组件
LDAP 采用轻量型结构,并通过 DIT(目录信息树,Directory Information Tree)组织所有数据,支持高效的目录浏览和检索。了解 DIT 结构及各组件对于理解 LDAP 搜索和目录管理至关重要。
目录信息树(DIT)
DIT 是 LDAP 中存储数据的分层树状结构。根节点下通常以 dc(域名组件) 和/或 o(组织名称) 开始,向下分层包含组织单元(ou)、通用名称(cn) 等条目。典型结构如下:
dc=rockylinux,dc=lan # 根域 BaseDN
│
├── o=Company # 组织名称
│ └── ou=department # 组织单元(部门)
| └── cn=muzilee # 用户
│ └── cn=devops # 用户组
│ └── cn=computers # 计算机
主要组件
关键字 | 英文全称 | 含义 |
---|---|---|
dc | Domain Component | 域名组件,将完整的域名分为若干部分。例如:域名 rockylinux.lan 转换为 dc=rockylinux,dc=lan,作为树结构的基础。 |
o | Organization Name | 组织名称,表示公司或机构,例如:o=Company。通常是目录树中较高层级的条目。 |
ou | Organization Unit | 组织单元,可包含其他对象(如用户、组等)和子组织单位,如:ou=users、ou=groups,可用于细分企业部门或团队,如:ou=IT。 |
cn | Common Name | 通用名称,用于标识个人用户、组等对象的名称,如 cn=muzi、cn=devops。 |
uid | User Id | 用户 ID,唯一标识某个用户,如 uid=muzilee。 |
sn | Surname | 姓氏,通常用于存储个人的姓,如 sn=lee。 |
dn | Distinguished Name | 专有名称,唯一标识 LDAP 目录中每一条记录的条目,表示完整路径,如 uid=muzilee,cn=users,cn=compat,dc=rockylinux,dc=lan。 |
rdn | Relative Distinguished Name | 相对专有名称,DN 就是由多个 RDN 组成,如 uid=muzilee、cn=users、cn=compat、dc=rockylinux、dc=lan。 |
属性(Attributes)与属性值(Values)
- LDAP 条目由各类属性(如:cn、sn、mail、uid 等)以及属性值组成。
- 例如:
cn=muzi
,其中cn
是属性,muzi
是属性值。
- 例如:
- 属性可用于存放用户信息(如:电话号码、邮箱、登录凭据等)。
- 用户账户通常包含:
uid
、userPassword
等属性及对应值。 - 用户组(如 cn=devops)可包含成员属性,如
uniqueMember=cn=muzi,ou=IT,o=Company
。
- 用户账户通常包含:
- LDAP 目录通过这些属性对条目进行高效检索和管理。
对象类(ObjectClass)
- LDAP 条目的属性集合由
objectClass
决定,如:organizationalPerson
(结构化存储个人信息)inetOrgPerson
(互联网组织人员)groupOfUniqueNames
(唯一成员组)
- 不同 objectClass 对可用属性和条目结构有约束作用。
参考样例
# extended LDIF
#
# LDAPv3
# base <dc=rockylinux,dc=lan> (default) with scope subtree
# filter: uid=muzilee
# requesting: ALL
#
# muzilee, users, compat, rockylinux.lan
dn: uid=muzilee,cn=users,cn=compat,dc=rockylinux,dc=lan
objectClass: posixAccount
objectClass: ipaOverrideTarget
objectClass: top
gecos: muzi lee
cn: muzi lee
uidNumber: 608200006
gidNumber: 608200006
loginShell: /bin/bash
homeDirectory: /ldaphome/muzilee
ipaAnchorUUID:: OklQQTpyb2NreWxpbnV4LmxhbjpjMDM0MTRkYS01MGNhLTExZjAtOWViNi01Mm
U5ZWI3NzNkZmU=
uid: muzilee
# muzilee, users, accounts, rockylinux.lan
dn: uid=muzilee,cn=users,cn=accounts,dc=rockylinux,dc=lan
givenName: muzi
sn: lee
uid: muzilee
cn: muzi lee
displayName: muzi lee
initials: ml
gecos: muzi lee
objectClass: top
objectClass: person
objectClass: organizationalperson
objectClass: inetorgperson
objectClass: inetuser
objectClass: posixaccount
objectClass: krbprincipalaux
objectClass: krbticketpolicyaux
objectClass: ipaobject
objectClass: ipasshuser
objectClass: ipaSshGroupOfPubKeys
objectClass: mepOriginEntry
objectClass: ipantuserattrs
loginShell: /bin/bash
homeDirectory: /ldaphome/muzilee
uidNumber: 608200006
gidNumber: 608200006
ipaNTSecurityIdentifier: S-1-5-21-3223399076-1772250745-127116554-1006
# search result
search: 2
result: 0 Success
# numResponses: 3
# numEntries: 2
一般在企业内部,会遵从企业组织架构,来构建 DN,这样更有利于后期的权限管理、组织架构调整等。
LDAP 服务提供商
厂商 | 产品名称 | 简介 | 优点 | 缺点 |
---|---|---|---|---|
SUN | SUNONE Directory Server | 基于文本数据库存储,速度快 | 性能高、查询速度快,商业支持 | SUN 系统生态为主,社区活跃度有限 |
IBM | IBM Directory Server | 基于 DB2 数据库存储,速度一般 | 商业稳定性强,与 IBM 产品整合好,安全性高 | 相对速度一般,部署与运维较复杂 |
Novell | Novell Directory Server | 基于文本数据库存储,速度快,但市场使用率较低 | 性能较好,安全性高,适合原有 Novell 用户 | 市场占有率低,生态支持弱,不常用 |
Microsoft | Active Directory | 与 Windows 系统深度集成,适合中大型企业 | 维护简单,社区与生态丰富,与微软产品兼容好,支持 SSO、权限统一管理 | 处理大数据量速度一般,仅适合 Windows 环境 |
Opensource | OpenLDAP | 开源项目,广泛应用,基于文本数据库,性能优秀 | 免费开源、可自定义性高、性能好、社区活跃 | 配置和维护门槛较高、文档不够完善 |
Opensource | 389 Directory Server(389ds) | RedHat 主导的开源项目,基于文本存储,功能丰富 | 免费开源,易部署,GUI 管理界面丰富,RedHat 支持 | 生态稍逊于 OpenLDAP,适用 Linux 平台 |
Red Hat | Red Hat Directory Server(RHDS | RHDS 是基于 389ds 的企业级商业目录服务器,具备良好管理工具和企业级支持 | 商业技术支持,安全性高,易维护,高性能,易与 Red Hat 生态集成 | 需购买授权,主要适配 RHEL,成本较高 |
Opensource | FreeIPA | 综合身份管理解决方案,集成 Kerberos、DNS、证书等功能,构建在 389ds 之上 | 免费开源,功能全面,支持多种认证管理,适合做企业级统一身份平台 | 部署复杂度较高,主要适合 Linux 环境 |
目前,大多数企业更倾向于使用 Microsoft Active Directory,主要原因在于其市场占有率高、上手难度相对较低(当然,深入底层后学习成本会逐步提高,但 Active Directory 提供了开箱即用的体验,能够很好地满足企业用户的需求)。
LDAP 使用场景
LDAP 作为统一的目录服务和身份认证协议,适用于各种需要集中管理用户和权限信息的环境。其典型应用场景包括但不限于:
-
操作系统登录认证:
配置在 Linux、Unix、Windows 等操作系统中,用于实现用户的集中身份认证和统一账户管理,简化多台计算机的用户账号维护。 -
文件与存储服务认证:
用于集成 VSFTP、NFS、Samba、SFTP 等文件共享与访问服务器,实现用户认证统一,便于跨主机资源管控和权限管理。 -
虚拟专用网(VPN)认证:
与 OpenVPN、IPSec VPN 等接入服务集成,统一远程用户的登录身份和访问权限,提高安全性和管理效率。 -
企业电子邮件系统认证:
支持 Microsoft Exchange、Zimbra、Postfix、Dovecot 等邮件系统,进行用户邮箱的统一认证、授权与地址簿管理。 -
Web 应用及企业门户系统单点登录(SSO):
与 ERP、OA、CRM、HR、Wiki、GitLab、Jenkins、云盘等企业各类业务系统集成,实现单点登录、集中权限控制和用户自动同步,提高用户体验和管理效率。 -
Kubernetes 及容器平台认证集成:
为 Kubernetes、Rancher 等云原生平台或 DevOps 工具提供统一用户身份认证方案,集中管理集群访问权限。 -
无线和有线网络接入认证(802.1X/Radius):
搭配 Radius、FreeRadius 等网络接入控制方案,提高企业内网及无线局域网的用户管理和安全防护能力。 -
通用身份与访问管理(IAM):
作为企业级身份和访问管理中间件,为各类自研或第三方应用系统提供开放、标准的认证与授权接口。 -
地址簿与通讯录管理:
充当企业员工、联系人信息的统一数据源,方便查询与共享。
LDAP 身份验证工作流
LDAP(轻型目录访问协议)采用客户端 — 服务器架构进行身份验证,主要涉及以下关键角色和流程:
主要组成部分
-
目录系统代理(DSA,Directory System Agent):
LDAP 服务器,负责存储用户、组等目录数据,并处理客户端的身份验证与查询请求。 -
目录用户代理(DUA,Directory User Agent):
LDAP 客户端,通常是用户的终端设备或应用,例如:企业邮箱客户端、Web 系统、操作系统登录模块等,通过网络访问 DSA 以认证身份或检索信息。 -
专有名称(DN,Distinguished Name):
LDAP 条目的唯一标识,由目录信息树(DIT)的完整路径构成,如:cn=muzi,ou=IT,o=Company
。 -
相对专有名称(RDN,Relative Distinguished Name):
DN 的路径片段,如cn=muzi
,在目录层级中相对于上一级节点的名称,用于逐级查找对象。 -
应用编程接口(API):
通用接口(如 LDAP 协议自身、LDAP SDK、AD/LDAP 连接器等),实现客户端与 LDAP 服务器的数据交互与身份认证,屏蔽协议实现细节。
LDAP 身份验证流程详解
-
认证请求发起
用户在支持 LDAP 的应用(如:邮箱、VPN、Web 系统、操作系统等)上输入用户名及密码,客户端(DUA)发起与 LDAP 服务器(DSA)的连接。通常企业会开启加密通信(如 LDAPS、StartTLS)保障认证流程安全。 -
绑定操作(Bind)
客户端调用 LDAP API,使用用户输入的 DN(或使用用户名/邮件映射生成 DN)和密码,进行身份验证。Bind 操作包括:- 简单绑定(Simple Bind):直接用明文用户名和密码,与 LDAP 服务器进行认证。可通过 SSL/TLS 加密保障安全。
- SASL 绑定(Simple Authentication and Security Layer):支持多种认证机制,如 Kerberos、OAuth 等,提供更高安全性和兼容性。
-
目录查询与核查
服务器根据 DN 在目录信息树(DIT)中定位用户对象,逐级检验 RDN 片段(如ou=IT
→cn=muzi
),若路径有误或不存在,则返回认证失败。 -
属性校验
LDAP 服务器核查所定位到用户对象的属性(如uid
、userPassword
等),校对输入的密码是否匹配,决定认证是否通过。 -
认证结果响应
- 若验证成功,LDAP 服务器返回绑定成功响应,客户端获得访问所需的服务或资源权限。
- 若验证失败,返回错误信息(如 DN 不存在、密码错误、账户锁定、无权限等),客户端提示认证失败。
-
连接解绑(Unbind)
客户端与 LDAP 服务器通信结束后,主动解绑会话,释放资源,结束身份验证流程。 -
权限判定与资源访问
认证通过后,客户端或应用根据 LDAP 目录中的用户组及权限设定,决定用户能访问的文件、系统功能或应用数据等。
工作流示意
总结
LDAP 的理论知识非常丰富,甚至足以单独写成一本 500 页的专著。在这里,木子仅对后续章节会用到的相关知识做简要介绍。关于更为详尽的理论内容,强烈建议各位同学查阅文末参考文献。
参考文献
[1] 什么是轻量级目录访问协议(LDAP)身份验证?
[2] Linux 域身份、身份验证和策略指南 | Red Hat Enterprise Linux | 7 | Red Hat Documentation
