头图

1、OpenLDAP概述

OpenLDAP是一款轻量级目录访问协议(Lightweight Directtory Access Protocol,LDAP),属于开源集中账号管理架构的实现,且支持众多系统版本,被很多互联网公司所采用。LDAP具有两个国家的标准,分别是X.500和LDAP。OpenLDAP是基于X.500标准的,而且去除了X.500复杂的功能并且可以根据自我需求定制额外扩展的功能,但是与X.500也有不同之处,例如OpenLDAP支持TCP/IP协议等。

1.1、OpenLDAP的后端数据库

OpenLDAP提供并实现目录服务的信息服务,目录服务是一种特殊的数据库系统,对于数据的读取、浏览、搜索有很好的效果,一般用来包含基于属性的描述性信息并支持复杂精细复杂的过滤功能,但OpenLDAP目录服务不支持通用数据库的大量更新操作所需要的复杂的事务管理或回滚策略等。
随着OpenLDAP的版本的迭代,先后使用了BDB(Berkeley Database)、HDB(Hierarchical Database)、MDB(Memory-Mapped Database)作为后端数据库。
BDB:DBD是OpenLDAP中较早使用的一种数据库引擎,是基于Berkeley DB库实现,是一种高性能、事务性的嵌入式数据库。数据存储在多个以".db"结尾的文件中,具有良好的读写性能,适用于大多数场景,但是其配置项较多且需要手动优化配置。随着时间的推移数据量逐渐增大,可能会出现数据库崩溃的或损坏的情况,需要定期维护。
HDB:HDB是BDB的一种改进版,增强了对层次结构的支持,更适合LDAP数据的存储,同时支持索引,尤其是涉及到子树搜索的操作。
MDB:是OpenLDAP 2.4版本中引入的一种新的数据库引擎,它是基于LMDB(lightnong Memory-Mapped Database)实现的,LMDB是一个轻量级的、事务性的、嵌入式键值存储的数据库引擎。具有极高的读写性能,在数据读取方面几乎不需要锁操作且数据写入时也只需要对单个页面进行加锁;与BDB和HDB不同,MDB几乎不需要手动维护和优化,且MDB的数据存储在单一的文件中,使用内存映射文件的方式存储数据,直接在虚拟内存中映射磁盘文件,从而极大的减少了内存拷贝操作。MDB使用了精细化的内存管理 ,因此MDB对内存的使用非常高效。

1.2、OpenLDAP的功能

在LDAP的功能模型中定义了一些列利用LDAP协议的操作,主要包含以下4部分。
查询操作(ldapsearch):允许查询目录并取得条目,其查询性能比关系数据库好。
更新操作(ldapmodify):目录数条目支持条目的添加、删除、修改等操作;
同步操作:OpenLDAP是一种典型的分布式结构,提供复制同步,可将主服务器上的数据通过推或拉的机制实现在从服务器上更新,完成数据的同步,从而避免了OpenLDAP服务器出现单点故障,影响用户验证。
认证和管理操作:允许客户端在目录中识别自己,并且能够控制一个会话的性质。

1.3、OpenLDAP的适用场景

OpenLDAP账号管理软件适用于所有不同发行版的UNIX系统、Windows系统以及各种应用平台的用户管理,如Apache、Nginx、Zabbix、FTP、Hadoop、OpenStack以及存储设备控制台等。OpenLDAP适用于一台及以上机器的系统的账号集中式统一管理。
OpenLDAP支持的大多数的操作系统平台,如Red Hat、CentOS、FreeBSD、Debian、Mac OS 、Ubuntu、Windows、Fedora等。

1.4、OpenLDAP目录架构

目前OpenLDAP目录架构分为两种:一种为互联网命名组织结构;另一种为企业级命名组织架构。
基于互联网的命名组织架构
image.png
基于企业级命名组织架构
image.png
OpenLDAP的目录信息以树形结构进行存储的,在数根一般定义为国家(c=CN)或域名(dc=com),其次定义一般是一个或多个组织(organization,o)或组织单元(organization unit,ou)。一个组织单元可以包含员工、设备信息等相关信息,例如:uid=bas,ou=People,dc=datac,dc=com

1.5、OpenLDAP中的Schema、objectClass和属性

scheme是OpenLDAP的重要组成部分,主要用于控制目录树中各种条目所拥有的对象类及各种属性的定义,并通过自身内部规范机制限定目录树条目所遵循的裸机结构以及定义规范,保证整个目录树没有非法条目数据,避免不合法的条目存在于目录树中,从而保障整个目录树信息的完整性和唯一性。
在OpenLDAP目录树中,schema用来指定一个条目所包含的对象类(objectClass)以及每一个对象所包含的属性值(attribute value)。其属性又分为必要属性和可选属性两种,一般必要属性是指添加条目时必须指定的属性,可选属性是可以选择或不选择的。schema定义对象类,对象类包含属性的定义,对象类和属性组合成条目。OpenLDAP中的对象可以类比MySQL数据库中的数据表,只不过MySQL中数据表中的字段是用户的自己定义的,OpenLDAP中的对象是由各个系统或操作系统进行定义的,用户也可自定义。OpenLDAP中的属性和MySQL中数据表中定义的字段类似,字段值可以为空或不为空,以及字段的类型,如字符串类型、数值类型。

