openLDAP入门系列笔记第一篇--捋透openLDAP的基础概念
关于部署,前边已经有文章,可参考前边快速部署的文档。
# 前言
- openLDAP 是个好东西。
- openLDAP 不是一个很容易学习透彻上手使用的东西。
- openLDAP 有星罗棋布的概念,你很容易迷失其中,找不到一条适合自己的出路。
- openLDAP 没有标准答案,在各种概念之下,有各种使用方法,追求一个标准答案,可能往往会迷失自己。
本文将着力于将 ldap 中概念讲清道明,希望你看了就能懂,不再困厄烦恼。
但注意,这篇文章可能只是一个字典式的整理供你查阅,渴望通过这一篇文章直接把 ldap 入门,那就有点小瞧 ldap 的入门难度了,也就不会有那篇大名鼎鼎的:我花了一个五一终于搞懂了 OpenLDAP (opens new window)(但事实上你现在看了这篇文章,仍旧无法搞懂 OpenLDAP,看文章底下的评论区就是例证)。
# 介绍
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=eryajf,dc=net
"。对象类(ObjectClass)
对象类是属性的集合,LDAP 预想了很多人员组织机构中常见的对象,并将其封装成对象类。比如人员(
person
)含有姓(sn
)、名(cn
)、电话(telephoneNumber
)、密码(userPassword
)等属性,单位职工(organizationalPerson
)是人员(person
)的继承类,除了上述属性之外还含有职务(title
)、邮政编码(postalCode
)、通信地址(postalAddress
)等属性。属性 (Attribute)
每个条目都可以有很多属性(Attribute),比如常见的人都有姓名、地址、电话等属性。每个属性都有名称及对应的值,属性值可以有单个、多个。
# 属性详解
要注意,如下标识的字段,即 ldap 中可查询交互使用的字段,其中原有的大小写方式,需与之一致。
# 基础字段
dc (Domain Component)
域名的部分,其格式是将完整的域名分成几部分,如域名为
eryajf.net
变成dc=eryajf,dc=net
。ou(Organization Unit)
组织单位,组织单位可以包含其他各种对象(包括其他组织单元)。
cn (Common Name)
常用名称,可用作分组的名字,或者用户的全名。参考 (opens new window)
dn (Distinguished Name)
每一个条目都有一个唯一的标识名,dn 在 ldap 中全局唯一,相当于该条目的唯一 ID,如上边示例中的:
cn=group,dc=eryajf,dc=net
就是该条目的 dn。rdn (Relative dn)
一般指 dn 逗号最左边的部分,如
cn=group,dc=eryajf,dc=net
的 rdn 就是cn=group
。Base DN
LDAP 目录树的最顶部就是根,比如上边示例中的 base dn 为
dc=eryajf,dc=net
。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
此群组中成员的用户名列表。