Skip to main content

LDAP简介

LDAP 是轻量目录访问协议,英文全称是 Lightweight Directory Access Protocol,一般都简称为 LDAP。

OpenLDAP 默认以 Berkeley DB 作为后端数据库,Berkeley DB 数据库主要以散列的数据类型进行数据存储,如以键值对的方式进行存储。Berkeley DB 是一类特殊的数据库,主要作用于搜索、浏览、更新查询操作,一般用于一次写入数据、多次查询和搜索有很好的效果。Berkeley DB 数据库时面向查询进行优化,面向读取进行优化的数据库。Berkeley DB 不支持事务性数据库(MySQL、MariDB、Oracle 等)所支持的高并发的吞吐量以及复杂的事务操作。

通常我们在 ldap 中维护的数据大概会像如下目录树: 基于这张图,我们来展开相关的概念介绍。

目录树概念

目录树

在一个目录服务系统中,整个目录信息集可以表示为一个目录信息树,树中的每个节点是一个条目 (Entry)。

条目(Entry)

条目,也叫记录项,是 LDAP 中最基本的颗粒,就像字典中的词条,或者是数据库中的记录。通常对 LDAP 的添加、删除、更改、检索都是以条目为基本对象的。

LDAP 目录的条目(entry)由属性(attribute)的一个聚集组成,并由一个唯一性的名字引用,即专有名称(distinguished name,DN)。例如,DN 能取这样的值:" cn=group,dc=ldapauth,dc=com "。

对象类(ObjectClass)

对象类是属性的集合,LDAP 预想了很多人员组织机构中常见的对象,并将其封装成对象类。比如人员( person )含有姓( sn )、名( cn )、电话 ( telephoneNumber )、密码 ( userPassword ) 等属性,单位职工 ( organizationalPerson ) 是人员 ( person ) 的继承类,除了上述属性之外还含有职务( title )、邮政编码( postalCode )、通信地址 ( postalAddress ) 等属性。

属性 (Attribute)

每个条目都可以有很多属性(Attribute),比如常见的人都有姓名、地址、电话等属性。每个属性都有名称及对应的值,属性值可以有单个、多个。

属性详解

要注意,如下标识的字段,即 ldap 中可查询交互使用的字段,其中原有的大小写方式,需与之一致。

基础字段

dc (Domain Component)

域名的部分,其格式是将完整的域名分成几部分,如域名为 ldapauth.com 变成 dc=ldapauth,dc=com 。

ou(Organization Unit)

组织单位,组织单位可以包含其他各种对象 (包括其他组织单元)。

cn (Common Name)

常用名称,可用作分组的名字,或者用户的全名。参考(opens new window)

dn (Distinguished Name)

每一个条目都有一个唯一的标识名,dn 在 ldap 中全局唯一,相当于该条目的唯一 ID,如上边示例中的: cn=group,dc=ldapauth,dc=com 就是该条目的 dn。

rdn (Relative dn)

一般指 dn 逗号最左边的部分,如 cn=group,dc=ldapauth,dc=com 的 rdn 就是 cn=group 。

Base DN

LDAP 目录树的最顶部就是根,比如上边示例中的 base dn 为 dc=ldapauth,dc=com 。

description

在不同类别中,对应不同类别的说明信息,比如用户的说明信息,分组的说明信息。

#用户字段 用户字段依然会用到基础字段,并不代表这部分内容与上边的内容是隔离的。

objectClass : top 、 person 、 organizationalPerson 、 inetOrgPerson 、 posixAccount

uid (User Id)

用户的用户名,通常为中文拼音,或者用邮箱地址的用户名部分。

sn (Surname)

用户的姓氏,对于中文环境下,可以直接用姓名填充。

givenName

用户的名字,不包含姓,对于中文语境下,可灵活运用该字段。

displayName

用户的显示名字,全名。

mail

用户的邮箱。

title

用户的职位。

employeeNumber

用户的员工 ID,也可以理解为工号。

employeeType

用户在单位中的角色。

departmentNumber

用户所在部门的名称,通常为部门名,而非部门号。

businessCategory

描述业务的种类,在中文语境中可灵活定义。参考(opens new window)

userPassword

用户密码。

jpegPhoto

用户的个人资料照片。

photo

用户的照片,如上这两个字段都可以用。

postalAddress

用户的邮政地址,也可以直接认为是用户地址。参考(opens new window)

entryUuid

此用户专属的固定通用标识符,类似 union_id,通常用不到。

objectSid

此用户专属的通用标识符,与 Windows 安全标识符兼容。

uidNumber

用户的 POSIX UID 号码。如果为用户设置了 POSIX ID,这里则会显示此号码。否则,这里会显示专属的固定标识符。

gidNumber

用户主要群组的 POSIX GID 号码。如果为用户设置了 POSIX GID,这里则会显示此号码。否则,则会显示与用户的 UID 相同的号码。

注意:您无法按 uidNumber 或 gidNumber 搜索用户,除非管理员使用 Admin SDK API (opens new window)设置了用户的 posixAccounts 属性。

homeDirectory

用户的 POSIX 主目录。默认为 /home/<用户名> 。

loginShell

用户的 POSIX 登录 shell。默认为 /bin/bash 。

carLicense

车牌,通常用不上这个字段。

homePhone

家庭固定电话,通常用不上这个字段。

homePostalAddress

邮编,通常用不上这个字段。

roomNumber

房间号码,通常用不上这个字段。

secretary

秘书,通常用不上这个字段。

#分组字段 objectClass : top 、 groupOfNames 、 posixGroup

displayName

用户可理解的群组显示名称。

description

用户可理解的群组详细说明。

gidNumber

群组的 POSIX GID 号码。这是固定的专属 ID,但无法通过此 ID 高效地查找群组。

entryUuid

此群组专属的固定通用标识符。

member

此群组中成员的完全符合条件的名称列表。

memberUid

此群组中成员的用户名列表。

简单认识objectCLass以及常见应用

我们可以把 objectCLass 的属性值理解为是 ldap 中的一种模板,模板定义哪些信息可以存取,哪些信息不可以存储在目录树中。

因此,我们在实际使用过程中会发现,声明了不同的 objectCLass 时,可能添加某个字段就会报错了。

objectClass 的分类

结构型(structural):如 person 和 oraganizationUnit

辅助型(auxiliary):如 extensibleObject

抽象型(abstract):如 top,抽象型的 objectClass 不能直接使用

objectCLass 的列表

很多文档在介绍 objectCLass 列表时会说,常见的 objectCLass,我想说,你看了如下列表之后,内心的 OS 应该是:他妹的,一个也不常见。

但我还是列出一下,让你大概有个感受:

alias

applicationEntity

dSA

applicationProcess

bootableDevice

certificationAuthority

certificationAuthority-V2

country

cRLDistributionPoint

dcObject

device

dmd

domain

domainNameForm

extensibleObject

groupOfNames

groupOfUniqueNames

ieee802Device

ipHost

ipNetwork

ipProtocol

ipService

locality

dcLocalityNameForm

nisMap

nisNetgroup

nisObject

oncRpc

organization

dcOrganizationNameForm

organizationalRole

organizationalUnit

dcOrganizationalUnitNameForm

person

organizationalPerson

inetOrgPerson

uidOrganizationalPersonNameForm

residentialPerson

posixAccount

posixGroup

shadowAccount

strongAuthenticationUser

uidObject

userSecurityInformation