如何配置OpenLDAP和执行管理LDAP任务
介绍
如果您不知道如何配置您的系统或在哪里可以找到您需要的重要信息,那么管理 OpenLDAP 系统可能会很困难。 在本指南中,我们将演示如何查询 OpenLDAP 服务器以获取关键信息以及如何更改正在运行的系统。
先决条件
要开始使用,您应该可以访问安装和配置了 OpenLDAP 的系统。 您可以在此处 了解如何设置 OpenLDAP 服务器 。 您应该熟悉使用 LDAP 目录服务时使用的基本术语。 本指南可用于更熟悉这些主题。
OpenLDAP 在线配置
LDAP 系统将它们存储的数据组织成层次结构,简称为 目录信息树 或 DITs。 从 2.3 版开始,OpenLDAP 服务器的实际配置在一个特殊的 DIT 中进行管理,通常植根于一个名为 cn=config
的条目。
此配置系统称为 OpenLDAP 在线配置,或 OLC。 与过时的配置方法不同,它依赖于在服务启动时读取配置文件,对 OLC 的修改会立即实施,并且通常不需要重新启动服务。
OLC 系统使用标准 LDAP 方法来验证和进行修改。 因此,经验丰富的 LDAP 管理员的管理通常是无缝的,因为他们可以使用与操作数据 DIT 相同的知识、技能和工具。 但是,对于那些刚接触 LDAP 的人来说,可能很难开始,因为您可能需要知道如何使用 LDAP 工具来配置学习环境。
本指南将重点教您基本的 OpenLDAP 管理,以克服这种先有鸡还是先有蛋的情况,以便您可以开始学习 LDAP 并管理您的系统。
访问根 DSE
我们将首先讨论一个称为根 DSE 的结构,它是包含我们服务器的所有单独 DIT 的结构。 这基本上是一个用于管理服务器知道的所有 DIT 的条目。 通过从这个条目开始,我们可以查询服务器以查看它是如何组织的,并找出下一步要去哪里。
DSE 代表什么?
DSE 代表“DSA 特定条目”,它是 LDAP 服务器中的管理或控制条目。 DSA 代表“目录系统代理”,基本上是指实现 LDAP 协议的目录服务器。
要查询根 DSE,我们必须使用空白(空)搜索库和搜索范围“base”执行搜索。 基本搜索范围意味着只返回给定的条目。 通常,这用于限制搜索的深度,但在根 DSE 上操作时,这是必需的(如果选择了任何其他搜索范围,则不会返回任何信息)。
我们需要的命令是这样的:
ldapsearch -H ldap:// -x -s base -b "" -LLL "+"
我们假设您从 LDAP 服务器本身执行此操作,并且您尚未设置任何访问限制。 结果应与此类似:
根 DSE 输出
dn: structuralObjectClass: OpenLDAProotDSE configContext: cn=config namingContexts: dc=example,dc=com supportedControl: 2.16.840.1.113730.3.4.18 . . . supportedLDAPVersion: 3 supportedSASLMechanisms: GS2-IAKERB supportedSASLMechanisms: GS2-KRB5 supportedSASLMechanisms: SCRAM-SHA-1 supportedSASLMechanisms: GSSAPI supportedSASLMechanisms: DIGEST-MD5 supportedSASLMechanisms: NTLM supportedSASLMechanisms: CRAM-MD5 entryDN: subschemaSubentry: cn=Subschema
我们稍微截断了输出。 您可以看到有关此 LDAP 服务器的重要元数据。 我们稍后将介绍其中一些项目的含义。 现在,我们将看看生成此输出的命令。
-H ldap://
命令用于在 localhost 上指定未加密的 LDAP 查询。 没有任何身份验证信息的 -x
让服务器知道您需要匿名连接。 我们告诉它搜索范围并使用 -s base -b ""
将搜索基础设置为空。 我们用 -LLL
抑制了一些无关的输出。 最后,"+"
指定我们希望查看通常隐藏的操作属性(这是我们可以找到所需信息的地方)。
查找此服务器管理的 DIT
现在,出于我们的目的,我们正试图找出这个特定的 LDAP 服务器配置为服务的 DIT。 我们可以在上面的输出中找到 namingContexts
操作属性的值。
如果这是我们想要的唯一信息,我们可以构建一个更好的查询,如下所示:
ldapsearch -H ldap:// -x -s base -b "" -LLL "namingContexts"
在这里,我们已经调用了我们想知道其值的确切属性。 服务器上每个 DIT 的基本条目可通过 namingContexts
属性获得。 这是一个通常隐藏的操作属性,但显式调用它允许返回它。
这将抑制其他信息,为我们提供如下所示的干净输出:
命名上下文搜索
dn: namingContexts: dc=example,dc=com
我们可以看到,这个 LDAP 服务器只有一个(非管理)DIT,它植根于一个可分辨名称 (DN) 为 dc=example,dc=com
的条目。 如果服务器负责额外的 DIT,这可能会返回多个值。
查找配置 DIT
搜索 namingContexts
不会返回可用于配置 OpenLDAP 服务器的 DIT。 配置 DIT 的根条目存储在名为 configContext
的专用属性中。
要了解配置 DIT 的基本 DN,请查询此特定属性,就像我们之前所做的那样:
ldapsearch -H ldap:// -x -s base -b "" -LLL "configContext"
结果很可能是这样的:
配置上下文搜索
dn: configContext: cn=config
配置 DIT 基于名为 cn=config
的 DN。 由于这很可能与您的配置 DIT 完全匹配,因此我们将在整个指南中使用它。 如果您的配置 DIT 不同,请修改给定的命令。
访问配置 DIT
现在我们知道了配置 DIT 的位置,我们可以查询它以查看当前设置。 要做到这一点,我们实际上需要与到目前为止我们一直使用的格式有所不同。
由于此 DIT 可用于更改 LDAP 系统的设置,因此它具有一些访问控制。 默认情况下,它被配置为允许对操作系统的 root 或 sudo
用户进行管理。
我们需要的命令如下所示:
sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "cn=config" -LLL -Q
为了使这个工作,您需要在命令前使用 sudo
并将我们之前的 ldapsearch
命令中的 -x
替换为 -Y EXTERNAL
以表明我们想要使用 SASL 身份验证方法。 您还需要将协议从 ldap://
更改为 ldapi://
以通过 Unix 套接字发出请求。 这允许 OpenLDAP 验证操作系统用户,它需要评估访问控制属性。 然后我们使用 cn=config
条目作为我们搜索的基础。
结果将是一长串设置。 将它通过管道传输到寻呼机中可能会有所帮助,以便您可以轻松地上下滚动:
sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "cn=config" -LLL -Q | less
你可以看到有相当多的信息,可以处理很多。 此命令打印出整个配置树。 为了更好地了解组织和存储信息的层次结构,让我们打印出各种条目 DN:
sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "cn=config" -LLL -Q dn
这将是一个更易于管理的列表,显示条目标题 (DN) 本身而不是其全部内容:
cn=config 条目 DN
dn: cn=config dn: cn=module{0},cn=config dn: cn=schema,cn=config dn: cn={0}core,cn=schema,cn=config dn: cn={1}cosine,cn=schema,cn=config dn: cn={2}nis,cn=schema,cn=config dn: cn={3}inetorgperson,cn=schema,cn=config dn: olcBackend={0}hdb,cn=config dn: olcDatabase={-1}frontend,cn=config dn: olcDatabase={0}config,cn=config dn: olcDatabase={1}hdb,cn=config
这些条目表示配置 LDAP 系统的不同区域的配置层次结构。 让我们看看这些条目中的每一个都处理了哪些设置:
顶级条目包含一些将应用于整个系统的全局设置(除非在更具体的上下文中被覆盖)。 您可以通过键入以下内容来查看此条目中存储的内容:
sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "cn=config" -LLL -Q -s base
本节中的常见项目是全局授权设置、日志级别详细设置、指向进程的 PID 文件位置的指针以及有关 SASL 身份验证的信息。
此下方的条目配置系统的更具体的区域。 让我们看一下您可能会看到的不同类型的条目。
查找管理员条目
现在您可以访问 cn=config
DIT,我们可以找到系统上所有 DIT 的 rootDN。 rootDN 基本上是管理条目。 我们还可以找到可用于登录该帐户的密码(通常是散列)。
要查找每个 DIT 的 rootDN,请键入:
sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "cn=config" "(olcRootDN=*)" olcSuffix olcRootDN olcRootPW -LLL -Q
您将获得如下所示的打印输出:
rootDN 信息
dn: olcDatabase={1}hdb,cn=config olcSuffix: dc=example,dc=com olcRootDN: cn=admin,dc=example,dc=com olcRootPW: {SSHA}AOADkATWBqb0SJVbGhcIAYF+ePzQJmW+
如果您的系统服务于多个 DIT,您应该会看到每个 DIT 对应一个块。 在这里,我们可以看到基于 dc=example,dc=com
的 DIT 的管理员条目是 cn=admin,dc=example,dc=com
。 我们还可以看到散列密码。
查看架构信息
LDAP 模式定义系统可用的对象类和属性。 可以在运行时将模式添加到系统中,以使不同的对象类型和属性可用。 但是,某些属性是系统本身内置的。
查看内置架构
内置模式可以在 cn=schema,cn=config
条目中找到。 您可以通过键入以下内容来查看 LDAP 系统内置的模式:
sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "cn=schema,cn=config" -s base -LLL -Q | less
这将显示包含在 OpenLDAP 系统本身中的模式。 与其他所有模式不同,它不需要添加到要使用的系统中。
查看其他架构
内置模式提供了一个很好的起点,但它可能不会包含您想要在条目中使用的所有内容。 您可以通过传统的 LDIF 方法将其他模式添加到系统中。 这些将作为代表内置模式的 cn=schema
条目下的子条目提供。
通常,这些将被命名为带括号的数字,后跟模式名称,如 cn={0}core,cn=schema,cn=config
。 括号内的数字表示用于确定模式读入系统的顺序的索引。 这通常在添加它们时由系统自动完成。
要仅查看加载到系统上的附加模式的名称,您可以键入:
sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "cn=schema,cn=config" -s one -Q -LLL dn
输出将显示子条目的名称。 它可能看起来像这样,具体取决于加载到系统上的内容:
附加模式
dn: cn={0}core,cn=schema,cn=config dn: cn={1}cosine,cn=schema,cn=config dn: cn={2}nis,cn=schema,cn=config dn: cn={3}inetorgperson,cn=schema,cn=config
架构本身和分配的索引号可能会有所不同。 您可以通过进行基本搜索并列出您感兴趣的特定模式来查看特定模式的内容。 例如,如果我们想查看上面列出的 cn={3}inetorgperson
模式,我们可以输入:
sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "cn={3}inetorgperson,cn=schema,cn=config" -s base -LLL -Q | less
如果要打印所有附加架构,请键入:
sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "cn=schema,cn=config" -s one -LLL -Q | less
如果要打印出所有模式,包括内置模式,请改用:
sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "cn=schema,cn=config" -LLL -Q | less
模块、后端和数据库设置
配置 DIT 中其他一些感兴趣的领域是模块和各种存储技术设置。
模块
模块用于扩展 OpenLDAP 系统的功能。 这些条目用于指向和加载模块以使用它们的功能。 实际配置是通过其他条目完成的。
用于加载模块的条目将以 cn=module{#}
开头,其中括号包含一个数字,以便对模块的加载进行排序并区分各个条目。
您可以通过键入以下内容来查看系统上动态加载的模块:
sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "cn=config" -LLL -Q "objectClass=olcModuleList"
您将看到当前加载到系统中的模块:
加载的模块
dn: cn=module{0},cn=config objectClass: olcModuleList cn: module{0} olcModulePath: /usr/lib/ldap olcModuleLoad: {0}back_hdb
这个特定的例子只有一个模块,它允许我们使用 hdb
后端模块。
后端
后端条目用于指定实际处理数据存储的存储技术。
要查看哪些后端对您的系统处于活动状态,请键入:
sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "cn=config" -LLL -Q "objectClass=olcBackendConfig"
结果将使您了解正在使用的存储技术。 它可能看起来像这样:
OpenLDAP 活动后端
dn: olcBackend={0}hdb,cn=config objectClass: olcBackendConfig olcBackend: {0}hdb
数据库
这些存储系统的实际配置是在单独的数据库条目中完成的。 OpenLDAP 系统服务的每个 DIT 都应该有一个数据库条目。 可用的属性取决于用于每个数据库的后端。
要查看系统上所有数据库条目的名称,请键入:
sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "cn=config" -LLL -Q "olcDatabase=*" dn
您应该看到数据库条目的 DN:
数据库条目
dn: olcDatabase={-1}frontend,cn=config dn: olcDatabase={0}config,cn=config dn: olcDatabase={1}hdb,cn=config
让我们讨论一下它们各自的用途:
- olcDatabase={-1}frontend,cn=config:此条目用于定义特殊“前端”数据库的功能。 这是一个伪数据库,用于定义应该应用于所有其他数据库的全局设置(除非被覆盖)。
- olcDatabase={0}config,cn=config:此条目用于定义我们现在使用的
cn=config
数据库的设置。 大多数时候,这将主要是访问控制设置、复制配置等。 - olcDatabase={1}hdb,cn=config:此条目定义指定类型的数据库的设置(在本例中为
hdb
)。 这些通常会定义访问控制、如何存储、缓存和缓冲数据的详细信息,以及 DIT 的根条目和管理详细信息。
括号中的数字代表索引值。 它们主要由系统自动创建。 您必须替换为条目提供的值才能成功引用它。
您可以通过键入以下内容查看任何这些条目的内容:
sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "entry_to_view" -LLL -Q -s base | less
使用从上一个命令返回的条目 DN 来填充 entry_to_view
字段。
打印条目的操作属性(元数据)
到目前为止,我们主要使用 cn=config
DIT。 本指南的其余部分也适用于常规 DIT。
每个条目都有作为管理元数据的操作属性。 这些可以在任何 DIT 中访问,以找出有关条目的重要信息。
要打印条目的所有操作属性,您可以在条目后指定特殊的“+”属性。 例如,要打印出 dc=example,dc=com
条目的操作属性,我们可以键入:
ldapsearch -H ldap:// -x -s base -b "dc=example,dc=com" -LLL "+"
这将打印出所有的操作属性。 它可能看起来像这样:
[list operational attributes] dn: dc=example,dc=com structuralObjectClass: organization entryUUID: cdc658a2-8c3c-1034-8645-e30b83a2e38d creatorsName: cn=admin,dc=example,dc=com createTimestamp: 20150511151904Z entryCSN: 20150511151904.220840Z#000000#000#000000 modifiersName: cn=admin,dc=example,dc=com modifyTimestamp: 20150511151904Z entryDN: dc=example,dc=com subschemaSubentry: cn=Subschema hasSubordinates: TRUE
这对于查看谁在什么时间修改或创建条目等非常有用。
使用子模式
子模式是可用类和属性的表示。 它显示了与 cn=config
DIT 中的模式条目类似的信息,以及一些附加信息。 这可通过常规的非配置 DIT 获得,因此不需要 root 访问权限。
寻找子模式
要查找条目的子模式,您可以查询条目的所有操作属性,就像我们上面所做的那样,或者您可以询问定义条目的子模式的特定属性(subschemaSubentry
):
ldapsearch -H ldap:// -x -s base -b "dc=example,dc=com" -LLL subschemaSubentry
这将打印出与当前条目关联的子模式条目:
[list subchema entry] dn: dc=chilidonuts,dc=tk subschemaSubentry: cn=Subschema
树中的每个条目共享相同的子模式是很常见的,因此您通常不必为每个条目查询它。
显示子模式
要查看子模式条目的内容,我们需要查询上面找到的子模式条目,其范围为“base”。 所有重要信息都存储在操作属性中,因此我们将不得不再次使用特殊的“+”选择器。
我们需要的命令是:
ldapsearch -H ldap:// -x -s base -b "<^>cn=subschema" -LLL "+" | less
这将打印出整个子模式条目。 我们可以根据我们正在寻找的信息类型进行过滤。
如果要查看 LDAP 语法定义,可以输入以下内容进行过滤:
ldapsearch -H ldap:// -x -s base -b "cn=subschema" -LLL ldapSyntaxes | less
如果要查看控制如何处理搜索以匹配条目的定义,请键入:
ldapsearch -H ldap:// -x -s base -b "cn=subschema" -LLL matchingRules | less
要查看匹配规则可用于匹配哪些项目,请键入:
ldapsearch -H ldap:// -x -s base -b "cn=subschema" -LLL matchingRuleUse | less
要查看可用属性类型的定义,请使用:
ldapsearch -H ldap:// -x -s base -b "cn=subschema" -LLL attributeTypes | less
要查看 objectClass 定义,请键入:
ldapsearch -H ldap:// -x -s base -b "cn=subschema" -LLL objectClasses | less
结论
虽然操作 OpenLDAP 服务器一开始看起来很棘手,但了解配置 DIT 以及如何在系统中查找元数据可以帮助您开始运行。 使用 LDIF 文件修改 cn=config
DIT 会立即影响正在运行的系统。 此外,通过 DIT 配置系统允许您仅使用 LDAP 工具设置远程管理。 这意味着您可以将 LDAP 管理与服务器管理分开。