2、OpenLDAP的部署

在Linux操作系统环境下安装OpenLDAP的方式一般有两种:源码编译安装 和 rpm软件包进行安装(yum安装,支持的最高版本为2.4.44)。以下安装以OpenLDAP 2.5.12版本为例。

2.1、源码编译安装

OpenLDAP依赖于Openssl 1.1.1版本,在安装OpenLDAP之前先进行安装openssl。

# 查看现有版本的openssl
openssl version
# 删除旧版本的openssl
yum remove openssl 
# 下载openssl的源码包
wget https://openssl.org/source/old/1.1.1/openssl-1.1.1g.tar.gz
# 解压文件
tar -zxvf openssl-1.1.1g.tar.gz
# 安装编译源码依赖 gcc
yum install -y gcc
# 开始编译 cd openssl-1.1.1g   并安装
./config shared --openssldir=/usr/local/openssl --prefix=/usr/local/openssl && make && make install
# 配置openssl
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
ldconfig
cp /usr/local/openssl/bin/openssl /usr/bin/openssl
# 测试
openssl version

安装OpenLDAP

# 下载OpenLDAP的源码包 cd /opt/soft
wget https://mirror-hk.koddos.net/OpenLDAP/openldap-release/openldap-2.5.12.tgz
# 解压文件
tar -zxvf openldap-2.5.12.tgz
# 安装源码编译需要的依赖
yum install -y libtool-ltdl-devel gcc  libtool-ltdl
# 进入到OpenLDAP的目录中
cd openldap-2.5.12 
# 开始进行编译
./configure --prefix=/opt/openldap --enable-syslog --enable-modules --enable-debug --with-tls && \
make depend && \
make && \
make install

至此源码编译安装完成:
image.png
如果需要使用完整的功能,安装完成后,许在OpenLDAP中配置相应的证书,才可以的使用完整的功能。

2.2、yum方式安装

主要注意的是,在使用yum安装OpenLDAP时,支持的最新版本是2.4.44,后端使用的数据库为HDB。

# 通过yum安装openLdap
yum -y install openldap openldap-servers openldap-clients openldap-devel compat-openldap

2.3、OpenLDAP的配置文件

在OpenLDAP中,有两种配置文件,分别为slapd.conf和slapd.ldif,两种配置文件均可以完成OpenLDAP的配置,其中slapd.conf配置文件被称为静态配置文件,之所被称为静态配置文件是因为不用修改完成之后,可以直接根据此配置文件的配置项进行启动slapd服务。同时也可以根据slapd.conf配置文件使用slapadd命令创建对应的数据库,再根据数据库的中的配置启动slapd服务。而动态配置文件slapd.ldif必须先使用slapadd命令创建对应的数据库,再根据数据库的中的配置启动slapd服务。用户也可以 使用slapadd命令创建对应的数据库后,在修改的数据库配置信息,然后再进行启动slapd服务。
配置文件的信息,使用源码编译安装OpenLDAP的配置文件的配置位于OpenLDAP安装目录的/etc/openldap目录下,目录下信息如下:
image.png
ldap.conf:客户端的配置文件,用于配置OpenLDAP客户端工具的默认行为;如:配置默认的OpenLDAP服务器地址、baseDN、绑定DN、TLS/SSL配置信息等;
slapd.conf:OpenLDAP服务端的传统配置文件,用于配置LDAP目录服务器的各种参数,该文件包含数据库类型、数据存储路径、访问控制列表、索引配置等。
slapd.ldif:新版本的配置文件,也可以用于传统配置的场景;新的 OpenLDAP 版本中,slapd.ldif是推荐使用的配置方式,取代了传统的 slapd.conf。配置可以在运行时通过 LDAP 操作直接修改,增强了灵活性和动态性;
schema:是一个目录,目录中存放了OpenLDAP中默认支持的schema信息,及objectClass的定义;
slapd 配置存储为具有预定义架构和 DIT 的特殊 LDAP 目录。有特定的 objectClasses 用于承载全局配置选项、架构定义、后端和数据库定义以及其他各种项目,下图 显示了示例配置树:
image.png
以下说明三种修改配置的方式:
1、通过修改配置文件slapd.conf
slapd.conf配置文件中注释内容较多,删除注释的的配置内动如下:

