LDAP¶
上传件:
LDAP.md(原文件可下载)。
LDAP¶
1. 概念¶
1.1 定义¶
LDAP(Lightweight Directory Access Protocol)是一种基于TCP/IP的开放协议,专为访问和管理分布式目录服务设计,提供目录数据的快速读取和查询能力,优化读操作性能,支持跨平台、跨网络的目录信息统一管理
1.2 目录服务结构¶
LDAP目录以树状层次结构(Directory Information Tree, DIT)组织数据,每个节点称为条目(Entry),条目由唯一标识符DN(Distinguished Name)和属性集合构成
1.3 核心应用场景¶
- 统一身份认证
- 企业内部系统(如GitLab、Jenkins)通过LDAP协议对接,实现用户账号的集中管理68。
- 管理员在LDAP中维护用户密码、权限等信息,各系统通过LDAP API同步数据68。
- 单点登录(SSO)
- 用户通过一次登录即可访问多个应用,LDAP存储全局会话凭证17。
- 设备与资源管理
- 存储打印机、服务器等设备的IP、位置、配置信息,支持快速检索
2 LDAP核心数据模型(DIT 与条目)¶
LDAP 数据以目录信息树 DIT(Directory Information Tree) 组织,是一棵倒置的树,所有数据节点称为条目(Entry)。
2.1 目录信息树 DIT(Directory Information Tree)¶
结构:根节点(Base DN)→ 组织单元(OU)→ 子节点 → 叶子节点(用户 / 设备)
类比:类似文件系统的目录树,DN = 绝对路径,RDN = 文件名
典型 DIT 示例:
dc=example,dc=com # 根(域名组件,对应 example.com)
├── ou=People # 组织单元:员工
│ ├── uid=john # 用户条目:John
│ └── uid=jane # 用户条目:Jane
└── ou=Groups # 组织单元:用户组
├── cn=dev # 组条目:研发组
└── cn=admin # 组条目:管理员组
2.2 条目 Entry(基本存储单元)¶
每个条目是 DIT 中的一个节点,代表一个实体(用户、组、设备、打印机等),由两部分组成:
DN(Distinguished Name,可分辨名称):全局唯一标识,从叶子到根的完整路径,用于定位条目
- 格式:
RDN1, RDN2, ..., Base DN - 示例:
uid=john,ou=People,dc=example,dc=com
属性集(Attributes):描述条目的特征,由属性类型(Attribute Type)+ 一个 / 多个属性值(Value) 组成
示例(用户条目)
cn: John Doe # Common Name,通用名
sn: Doe # Surname,姓
uid: john # User ID,用户ID
mail: john@example.com # 邮箱
userPassword: {SSHA}xxx # 密码(加密存储)
objectClass: inetOrgPerson # 对象类(决定属性合法性)
2.3 关键命名与属性术语¶
2.3.1 RDN(Relative Distinguished Name,相对可分辨名称)¶
条目在父节点下的唯一标识,是 DN 的最左部分
示例:uid=john 是 uid=john,ou=People,dc=example,dc=com 的 RDN
常用 RDN 前缀:
uid=:用户 ID(User ID)cn=:通用名(Common Name,人名 / 组名)ou=:组织单元(Organizational Unit,部门 / 分支)dc=:域组件(Domain Component,域名拆分,如dc=example,dc=com)o=:组织(Organization,公司名)c=:国家(Country,如c=CN)
2.3.2 常用标准属性(Attribute)¶
| 属性名 | 全称 | 含义 | 示例 |
|---|---|---|---|
| cn | Common Name | 通用名 / 显示名 | cn=John Doe |
| sn | Surname | 姓 | sn=Doe |
| givenName | Given Name | 名 | givenName=John |
| uid | User ID | 用户唯一标识 | uid=john |
| 邮箱 | mail=john@example.com |
||
| userPassword | User Password | 密码(加密) | {SSHA}xxx |
| telephoneNumber | Telephone Number | 电话 | telephoneNumber=13800138000 |
| ou | Organizational Unit | 组织单元 | ou=People |
| dc | Domain Component | 域组件 | dc=example,dc=com |
| objectClass | Object Class | 对象类(决定属性约束) | objectClass: inetOrgPerson |
2.4 Schema(模式:数据合法性规则)¶
Schema 是 LDAP 的元数据规范,强制约束条目结构,确保数据一致性:
- 对象类(Object Class)
:定义条目类型(如用户、组、设备),规定
必须属性(MUST) 和可选属性(MAY)
-
核心对象类:
top:所有对象类的基类person:基础人员类(必须:cn,sn)organizationalPerson:组织人员(继承 person,扩展ou,title等)inetOrgPerson:互联网人员(最常用,继承 organizationalPerson,扩展uid,mail,userPassword等)groupOfNames:用户组(包含member属性,引用用户 DN)
-
属性类型(Attribute Type):定义属性的语法(Syntax,数据类型)、匹配规则(Matching Rule,查询匹配方式)、单值 / 多值、是否可索引
-
语法(Syntax):属性值的格式约束(如字符串、整数、DN、二进制、日期)
-
匹配规则(Matching Rule):查询时如何比较属性值(如精确匹配、前缀匹配、忽略大小写)
3 常用命令¶
参考链接:https://www.cnblogs.com/boradviews/p/18700245
yum install openldap-servers openldap-clients -y
systemctl status slapd # 查看lsap服务状态
# 基础查询(匿名)
ldapsearch -x -b "dc=rainchen,dc=com"
# 管理员权限查询
ldapsearch -x -D "cn=admin,dc=rainchen,dc=com" -W -b "dc=rainchen,dc=com"
# -x:简单认证
# -D:绑定 DN
# -W:交互式输密码(安全)
# -w password:命令行明文密码(生产禁用)
# -b:基准 DN,搜索 / 操作基准 DN
# -f file.ldif:从文件执行
# -H ldap://ip or -H ldaps://ip:指定服务器
#查看当前数据库配置
ldapsearch -Y EXTERNAL -H ldapi:/// -b "cn=config" "olcDatabase={2}hdb"
ldapsearch -Y EXTERNAL -H ldapi:/// -b "cn=config" "olcDatabase={1}mdb"
# 查询基准DN是否存在
ldapsearch -x -H ldap://localhost -b "dc=rainchen,dc=com" -s base
slapcat -n 1 | grep "dn: " | head -n 1
# 测试绑定是否成功(排查认证)
ldapwhoami -x -D "cn=admin,dc=rainchen,dc=com" -W
# 只看用户(过滤 objectClass)
ldapsearch -x -D "cn=admin,dc=rainchen,dc=com" -W -b "ou=IT,dc=rainchen,dc=com" "(objectClass=inetOrgPerson)"
# 模糊查找(姓名含 lws)
ldapsearch -x -D "cn=admin,dc=rainchen,dc=com" -W -b "dc=rainchen,dc=com" "(uid=*lws*)"
# 只返回指定属性(精简输出)
ldapsearch -x -D "cn=admin,dc=rainchen,dc=com" -W -b "dc=rainchen,dc=com" "(uid=*lws*)" cn uid gid
# 删除用户
ldapdelete -x -D "cn=admin,dc=rainchen,dc=com" -W "uid=rainchen,ou=IT,dc=rainchen,dc=com"
# 删除 OU(必须为空)
ldapdelete -x -W -D "cn=admin,dc=example,dc=com" "ou=test,dc=example,dc=com"
# 直接修改管理员密码
ldapmodify -x -D "cn=admin,dc=example,dc=com" -W <<EOF
dn: cn=admin,dc=example,dc=com
changetype: modify
replace: userPassword
userPassword: {SSHA}xxxxxxxxxxxx
EOF
# 列出所有数据库配置条目
ldapsearch -Y EXTERNAL -H ldapi:/// -b "cn=config" "(olcDatabase=*)" dn
# 添加DC根域节点
ldapadd -x -D cn=admin,dc=rainchen,dc=com -w 123456 -f base.ldif
# 验证文件合法性
slaptest -v -f restore.ldif
# 以管理员强制执行
ldapadd -x -H ldapi:/// -D "cn=admin,dc=rainchen,dc=com" -W -f restore.ldif
# 修改数据库配置
ldapmodify -Y EXTERNAL -H ldapi:// -f modify.ldif
# 生成加密密码
slappasswd -s 123456
4 认证方式¶
| 认证方式 | 参数 | 适用场景 | 执行条件 |
|---|---|---|---|
| EXTERNAL | -Y EXTERNAL -H ldapi:/// |
修改 cn=config、初始化配置 |
本地 root/ldap 用户 |
| 简单密码 | -x -D "cn=admin,dc=example,dc=com" -W |
操作业务数据(用户 / 组) | 本地 / 远程均可 |
5 以文件方式增删改查¶
5.1 修改用户密码¶
新建 modify_pwd.ldif
dn: uid=zhangsan,ou=people,dc=example,dc=com
changetype: modify
replace: userPassword
userPassword: newpassword
ldapmodify -x -D "cn=admin,dc=rainchen,dc=com" -W -f modify_pwd.ldif
5.2 添加 / 替换属性¶
dn: uid=zhangsan,ou=people,dc=example,dc=com
changetype: modify
add: telephoneNumber
telephoneNumber: 13800138000
5.3 删除属性¶
dn: uid=zhangsan,ou=people,dc=example,dc=com
changetype: modify
delete: telephoneNumber