自学内容网 自学内容网

LDAP入门宝典(上):协议、结构与OpenLDAP实战部署

一、简介

1.1.目录服务(active directory)

目录服务是专门为搜索和浏览而设计的专用数据库,此外还支持基本的查找和更新功能。

目录服务往往包含描述性的、基于属性的信息并支持复杂的过滤功能。目录通常不支持数据库管理系统中为处理大量复杂更新而设计的复杂事务或回滚方案。如果完全允许的话,目录更新通常是简单的全有或全无更改。目录通常经过调整以对大量查找或搜索操作做出快速响应。他们可能有能力广泛复制信息以提高可用性和可靠性,同时减少响应时间。复制目录信息时,消费者之间的临时不一致可能是可以的,只要及时解决不一致即可。

全局服务通常是分布式的,这意味着它们包含的数据分布在许多机器上,所有机器都合作提供目录服务。通常一个全局服务定义一个统一的命名空间无论您在哪里与数据本身相关,都可以提供相同的数据视图。

1.2.什么是LDAP?

轻型目录访问协议(Lightweight Directory Access Protocol,LDAP):是一个开放的、中立的、业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息,它是由目录数据库和一套访问协议组成的系统,

  • LDAP是用于访问目录服务(特别是基于X.500的目录服务),LDAP在TCP/IP或其他面向连接的传输服务上运行。LDAP是IETF标准的跟踪协议。
  • LDAP是目录非关系型的,不存储BLOB,读写是非对称的,读方便,写麻烦,适合于查询搜索。LDAP不支持数据库的事务和回滚机制。
  • LDAP支持负载的查询过滤器,使用树状结构,类似于互联网域名、公司组织结构、文件的目录结构等。

1.3.为什么用LDAP?

LDAP是开放的Internet标准,市场上或者开源社区的绝大多数软件都支持LDAP协议。简单来说,LDAP协议最大的好处就是能统一管理用户密码,新人报道创建一个用户就能登录公司的所有平台(gitlab、监控等),离职一键删除即可。

1.4.相关协议

与LDAP相关的协议很多,但主要是两个系列:

  • X.500系列协议

目录服务的最初协议,完整地描述了目录、目录服务的组成、目录结构等内容。X.500本身只是一个概览,各部分的实现在其子协议如X.501、X.502中,所以说X.500是一个系列协议。
值得一提的是,常见的X.509公钥证书也属于该系列协议。

  • LDAP系列协议

LDAP并非只有一个协议文件,其涉及到方方面面,每个方面单独由一个协议文件描述,加星号的必看

RFC4511*:通过TCP传输消息的方式,规定了传输层面的消息类型、消息内容,如绑定、查询等
RFC4512*:信息模型,规定了schema、object class、attribute type等内容
RFC4513*:规定了鉴权方式和安全机制:TLS、SASL
RFC4514:规定了DN的字符串表示方式
RFC4515:规定了过滤器的格式,过滤器用于查找时指定条件
RFC4516:规定了统一资源定位符的格式,即LDAP端点长啥样
RFC4517*:语法和匹配规则,列举了所有允许的语法和匹配规则
RFC4518:字符串国际化
RFC4519*:应用程序的schema,列举了所有允许的object class和attribute type
RFC2377*:推荐的DIT组织方式,即目录服务的树的组织方式

二、X500协议原理

2.1.定义目录系统

Directory旨在提供一个用户友好的name-address类的映射,其中name不可变,address允许动态变化,即key-value结构。Directory由一批系统组成,每个系统持有对应现实世界的逻辑数据,这些存储的数据叫做DIB,即目录信息库。整体架构如下
在这里插入图片描述
一个标准的目录系统,有以下几部分:

  • 目录服务
  • 目录服务的用户
  • 目录服务用来暴露自己的访问端点
  • 用户和服务之间使用协议如LDAP进行交互

2.2.DIB与DIT

目录信息库,由DIT(目录信息树)、节点Entry、Entry中的属性及属性值构成。

Entry代表一个节点,类型可以是object,也可以是alias,后者表示一个object entry的别名;一个Entry内可以拥有多个属性;一个属性内可以拥有一个Type,以及多个Value;下图展示了一个DIT的树形结构:

在这里插入图片描述
一个假设的DIT如下,则DN:{C=GB, L=Winslow, O=Graphic Services, CN=Laser Printer}代表了Laser Printer。
在这里插入图片描述
你可能会想,DIB和常见的数据库有什么关系呢?实际上他们没什么关系,类似HTTP和TCP。硬要说有关系的话,DIB更加垂直吧,仅适用于这种树形存储结构,查询多、更新少;数据库则更加通用,相对而言也更加底层。DIB只是规定了一种存储键值对数据的树形结构,可以用任何方式实现DIB,包括关系型数据库。

2.3.目录服务

X.500规定了目录服务支持的一些典型的操作,我们大致列举一下

读操作
1)Read:读指定的entry。LDAP不支持此操作
2)Compare:比较给的值和指定entry的值是否一致。这个在验证密码时有用
3)List:列出指定entry的所有子entry
4)Search:列出满足指定过滤器的所有entry
5)Abandon:放弃,作用在一个挂起请求上,标识客户端对该请求不在感兴趣

修改操作
1)添加entry
2)移除entry
3)修改entry
4)修改DN,修改某个entry的相对名称。如果该entry有子节点,则子节点的这部分名字也会被修改

其它可能的输出
1)错误
2)转移(referral):可能当前服务无法处理这个请求,它会返回一个新的端点,类似HTTP的重定向

三、LDAP协议原理

通过X.500我们知道了目录服务内部由DIT实现,每个节点上放置的数据貌似可以自由指定,那为什么无论看文章还是自己搭建的LDAP服务,总是以dc、cn之类的属性指定dn呢?
下面内容就是这些相关的。

3.1.Schema

LDAP通过RFC4512、RFC4517、RFC4519,对DIT进行了详尽的规定。限制了节点的类型、属性的类型、值的类型,这些限制,叫做schema。具体来说,有几点

  • 规定了Syntax,即“语法”。规定了attribute value的存储结构
  • 规定了attribute type,即属性的种类
  • 规定了object class,对象类,类之间可以继承,一个类由多个attribute type组成。一个entry必须是某个object class。object class规定了该entry可以包含哪些属性
  • 规定了匹配规则,用于在执行查找和比较操作时对库中的属性值和请求的属性值进行比较以面向对象的思维是很好理解的,object class是类、attribute type是属性、Syntax则是属性的类型

以面向对象的思维是很好理解的,object class是类、attribute type是属性、Syntax则是属性的类型。

3.1.1.常见数据类型

在这里插入图片描述

3.1.2.常见匹配规则

在这里插入图片描述

3.1.3.常用属性种类

在这里插入图片描述

3.1.4.DIT组织方式

schema有了,那么是不是所有节点都可以是任何object class类型呢?理论上是的,但LDAP有推荐的方式构建DIT——RFC2377。我们实际中创建的LDAP服务,也是以这种建议进行构建的。其主要特点是以DNS为基础进行构建,总体如下:

  • DIT的上部使用dc,将域名转换为dc类型的entry。比如某公司域名为foo.com,则其根节点的DN为dc=foo,dc=com;它有一个子域名,为account.foo.com,则该节点位于根节点下,其RDN为dc=account,合起来DN为dc=account,dc=foo,dc=com。

  • DIT的下部,可以是个人、组、机构等。建议使用uid或cn来描述RDN。比如account.foo.com下有一个账户名为zou8944,则其DN为cn=test,dc=account,dc=foo,dc=com

这种组织方式看起来理所应当,但其前身X.500却并不是这么规定的。由于历史原因,它使用权威注册的组织机构命名作为DIT的上层。比如o=“Nadir Networks, Inc.”, st=New Jersey, c=US,这表示,在美国的新泽西州的Nadir网络公司。
这样做有两个问题:权威的组织机构注册非常麻烦;跨国公司不好办。于是有了新的基于DNS的划分方式。

3.2.LDAP数据结构

LDAP数据采用属性列表的形式,信息模型是建立在"条目"(entries)的基础上。一个条目是一些属性的集合,并且具有一个全局唯一的"可区分名称"DN,一个条目可以通过DN来引用。每一个条目的属性具有一个类型和一个或者多个值。