# 指定导入的schema
include     /opt/openldap/etc/openldap/schema/core.schema
# slapd服务启动后,对应pid和启动参数的保存位置
pidfile     /opt/openldap/var/run/slapd.pid
argsfile    /opt/openldap/var/run/slapd.args
# 全局配置的条目名称
database config
# 数据库的类型
database    mdb
maxsize     1073741824
# 数据的前缀
suffix      "dc=datac,dc=com"
# 根据域
rootdn      "cn=Manager,dc=datac,dc=com"
# 访问时使用的密码
rootpw      {SSHA}6PLbMjtbQS+MgIgaUR7UgAWUUx+cyXqo
# 数据目录
directory   /opt/openldap/var/openldap-data
# 索引匹配的方式 eq
index   objectClass eq
# 监控 数据库
database monitor

在上述配置文件中通常修改的配置项只有三个,分别是数据条目的前缀(suffix),根域(rootdn)和密码(rootpw),其中密码的获取可以通过OpenLDAP的提供的命令进行加密,如下:

[root@cpe-172-88-1-61 sbin]# ./slappasswd --help
./slappasswd: invalid option -- '-'
Usage: slappasswd [options]
  -c format crypt(3) salt format
  -g        generate random password
  -h hash   password scheme
  -n        omit trailing newline
  -o <opt>[=val] specify an option with a(n optional) value
    module-path=<pathspec>
    module-load=<filename>
  -s secret new password
  -u        generate RFC2307 values (default)
  -v        increase verbosity
  -T file   read file for new password
  
# 执行命令 返回加密后的密码
[root@cpe-172-88-1-61 sbin]# ./slappasswd -s 123456
{SSHA}tpy3AeAQr9EekkIIXThlHdzX/Gqp0hSC

2、通过修改配置文件slapd.ldif
slapd.ldif的配置文件删除注释信息后,如下所示:

# 全局信息配置
dn: cn=config
objectClass: olcGlobal
cn: config
# slapd服务启动后,对应pid和启动参数的保存位置
olcArgsFile: /opt/openldap/var/run/slapd.args
olcPidFile: /opt/openldap/var/run/slapd.pid
​
# schema的信息配置
dn: cn=schema,cn=config
objectClass: olcSchemaConfig
cn: schema
​
include: file:///opt/openldap/etc/openldap/schema/core.ldif
​
# 配置前端数据库,是一个特殊的数据库,主要用于处理全局配置选项和默认行为,这些选项适用于其他所有的数据库
dn: olcDatabase=frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: frontend
​
# 数据库信息配置
dn: olcDatabase=mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: mdb
olcDbMaxSize: 1073741824
olcSuffix: dc=my-domain,dc=com
olcRootDN: cn=Manager,dc=my-domain,dc=com
olcRootPW: secret
# 指定数据库的数据库文件的位置
olcDbDirectory: /opt/openldap/var/openldap-data
olcDbIndex: objectClass eq
​
# monitor数据库用于监控 OpenLDAP 服务器的状态和性能,以下为禁用监控功能
dn: olcDatabase=monitor,cn=config
objectClass: olcDatabaseConfig
olcDatabase: monitor
olcRootDN: cn=config
olcMonitoring: FALSE

在上述配置文件中通常修改的配置项只有三个,分别是数据条目的前缀(olcSuffix),根域(olcRootDN)和密码(olcRootPW),其中密码的获取可以通过OpenLDAP的提供的命令进行加密(slappasswd -s 密码)。
3、修改slapadd命令创建对应的数据库后的配置文件
使用yum方式安装时,就是通过这种方式进行修改配置的,通过下命令根据配置文件的内容创建数据库:

# 根据配置文件slapd.ldif 创建数据库
slapadd -n 0 -F /opt/openldap/slapd.d -l /opt/openldap/etc/openldap/slapd.ldif
# 根据配置文件slapd.conf 创建数据库
slapadd -n 0 -F /opt/openldap/slapd.d -l /opt/openldap/etc/openldap/slapd.conf
# 注意:以上两种创建数据库的方式均可以使用,需要注意,要提前创建目录/opt/openldap/slapd.d

对应的数据库文件在目录/opt/openldap/slapd.d/cn=config目录下,内容信息如下:

[root@cpe-172-88-1-61 cn=config]# ll
总用量 20
drwxr-x---. 2 root root  29 8月  18 17:26 cn=schema
-rw-------. 1 root root 378 8月  18 17:26 cn=schema.ldif
-rw-------. 1 root root 603 8月  18 17:26 olcDatabase={0}config.ldif
-rw-------. 1 root root 443 8月  18 17:26 olcDatabase={-1}frontend.ldif
-rw-------. 1 root root 651 8月  18 17:28 olcDatabase={1}mdb.ldif
-rw-------. 1 root root 450 8月  18 17:26 olcDatabase={2}monitor.ldif

查看olcDatabase={1}mdb.ldif配置文件内容信息如下:

# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 dd4b87bb
dn: olcDatabase={1}mdb
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {1}mdb
olcDbDirectory: /opt/openldap/var/openldap-data
olcSuffix: dc=datac,dc=com
olcRootDN: cn=Manager,dc=datac,dc=com
olcRootPW:: e1NTSEF9YjZ5MU9rYWxYN1lUQWkwenhFNDMzT1UxVFpsdTQzeHU=
olcDbIndex: objectClass eq
olcDbMaxSize: 1073741824
structuralObjectClass: olcMdbConfig
entryUUID: b4e240f4-f18f-103e-884a-d39e20e7d7c4
creatorsName: cn=config
createTimestamp: 20240818092634Z
entryCSN: 20240818092634.840463Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20240818092634Z

