如何配置 OpenLDAP 并执行管理 LDAP 任务
介绍
如果您不知道如何配置系统或在哪里可以找到所需的重要信息,管理 OpenLDAP 系统可能会很困难。在本指南中,我们将演示如何查询 OpenLDAP 服务器以获取关键信息以及如何更改正在运行的系统。
先决条件
首先,您应该可以访问已安装并配置 OpenLDAP 的系统。您可以在此处了解如何设置 OpenLDAP 服务器。您应该熟悉使用 LDAP 目录服务时使用的基本术语。 本指南可用于进一步熟悉这些主题。
OpenLDAP 在线配置
LDAP 系统将其存储的数据组织成层次结构,称为目录信息树(简称DIT)。从 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,我们必须使用空白(空)搜索基础和“基础”搜索范围执行搜索。基础搜索范围意味着只返回给定的条目。通常,这用于限制搜索深度,但在根 DSE 上操作时,这是必需的(如果选择了任何其他搜索范围,则不会返回任何信息)。
我们需要的命令是这样的:
ldapsearch -H ldap:// -x -s base -b "" -LLL "+"
我们假设您是从 LDAP 服务器本身执行此操作,并且尚未设置任何访问限制。结果应类似于以下内容:
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://
命令用于指定本地主机上的未加密 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
搜索 不会返回可用于配置 OpenLDAP 服务器的 DIT namingContexts
。配置 DIT 的根条目存储在名为 的专用属性中configContext
。
要了解配置 DIT 的基本 DN,您可以查询此特定属性,就像我们之前所做的那样:
ldapsearch -H ldap:// -x -s base -b "" -LLL "configContext"
结果可能是这样的:
dn:
configContext: cn=config
配置 DIT 基于名为 的 DN cn=config
。由于这很可能与您的配置 DIT 完全匹配,因此我们将在整个指南中使用它。如果您的配置 DIT 不同,请修改给定的命令。
访问配置DIT
现在我们知道了配置 DIT 的位置,我们可以查询它来查看当前设置。为此,我们实际上需要稍微偏离我们到目前为止使用的格式。
由于此 DIT 可用于更改我们的 LDAP 系统的设置,因此它具有一些访问控制。默认情况下,它配置为允许 root 或sudo
OS 用户进行管理。
我们需要的命令如下:
sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "cn=config" -LLL -Q
为了实现这一点,您需要sudo
在命令前使用 ,并将-x
我们前面ldapsearch
命令中的 替换为 ,以-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)本身而不是其全部内容:
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
您将获得如下所示的打印输出:
dn: olcDatabase={1}hdb,cn=config
olcSuffix: dc=example,dc=com
olcRootDN: cn=admin,dc=example,dc=com
olcRootPW: {SSHA}AOADkATWBqb0SJVbGhcIAYF+ePzQJmW+
如果您的系统提供多个 DIT,您应该会看到每个 DIT 都有一个块。在这里,我们可以看到我们的管理员条目是cn=admin,dc=example,dc=com
基于的 DIT 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"
结果将让您了解所使用的存储技术。它可能看起来像这样:
dn: olcBackend={0}hdb,cn=config
objectClass: olcBackendConfig
olcBackend: {0}hdb
Databases
The actual configuration of these storage systems is done in separate database entries. There should be a database entry for each of the DITs that an OpenLDAP system serves. The attributes available will depend on the backend used for each of the databases.
To see all of the names of database entries on the system, type:
sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "cn=config" -LLL -Q "olcDatabase=*" dn
You should see the DNs of the database entries:
dn: olcDatabase={-1}frontend,cn=config
dn: olcDatabase={0}config,cn=config
dn: olcDatabase={1}hdb,cn=config
Let’s discuss a bit about what each of these is used for:
olcDatabase={-1}frontend,cn=config
: This entry is used to define the features of the special “frontend” database. This is a pseudo-database used to define global settings that should apply to all other databases (unless overridden).olcDatabase={0}config,cn=config
: This entry is used to define the settings for thecn=config
database that we are now using. Most of the time, this will be mainly access control settings, replication configuration, etc.olcDatabase={1}hdb,cn=config
: This entry defines the settings for a database of the type specified (hdb
in this case). These will typically define access controls, details of how the data will be stored, cached, and buffered, and the root entry and administrative details of the DIT.
The numbers in brackets represent an index value. They are mainly created automatically by the system. You will have to substitute the value given to the entry in order to reference it successfully.
You can see the contents of any of these entries by typing:
sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "entry_to_view" -LLL -Q -s base | less
Use the entry DNs returned from the previous command to populate the entry_to_view
field.
Print an Entry’s Operational Attributes (Metadata)
So far, we’ve been working mainly with the cn=config
DIT. The rest of this guide will be applicable to regular DITs as well.
Each entry has operational attributes that act as administrative metadata. These can be accessed in any DIT in order to find out important information about the entry.
To print out all of the operational attributes for an entry, you can specify the special “+” attribute after the entry. For instance, to print out the operational attributes of an entry at dc=example,dc=com
, we could type:
ldapsearch -H ldap:// -x -s base -b "dc=example,dc=com" -LLL "+"
This will print off all of the operational attributes. It will likely look something like this:
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
This can be useful for seeing who modified or created an entry at what time, among other things.
Working with the subschema
The subschema is a representation of the available classes and attributes. It shows similar information to the schema entries in the cn=config
DIT, with some additional information. This is available through regular, non-configuration DITs, so root access is not required.
Finding the subschema
To find the subschema for an entry, you can query all of the operational attributes of an entry, as we did above, or you can ask for the specific attribute that defines the subschema for the entry (subschemaSubentry
):
ldapsearch -H ldap:// -x -s base -b "dc=example,dc=com" -LLL subschemaSubentry
This will print out the subschema entry that is associated with the current 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 以及如何在系统中查找元数据可以帮助您快速上手。cn=config
使用 LDIF 文件修改 DIT 可以立即影响正在运行的系统。此外,通过 DIT 配置系统允许您仅使用 LDAP 工具设置远程管理。这意味着您可以将 LDAP 管理与服务器管理分开。