跳转至

LDAP

LDAP

1. 概念

1.1 定义

LDAP(Lightweight Directory Access Protocol)是一种基于TCP/IP的开放协议,专为访问和管理分布式目录服务设计,提供目录数据的快速读取和查询能力,优化读操作性能‌,支持跨平台、跨网络的目录信息统一管理‌

1.2 目录服务结构

LDAP目录以树状层次结构(Directory Information Tree, DIT)组织数据,每个节点称为‌条目(Entry)‌,条目由唯一标识符‌DN(Distinguished Name)‌和属性集合构成‌

1.3 核心应用场景
  1. ‌统一身份认证
  2. 企业内部系统(如GitLab、Jenkins)通过LDAP协议对接,实现用户账号的集中管理‌68。
  3. 管理员在LDAP中维护用户密码、权限等信息,各系统通过LDAP API同步数据‌68。
  4. 单点登录(SSO)
  5. 用户通过一次登录即可访问多个应用,LDAP存储全局会话凭证‌17。
  6. ‌设备与资源管理
  7. 存储打印机、服务器等设备的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 Email 邮箱 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 的元数据规范,强制约束条目结构,确保数据一致性:

  1. 对象类(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