以上信息是根据配置文件slapd.ldif 或slapd.conf中定义的内容创建的信息,启动olcRootPW配置是配置文件中密码进行了base64编码之后的值。用户也可以修改此配置。

2.4、OpenLDAP的主服务slapd的启动

1、创建数据库

# 如果次已经已经执行,或使用yum安装可以忽略此步骤
slapadd -n 0 -F /opt/openldap/slapd.d -l /opt/openldap/etc/openldap/slapd.ldif

2、启动slapd服务(源码编译安装)

/opt/openldap/libexec/slapd -h ldap:/// -F /opt/openldap/slapd.d  -d 1
​
说明: 
    -F :指定配置数据库的位置;
    -d : 设置日志的登录,-1表示启动所有调试 0:表示无需调试 1:表示跟踪函数的调试

3、yum安装的方式的启动

# yum安装方式通常要修改的配置有两个分别为:olcDatabase={1}monitor.ldif 和 olcDatabase={2}hdb.ldif,因为配置文件中包含的olcSuffix
systemctl start slapd

3、OpenLDAP的命令使用

在OpenLDAP提供的命令中,常用的命令有ldapadd、ldapsearch、ldapmodify、ldapdelete四个命令,对应数据的增、查、改、删的功能,下面详细说下这个四个命令及常用的参数:

3.1、ldapadd 添加数据

ldapadd是一个用于将条目添加到LDAP目录中的命令,它通常通过读取一个ldif(LDAP Data Interchange Format)文件来添加条目,以下为ldapadd命令的主要参数:
基本用法如下:
ldapadd [options] [file...]
主要参数详解:
-D <binddn> :用于指定绑定到 LDAP 服务器时使用的 DN(Distinguished Name)。通常是管理员的 DN,如:cn=Manager,dc=datac,dc=com
-W:提示输入绑定用户的密码。此选项会在运行命令时要求你手动输入密码,确保密码不会出现在命令历史记录中
-x:使用简单认证(Simple Authentication),即不使用 SASL。大多数情况下,使用简单认证是足够的。
-w <密码> : 指定绑定用户的密码。这种方式将密码直接包含在命令中,但出于安全考虑不推荐;
-y <passwdfile> :从指定的文件中读取密码,而不是在命令行中输入密码。该文件应只包含密码,无需其他内容
-f:指定包含要添加的条目(LDIF格式)的文件。如果不指定文件,ldapadd 将从标准输入读取数据
-c:继续执行,即使出现错误。默认情况下,ldapadd 遇到错误时会停止执行, -c 选项可以让它忽略错误并继续处理其他条目;
-h <ldaphost>: 指定要连接的 LDAP 服务器的主机名或 IP 地址。默认情况下,ldapadd 连接到 localhost
-p <ldapport>: 指定要连接的 LDAP 服务器的端口号。默认端口为 389,如果使用的是安全的 LDAP 协议(LDAPS),端口通常为 636;
-H <ldapuri>:使用 LDAP URI 形式指定要连接的 LDAP 服务器,比如 ldap://hostname:port/。 与 -h 和 -p 类似,但更灵活
-v:详细模式(Verbose),启用后会打印出更多的操作信息,便于调试
-n : 仿真模式(No-op mode),执行时只显示会进行的操作而不实际添加条目。这对于测试非常有用;
-Q:使用 SASL 的 Quiet 模式。如果使用的是 SASL 认证方式,并且希望避免提示密码的输入,可以使用该选项;
-R <realm> :SASL 选项,指定要使用的认证领域(realm)
-U <authcid>:SASL 选项,指定要使用的认证标识(authentication identity),即用户名;
如下,向OpenLDAP中添加数据条目。创建ldif文件,base.ldif文件,内容如下:

dn: dc=datac,dc=com
o: test com
dc: datac
objectClass: top
objectClass: dcObject
objectClass: organization
​
dn: cn=root,dc=datac,dc=com
cn: root
objectClass: organizationalRole
description: Directory Manager
​
dn: ou=People,dc=datac,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit
​
dn: ou=Group,dc=datac,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit

执行添加:

[root@localhost opt]# ldapadd -x -W -D "cn=Manager,dc=datac,dc=com" -f /root/base.ldif
Enter LDAP Password: 
adding new entry "dc=datac,dc=com"
​
adding new entry "cn=root,dc=datac,dc=com"
​
adding new entry "ou=People,dc=datac,dc=com"
​
adding new entry "ou=Group,dc=datac,dc=com"
​

3.2、ldapsearch 数据查询

ldapsearch是一个用于在 LDAP 目录中执行搜索操作的命令行工具。它能够根据指定的过滤条件和属性在 LDAP 目录中查找和检索条目。以下是 ldapsearch 命令的主要参数及其详细说明:
基本语法:

