1. 简介

LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)以树状的层次结构存储数据。目录是为查询、浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据。目录服务是由目录数据库和访问协议组成的系统。

LDAP 提供复杂的不同层次的访问控制(ACL)。


2. 简称


3. 数据组织方式

ldap-dit-example.png


4. 基本概念

4.1. Entry

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

每个条目都有唯一的标识名(Distinguished Name,DN)如上图中的"cn=baby,ou=marketing,ou=people,dc=mydomain,dc=org"。通过 DN 的层次型语法结构,可方便地表示出条目在 LDAP 树中的位置,通常用于检索。LDAP 目录树的最顶部是所谓的 Base DN,比如"dc=mydomain,dc=org"。

4.2. Attribute

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

定义属性需要符合规则,该规则通过 schema 指定。比如,如果 entry 不包含在 inetorgperson schema 中的 ObjectClass inetOrgPerson,那么就不能为其指定 employeeNumber 属性,因为该属性是在 inetOrgPerson 中定义的。

LDAP 为人员组织机构中常见的设计了属性,比如 commonName、surname。

4.3. ObjectClass

对象类是属性的集合,通过对象类可以方便地定义条目类型。条目通过继承对象类的方式,继承各种属性。

对象类有三种类型:结构类型(Structural)、抽象类型(Abstract)和辅助类型(Auxiliary)。结构类型是最基本的类型,它规定对象实体的基本属性,每个条目属于且仅属于一个结构型对象类。抽象类型是结构类型或其它抽象类型的父类,它将对象属性中共性的部分组织在一起,成为其它类的模版,条目不能直接继承抽象型对象类。辅助类型规定对象实体的扩展属性。虽然每个条目只属于一个结构型对象类,但可以同时属于多个辅助型对象类。

对象类本身可以相互继承,所有对象类的根类是 top。以常用的人员类型为例,它们的继承关系如下:

ldap-object-class-example.webp

4.4. Schema

对象类(ObjectClass)、属性类型(AttributeType)、语法(Syntax)分别约定条目、属性、值,它们之间的关系如下图所示,所有这些构成模式(Schema) - 对象类的集合。条目数据在导入时,通常需要接受模式检查,以确保目录中所有条目的数据结构一致。

Schema(通常在 /etc/ldap/schema/ 目录)在导入时需要注意前后顺序。

ldap-schema-example.png

4.5. Backend & Database

LDAP 的守护进程 slapd 接收、响应请求,但实际存储、获取数据的操作由 Backend 完成,数据存放在 Database 中。一个 Backend 可以有多个 Database Instance,但每个 Database 的 suffix 和 rootdn 不一样。

4.6. LDIF

LDIF(LDAP Data Interchange Format,数据交换格式)是 LDAP 数据库信息的文本格式,用于数据的导入/导出,没行是"属性:值"对。

4.7. 过滤器和语法

LDAP 是以查询为主的目录结构,无论何种查询方式,最终都由过滤器确定查询的条件。过滤器相当于 SQL 中的 WHERE 子句。LDAP 的类过滤和字符串都必须放在括号内,比如 "(objectclass=*)"。

可使用 =、>=、<=、~=(约等于)进行比较,比如"(number<=100)"。合并条件必须把操作符放在两个操作对象的前面,单一操作对象用括号括起来。比如:


5. 在 Ubuntu 18.04 上安装 OpenLDAP

5.1. 安装

说明:

  1. 在安装过程中,会要求为 LDAP 创建管理员密码。

使用如下命令查看管理员账号:

可以看到目录信息树(DIT)的后缀是 nodomain,接下来对其进行更改。

5.2. 重新配置 slapd

说明:

  1. 第一步回答 No
  2. 第二步填写域名,比如 mycompany.com
  3. 第三步填写组织名,比如 Company
  4. 第四步填写管理员密码,比如 secret;第五步确认管理员密码
  5. 第六步选择使用的数据库后端,比如 MDB
  6. 第七步选择在清除 slapd 时是否移除数据库,比如 Yes
  7. 第八步选择是否移除旧数据库,比如 Yes

再次查看管理员账户:

5.3. 创建管理员组(可选,目的是测试 ACL)

创建 acl.ldif:

导入配置:

更多关于 ACL 的细节,请移步参考文档或自行查阅资料。

5.4. 说明

6. Python 客户端

6.1. 环境说明
6.2. 示例

Appendix 1 - 创建 Ubuntu 虚拟机的 Vagrantfile


参考资料