OpenLDAP官方文档

1.LDAP的使用场景

公司内部会有许多第三方系统或服务,例如Svn,Git,VPN,Jira,Jenkins等等,每个系统都需要维护一份账号密码以支持用户认证,当然公司也会有许多的主机或服务器,需要开放登录权限给用户登录使用,每台主机需要添加登录的账号密码,这些操作不仅繁琐且不方便管理,密码记错或遗忘的情况时有发生。

引入一套支持各系统、服务、主机单点认证的服务就显得尤其迫切和重要。LDAP服务正是为此而生,且经过长时间市场检验,安全稳定,文档也比较丰富,方便上手。

市面上只要你能够想像得到的所有工具软件,全部都支持LDAP协议。LDAP协议的好处就是你公司的所有员工在所有这些工具软件里共享同一套用户名和密码,来人的时候新增一个用户就能自动访问所有系统,走人的时候一键删除就取消了他对所有系统的访问权限,这就是LDAP

2.目录服务简介

目录简单来说就是一种树状结构的数据库。
而目录服务是一种以树状结构的目录数据库为基础,外加各种访问协议的信息查询服务。
顾名思义,目录天生就是用来查询的。
与关系型数据库(如 MariaDB)相比,目录服务最大的优点就是读取性能极高。
但是,目录服务的写入性能就非常差了,而且不支持事务处理等容错功能,因此不适合频繁修改数据。
在现实世界中,资源的分布形式很多都是树状的、有层次的。因此,目录服务有着非常广泛的用途。
像企业员工信息、企业设备信息、证书公钥等具有层次性、且不需要频繁改写的数据都适合使用目录服务来存储。

X.500 是 ISO 制定的一套目录服务的标准,它是一个协议族,定义了一个机构如何在全局范围内共享名称和与名称相关联的对象。通过它,可以将局部的目录服务连接起来,构建基于 Internet 的分布在全球的目录服务系统……而目录访问协议(DAP)是 X.500 的核心组成之一。

3、LDAP 简介

DAP 非常复杂,所以人们都不喜欢使用它。
所以,轻量级目录访问协议(LDAP)应运而生!LDAP 是基于 X.500 的 DAP 发展而来的,目前最新版本是第 3 版。
LDAP 协议的主要特点如下:

  • 基于 TCP/IP。
  • 以树状结构存储数据。
  • 读取速度快,写入速度慢。
  • 服务器用于存放数据,客户端用于操作数据。
  • 跨平台、维护简单。
  • 支持 SSL/TLS 加密。
  • 协议是开放的。

LDAP 的四大模型:

  • 信息模型:规定了 LDAP 目录信息的表示方式以及数据的存储结构。
  • 命名模型:规定了 LDAP 目录中数据如何进行组织和区分。
  • 功能模型:规定了可以对 LDAP 目录进行的操作(如查询、更新、认证等)。
  • 安全模型:规定了保护 LDAP 目录中的数据的安全措施。

基于 LDAP 协议的产品有很多,例如openladp,开源的 OpenDirectory 以及微软开发的 ActiveDirectory。

所以总结起来就是

  1. LDAP:Lightweight Directory Access Protocol,轻量目录访问协议。
  2. LDAP服务是一个为只读(查询、浏览、搜索)访问而优化的非关系型数据库呈树状结构组织数据。
  3. LDAP主要用做用户信息查询(如邮箱、电话等)或对各种服务访问做后台认证以及用户数据权限管控。

4、LDAP 基本结构和相关术语

4.1 基本结构

openladp - 图1
上图表示的就是一颗 LDAP 目录树。

  • DC:domain component一般为公司名,例如:dc=航天,dc=宝安
  • OU:organization unit为组织单元,最多可以有四级,每级最长32个字符,可以为中文
  • CN:common name为用户名或者服务器名,最长可以到80个字符,可以为中文
  • DN:distinguished name为一条LDAP记录项的名字,有唯一性,例如:dc:”cn=admin,ou=developer,dc=163,dc=com”

4.2 条目(Entry)

4.1 的图中的每一个方框就是一个条目。
一个条目有若干个属性和若干个值。有些条目还能包含子条目。

4.3 识别名(Distinguished Name, DN)

它表示条目在目录树中从根出发的绝对路径,是条目的唯一标识。
可以跟 UNIX 文件系统中文件或目录的完整路径做类比。
例如:4.1 的图中右下角的条目的 DN 是 cn=张三,dc=航天,dc=com

4.4 相对识别名(Relative Distinguished Name, RDN)

相对识别名就是识别名第一个逗号左侧的内容。
可以跟 UNIX 文件系统中文件或目录名做类比。
例如:4.1 的图中右下角的条目的 RDN 是 cn=group1
在一般情况下,RDN 以 dc=ou=c=o= 开头的条目为容器。也就是说,它们可以包含子条目。