ldapsearch [options] [filter] [attributes...]

主要参数说明:
-b <searchbase> :指定搜索的起始点(Base DN)。这是目录树中开始搜索的节点,通常是根节点或某个子节点,如dc=datac,dc=com
-D <binddn>:指定绑定到 LDAP 服务器时使用的 DN(Distinguished Name),用于认证。例如:-D "cn=Manager,dc=datac,dc=com"
-W :提示输入绑定用户的密码。此选项会在运行命令时要求你手动输入密码;
-x: 使用简单认证(Simple Authentication),即不使用 SASL。大多数情况下,使用简单认证是足够的
-w <passwd> :指定绑定用户的密码。这种方式将密码直接包含在命令中,但出于安全考虑不推荐,因为密码可能会被记录在命令历史记录中。
-y <passwdfile> :从指定的文件中读取密码,而不是在命令行中输入密码。该文件应只包含密码,无需其他内容
-f <file>:从文件中读取搜索过滤器,而不是在命令行中指定。这对于较复杂的过滤器特别有用;
-c :继续执行,即使出现错误。默认情况下,ldapadd 遇到错误时会停止执行,但使用 -c 选项可以让它忽略错误并继续处理其他条目;
-h <ldaphost> :指定要连接的 LDAP 服务器的主机名或 IP 地址。默认情况下,ldapadd 连接到 localhost;
-p <ldapport> :指定要连接的 LDAP 服务器的端口号。默认端口为 389,如果使用的是安全的 LDAP 协议(LDAPS),端口通常为 636;
-H <ldapuri>:使用 LDAP URI 形式指定要连接的 LDAP 服务器,比如 ldap://hostname:port/。这个选项与 -h 和 -p 类似,但更灵活;
-n:仿真模式(No-op mode),只显示将要执行的搜索操作而不实际执行。这对于测试和调试很有用;
-l <timelimit>:设置搜索操作的时间限制(秒)。如果在指定时间内搜索未完成,将中止操作;
-z <sizelimit>:设置搜索返回的最大条目数。如果达到该限制,将中止操作
-o <option>=<value>:设置额外的 LDAP 选项,例如:-o ldif-wrap=no 可以禁用 LDIF 行包装
-E <extension>:使用 LDAP 控制或扩展,例如分页搜索
-LLL:以 LDIF 格式显示输出,但不包括 LDIF 标头信息(如版本号和注释),并去除所有换行符,适合直接处理输出;
-tt : 将二进制属性值输出到临时文件中,而不是直接显示在终端
如下是ldapsearch的查询示例:

ldapsearch -x -b "dc=datac,dc=com" -H ldap://127.0.0.1
# 结果信息如下:
# extended LDIF
#
# LDAPv3
# base <dc=datac,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
​
# datac.com
dn: dc=datac,dc=com
o: test com
dc: datac
objectClass: top
objectClass: dcObject
objectClass: organization
​
# root, datac.com
dn: cn=root,dc=datac,dc=com
cn: root
objectClass: organizationalRole
description: Directory Manager
​
# People, datac.com
dn: ou=People,dc=datac,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit
​
# Group, datac.com
dn: ou=Group,dc=datac,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit
​
# search result
search: 2
result: 0 Success
​
# numResponses: 5
# numEntries: 4

3.3、ldapmodify 修改数据

ldapmodify 是一个用于修改 LDAP 目录中现有条目的命令行工具。它允许添加、删除和替换条目的属性或属性值。以下是 ldapmodify 命令的主要参数及其详细说明:
基本用法:
ldapmodify [options]
参数说明:
-b <searchbase>: 指定修改操作的起始点(Base DN),类似于 ldapsearch。
-D <binddn>: 指定绑定到 LDAP 服务器时使用的 DN,用于认证。例如:-D "cn=Manager,dc=datac,dc=com"。
-W : 提示输入绑定用户的密码。此选项确保密码不会出现在命令历史记录中。
-w <passwd>: 指定绑定用户的密码。不推荐使用此选项,因为密码会出现在命令历史记录中。
-y <passwdfile>: 从指定的文件中读取密码,而不是在命令行中输入密码。这个文件应该只包含密码。
-x: 使用简单认证(Simple Authentication),即不使用 SASL。
-H <ldapuri> : 使用 LDAP URI 形式指定要连接的 LDAP 服务器,例如:ldap://localhost:389/。这个选项比 -h 和 -p 更灵活。
-h <ldaphost>: 指定要连接的 LDAP 服务器的主机名或 IP 地址,默认是 localhost。
-p <ldapport>: 指定要连接的 LDAP 服务器的端口号,默认是 389。
-v: 详细模式(Verbose),启用后会打印出更多的操作信息,便于调试。
-c: 继续执行,即使出现错误。默认情况下,ldapmodify 遇到错误时会停止执行,但使用 -c 选项可以忽略错误并继续。
-n: 仿真模式(No-op mode),只显示将要执行的修改操作而不实际执行。这对于测试和调试很有用。
-f <file>: 指定包含 LDIF 数据的文件,并从该文件读取要执行的修改操作。
-l <timelimit>: 设置修改操作的时间限制(秒)。如果在指定时间内操作未完成,将中止操作。
-o <option>=<value>: 设置额外的 LDAP 选项,例如:-o ldif-wrap=no 可以禁用 LDIF 行包装。
使用ldapmodify命令修改数据时,通常是通过ldif文件进行修改的,常见的ldif操作格式有以下几种:
添加属性

