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
用户的显示名字,全名。
用户的邮箱。
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