类型通常是容易记忆的名称,比如"cn"是通用名称(common name) ,或者"mail"是电子邮件地址。条目的值的语法取决于属性类型。

3.2.1.objectClass

LDAP通过属性objectClass来控制哪一个属性必须出现或允许出现在一个条目中,它的值决定了该条目必须遵守的模式 规则。可以理解为关系数据库的表结构,常用到的objectClass有:

objectClass含义
olcGlobal全局配置文件类型, 主要是cn=config.ldif 的配置项
top顶层的对象
organization组织,比如公司名称,顶层的对象
organizationalUnit重要, 一个目录节点,通常是group,或者部门这样的含义
inetOrgPerson重要, 我们真正的用户节点类型,person类型, 叶子节点
groupOfNames重要, 分组的group类型,标记一个group节点
olcModuleList配置模块的对象

3.2.2.常用关键字

ldap的entry是由各种字段构成,可以理解为关系数据库的字段。

关键字英文全称含义
dcDomain Component域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成dc=example,dc=com
uidUser Id用户ID,如“tom”
ouOrganization Unit组织单位,类似于Linux文件系统中的子目录,它是一个容器对象,组织单位可以包含其他各种对象(包括其他组织单元),如“market”
cnCommon Name公共名称,如“Thomas Johansson”
snSurname姓,如“Johansson”
dnDistinguished Name惟一辨别名,类似于Linux文件系统中的绝对路径,每个对象都有一个惟一的名称,如“uid= tom,ou=market,dc=example,dc=com”,在一个目录树中DN总是惟一的
rdnRelative dn相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如“uid=tom”或“cn= Thomas Johansson”
cCountry国家,如“CN”或“US”等。
oOrganization组织名,如“Example, Inc.”

这里,我们把dn当做用户唯一主键, cn是common name,应该等同于用户名,因为用户名必须唯一,通常为邮箱前缀 ,比如ryan.miao. sn作为姓氏, uid作为用户id。通常用户id也是唯一的。

3.2.3.用户组织

在使用ldap做认证的时候, 大概逻辑如下:

  • 配置ldap host, admin, admin pass
  • 用户登录时传递username
  • 读取配置的ldap信息,查询cn或者uid等于username的数据

取出第一个记录, 获得dn, 根据dn和password再次去ldap服务器认证。即我们必须保证cn或uid是全局唯一的, 认证通常需要进行两次。原因就在于dn没办法根据用户名计算出来。

1.目录树如下:
在这里插入图片描述
2.DIT如下:
在这里插入图片描述

3.3.LDAP特性

1.是一个跨平台的,标准的协议。
2.的结构用树型结构来表示,而不是表格,因此不需要用SQL语句维护
3.提供了静态数据的快速查询方式
4.是一个安全的协议
5.支持异类数据存储
6.是C/S架构,server端用于存储树,client端提供操作目录信息树的工具
7.是一种目录服务,保存在特殊的数据库中,数据的读取速度远高于写入速度。
8.查询做了优化,读取速度优于普通关系数据库。
9.不支持事务、不能进行回滚,需要进行这些操作的应用只有选择关系数据库。
10.采用服务器/客户端模式,支持分布式结构。
11.中的条目以树形结构组织和存储。
12.基于Internet协议,直接运行在简单和通用的TCP/IP或其他可靠的传输协议层连接的建立和包的处理简单、快捷,对于互联网和企业网应用都很方便。
13.协议简单,通过使用查找操作实现列表操作和读操作。
14.通过引用机制实现分布式访问,通过客户端API实现分布式操作(对于应用透明),平衡了负载。
15.实现具有低费用、易配置和易管理的特点,并提供了满足应用程序对目录服务所需求的特性。

3.4.如何工作?

LDAP 利用客户端-服务器模型。一个或多个 LDAP 服务器包含构成目录信息树的数据 (数码管)。客户端连接到服务器并问它一个问题。服务器以一个答案和/或一个指向客户端可以获取附加信息的位置(通常是另一个 LDAP 服务器)的指针进行响应。无论客户端连接到哪个 LDAP 服务器,它都会看到相同的目录视图;提供给一个 LDAP 服务器的名称引用它在另一个 LDAP 服务器上的相同条目。这是全局目录服务的一个重要特性。