dn: uid=johndoe,dc=datac,dc=com
changetype: modify
add: mail
mail: johndoe@datac.com

删除属性

dn: uid=johndoe,dc=datac,dc=com
changetype: modify
delete: description

替换属性

dn: uid=johndoe,dc=datac,dc=com
changetype: modify
replace: mail
mail: john.new@datac.com

重命名条目

dn: uid=johndoe,dc=datac,dc=com
changetype: modrdn
newrdn: uid=johnd
deleteoldrdn: 1

删除条目

dn: uid=johnd,dc=datac,dc=com
changetype: delete

操作示例:
创建文件add_it.ldif,添加一条数据ou=IT,然后在创建文件modify_it.ldif,对ou=IT这条数据,添加描述信息;

# add_it.ldif 内容如下:
dn: ou=IT,dc=datac,dc=com
ou: IT
objectClass: top
objectClass: organizationalUnit
​
# 执行添加命令:
ldapadd -x -W -D "cn=Manager,dc=datac,dc=com" -f /root/add_it.ldif

创建modify_it.ldif文件,修改为it这条数据添加描述信息

modify_it.ldif文件 ,内容如下:
​
dn: ou=IT,dc=datac,dc=com
changetype: modify
add: description
description: IT Department
​
# 执行命令
ldapmodify -x -W -D "cn=Manager,dc=datac,dc=com" -f /root/modify_it.ldif

3.4、ldapdelete 删除数据

ldapdelete 是一个用于删除 LDAP 目录中条目的命令行工具。它通过指定条目的 DN来删除该条目。如果需要,还可以递归地删除条目的子条目。
基本语法:
ldapdelete [options] [dn]...
常用的参数:
-D <binddn>:指定绑定到 LDAP 服务器时使用的 DN(Distinguished Name),用于认证。例如:-D "cn=Manager,dc=datac,dc=com"。
-w <passwd>:指定绑定用户的密码。不推荐使用此选项,因为密码会出现在命令历史记录中。
-W:提示输入绑定用户的密码。此选项确保密码不会出现在命令历史记录中。
-y <passwdfile>:从指定的文件中读取密码,而不是在命令行中输入密码。这个文件应该只包含密码。
-x:使用简单认证(Simple Authentication),即不使用 SASL。
-H <ldapuri>:使用 LDAP URI 形式指定要连接的 LDAP 服务器,例如:ldap://localhost:389/。这个选项比 -h 和 -p 更灵活。
-h <ldaphost>:指定要连接的 LDAP 服务器的主机名或 IP 地址,默认是 localhost。
-p <ldapport>:指定要连接的 LDAP 服务器的端口号,默认是 389。
-c:继续执行,即使出现错误。默认情况下,ldapdelete 遇到错误时会停止执行,但使用 -c 选项可以忽略错误并继续。
-v:详细模式(Verbose),启用后会打印出更多的操作信息,便于调试。
-r:递归删除条目。即删除指定条目及其所有子条目。注意,这个操作不可逆,需要小心使用。
-n:仿真模式(No-op mode),只显示将要执行的删除操作而不实际执行。这对于测试和调试很有用。
-f <file>:指定一个文件,该文件包含要删除的 DN 列表。文件中的每一行应包含一个 DN。
删除数据有两种方式,一种是通过文件,一种是通过dn

创建删除数据的文件:delete_it.ldif
​
dn: ou=IT,dc=datac,dc=com
changetype: delete
# 执行删除命令
ldapdelete -x -W -D "cn=Manager,dc=datac,dc=com" -f /root/delete_it.ldif
​
# 通过dn直接进行删除
ldapdelete -x -W -D "cn=Manager,dc=datac,dc=com" "ou=IT,dc=datac,dc=com"

4、OpenLDAP的数据同步

在2.4之前的版本中,复制是根据主服务器和一定数量的从服务器之间进行的。主服务器接受来自其他客户端的目录更新请求,从服务器只接受主服务器的更新请求。任何特定的主数据库只能充当一个角色,无论是主数据库还是从数据库。在OpenLDAP的2.4版本中引入了多主服务器的模式。
由于OpenLDAP现在支持多种数据同步模式,传统的主/从术语已经被弃用,取而代之的是提供者/多提供者和消费者模型。提供者是可以接受外部写入操作并将其更新提供给消费者的服务器。消费者则从提供者那里请求和接收复制更新。与固定的主/从关系不同,提供者/消费者模型具有很大的灵活性:消费者接收到的复制更新可以进一步传播给其他服务器,使得消费者也可以同时担任提供者的角色。此外,消费者不一定必须是一个实际的 LDAP 服务器;它可以是任何请求复制更新的 LDAP 客户端。接下来介绍一下OpenLDAP的五种数据同步模式。

