配置目录数据库

Red Hat Directory Server 12

配置和管理红帽目录服务器数据库

Red Hat Customer Content Services

摘要

您可以配置数据库、后缀、链策略、数据库链接和引用。使用虚拟目录树在自定义分组或层次结构中组织条目。

对红帽文档提供反馈

我们感谢您对文档提供反馈信息。请让我们了解如何改进文档。要做到这一点:

  • 要通过 JIRA 提交反馈(需要帐户):

    1. 登录到 Jira 网站。
    2. 在顶部导航栏中点 Create
    3. Summary 字段中输入描述性标题。
    4. Description 字段中输入您对改进的建议。包括到文档相关部分的链接。
    5. 点对话框底部的 Create
  • 要通过 Bugzilla 提交反馈(需要帐户):

    1. 进入 Bugzilla 网站。
    2. 在 Component 中选择 Documentation
    3. Description 中输入您要提供的信息。包括文档相关部分的链接。
    4. Submit Bug

第 1 章 在单独的数据库中存储后缀

您可以通过将实例中的数据划分为多个数据库,在目录服务器中设计分布式数据存储逻辑。您可以使用目录树的后缀作为数据划分的方法。

您可以创建几个目录树,并通过 root 后缀将其存储在单独的数据库中。您还可以将单个目录树划分为分支,并通过子后缀将分支存储在单独的数据库中。

1.1. 数据结构中的后缀的角色

目录服务器以分级结构形式呈现名为目录树(DIT)的数据。以下是一个简单的目录树:

图 1.1. 带有一个根后缀的简单目录树

目录树简单

每个目录树都有一个根条目,用于定义该目录树的命名上下文,如 dc=example,dc=com

您可以将各种目录树存储在不同的数据库中,然后在多个服务器间分发这些数据库。

您可以使用后缀来定义数据存储的分布逻辑。后缀将目录树的分支(subtree)与特定数据库相关联。

这样,您可以在服务器的一个实例中有多个数据库。您不限于一个数据库。

1.2. root 后缀与子后缀

root 后缀将整个目录树(DIT)与数据库关联。root 后缀没有父后缀。

当您想将目录树的分支存储在单独的数据库中时,您可以创建一个子后缀,它将树的分支与分支的上级不同的数据库相关联。子后缀必须附加到父后缀。父后缀可以是 root 后缀或子后缀,这意味着任何子树的分支可以存储在单独的数据库中。

图 1.2. 在独立数据库中带有子后缀的目录树

带有不同数据库的目录树

在本例中,ou=people,dc=example,dc=com 子后缀存储在一个数据库中,根后缀下的剩余目录树存储在不同的数据库中。

使用子后缀的优点:

  • 您可以在粒度级别执行数据库维护(导入/导出/索引)。
  • 您可以将子后缀存储在单独的磁盘上,从而解决了磁盘空间的问题。

使用子后缀的缺点:

  • 设置期间您需要更多的管理操作。
  • 复制需要为每个子后缀使用单独的配置和复制协议。

1.3. 多个 root 后缀

您还可以在单个实例中有多个带有不同根后缀的目录树(DIT)。例如,当您想要将某些部分数据与用户 root 分隔开时。

图 1.3. 由 root 后缀定义的几个目录树

目录树多根

当客户端搜索 dc=example,dc=com 树时,搜索不会从其他树返回条目,因为它们没有限制搜索算法。

然后,您可以选择实例的默认目录树和命名上下文。

1.4. 使用命令行创建 root 后缀

此流程指导您在命令行中创建目录树的根后缀。

流程

  1. 可选:列出已在使用的后缀和后端数据库:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list
    dc=example,dc=com (userroot)

    括号中的名称是后端数据库,用于存储对应后缀的数据。在下一步中创建根后缀时,您无法使用现有数据库名称。

  2. --suffix 参数中指定根后缀的 DN,并使用 --be-name 参数将其与新数据库相关联:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend create --suffix="dc=example,dc=net" --be-name="example"

验证

  • 在此流程的第一步中,使用 命令列出后缀和数据库。

1.5. 使用 Web 控制台创建 root 后缀

此流程指导您在浏览器中创建目录树的根后缀。

先决条件

  • 在 web 控制台中登录到实例。

流程

  1. Database 下,单击配置树下的 Create Suffix 按钮。
  2. 填写 后缀 DN数据库名称
  3. 选择 Create The Top Suffix Entry 并点 Create Suffix

验证

  • 新后缀应出现在后缀的树中。

1.6. 更改默认命名上下文

命名上下文是目录树(DIT)的属性,用于定义该 DIT 中条目的 root 命名空间。当您使用多个 root 后缀在实例中构建数据时,您的实例具有多个 DIT,每个实例使用不同的命名上下文。

当您处理实例中的多个 root 后缀时,这个过程指示如何在命令行中更改默认命名上下文。

访问您的实例的客户端可能不知道它们需要使用的命名上下文。如果没有其他已知命名上下文的命名上下文,目录服务器会向客户端信号默认的命名上下文。

您可以在 cn=config 中的 nsslapd-defaultnamingcontext 属性中设置默认命名上下文。目录服务器将此值传播到目录服务器代理服务条目(root DSE),客户端可以匿名查询它。

先决条件

  • 您已创建了定义实例默认命名上下文的根后缀。

流程

  1. 可选:查看当前的默认命名上下文:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com config get nsslapd-defaultnamingcontext
    nsslapd-defaultnamingcontext: dc=example,dc=com
  2. nsslapd-defaultnamingcontext 参数的值替换为所需的命名上下文:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-defaultnamingcontext=dc=example,dc=net

验证

  • 查看当前的默认命名上下文。该值应该被更新。

1.7. 使用命令行创建子后缀

您可以使用命令行为目录树创建子后缀。

先决条件

  • 为子后缀创建了父后缀。