4.5 基准识别名(Base Distinguished Name, Base DN)

一般指整个目录树的根。
例如,4.1 的图的 Base DN 是 dc=zenandidi,dc=com

4.6 模式(Schema)

模式是对象类(ObjectClass)、属性类型(AttributeType)、属性语法(Syntax)和匹配规则(MatchingRules)的集合。
可以跟关系型数据库的数据表结构做类比。
LDAP 协议定义了一些标准的模式,一般直接使用即可。用户也可以根据自己的需求自行定义模式。
schema(一般在/etc/ldap/schema/目录)在导入时要注意前后顺序。

4.6.1 对象类(ObjectClass)

学过面向对象编程语言的人都知道,类是属性的封装。
对象类封装了必选的属性和可选的属性,同时对象类也是支持继承的。
通过对象类可以很方便地指定条目的类型。一个条目也可以绑定多个对象类。
对象类又分为了结构类型(Structural)、抽象类型(Abstract)、辅助类型(Auxiliary)这三类。
下图是一个对象类所包含的内容。
openladp - 图2

4.6.2 属性类型(AttributeType)

属性类型定义了属性值的设定规则(属性语法),以及同一个属性的各个数据相互比较的规则等。
下图是一个属性类型包含的内容。
openladp - 图3

4.6.3 属性语法(Syntax)

下图是 LDAP 协议预定义的一些属性语法,例如二进制、字符串、电话号码类型等。
openladp - 图4

4.6.4 匹配规则(MatchingRule)

这个我把它理解为各种类型属性的集合。
下图是 LDAP 协议预定义的一些匹配规则。
openladp - 图5

4.7 backend & database

ldap的后台进程slapd接收、响应请求,但实际存储数据、获取数据的操作是由Backends做的,而数据是存放在database中,所以你可以看到往往你可以看到backenddatabase指令是一样的值如 bdb 。一个 backend 可以有多个 database instance,但每个 database 的 suffix 和 rootdn 不一样。openldap 2.4版本的模块是动态加载的,所以在使用backend时需要moduleload back_bdb指令。
bdb是一个高性能的支持事务和故障恢复的数据库后端,可以满足绝大部分需求。许多旧文档里(包括官方)说建议将bdb作为首选后端服务(primary backend),但2.4版文档明确说hdb才是被首先推荐使用的,这从 2.4.40 版默认安装后的配置文件里也可以看出。hdb是基于bdb的,但是它通过扩展的索引和缓存技术可以加快数据访问,修改entries会更有效率,有兴趣可以访问上的链接或slapd.backends
另外config是特殊的backend,用来在运行时管理slapd的配置,它只能有一个实例,甚至无需显式在slapd.conf中配置。

4.8 TLS & SASL

分布式LDAP 是以明文的格式通过网络来发送信息的,包括client访问ldap的密码(当然一般密码已然是二进制的),SSL/TLS 的加密协议就是来保证数据传送的保密性和完整性。
SASL (Simple Authenticaion and Security Layer)简单身份验证安全框架,它能够实现openldap客户端到服务端的用户验证,也是ldapsearchldapmodify这些标准客户端工具默认尝试与LDAP服务端认证用户的方式(前提是已经安装好 Cyrus SASL)。SASL有几大工业实现标准:Kerveros V5、DIGEST-MD5、EXTERNAL、PLAIN、LOGIN。
Kerveros V5是里面最复杂的一种,使用GSSAPI机制,必须配置完整的Kerberos V5安全系统,密码不再存放在目录服务器中,每一个dn与Kerberos数据库的主体对应。DIGEST-MD5稍微简单一点,密码通过saslpasswd2生成放在sasldb数据库中,或者将明文hash存到LDAP dn的userPassword中,每一个authid映射成目录服务器的dn,常和SSL配合使用。参考将 LDAP 客户端配置为使用安全性
EXTERNAL一般用于初始化添加schema时使用,如ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/core.ldif

4.9 LDIF(LDAP Data Interchange Format) 文件

LDAP 数据交换格式文件,它以文本形式存储,用于在服务器之间交换数据。
添加数据以及修改数据都需要通过 LDIF 文件来进行。
可以跟关系型数据库的 SQL 文件做类比。
LDIF 文件的格式一般如下:

  1. dn: <识别名>
  2. <属性 1>: <值 1>
  3. <属性 2>: <值 2>
  4. ...

5.OpenLDAP的安装和使用

注意事项:
1.不同版本的linux安装OpenLDAP差异很大
2.要注意使用的OpenLDAP的版本,例如老版的OpenLDAP是修改slapd.conf的文件,新版的OpenLDAP没有这个文件,取而代之的是slapd.d的文件夹。

ubuntu和Deb