4.1、Syncrepl模式

syncrepl 模式可以将其理解为主-从(master-slave)模式,syncrepl 为Sync Replication的缩写,是一个消费者端复制引擎,它使消费者LDAP服务器能够维护DIT片段的卷影副本。syncrepl通常运行在消费者处,并作为slapd(8)线程之一执行。它通过连接到复制提供程序来创建和维护副本,以执行初始DIT内容加载,然后进行定期内容轮询或在内容更改时及时更新。
Syncrepl 使用 LDAP 内容同步协议(简称 LDAP Sync)作为消费者同步协议。LDAP Sync 提供状态复制,支持基于拉取和基于推送的同步,并且不强制使用历史记录存储。在基于拉取的复制中,消费者会定期轮询提供者以获取更新。在基于推送的复制中,消费者会实时监听提供者发送的更新。由于该协议不需要历史记录存储,因此提供者不需要维护它收到的任何更新日志。
syncrepl 引擎利用LDAP 同步协议的refreshOnly和refreshAndPersist操作。如果数据库定义中包含 syncrepl 规范,slapd (8) 将启动 syncrepl 引擎作为slapd (8) 线程并安排其执行。如果指定了refreshOnly操作,syncrepl 引擎将在同步操作完成后的间隔时间重新安排。如果指定了refreshAndPersist操作,引擎将保持活动状态并处理来自提供程序的持久同步消息。需要注意的是,该模式下如果提供者中某一个对象的属性发生了变更,消费者端会同步更新整个对象,而不是仅仅更新变更的属性值。
这种方式的优点是,当单个对象中的多个属性值发生改变时,不用关心属性的变更属性。但是涉及到多个对象的单次属性变更时,这种方式就可能会存在问题。官方给出了一个假设:假设您的数据库包含 102,400 个对象,每个对象大小为 1 KB。此外,假设您定期运行批处理作业来更改提供程序上 102,400 个对象中出现的单个两字节属性值。不计算 LDAP 和 TCP/IP 协议开销,每次运行此作业时,每个使用者将传输和处理100 MB数据以处理200KB 的更改!
在这种情况下,传输和处理的数据中有 99.98% 是冗余的,因为它们表示未发生改变的值。这浪费了宝贵的传输和处理带宽,并且可能导致不可接受的复制积压。虽然这种情况很极端,但它可以说明在某些 LDAP 部署中遇到的一个非常现实的问题。
因此,为了解决或避免这种问题的发生,官方又陆续提供了以下四种替换方案。

4.2、N-Way Multi-Master模式