四、LDAP适用场景

要通过基于标准的方法集中管理、存储和访问数据时,您应该使用目录服务器。
在整个行业中发现的一些常见示例包括但不限于:

1.机器认证
2.用户认证
3.用户/系统组
4.地址簿
5.组织代表
6.资产追踪
7.电话信息存储
8.用户资源管理
9.电子邮件地址查找
10.应用程序配置存储
11.PBX 配置存储

五、LDAP相关产品

厂商产品说明
SUNSUNONE Directory Server基于文本数据库的存储,速度快 。
IBMIBM Directory Server基于DB2 的的数据库,速度一般。
NovellNovell Directory Server基于文本数据库的存储,速度快, 不常用到。
MicrosoftMicrosoft Active Directory基于WINDOWS系统用户,对大数据量处理速度一般,但维护容易,生态圈大,管理相对简单。
OpenLDAPOpenLDAP开源的项目,速度很快

六、OpenLDAP

6.1.什么是OpenLDAP?

LDAP 具有两个国家标准,分别是X.500 和LDAP。OpenLDAP 是基于X.500 标准的,而且去除了X.500 复杂的功能并且可以根据自我需求定制额外扩展功能,但与X.500 也有不同之处,例如OpenLDAP 支持TCP/IP 协议等,目前TCP/IP 是Internet 上访问互联网的协议。

OpenLDAP 服务器(slapd,独立 LDAP 守护程序)架构分为处理网络访问和协议处理的前端和严格处理数据存储的后端。这种拆分设计是 1996 年编写的密歇根大学原始代码的一个特征[10],并在所有后续的 OpenLDAP 版本中继续使用。原始代码包括一个主数据库后端和两个实验/演示后端。该架构是模块化的,许多不同的后端现在可用于连接其他技术,而不仅仅是传统的数据库。

OpenLDAP 则直接运行在更简单和更通用的TCP/IP 或其他可靠的传输协议层上,避免了在OSI会话层和表示层的开销,使连接的建立和包的处理更简单、更快,对于互联网和企业网应用更理想。LDAP 提供并实现目录服务的信息服务,目录服务是一种特殊的数据库系统,对于数据的读取、浏览、搜索有很好的效果。目录服务一般用来包含基于属性的描述性信息并支持精细复杂的过滤功能,但OpenLDAP 目录服务不支持通用数据库的大量更新操作所需要的复杂的事务管理或回滚策略等。

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

OpenLDAP 目录中的信息是按照树形结构进行组织的,具体信息存储在条目(entry)中,条目可以看成关系数据库中的表记录,条目是具有区别名(Distinguished Name,DN)的属性(attribute),DN 是用来引用条目,DN 相当于关系数据库(Oracle/MySQL)中的主键(primary key),是唯一的。属性由类型(type)和一个或者多个值(value)组成,相当于关系数据库中字段的概念。

需要说明的是,从openLDAP 2.4.23开始,不在使用 /etc/openldap/ldap.conf 作为配置文件,所有配置都保存在/etc/openldap/slapd.d/cn=config目录下,配置文件后缀为.ldif,每个配置文件都是通过命令生成的,禁止手动编辑修改。

6.2.版本功能