流程

  1. 可选:列出已在使用的后缀和后端数据库:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list
    dc=example,dc=com (userroot)

    括号中的名称是后端数据库,用于存储对应后缀的数据。在下一步中创建子后缀时,您无法使用现有数据库名称。

  2. --suffix 参数中指定子后缀的完整 DN,使用 --be-name 参数将其与新数据库关联,并在 --parent-suffix 参数中指定父后缀:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend create --suffix="ou=People,dc=example,dc=com" --be-name="example" --parent-suffix="dc=example,dc=com" --create-suffix

    使用 --create-suffix 参数时,该命令会为子后缀创建配置条目,以及 sub-suffix 条目 ou=People,dc=example,dc=com

    --create-suffix 参数支持使用以下 RDN 属性类型创建后缀: c,cn,dc,o, 和 ou。如果要使用 RDN (如 l )创建后缀,您可以使用 dsconf backend create 命令而无需 --create-suffix 选项,然后使用 LDAP 添加操作或从 LDIF 文件中导入条目来添加后缀条目。

验证

  • 在此流程的第一步中,使用 命令列出后缀和数据库。

1.8. 使用 Web 控制台创建子后缀

此流程指导您在浏览器中为目录树创建子后缀。

先决条件

  • 在 web 控制台中登录到实例。
  • 为子后缀创建了父后缀。

流程

  1. Database 下,从配置树中选择后缀,该树是子后缀的父级。
  2. 后缀任务 并选择 Create Sub-Suffix
  3. 填写 Sub-Suffix DN,如 ou=PeopleDatabase Name
  4. 选择 Create The Top Suffix Entry 并点 Create Sub-Suffix

验证

  • 新的子后缀应当显示在配置树中的后缀之间。

第 2 章 使用视图创建虚拟目录层次结构

您可以创建虚拟目录树(DIT)视图来组织自定义分组或层次结构中的条目,从而从各种视角导航标准 DIT。这样,您可以降低目录管理成本,并通过条目对服务用户更直观地进行导航。

2.1. 关于视图

虚拟目录树(DIT)除标准目录树(DIT)之外,虚拟目录树或 视图 是一个可选的结构层,用于对 DIT 中的条目进行分类和搜索。

通过使用视图,您可以创建虚拟目录层次结构,因此无论它们在标准 DIT 中的放置是什么,都可以轻松地浏览条目。视图使用条目的属性包含在虚拟层次结构中,类似于过滤的角色或动态组的成员。对于客户端应用,视图显示为普通容器层次结构。

这样,您可以最初将条目放在扁平 DIT 中,并使用视图将条目分类到复杂层次结构中,而无需移动条目。另外,条目可能会出现在多个视图中,您无法使用标准 DIT 实现。

您可以将视图视为 命名过滤器。每个视图都是 nsView 对象类的条目,可能具有 nsViewFilter 属性,它指出该视图中可见的条目。可能需要通过在过滤器中指定对象类来限制返回的条目类型。