N-Way Multi-Master模式(多提供者)主要用于多台主服务之间进行LDAP目录树信息的同步,更好的提供了服务的冗余性;多提供者复制是一种使用 Syncrepl 将数据复制到多个提供者目录服务器的复制技术。多提供者模式的优点:
可以有效的避免单点故障;
任意一个提供者发生故障,都不会影响整个集群的正常运行,其他服务提供者可以正常提供服务;
提供者可以位于多个物理站点,即分布在整个网络/全球
适用于自动故障转移/高可用性,但是多提供模式目前依然存在争议,争议点主要为以下几点:
破坏目录模型的数据一致性保证。(讨论的站点:https://www.openldap.org/faq/data/cache/1240.html
如果网络分区导致于提供者的连接中断,则自动故障转移只会使问题更加严重;
通常特定的计算机无法区分与对等点失去联系是因为对等点崩溃还是因为网络连接故障。
如果出现网络分区,并且多个客户端开始向每个服务提供者写入数据,那么协调将会变得非常复杂,最好的办法应该是拒绝写入。

4.3、MirrorMode模式

镜像模式是一种混合配置即互为主备,它提供单提供者复制的所有一致性保证,同时还提供多提供者的高可用性。在镜像模式下,两个提供者设置为相互复制(作为多提供者配置),但使用时需要外部负载均衡器将所有写入请求定向到两个服务器中的其中一个。如果第一个提供者崩溃,则第二个提供者将仅用于写入,此时需要外部负载均衡器将切换到将所有写入定向到第二个提供者。当崩溃的提供者修复并重新启动时,它将自动追上正在运行的提供者上的任何更改并重新同步。
镜像复制模式的优点:
为目录写入提供高可用性解决方案;
只要有一个提供者存活就可以安全地接受客户端写数据的请求;
服务提供者相互复制,保证了数据始终是最新状态,并且可以随时提供对外提供服务;
Syncrepl 还允许提供者节点在任何时候停机后数据重新同步;
镜像复制模式的缺点:
镜像复制模式并不是所谓的多提供者解决方案,这是因为写入一次只能发送到了一个镜像节点上;
镜像复制迷失可以称为主-主模式的热备份,因此需要外部服务器(代理模式下slapd)或负载均衡器来管理哪一个服务提供者当前是出于或者状态;
备份的管理略有不同(官方未给出明确的解释);

4.4、Syncrepl Proxy模式

该同步模式属于代理同步,它将主服务隐藏起来,而代理主机上通过syncrepl从服务器上以拉的方式同步目录树数据,当代理主机数据发生变化时,代理服务器又以推的方式将数据更新到下属的从LDAP服务器上,且从LDAP服务只又对代理LDAP服务有读权限。

4.5、Delta-syncrepl模式

Delta-syncrepl是一种基于变更日志的Syncrepl变体,其工作原理 在提供程序上的单独数据库中维护可选深度的变更日志。复制消费者会检查变更日志以查找所需的更改,只要变更日志包含所需的更改,消费者就会从变更日志中获取更改并将其应用于其数据库。但是,如果消费者的同步程度太低(或完全为空),则使用常规 syncrepl 使其保持最新状态,然后复制将切换回 delta-syncrepl 模式。

5、CyberEngine中的OpenLDAP

5.1、CyberEngine中OpenLDAP的HA

在 CyberEngine 中,OpenLDAP 的高可用性 (HA) 架构是通过 MirrorMode(镜像模式)搭建的。镜像模式是一种多主复制机制,允许两个或多个 OpenLDAP 服务器之间保持数据同步。在这种模式下,每个服务器都可以接受写操作,并通过同步确保数据的一致性。
架构说明:
MirrorMode:在 MirrorMode 下,两个或多个 OpenLDAP 实例彼此作为主服务器,可以相互复制数据。这意味着每个服务器都可以独立处理写入请求,并将更改同步到其他服务器,确保所有实例中的数据一致。这种机制在主服务器发生故障时,另一个主服务器可以无缝接管,从而实现高可用性。
Kubernetes:OpenLDAP 实例作为 Kubernetes 中的 Pod 运行,通过 Kubernetes 的管理能力,能够在节点出现故障时自动重新调度 Pod,确保服务的高可用性。此外,Kubernetes 的 Service 资源用于在多个 OpenLDAP Pod 之间实现负载均衡。这样,客户端请求可以自动分发到多个实例上,避免单点故障。
负载均衡:通过 Kubernetes 的 Service 实现的负载均衡,确保了请求可以均匀地分布到不同的 OpenLDAP 实例上,无论是读操作还是写操作。Kubernetes Service 还提供了虚拟 IP 和 DNS 名称,客户端可以通过这些方式访问 OpenLDAP 服务,而不需要关心具体的 Pod IP 地址。
补充说明:
故障切换:如果一个 OpenLDAP 实例发生故障,由于使用了 MirrorMode,其他实例可以继续处理请求,确保服务不中断。当故障的实例恢复后,它将自动与其他实例同步数据,恢复一致性。
数据同步:在 MirrorMode 模式下,数据同步是实时且双向的,每个实例的更改都会立即复制到其他实例。这种同步机制确保了所有实例始终保持数据的一致性。
扩展性:通过 Kubernetes 进行管理,OpenLDAP 的集群可以根据需求进行扩展,增加更多的实例以应对更大的负载,而不会影响整体架构的高可用性。
这种高可用架构保证了 CyberEngine 中 OpenLDAP 服务的稳定性和可靠性,即使在部分组件发生故障的情况下,系统也能继续提供服务。

5.2、CyberEngine中OpenLDAP、Kerberos、Ranger之间的关系

image.png
在 CyberEngine 中,OpenLDAP 作为 Kerberos 的后端数据库,用于存储在 Kerberos 中创建的账号信息。这些账号信息以数据库条目的形式存储在 OpenLDAP 中,从而为 Kerberos 提供强大的身份验证支持。与此同时,Apache Ranger 中的 ranger-usersync 服务通过定期拉取 OpenLDAP 中特定条目下的用户信息,并将这些信息同步到 Ranger 的用户体系中。这种同步机制确保了 Kerberos 和 Ranger 两个独立的框架中用户信息的一致性,从而在整个系统中实现统一的用户认证与权限管理。

6、参考资料

OpenLDAP的官网:https://www.openldap.org/doc/admin26/index.html
Sun Java System Directory Server Enterprise Edition 6.2 管理指南:https://docs.oracle.com/cd/E19957-01/820-3204/index.html
LINUXUNIX OPENLDAP实战指南
yum安装OpenLDAP:https://blog.csdn.net/weixin_45536587/article/details/120626150


数新网络
1 声望0 粉丝

数新网络,全称浙江数新网络有限公司,2020年7月成立,总部位于杭州,在上海、北京、深圳等各地设有分支机构。 公司创始人陈廷梁(花名:王贲)是原阿里云大数据平台研发总监,阿里云产品委员会与架构组成员,主...


引用和评论

0 条评论