OpenLDAP 软件的主要(功能)版本包括:

  • OpenLDAP 版本 1 是对密歇根大学项目的最后一个版本(版本 3.3)的总体清理,并整合了其他更改。
  • OpenLDAP 版本 2.0 于 2000 年 8 月发布,包括主要增强功能,包括 LDAP 版本 3 (LDAPv3) 支持、Internet 协议版本 6 ( IPv6 ) 支持以及许多其他增强功能。
  • OpenLDAP 2.1 版于 2002 年 6 月发布,包括事务数据库后端(基于Berkeley 数据库或 BDB)、简单身份验证和安全层(SASL) 支持,以及元、监视器和虚拟实验后端。
  • 2003 年 12 月发布的 OpenLDAP 版本 2.2 包括具有复制支持 (syncrepl) 的 LDAP“同步”引擎、覆盖接口以及大量数据库和 RFC 相关的功能增强。
  • OpenLDAP 版本 2.3 于 2005 年 6 月发布,包括配置后端(动态配置)、其他覆盖(包括符合 RFC 的密码策略软件)以及许多其他增强功能。
  • OpenLDAP 版本 2.4 于 2007 年 10 月发布,引入了 N-way MultiMaster 复制、Stand-by master 以及动态删除和修改 Schema 元素的能力等等。[21]
  • OpenLDAP 2.5 版于 2021 年 4 月发布,引入了 LDAP 负载平衡代理服务器、LDAP 事务支持、HA 代理协议 v2 支持等。[22]
  • 2021 年 10 月发布的 OpenLDAP 版本 2.6 引入了额外的负载平衡策略和额外的选项,以提高与某些 LDAP 控制的一致性和 LDAP 负载平衡器守护程序的扩展操作,以及直接记录到文件而不是通过 slapd 和 syslog 的能力已加载

6.3.优点

  • OpenLDAP 是一个跨平台的标准互联网协议,它基于X.500 标准协议。

  • OpenLDAP 提供静态数据查询搜索,不需要像在关系数据中那样通过SQL 语句维护数据库信息。

  • OpenLDAP 基于推和拉的机制实现节点间数据同步,简称复制(replication)并提供基于TLS、SASL 的安全认证机制,实现数据加密传输以及Kerberos 密码验证功能。

  • OpenLDAP 可以基于第三方开源软件实现负载(LVS、HAProxy)及高可用性解决方案,24 小时提供验证服务,如Headbeat、Corosync、Keepalived 等。

  • OpenLDAP 数据元素使用简单的文本字符串(简称LDIF 文件)而非一些特殊字符,便于维护管理目录树条目。 章

  • OpenLDAP 可以实现用户的集中认证管理,所有关于账号的变更,只须在OpenLDAP 服务器端直接操作,无须到每台客户端进行操作,影响范围为全局。

  • OpenLDAP 默认使用协议简单如支持TCP/ZP 协议传输条目数据,通过使用查找操作实现对目录树条目信息的读写操作,同样可以通过加密的方式进行获取目录树条目信息。

  • OpenLDAP 产品应用于各大应用平台(Nginx、HTTP、vsftpd、Samba、SVN、Postfix、OpenStack、Hadoop 等)、服务器(HP、IBM、Dell 等)以及存储(EMC、NetApp 等)控制台,负责管理账号验证功能,实现账号统一管理。

  • OpenLDAP 实现具有费用低、配置简单、功能强大、管理容易及开源的特点。

  • OpenLDAP 通过ACL(Access Control List)灵活控制用户访问数据的权限,从而保证数据的安全性。

6.4.为什么选择OpenLDAP