您可以将视图用作其他视图的容器,从而创建虚拟层次结构。嵌套的视图从上级继承过滤器,并通过将其过滤器和上级过滤器与 AND 合并来限制视图,如 (& (container filter) (view filter)

当使用视图作为基础执行搜索时,从此虚拟搜索空间返回与过滤器匹配的条目。条目仅以虚拟方式嵌套在视图下,但它们实际上可以存储在 DIT 中的任何位置。

注意

您可以创建一个测试实例,并探索查看如何从 /usr/share/dirsrv/data/Example-views.ldif 中的示例文件中导入的数据进行查看。

2.2. 目录设计注意事项

当您设计目录树(DIT)时,您自然倾向于使用层次结构对条目进行分类,以反映您机构中的层次结构。没有视图的标准 DIT 将条目的位置绑定到条目的可分辨名称(DN),因此更适合与固定层次结构一起使用。

图 2.1. 基于功能单元的标准层次结构 DIT

查看标准 dit

但是,组织内层次结构的性质是动态的。在标准 DIT 中移动条目非常耗时,因为每次更改条目的位置时,条目及其所有子代都必须被重命名。这会导致服务中断和其他费用,特别是对顶级子树的更改。

最好根据不更改的特征设计具有资源分类的扁平层次结构,如资源类型(人员、设备等),并在标准扁平 DIT 中捕获此层次结构。

图 2.2. 基于资源类型的标准扁平 DIT

查看扁平 dit

但是,对于浏览资源,扁平 DIT 并不方便。不同的用户需要从不同的视角导航资源,如与功能单元或地理位置的关联,这在扁平 DIT 时需要额外的工具或复杂的搜索查询。

克服扁平 DIT 限制的解决方案由虚拟视图层次结构提供。视图通过将条目的名称与层次结构中的条目位置分隔开,从而允许创建灵活的层次结构。虚拟层次结构基于属性。

图 2.3. 带有虚拟层次结构的 DIT

查看虚拟 dit

2.3. 使用视图的好处

使用虚拟目录树视图具有自定义灵活的层次结构的优势,用户更直观地浏览,与深入嵌套标准目录树(DIT)相比,管理员更高效地维护。

扁平和灵活的命名

视图有助于将扁平命名空间用于条目,因为虚拟 DIT 视图提供了类似于传统层次结构提供的导航和管理器支持。

每当对 DIT 发生变化时,不需要移动条目;只有虚拟 DIT 视图层次结构更改。由于这些层次结构不包含实际条目,因此它们简单并快速修改。

在设计错误时降低成本
部署规划期间的过度配置与虚拟 DIT 视图比较小。如果在第一个实例中没有正确开发层次结构,可以在不中断服务的情况下轻松、快速地更改。
快速且更便宜的维护

查看层次结构可在几分钟内完全修订,结果会立即实现,从而显著降低目录维护成本。

对虚拟 DIT 层次结构的更改会立即实现。当组织更改时,可以快速创建新的虚拟 DIT 视图。新的虚拟 DIT 视图可以与旧视图同时存在,从而促进了更逐步更改自身以及使用这些条目的应用程序。因为目录中的组织变化不是完全没有操作,所以可以在一段时间内执行,且不会中断服务。

增强的总体灵活性

通过使用多个虚拟 DIT 视图进行导航和管理,可以更灵活地使用目录服务。

通过虚拟 DIT 视图提供的功能,组织可以使用旧方法和新方法组织目录数据,而无需将条目放在 DIT 的特定位置上。

直观的用户导航

视图在工作实践中提升灵活性并降低目录用户创建复杂搜索过滤器的要求,使用它们原本不需要知道的属性名称和值。

通过以多种方式查看和查询目录信息的灵活性,最终用户和应用程序能够通过分层导航来直观地找到所需的内容。

频繁搜索查询的快捷方式
虚拟 DIT 视图层次结构可以作为某种可用的查询创建,以便于检索常见必要信息。

2.4. 查看与其他功能的兼容性

使用视图时,搜索空间仅限于单个后缀下的条目。用户必须对视图进行搜索查询,才能从虚拟层次结构中获取结果。您必须采用稍有不同的方法才能进行访问控制。您可以在视图中使用角色和服务类别的条目分组。

多个后端

虚拟 DIT 视图并不与多个后端完全兼容。

搜索仅限于单个后端,这意味着视图返回的条目必须位于相同的后缀下。

搜索空间

虚拟搜索空间与标准搜索空间分开。只有在搜索基于带有过滤器的视图节点时,才能访问虚拟搜索空间。否则,它是对标准目录树(DIT)的传统搜索,不会返回虚拟 DIT 层次结构中包含的条目。

例如,基于 dc=example,dc=com 的搜索不会返回来自视图的虚拟搜索空间的任何条目;实际上,不会执行 virtual-search-space 搜索。如果搜索基础为 ou=Cupertino,ou=Location Views,dc=example,dc=com,则会出现视图处理。

这样,目录服务器可确保搜索不会产生这两个位置的条目。

Access control
使用视图时,可能需要使用稍有不同的方式来访问控制。因为目前在视图中对访问控制列表(ACL)没有明确支持,因此在 view 父级创建基于角色的 ACL,并将角色添加到视图层次结构的适当部分。这样,请利用层次结构的组织属性。
条目分组
目录服务器中的 服务类 和角色 都支持视图。当在视图层次结构中添加 服务或 角色时,逻辑上且实际包含在视图中的条目将被视为在范围内。这意味着,可以使用虚拟 DIT 视图来应用 角色和服务 ,但即使查询扁平命名空间,也可以看到该应用程序的效果。

2.5. 将视图与客户端应用程序的兼容性

虚拟目录树(DIT)视图旨在模拟标准 DIT。存在对于大多数应用程序而言,视图的存在应是透明的;它们不应表示它们正在使用视图。除了一些特殊情况外,用户无需知道在目录服务器实例中使用视图;视图看起来和行为类似于标准 DIT。

某些类型的应用程序在处理支持视图的目录服务时遇到问题。例如:

  • 使用目标条目的可分辨名称(DN)的应用程序导航 DIT。

    这种类型的应用程序会发现,它正在导航出条目物理存在的层次结构,而不是找到该条目的视图层次结构。这样做的原因是,通过更改条目的 DN 以符合视图的层次结构,不会尝试忽略条目的真正位置。

    这由设计 - 如果条目的真正位置进行解包,例如依赖 DN 来识别唯一条目的应用程序时,许多应用程序都无法正常工作。通过破坏性 DN 是客户端应用程序的一个不常见的技术,但无法做到这一点,但这样做的客户端可能无法正常工作。

  • 使用 numSubordinates 操作属性的应用程序来确定节点下存在多少个条目。

    对于视图中的节点,这目前仅计算标准搜索空间中存在的条目,忽略虚拟搜索空间。因此,应用程序可能无法在搜索中评估视图。

2.6. 创建视图

此流程指导您在命令行中创建虚拟 directory-tree 视图。

流程

  • 使用 ldapadd 工具添加一个视图条目。

    指定 nsView 对象类并在 nsViewFilter 属性中定义 view 过滤器:

    # ldapadd -D "cn=Directory Manager" -W -H ldap://server.example.com -x
    dn: ou=PeopleInRoom0466,dc=example,dc=com
    objectClass: top
    objectClass: organizationalUnit
    objectClass: nsView
    ou: PeopleInRoom0466
    description: People in the room 0466
    nsViewFilter: (&(objectClass=inetOrgPerson)(roomNumber=0466))

验证

  • 使用视图作为搜索基础执行搜索:

    # ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com -x -b ou=PeopleInRoom0466,dc=example,dc=com

2.7. 使用命令行创建索引以提高视图的性能

视图基于给定的过滤器从搜索结果衍生而来。过滤器的一部分是在 nsViewFilter 中明确给定的属性;过滤器的其余部分基于条目层次结构,查找视图中包含的实际条目的 entryidparentid 操作属性。

(|(parentid=search_base_id)(entryid=search_base_id)

如果任何搜索的属性 - entryidparentidnsViewFilter - 中的属性没有被索引,则搜索会部分未索引,并且目录服务器搜索整个目录树是否有匹配的条目。

要提高性能,请创建索引,如下所示:

  • entryid 创建等号索引 (q)。默认情况下,parentid 属性在系统索引中索引。
  • 如果 nsViewFilter 测试中的过滤器存在(attribute),则为正在测试的属性创建 存在索引 (pres)。您应该只将这个索引类型用于目录条目的次要显示的属性。
  • 如果 nsViewFilter 中的过滤器相等(attribute=value),为正在测试的属性创建 相等索引 (eq)。
  • 如果 nsViewFilter 中的过滤器测试子字符串(attribute=value*),请为正在测试的属性创建 子字符串索引 (sub)。
  • 如果 nsViewFilter 中的过滤器测试 approximation (attribute~=value),则为被测试的属性创建 大约索引 (大约)。

例如,当您使用以下视图过滤器时:

nsViewFilter: (&(objectClass=inetOrgPerson)(roomNumber=*66))

您应该使用 相等索引 (默认情况下为 )和 roomNumber (带有 子字符串索引)进行索引

先决条件

  • 您已了解您在视图过滤器中使用的属性。

流程

  1. 可选:列出后端以确定要索引的数据库:

    # dsconf -D "cn=Directory Manager" instance_name backend suffix list
    dc=example,dc=com (userroot)

    请注意所选的数据库名称(在括号中)。

  2. 使用 dsconfig 实用程序为所选后端数据库创建索引配置。

    指定属性 name, index type, 以及可选的匹配规则来设置 collation order (OID),特别是在国际化实例时。

    # dsconf -D "cn=Directory Manager" instance_name backend index add --attr roomNumber --index-type sub userroot

    对 view 过滤器中使用的每个属性重复此步骤。

  3. 重新索引数据库以应用新的索引:

    # dsconf -D "cn=Directory Manager" instance_name backend index reindex userroot

验证

  1. 执行基于您在视图中使用的相同过滤器的标准目录树的搜索:

    # ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com -x -b dc=example,dc=com (&(objectClass=inetOrgPerson)(roomNumber=*66))
    # ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com -x -b dc=example,dc=com "(&(objectClass=inetOrgPerson)(roomNumber=*66))"
  2. 查看 /var/log/dirsrv/slapd-instance_name/ access 中的访问日志

    搜索的 RESULT 在详情中不应包含 note=UPartially Unindexed Filter

其他资源

2.8. 使用 Web 控制台创建索引以提高视图性能

视图基于给定的过滤器从搜索结果衍生而来。过滤器的一部分是在 nsViewFilter 中明确给定的属性;过滤器的其余部分基于条目层次结构,查找视图中包含的实际条目的 entryidparentid 操作属性。

(|(parentid=search_base_id)(entryid=search_base_id)

如果任何搜索的属性 - entryidparentidnsViewFilter - 中的属性没有被索引,则搜索会部分未索引,并且目录服务器搜索整个目录树是否有匹配的条目。

要提高性能,请创建索引,如下所示:

  • entryid 创建等号索引 (q)。默认情况下,parentid 属性在系统索引中索引。
  • 如果 nsViewFilter 测试中的过滤器存在(attribute),则为正在测试的属性创建 存在索引 (pres)。您应该只将这个索引类型用于目录条目的次要显示的属性。
  • 如果 nsViewFilter 中的过滤器相等(attribute=value),为正在测试的属性创建 相等索引 (eq)。
  • 如果 nsViewFilter 中的过滤器测试子字符串(attribute=value*),请为正在测试的属性创建 子字符串索引 (sub)。
  • 如果 nsViewFilter 中的过滤器测试 approximation (attribute~=value),则为被测试的属性创建 大约索引 (大约)。

例如,当您使用以下视图过滤器时:

nsViewFilter: (&(objectClass=inetOrgPerson)(roomNumber=*66))

您应该使用 相等索引 (默认情况下为 )和 roomNumber (带有 子字符串索引)进行索引

先决条件

  • 在 web 控制台中登录到实例。
  • 您已了解您在视图过滤器中使用的属性。

流程

  1. Database 下,从您要为其创建索引的配置树中选择一个后缀。
  2. 导航到 IndexesDatabase Indexes
  3. Add Index 按钮。
  4. 键入属性的名称,再选择属性。
  5. 选择 应该为 此属性创建的索引类型。
  6. 另外,还可添加 Matching Rules 来指定 collation order (OID),特别是在国际化实例时。
  7. 在创建索引后选择 Index 属性来 重新构建索引。
  8. Create Index
  9. 对要索引的每个属性重复这些步骤。

验证

  • 通过输入添加的属性的名称来过滤 Indexes
  • 新索引的属性应当会显示在结果中。

其他资源

第 3 章 将数据库切换到只读模式

默认情况下,目录服务器的数据库以读写模式运行,用户可以在其中检索和存储数据。

当您在一个给定时间(例如在备份之前或手动初始化消费者之前)需要数据库时,您可以将数据库切换到只读模式,以防止用户创建、修改或删除条目。

3.1. 先决条件

  • 数据库处于读写模式。
  • 数据库不在复制中使用,因为启用只读模式会禁用复制。

3.2. 使用命令行将数据库切换到只读模式

此流程演示了如何在命令行上将目录服务器数据库切换到只读模式。

流程

  1. 列出后缀及其对应的数据库:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list
    dc=example,dc=com (userroot)
    o=test (test_database)

    请注意您要切换的数据库的名称或后缀。

  2. 使用 --enable-readonly 参数启用只读模式,并根据名称或后缀指定数据库:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix set --enable-readonly "test_database"

验证

  • 尝试对目录的写入操作,例如:

    # ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
    dn: dc=example,dc=com
    changetype: modify
    add: description
    description: foo

    服务器应拒绝执行。

    modifying entry "dc=example,dc=com"
    ldap_modify: Server is unwilling to perform (53)
    	additional info: Server is read-only

3.3. 使用 Web 控制台将数据库切换到只读模式

此流程指导您在浏览器中将目录服务器数据库切换到只读模式。

先决条件

  • 在 web 控制台中登录到实例。

流程

  1. Database 下,选择配置树中的后缀。
  2. 检查 Database Read-Only Mode 选项。
  3. 单击 Save Configuration

验证

  • 尝试对目录的写入操作,例如:

    # ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
    dn: dc=example,dc=com
    changetype: modify
    add: description
    description: foo

    服务器应拒绝执行。

    modifying entry "dc=example,dc=com"
    ldap_modify: Server is unwilling to perform (53)
    	additional info: Server is read-only

3.4. 其他资源

第 4 章 将实例切换到只读模式

默认情况下,实例以读写模式运行,用户可以在其中检索和存储数据。在紧急情况下,比如要在重新索引期间阻止复制或禁用修改数据,但保留目录可用,您可以临时将实例切换到只读模式。

如果目录服务器维护多个数据库,并且所有数据库都需要切换到只读数据库,您可以在一个操作中、在命令行中或 web 控制台中执行此操作。

警告

在只读模式中,您无法重启实例,但您仍可能会修改配置。

如果您以只读模式停止实例,则无法再次启动它,直到您手动禁用只读模式。

要手动禁用只读模式,请打开 /etc/dirsrv/slapd-instance_name/dse.ldif 文件,进入到 cn=config 部分,并将 nsslapd-readonly 参数设置为 off

4.1. 先决条件

  • 实例处于读写模式。
  • 实例不在复制中使用,因为启用只读模式会禁用复制。

4.2. 使用命令行将实例切换到只读模式

此流程指导您在命令行中将 Directory 服务器实例切换为只读模式。

流程

  • ,将 nsslapd-readonly 参数设置为 :

    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-readonly=on

验证

  • 尝试对目录的写入操作,例如:

    # ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
    dn: dc=example,dc=com
    changetype: modify
    add: description
    description: foo

    服务器应拒绝执行。

    modifying entry "dc=example,dc=com"
    ldap_modify: Server is unwilling to perform (53)
    	additional info: Server is read-only

4.3. 使用 Web 控制台将实例切换到只读模式

此流程指导您在浏览器中将 Directory 服务器实例切换到只读模式。

先决条件

  • 在 web 控制台中登录到实例。

流程

  1. Server 下,选择 Advanced Settings 选项卡。
  2. 检查 Server Read-Only 选项。
  3. 点击 Save

验证

  • 尝试对目录的写入操作,例如:

    # ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
    dn: dc=example,dc=com
    changetype: modify
    add: description
    description: foo

    服务器应拒绝执行。

    modifying entry "dc=example,dc=com"
    ldap_modify: Server is unwilling to perform (53)
    	additional info: Server is read-only

第 5 章 删除不再需要的后缀数据库

当您需要回收目录服务器主机上的磁盘空间时,可以删除不再使用的后缀数据库。

5.1. 使用命令行删除数据库

此流程指导您在命令行中删除目录服务器数据库。

流程

  1. 列出后缀及其对应数据库:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list
    dc=example,dc=com (userroot)
    o=test (test_database)

    请注意您要删除的数据库的名称。

  2. 输入 dsconf backend delete 命令并指定数据库的名称:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend delete "test_database"
  3. 通过在提示符中输入 "是 I am sure" 来确认删除:

    Deleting Backend cn=test_database,cn=ldbm database,cn=plugins,cn=config :
    Type 'Yes I am sure' to continue: Yes I am sure

验证

  • 列出后缀/数据库:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list
    dc=example,dc=com (userroot)

5.2. 使用 Web 控制台删除数据库

此流程指导您在浏览器中删除目录服务器数据库。

先决条件

  • 在 web 控制台中登录到实例。

流程

  1. Database 下,选择您要删除的后缀。
  2. 进入 Suffix TasksDelete Suffix
  3. 选择 Yes, I am sure。
  4. Delete Suffix

验证

  • Database 下,查看配置树中的后缀列表。

第 6 章 验证后端数据库的完整性

目录服务器数据库完整性检查可以检测问题,如损坏元数据页面和重复键的排序。如果发现问题,您可以根据问题来重新索引数据库或恢复备份。

6.1. 执行数据库完整性检查

dsctl dbverify 命令使管理员能够验证后端数据库的完整性。

流程

  1. 可选:列出实例的后端数据库:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list
    dc=example,dc=com (userRoot)
  2. 停止实例:

    # dsctl instance_name stop
  3. 验证数据库。例如,要验证 userRoot 数据库,请输入:

    # dsctl instance_name dbverify userRoot
    [04/Feb/2022:13:11:02.453624171 +0100] - INFO - ldbm_instance_config_cachememsize_set - force a minimal value 512000
    [04/Feb/2022:13:11:02.465339507 +0100] - WARN - ldbm_instance_add_instance_entry_callback - ldbm instance userroot already exists
    [04/Feb/2022:13:11:02.468060144 +0100] - ERR - ldbm_config_read_instance_entries - Failed to add instance entry cn=userroot,cn=ldbm database,cn=plugins,cn=config
    [04/Feb/2022:13:11:02.471079045 +0100] - ERR - bdb_config_load_dse_info - failed to read instance entries
    [04/Feb/2022:13:11:02.476173304 +0100] - ERR - libdb - BDB0522 Page 0: metadata page corrupted
    [04/Feb/2022:13:11:02.481684604 +0100] - ERR - libdb - BDB0523 Page 0: could not check metadata page
    [04/Feb/2022:13:11:02.484113053 +0100] - ERR - libdb - /var/lib/dirsrv/slapd-instance_name/db/userroot/entryrdn.db: BDB0090 DB_VERIFY_BAD: Database verification failed
    [04/Feb/2022:13:11:02.486449603 +0100] - ERR - dbverify_ext - verify failed(-30970): /var/lib/dirsrv/slapd-instance_name/db/userroot/entryrdn.db
    dbverify failed
  4. 如果验证过程报告了任何问题,请手动修复或恢复备份。
  5. 启动实例:

    # dsctl instance_name start

其他资源

第 7 章 管理属性加密

目录服务器提供多种机制来保护对目录中敏感数据的访问。但是,默认情况下,服务器会将未加密的数据存储在数据库中。对于高度敏感信息,攻击者可能会获得数据库访问权限的潜在风险。

属性加密功能使管理员能够使用敏感数据存储特定属性,如政府身份号,在数据库中加密。为后缀启用后,这些属性的每个实例(即使索引数据)都会加密存储在数据库中的此属性中的每个条目。请注意,您可以为后缀启用属性加密。要为整个服务器启用此功能,您必须为服务器上的每个后缀启用属性加密。属性加密与 eqpres 索引完全兼容。

重要

您在条目中使用的任何属性都无法有效地加密。例如,如果您已配置为加密 uid 属性,则该值在条目中加密,而不是在 DN 中:

dn: uid=demo_user,ou=People,dc=example,dc=com
...
uid::Sf04P9nJWGU1qiW9JJCGRg==

7.1. 密钥目录服务器用于属性加密

要使用属性加密,您必须使用 TLS 配置加密连接。目录服务器使用服务器的 TLS 加密密钥和相同的 PIN 输入法进行属性加密。

服务器使用随机生成的对称密码密钥来加密和解密属性数据。服务器使用服务器 TLS 证书中的公钥来打包这些密钥。因此,属性加密的有效强度不能高于服务器的 TLS 密钥的强度。

警告

如果没有访问服务器的私钥,则无法从封装的副本中恢复对称密钥。因此,定期备份服务器的证书数据库。如果您丢失了密钥,您将无法再解密和加密存储在数据库中的数据。

7.2. 使用命令行启用属性加密

此流程演示了如何使用命令行在 userRoot 数据库中为 telephoneNumber 属性启用属性加密。执行此流程后,服务器会存储此属性 AES 加密的现有值和新值。

前提条件

  • 您已在目录服务器中启用了 TLS 加密。

流程

  1. 导出 userRoot 数据库:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend export -E userRoot

    服务器将导出存储在 /var/lib/dirsrv/slapd-instance_name/ldif/ 目录中的 LDIF 文件中。-E 选项解密导出期间已加密的属性。

  2. telephoneNumber 属性启用 AES 加密:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend attr-encrypt --add-attr telephoneNumber dc=example,dc=com
  3. 停止实例:

    # dsctl instance_name stop
  4. 导入 LDIF 文件:

    # dsctl instance_name ldif2db --encrypted userRoot /var/lib/dirsrv/slapd-instance_name/ldif/None-userroot-2022_01_24_10_28_27.ldif

    --encrypted 参数可让脚本加密导入过程中为加密配置的属性。

  5. 启动实例:

    # dsctl instance_name start

7.3. 使用 Web 控制台启用属性加密

此流程演示了如何使用 Web 控制台为 userRoot 数据库中的 telephoneNumber 属性启用属性加密。执行此流程后,服务器会存储此属性 AES 加密的现有值和新值。

请注意,web 控制台中的导出和导入功能不支持加密属性。因此,您必须在命令行中执行这些步骤。

前提条件

  • 您已在目录服务器中启用了 TLS 加密。
  • 在 web 控制台中登录到实例。

流程

  1. 导出 userRoot 数据库:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend export -E userRoot

    服务器将导出存储在 /var/lib/dirsrv/slapd-instance_name/ldif/ 目录中的 LDIF 文件中。-E 选项解密导出期间已加密的属性。

  2. 在 web 控制台中,进入到 DatabaseSuffixessuffix_entryEncrypted Attributes
  3. 输入要加密的属性,然后单击 Add Attribute
  4. Actions 菜单中,选择 Stop Instance
  5. 在命令行中导入 LDIF 文件:

    # dsctl instance_name ldif2db --encrypted userRoot /var/lib/dirsrv/slapd-instance_name/ldif/None-userroot-2022_01_24_10_28_27.ldif

    --encrypted 参数可让脚本加密导入过程中为加密配置的属性。

  6. 在 Web 控制台中,打开 Actions 菜单,然后选择 Start Instance

7.4. 启用属性加密后的一般注意事项

在为已在数据库中的数据启用了加密后,请考虑以下点:

  • 未加密的数据可以保留在服务器的数据库页面池后备文件中。删除此数据:

    1. 停止实例:

      # dsctl instance_name stop
    2. 删除 /var/lib/dirsrv/slapd-instance_name/db/guardian 文件:

      # **rm /var/lib/dirsrv/slapd-instance_name/db/guardian``
    3. 启动实例:

      # dsctl instance_name start
  • 启用加密并成功导入数据后,使用未加密的数据删除 LDIF 文件。
  • 目录服务器不加密复制日志文件。要保护此数据,请将复制日志存储在加密的磁盘上。
  • 服务器内存(RAM)中的数据未加密,并可暂时存储在交换分区中。要保护这些数据,请配置加密的交换空间。
重要

即使您删除包含未加密数据的文件,但在某些情况下可以恢复这些数据。

7.5. 更新用于属性加密的 TLS 证书

属性加密基于服务器的 TLS 证书。按照以下步骤,在续订或替换 TLS 证书后防止属性加密失败。

前提条件

  • 您配置的属性加密。
  • TLS 证书将在不久的将来过期。

流程

  1. 导出 userRoot 数据库:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend export -E userRoot

    服务器将导出存储在 /var/lib/dirsrv/slapd-instance_name/ldif/ 目录中的 LDIF 文件中。-E 选项解密导出期间已加密的属性。

  2. 创建私钥和证书签名请求(CSR)。如果要使用外部实用程序创建,请跳过这一步。

    • 如果您的主机只能由一个名称访问,请输入:

      # dsctl instance_name tls generate-server-cert-csr -s "CN=server.example.com,O=example_organization"
    • 如果您的主机可以通过多个名称访问:

      # dsctl instance_name tls generate-server-cert-csr -s "CN=server.example.com,O=example_organization" server.example.com server.example.net

      如果您将主机名指定为最后一个参数,该命令会使用 DNS:server.example. com、DNS:server.example.net 条目添加 Subject Alternative Name (SAN)扩展,来将 DNS:server.example.net 条目添加到 CSR。

    -s subject 参数中指定的字符串必须是根据 RFC 1485 的有效主题名称。主题中的 CN 字段是必需的,您必须将它设置为服务器的完全限定域名(FQDN)之一。该命令在 /etc/dirsrv/slapd-instance_name/Server-Cert.csr 文件中存储 CSR。

  3. 将 CSR 提交给证书颁发机构(CA)以获取签发证书。详情请查看您的 CA 文档。
  4. 将 CA 发布的服务器证书导入到 NSS 数据库:

    • 如果您使用 dsctl tls generate-server-cert-csr 命令创建私钥,请输入:

      # dsconf -D "cn=Directory Manager" ldap://server.example.com security certificate add --file /root/instance_name.crt --name "server-cert" --primary-cert

      请记住您在 --name _certificate_nickname参数中设置的证书名称。在后续步骤中需要它。

    • 如果您使用外部工具创建私钥,请导入服务器证书和私钥:

      # dsctl instance_name tls import-server-key-cert /root/server.crt /root/server.key

      请注意,命令要求您首先指定服务器证书的路径,然后指定私钥的路径。此方法始终将证书的 nickname 设置为 Server-Cert

  5. 将 CA 证书导入到 NSS 数据库:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate add --file /root/ca.crt --name "Example CA"
  6. 设置 CA 证书的信任标记:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate set-trust-flags "Example CA" --flags "CT,,"

    这会将 Directory 服务器配置为信任 CA 进行基于 TLS 加密和基于证书的身份验证。

  7. 停止实例:

    # dsctl instance_name stop
  8. 编辑 /etc/dirsrv/slapd-instance_name/dse.ldif 文件,并删除包括其属性的以下条目:

    • cn=AES,cn=encrypted 属性键,cn=database_name,cn=ldbm database,cn=plugins,cn=config
    • cn=3DES,cn=encrypted 属性键,cn=database_name,cn=ldbm database,cn=plugins,cn=config
    重要

    删除所有数据库的条目。如果包含 nsSymmetricKey 属性的任何条目保留在 '/etc/dirsrv/slapd-instance_name/dse.ldif 文件中,则目录服务器将无法启动。

  9. 导入 LDIF 文件:

    # dsctl instance_name ldif2db --encrypted userRoot /var/lib/dirsrv/slapd-instance_name/ldif/None-userroot-2022_01_24_10_28_27.ldif

    --encrypted 参数可让脚本加密导入过程中为加密配置的属性。

  10. 启动实例:

    # dsctl instance_name start

第 10 章 配置链策略

您可以将目录服务器配置为将来自客户端应用程序的请求连到包含数据库链接的目录服务器。链策略适用于在 Directory 服务器上创建的所有数据库链接。

10.1. 串联组件操作

组件 是服务器中使用内部操作的任何功能单元,如前端中的插件或功能。

有些组件向服务器发送内部 LDAP 请求,预期仅访问本地数据。对于这样的组件,您必须控制链策略,以便组件可以成功完成操作。例如,证书验证功能。您可以串联函数发出的 LDAP 请求,以检查代表远程服务器的证书是可信的。如果远程服务器不被信任,则存在一个安全问题。

默认情况下,您无法串联所有内部操作和任何组件,但默认值可以被覆盖。

另外,您必须在远程服务器上创建一个 ACI,以便指定的插件在远程服务器上执行操作。ACI 必须存在于分配给 数据库链接的后缀 中。

以下是组件名称,当允许这些组件串联内部操作时,以及组件在远程服务器上的 ACI 中需要的权限时,它们的潜在副作用:

  • ACI 插件 组件

    ACI 插件 组件实现了访问控制。您无法串联用于检索和更新 ACI 属性的操作,因为它不安全地混合本地和远程属性。但是,您可以通过设置以下串联组件属性来串联用于检索用户条目的请求:

    nsActiveChainingComponents: cn=ACI Plugin,cn=plugins,cn=config

    权限:读、搜索和比较。

  • 资源限值 组件

    资源限制 组件根据用户绑定 DN 设置服务器限制。如果您串联资源限制组件,您可以对远程用户应用资源限值。要链资源限制组件操作,请添加以下链组件属性:

    nsActiveChainingComponents: cn=resource limits,cn=components,cn=config

    权限:读、搜索和比较。

  • 基于证书的身份验证 组件

    您可以在外部 绑定方法 中使用基于证书的身份验证组件。此组件可以从远程服务器上的数据库检索用户证书。当您允许此组件链时,它允许基于证书的身份验证与数据库链接一起使用。要串联此组件的操作,请添加以下链组件属性:

    nsActiveChainingComponents: cn=certificate-based authentication,cn=components,cn=config

    权限:读、搜索和比较。

  • 密码策略 组件

    密码策略 组件将 SASL 绑定添加到远程服务器。对于某种形式的 SASL 身份验证,需要使用用户名和密码进行身份验证。启用密码策略时,它允许服务器验证并实施所请求的特定身份验证方法,并应用适当的密码策略。要串联此组件的操作,请添加链组件属性:

    nsActiveChainingComponents: cn=password policy,cn=components,cn=config

    权限:读、搜索和比较。

  • SASL 组件

    SASL 组件允许 SASL 绑定到远程服务器。要串联此组件的操作,请添加链组件属性:

    nsActiveChainingComponents: cn=password policy,cn=components,cn=config

    权限:读、搜索和比较。

  • 在操作组件 后引用完整性

    引用完整性后期 组件会将包含 DN 的属性的更新传播到包含指向属性的指针的条目。例如,您可以在删除组时从组中自动删除条目。当组成员远程到静态组定义时,将 引用完整性后 插件与链一起使用简化了静态组的管理。

    nsActiveChainingComponents: cn=referential integrity postoperation,cn=plugins,cn=config

    权限:读、搜索和比较。

  • 属性唯一 组件

    属性唯一 组件验证指定属性的所有值都是唯一的。当您串联插件时,它会确认属性值是唯一的,即使属性是通过数据库链接更改的。要串联此组件的操作,请添加链组件属性:

    nsActiveChainingComponents: cn=attribute uniqueness,cn=plugins,cn=config

    权限:读、搜索和比较。

  • 角色 组件

    角色 组件串联数据库中条目的角色和角色分配。当您串联此组件时,即使链的数据库也会维护角色。要串联此组件的操作,请添加链组件属性:

    nsActiveChainingComponents: cn=roles,cn=components,cn=config

    权限:读、搜索和比较。

注意

您无法串联 角色 插件、密码策略 组件、复制 插件和 引用完整性 插件组件。当您在发布请求的服务器上启用引用 完整性 插件时,请确保您分析了性能、资源、时间和完整性需求。不是完整性检查可能非常耗时,且在内存和 CPU 上排空操作。

10.2. 使用命令行串联组件操作

您可以使用命令行添加允许链的组件:

流程

  1. 指定要包含在链中的组件:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com chaining config-set \ --add-comp="cn=referential integrity postoperation,cn=components,cn=config"
  2. 重启实例:

    # dsctl instance_name restart
  3. 在远程服务器的后缀中创建 ACI,该操作将被串联:

    # ldapmodify -D "cn=Directory Manager" -W -H 389 remoteserver.example.com -x
     dn: ou=People,dc=example,dc=com
     changetype: modify
     add: aci
     aci: (targetattr = "*")(target="ldap:///ou=customers,ou=People,dc=example,dc=com")
     (version 3.0; acl "RefInt Access for chaining"; allow
     (read,write,search,compare) userdn = "ldap:///cn=referential
     integrity postoperation,cn=plugins,cn=config";)

验证

  • 显示链允许的组件:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com chaining config-set \ --add-comp="cn=referential integrity postoperation,cn=components,cn=config"

10.3. 使用 Web 控制台串联组件操作

您可以使用 Web 控制台添加允许链的组件:

先决条件

  • 您已在 web 控制台中打开了 Directory Server 用户界面并选择了实例。

流程

  1. 打开 数据库
  2. 在左侧的导航中,选择 链配置条目
  3. 单击组件到 链字段下的 Add 按钮。
  4. 选择您要链的组件,然后点 Add & Save New components
  5. 在远程服务器的后缀中创建 ACI,该操作将被串联:

    # ldapmodify -D "cn=Directory Manager" -W -H 389 remoteserver.example.com -x
     dn: ou=People,dc=example,dc=com
     changetype: modify
     add: aci
     aci: (targetattr = "*")(target="ldap:///ou=customers,ou=People,dc=example,dc=com")
     (version 3.0; acl "RefInt Access for chaining"; allow
     (read,write,search,compare) userdn = "ldap:///cn=referential
     integrity postoperation,cn=plugins,cn=config";)

验证

  • 所选组件应串联。

第 11 章 链 LDAP 控制

LDAP 操作可以包含一些更改其行为的数据(名为 control 和在 ldap 协议中指定)。您可以指定要转发到远程服务器的 LDAP 控制。

11.1. 关于链 LDAP 控制

数据库链接将包含以下控制的请求转发到用于链 LDAP 控件的远程服务器:

  • 虚拟列表视图(VLV) 控制提供了特定条目的列表。
  • 服务器端按其 属性值对条目进行分类,通常使用特定的匹配规则。
  • Dereferencing control 从引用的条目中拉取指定的属性信息,并使用其余的搜索结果返回此信息。
  • Managed DSA 控制将智能引用返回为条目,而不是遵循这些引用。因此,可以更改或删除智能引用本身。
  • Loop 检测 控制跟踪服务器与另一个服务器链的次数。当计数达到配置的数量时,Loop 检测 会检测循环并通知客户端应用程序。
注意

当客户端应用程序向多个数据库发出请求时,数据库链接无法支持 服务器端排序和 VLV 控制。

以下是允许链及其对象标识符(OID)的一些 LDAP 控制:

控制名称OID

虚拟列表视图(VLV)

2.16.840.1.113730.3.4.9

服务器端排序

1.2.840.113556.1.4.473

受管 DSA

2.16.840.1.113730.3.4.2

循环检测

1.3.6.1.4.1.1466.29539.12

解引用搜索

1.3.6.1.4.1.4203.666.5.16

11.2. 使用命令行串联 LDAP 控制

您可以通过在命令行中使用 dsconf chaining config-set --add-control 来串联 LDAP 控制。

流程

  1. LDAP 控制:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com chaining \ config-set --add-control="2.16.840.1.113730.3.4.9"

    如果目录服务器的客户端创建自己的控制,并且串联远程服务器的操作,则添加自定义控制的对象标识符(OID)。

11.3. 使用 Web 控制台链 LDAP 控制

您可以使用 Web 控制台链 LDAP 控制。

先决条件

  • 您已在 web 控制台中打开了 Directory Server 用户界面并选择了实例。

流程

  1. 打开 Database 菜单。
  2. 选择 Chaining Configuration 条目。
  3. 单击 Forwarded LDAP Controls 字段下的 Add 按钮。
  4. 选择 LDAP 控制并点 Add & Save New Controls 按钮。

    如果目录服务器的客户端创建自己的控制,并且串联远程服务器的操作,则添加自定义控制的对象标识符(OID)。

  5. Save 按钮。

验证

  • 单击 Database 菜单,并确保所选的 LDAP 控制已串联。

法律通告

Copyright © 2024 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.