Rocky Linux 9 从入门到精通008 — LDAP 账号管理(理论篇)

前述

木子原本计划直接撰写 Samba 相关内容,但由于 Samba 篇涉及 LDAP 认证,因此在编写 Samba 认证章节时,决定先补充一篇关于 LDAP 账号统一管理的内容。实际上,在传统企业环境中,采用 Linux LDAP 认证服务器的情况相对较少,大多数企业更倾向于使用 Windows Active Directory。当前,SMB 共享服务的主流实现有两种方案:

  1. Linux LDAP + Samba
  2. Windows Active Directory + SMB

本章节将重点介绍 Linux LDAP,后续 Samba 章节,将结合 LDAP 来实现统一认证管理。

LDAP 简介

LDAP(Lightweight Directory Access Protocol,轻型目录访问协议)是一种用于访问和维护分布式目录信息的开放标准协议。它允许用户在企业内网或公共互联网中,查找和管理关于组织、个人、设备、文件等资源的结构化数据。
LDAP 最初作为 X.500 目录访问协议(DAP)的简化和轻量级版本而设计,旨在减少复杂性,便于在现代计算环境中广泛应用。LDAP 通常被用于实现目录服务(Directory Service),这类服务为网络中的用户和应用程序提供统一的身份认证、信息查询和资源管理功能。

LDAP 的核心目标有两大方面:

  1. 数据存储:以树形分层结构(通常称为目录信息树,DIT)存储大量静态或较少变动的数据,如用户名、密码、电子邮件、部门、设备等;
  2. 身份验证:为访问目录服务的用户或系统提供认证机制,确保数据访问的安全性和合规性。

作为企业 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 是属性值。
  • 属性可用于存放用户信息(如:电话号码、邮箱、登录凭据等)。
    • 用户账户通常包含:uiduserPassword 等属性及对应值。
    • 用户组(如 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 身份验证流程详解

  1. 认证请求发起
    用户在支持 LDAP 的应用(如:邮箱、VPN、Web 系统、操作系统等)上输入用户名及密码,客户端(DUA)发起与 LDAP 服务器(DSA)的连接。通常企业会开启加密通信(如 LDAPS、StartTLS)保障认证流程安全。

  2. 绑定操作(Bind)
    客户端调用 LDAP API,使用用户输入的 DN(或使用用户名/邮件映射生成 DN)和密码,进行身份验证。Bind 操作包括:

    1. 简单绑定(Simple Bind):直接用明文用户名和密码,与 LDAP 服务器进行认证。可通过 SSL/TLS 加密保障安全。
    2. SASL 绑定(Simple Authentication and Security Layer):支持多种认证机制,如 Kerberos、OAuth 等,提供更高安全性和兼容性。
  3. 目录查询与核查
    服务器根据 DN 在目录信息树(DIT)中定位用户对象,逐级检验 RDN 片段(如 ou=ITcn=muzi),若路径有误或不存在,则返回认证失败。

  4. 属性校验
    LDAP 服务器核查所定位到用户对象的属性(如 uiduserPassword 等),校对输入的密码是否匹配,决定认证是否通过。

  5. 认证结果响应

    • 若验证成功,LDAP 服务器返回绑定成功响应,客户端获得访问所需的服务或资源权限。
    • 若验证失败,返回错误信息(如 DN 不存在、密码错误、账户锁定、无权限等),客户端提示认证失败。
  6. 连接解绑(Unbind)
    客户端与 LDAP 服务器通信结束后,主动解绑会话,释放资源,结束身份验证流程。

  7. 权限判定与资源访问
    认证通过后,客户端或应用根据 LDAP 目录中的用户组及权限设定,决定用户能访问的文件、系统功能或应用数据等。

工作流示意

总结

LDAP 的理论知识非常丰富,甚至足以单独写成一本 500 页的专著。在这里,木子仅对后续章节会用到的相关知识做简要介绍。关于更为详尽的理论内容,强烈建议各位同学查阅文末参考文献。

参考文献

[1] 什么是轻量级目录访问协议(LDAP)身份验证?
[2] Linux 域身份、身份验证和策略指南 | Red Hat Enterprise Linux | 7 | Red Hat Documentation

Avatar photo

关于 木子

Email: [email protected] 微信:rockylinuxcn QQ: 2306867585
Founder of the Rocky Linux Chinese community, MVP、VMware vExpert、TVP, advocate for cloud native technologies, with over ten years of experience in site reliability engineering (SRE) and the DevOps field. Passionate about Cloud Computing、Microservices、CI&CD、DevOps、Kubernetes, currently dedicated to promoting and implementing Rocky Linux in Chinese-speaking regions.
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