我们知道,账号是登录系统的唯一入口。要登录系统,首先系统要存在登录所使用的账号(/etc/passwd)及密码信息(/etc/shadow),然后经过系统查找顺序(/etc/nsswith.conf)及认证模块(/etc/pam.d/*)验证,得到授权后方可登录系统。如果多个用户登录系统,就需要在每个系统上创建用户名和密码;否则,就无法登录系统。

对于账号管理人员而言,维护10 台、100 台机器的账号,或许勉强可以维护、管理。如果机器数量达到1000 以上时,对于账号的创建、回收、权限的分配、密码策略、账号安全审计等一系列操作,账号管理人员就心有余而力不足了。此时OpenLDAP 账号集中管理软件就应用而生,它可以实现账号集中维护、管理,只需要将被管理的机器加入到服务器端即可,此后所有与账号相关的策略均在服务端实现,从而解决了运维案例所产生的众多管理问题。

关于账号的添加、删除、修改、权限的赋予等一系列操作只需要在服务端操作即可,无须在客户端机器进行单独操作。客户端账号及密码均通过OpenLDAP 服务器进行验证,从而实现账号集中认证管理,此时账号管理员只须维护OpenLDAP 服务器条目即可。

OpenLDAP 属于开源软件,且OpenLDAP 支持LDAP 最新标准、更多模块扩展功能、自定义schema 满足需求、权限管理、密码策略及审计管理、主机控制策略管理、第三方应用平台管理以及与第三方开源软件结合实现高可用负载均衡平台等诸多功能,这也是商业化管理软件无可比拟的。所以关于账号的管理OpenLDAP 是企业唯一的选择。目前各大著名公司都在使用OpenLDAP实现账号的集中管理,如PPTv、金山GOOGLE、Facebook 等,这也是选择OpenLDAP 实现账号统一管理的原因之一。

6.5.OpenLDAP组件

OpenLDAP 有四个主要组件:

  • slapd – 独立的 LDAP守护进程和相关的模块和工具。
  • lloadd - 独立的 LDAP 负载平衡代理服务器
  • 实现 LDAP协议和ASN.1基本编码规则 (BER) 的库
  • 客户端软件:ldapsearch、ldapadd、ldapdelete 等

6.6.物理主机部署

6.6.1.安装

  • 基础环境
    • 系统版本:CentOS Linux release 7.9.2009 (Core)
    • OpenLDAP版本:2.4.44-25.el7_9 (OpenLDAP: slapd 2.4.44)
    • LDAP服务端IP:192.168.1.100
  • 安装
    #yum -y install openldap compat-openldap openldap-clients openldap-servers openldap-devel
    在这里插入图片描述
  • 查看安装后的版本
    #slapd -V

6.6.2.初始化OpenLDAP配置

  • cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
  • chown -R ldap. /var/lib/ldap

6.6.3.修改OpenLDAP管理员密码

# 生成加密密码。
[root@server ~]# slappasswd -s 123456
{SSHA}HW9GC/CZ32XyakMu9kYlEXk37QCTmPCC

# 在/etc/openldap/slapd.d目录外任意位置创建修改密码的配置文件。
[root@server ~]# vim changepasswd.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}HW9GC/CZ32XyakMu9kYlEXk37QCTmPCC

# 执行本次修改。
[root@server ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f change_passwd.ldif 
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"

# 执行成功后,会发现olcDatabase={0}config.ldif配置文件中多出一行olcRootPW项。
[root@server ~]# cat /etc/openldap/slapd.d/cn\=config/olcDatabase={0}config.ldif | grep olcRootPW
olcRootPW:: e1NTSEF9MzRUK0xPVUtub3dKWjF4MTN5dEpsSk5uN2dCeWM1NUI=

6.6.4.导入一些基础的schema配置

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/collective.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/corba.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/duaconf.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/dyngroup.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/java.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/misc.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/openldap.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/pmi.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/ppolicy.ldif

6.6.5.服务启动配置

# systemctl start slapd
# systemctl enable slapd
# systemctl status slapd

6.7.容器部署

6.7.1.ldap.yml

kind: Deployment
apiVersion: apps/v1
metadata:
  name: ldap
  namespace: ldap
  labels:
    app: ldap
spec:
  selector:
    matchLabels:
      app: ldap
  template:
    metadata:
      labels:
        app: ldap
    spec:
      containers:
      - name: ldap
        image: 'osixia/openldap'  ##镜像
        ports:
        - name: tcp-389
          containerPort: 389
          protocol: TCP
        - name: tcp-636
          containerPort: 636
          protocol: TCP
        env:
        - name: LDAP_ORGANISATION
          value: devops
        - name: LDAP_DOMAIN
          value: test.com
        - name: LDAP_ADMIN_PASSWORD
          value: test123
        - name: LDAP_CONFIG_PASSWORD
          value: test123
        - name: LDAP_BACKEND
          value: mdb
        resources:
          limits:
            cpu: 500m
            memory: 500Mi
          requests:
            cpu: 100m
            memory: 100Mi
        volumeMounts:
        - name: ldap-config-pvc
          mountPath: /etc/ldap/sldap.d
        - name: ldap-data-pvc
          mountPath: /var/lib/ldap
      volumes:
      - name: ldap-config-pvc
        emptyDir: {}
      - name: ldap-data-pvc
        emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: ldap-svc
  namespace: ldap
  labels:
    app: ldap-svc
spec:
  ports:
  - name: tcp-389
    port: 389
    protocol: TCP
    targetPort: 389
  - name: tcp-636
    port: 636
    protocol: TCP
    targetPort: 636
  selector:
    app: ldap

6.7.2.执行

kubectl apply -f ldap.yml

6.8.配置文件

安装后的配置目录是: /etc/openldap

  • /etc/openldap/slapd.conf:OpenLDAP的主配置文件,记录根域信息,管理员名称,密码,日志,权限等
  • /etc/openldap/slapd.d/*:这下面是/etc/openldap/slapd.conf配置信息生成的文件,每修改一次配置信息,这里的东西就要重新生成
  • /etc/openldap/schema/*:OpenLDAP的schema存放的地方
  • /var/lib/ldap/*:OpenLDAP的数据文件
  • /usr/share/openldap-servers/DB_CONFIG.example 模板数据库配置文件
  • slapd 配置存储为具有预定义模式和 DIT 的特殊 LDAP 目录。有特定的 objectClasses 用于携带全局配置选项、模式定义、后端和数据库定义以及各种其他项目,如下图:
    在这里插入图片描述

6.8.1.目录树

.
|-- certs
|   |-- cert8.db
|   |-- key3.db
|   |-- password
|   `-- secmod.db
|-- check_password.conf
|-- ldap.conf
|-- schema
|   |-- collective.ldif
|   |-- collective.schema
|   |-- corba.ldif
|   |-- corba.schema
|   |-- core.ldif
|   |-- core.schema
|   |-- cosine.ldif
|   |-- cosine.schema
|   |-- duaconf.ldif
|   |-- duaconf.schema
|   |-- dyngroup.ldif
|   |-- dyngroup.schema
|   |-- inetorgperson.ldif
|   |-- inetorgperson.schema
|   |-- java.ldif
|   |-- java.schema
|   |-- misc.ldif
|   |-- misc.schema
|   |-- nis.ldif
|   |-- nis.schema
|   |-- openldap.ldif
|   |-- openldap.schema
|   |-- pmi.ldif
|   |-- pmi.schema
|   |-- ppolicy.ldif
|   `-- ppolicy.schema
`-- slapd.d
    |-- cn=config
    |   |-- cn=schema
    |   |   `-- cn={0}core.ldif
    |   |-- cn=schema.ldif
    |   |-- olcDatabase={-1}frontend.ldif
    |   |-- olcDatabase={0}config.ldif
    |   |-- olcDatabase={1}monitor.ldif
    |   `-- olcDatabase={2}hdb.ldif
`-- cn=config.ldif

6.8.2.配置文件

  • cn=config.ldif
    默认配置文件,位于/etc/openldap/slapd.d, 文件格式为LDAP Input Format (LDIF), ldap目录特定的格式。
[root@server1 slapd.d]# cat cn\=config.ldif 

# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 f4e5fb69
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/openldap/slapd.args
olcPidFile: /var/run/openldap/slapd.pid
olcTLSCACertificatePath: /etc/openldap/certs
olcTLSCertificateFile: "OpenLDAP Server"
olcTLSCertificateKeyFile: /etc/openldap/certs/password
structuralObjectClass: olcGlobal
entryUUID: 7a881be8-c871-103c-9de8-ebde12c700c8
creatorsName: cn=config
createTimestamp: 20220914120659Z
entryCSN: 20220914120659.023874Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20220914120659Z
  • olcDatabase={2}hdb.ldif
    db存储格式,有bdb和hdb两种,这里是hdb. 可以直接查看文件,也可以查询:
    ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config dn | grep olcDatabase

  • 核心配置文件
    位于/etc/openldap/slapd.d/cn=config, 可以配置域名(olcSuffix), 管理员账号(olcRootDN)等。

# cat olcDatabase\=\{2\}hdb.ldif 

# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 87e8e007
dn: olcDatabase={2}hdb
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=my-domain,dc=com
olcRootDN: cn=Manager,dc=my-domain,dc=com
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
structuralObjectClass: olcHdbConfig
entryUUID: 7a8864cc-c871-103c-9dee-ebde12c700c8
creatorsName: cn=config
createTimestamp: 20220914120659Z
entryCSN: 20220914120659.025803Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20220914120659Z

6.9.LDFI文件格式

6.9.1.LDIF 用途

LDIF(LDAP Data Interchanged Format)的轻量级目录访问协议数据交换格式的简称,是存储LDAP 配置信息及目录内容的标准文本文件格式,之所以使用文本文件来存储这些信息是为了方便读取和修改,这也是其他大多数服务配置文件所采取的格式。通常用来交换数据并在OpenLDAP服务器之间互相交换数据,并且可以通过LDIF 实现数据文件的导入、导出以及数据文件的添加、修改、重命名等操作,这些信息需要按照LDAP 中schema 的规范进行操作,并会接受schema 的检查,如果不符合OpenLDAP schema 规范要求,则会提示相关语法错误。

6.9.2.LDIF 文件特点

  1. LDIF 文件每行的结尾不允许有空格或者制表符。
  2. LDIF 文件允许相关属性可以重复赋值并使用。
  3. LDIF 文件以.ldif 结尾命名。
  4. LDIF 文件中以#号开头的一行为注释,可以作为解释使用。
  5. LDIF 文件所有的赋值方式为:属性:[空格]属性值。
  6. LDIF 文件通过空行来定义一个条目,空格前为一个条目,空格后为另一个条目的开始。

6.9.3.LDIF 格式语法

LDIF 文件存取OpenLDAP 条目标准格式:

注释,用于对条目进行解释

  • dn:条目名称
  • objectClass(对象类): 属性值
  • objectClass(对象类): 属性值 ……

LDIF 格式样例如下:
dn: uid=water,ou=people,dc=linux,dc=com #DN 描述项,在整个目录树上为唯一的
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
objectClass: person
objectClass: inetOrgPerson
objectClass: hostObject
sn: Test
cn: Testcn
telephoneNumber:xxxxxxxxxxx
mail: xxxx@126.com

注:冒号后面有一个空格,然后才是属性的值,schema 规范定义要求很严格。

6.10.开启日志

6.10.1.确认否开启日志记录功能

less /etc/openldap/slapd.d/cn=config.ldif

如果存在olcLogLevel:配置项的话,则已开启日志功能
olcLogLevel: Stats

如果未开启日志配置,执行如下指令,开启日志设置
cd /etc/openldap
vim log_config.ldif

编辑log_config.ldif文件,添加如下内容,保存退出,使用ldapmodify进行动态修改openldap服务配置:
dn: cn=config
changetype: modify
add: olcLogLevel

stats为打印日志的级别,可根据不同的级别设置不同的值
olcLogLevel: stats

推荐使用ldapmodify指令修改openldap的配置,而无须重启openldap服务,因此执行如下指令将需要修改的配置内容同步到cn=config.ldif配置文件中去。

ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f log_config.ldif
openldap日志级别一览表:
在这里插入图片描述

6.10.2.配置rsyslog

修改/etc/rsyslog.conf配置文件,添加如下内容:

cat >> /etc/rsyslog.conf << EOF
local4.*  /var/log/slapd/slapd.log
EOF

创建目录:

mkdir -p /var/log/slapd
chown ldap.ldap /var/log/slapd/

然后重启rsyslog应用:

systemctl restart rsyslog
systemctl restart slapd   

重启看到日志 ls /var/log/slapd/
然后再目录/var/log/slapd/slapd.log目录下就可以看到slapd产生的日志了。

6.11.启用memberof功能

[root@server ~]# vim add_memberof.ldif
dn: cn=module{0},cn=config
cn: modulle{0}
objectClass: olcModuleList
objectClass: top
olcModuleload: memberof.la
olcModulePath: /usr/lib64/openldap

dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfUniqueNames
olcMemberOfMemberAD: uniqueMember
olcMemberOfMemberOfAD: memberOf

[root@server ~]# vim refint1.ldif
dn: cn=module{0},cn=config
changetype: modify
add: olcmoduleload
olcmoduleload: refint

[root@server ~]# vim refint2.ldif
dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
objectClass: top
olcOverlay: refint
olcRefintAttribute: memberof uniqueMember manager owner
# 执行配置文件修改。
[root@server ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f add_memberof.ldif
[root@server ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f refint1.ldif
[root@server ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f refint2.ldif

原文地址:https://blog.csdn.net/qq_40477248/article/details/143757981

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!