管理指南

Red Hat Directory Server 11

目录服务器的基本和高级管理

摘要

本指南涵盖了管理目录服务器实例和数据库的 GUI 和命令行流程。

使开源更多包含

红帽承诺替换我们的代码、文档和网页属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 信息

第 1 章 常规目录服务器管理任务

本章论述了管理目录服务器实例的一般任务。

1.1. 系统要求

1.2. 文件位置

1.3. 配置目录服务器的支持方法

您可以使用以下方法配置目录服务器:
  • 目录服务器提供的命令行工具
  • Web 控制台
重要
如果用户在控制台窗口之外更改配置,Web 控制台不会自动显示最新的设置。例如,如果您在 web 控制台打开时使用命令行更改配置,则在 web 控制台中不会更新新的设置。如果您使用 Web 控制台在不同计算机上更改配置,则也会应用此项。要临时解决这个问题,如果在控制台窗口之外更改了配置,请在浏览器中手动刷新 Web 控制台。

1.4. 使用 Web 控制台登录到目录服务器

Web 控制台是一个基于浏览器的图形用户界面(GUI),允许用户执行管理任务。Directory Server 软件包会自动为 Web 控制台安装目录服务器用户界面。
在 web 控制台中打开目录服务器:
  1. 使用浏览器连接到在 Directory Server 主机的端口 9090 上运行的 Web 控制台。例如:
    https://server.example.com:9090
  2. root 用户身份登录,或以具有 sudo 权限的用户身份登录。
  3. 选择 Red Hat Directory Server 条目。

1.5. 启动和停止目录服务器实例

1.5.1. 使用命令行启动和停止目录服务器实例

使用 dsctl 程序启动、停止或重启实例:
  • 启动实例:
    # dsctl instance_name start
  • 停止实例:
    # dsctl instance_name stop
  • 重启实例:
    # dsctl instance_name restart
另外,您可以使 Directory 服务器实例在系统引导时自动启动:
  • 对于单个实例:
    # systemctl enable dirsrv@instance_name
  • 对于服务器中的所有实例:
    # systemctl enable dirsrv.target

1.5.2. 使用 Web 控制台启动和停止目录服务器实例

作为命令行的替代选择,您可以使用 Web 控制台启动、停止或重启实例。
要启动、停止或重启目录服务器实例:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. Actions 按钮并选择要执行的操作:
    • 启动实例
    • 停止实例
    • 重启实例

1.6. 创建新目录服务器实例

详情请查看 Red Hat Directory Server 安装指南中的相应部分

1.7. 删除目录服务器实例

如果在服务器上运行多个实例,您可以删除它们的独立实例。
当您删除实例时,会删除 /var/lib/dirsrv/slapd-instance_name//etc/dirsrv/slapd-instance_name/ 目录的内容。
重要
/var/lib/dirsrv/slapd-instance_name/ 目录包含数据库,以及备份和恢复目录。/etc/dirsrv/slapd-instance_name/ 目录包含实例配置和网络安全服务(NSS)数据库。在删除实例前,备份此数据。

1.7.1. 使用命令行删除实例

使用命令行删除实例:
# dsctl instance_name remove --do-it
Removing instance ...
Completed instance removal

1.7.2. 使用 Web 控制台删除实例

使用 Web 控制台删除实例:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 单击 Actions 按钮,然后选择 Remove instance

1.8. 设置目录服务器配置参数

目录服务器将其配置存储在 cn=config 目录条目中。每个配置参数都是 LDAP 属性,参数的值是此属性中设置的值。

1.8.1. 管理配置参数

您可以通过以下方法设置、更新和删除配置参数:
  • 使用 dsconf 工具:
    注意
    红帽建议使用 dsconf 工具来管理目录服务器配置。

    例 1.1. 使用 dsconf设置配置参数

    例如,要将错误日志级别设置为 16384,请使用 dsconf 工具更新 nsslapd-errorlog-level 参数:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-errorlog-level=16384
    有关使用 dsconf 的详情,请查看 dsconf(8) man page。
  • 使用 LDAP 接口:

    例 1.2. 使用 LDAP 接口设置配置参数

    例如,要将错误日志级别设置为 16384,请使用 LDAP 接口更新 nsslapd-errorlog-level 参数:
    # ldapmodify -D "cn=Directory Manager" -W -x -H ldap://server.example.com:389
    
    dn: cn=config
    replace: nsslapd-errorlog-level
    nsslapd-errorlog-level: 16384
  • 编辑 /etc/dirsrv/slapd-instance_name/dse.ldif 文件。
    警告
    只要实例成功启动,请不要手动编辑此文件,因为这可能导致 Directory 服务器按预期工作,或者实例无法启动。

1.8.2. Directory 服务器存储其配置

目录服务器将 cn=config 条目中的配置存储在 /etc/dirsrv/slapd-instance_name/dse.ldif 文件中。服务器仅存储您在此文件中修改的参数。未列出的属性,使用它们的默认值。这可让您通过显示 /etc/dirsrv/slapd-instance_name/dse.ldif 文件来识别在这个实例中设置的所有配置参数。
重要
只要实例成功启动,不要手动编辑 /etc/dirsrv/slapd-instance_name/dse.ldif 文件。
有关如何编辑配置参数的详情,请参考 第 1.8.1 节 “管理配置参数”

1.8.3. 使用默认值的好处

如果没有设置参数,Directory 服务器将使用此参数的默认值。使用默认值的好处是,新版本通常会提供优化的设置并提高安全性。
例如,如果您没有设置 passwordStorageScheme 属性,Directory 服务器会自动使用最强大的支持的密码存储方案。如果将来的更新更改了默认值以提高安全性,当用户设置密码时,将使用新的存储方案自动加密密码。

1.8.3.1. 删除参数以使用默认值

如果设置了参数,且您想要使用默认值,请删除该参数:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config delete parameter_name
重要
您无法删除某些参数,如 nsslapd-secureport 将它们重置为默认值。如果您尝试删除它们,服务器会拒绝带有服务器的请求 无法执行(53) 错误。

1.8.4. dsconf config backend 命令限制

dsconf config backend 命令检索和设置后端配置。该命令有以下参数:
  • get
  • set
dsconf config backend get 命令检索带有设置值的所有服务器后端配置属性,例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com:389 backend config get

nsslapd-lookthroughlimit: 5000
nsslapd-mode: 600
nsslapd-idlistscanlimit: 2147483646
…
注意
您只能使用 dsconf config backend get 命令获取完整的属性值,而不是指定属性的值。
dsconf config backend set 命令单独设置后端配置属性。要设置值,请指定与 LDAP 属性名称匹配的选项,例如:
# dsconf -D "cn=Directory Manager"  ldap://server.example.com:389 backend config set --lookthroughlimit 4000  --cache-autosize-split 24
以下是 dsconf backend config set 命令选项和 LDAP 属性名称映射:

表 1.1.  dsconf backend config set 命令选项和 LDAP 属性名称的映射

dsconf backend config set 命令选项 LDAP 属性名称
--lookthroughlimit nsslapd-lookthroughlimit
--mode nsslapd-mode
--idlistscanlimit nsslapd-idlistscanlimit
--directory nsslapd-directory
--dbcachesize nsslapd-dbcachesize
--logdirectory nsslapd-db-logdirectory
--txn-wait nsslapd-db-transaction-wait
--checkpoint-interval nsslapd-db-checkpoint-interval
--compactdb-interval nsslapd-db-compactdb-interval
--compactdb-time nsslapd-db-compactdb-time
--txn-batch-val nsslapd-db-transaction-batch-val
--txn-batch-min nsslapd-db-transaction-batch-min-wait
--txn-batch-max nsslapd-db-transaction-batch-max-wait
--logbufsize nsslapd-db-logbuf-size
--locks nsslapd-db-locks
--locks-monitoring-enabled nsslapd-db-locks-monitoring-enabled
--locks-monitoring-threshold nsslapd-db-locks-monitoring-threshold
--locks-monitoring-pause nsslapd-db-locks-monitoring-pause
--import-cache-autosize nsslapd-import-cache-autosize
--import-cachesize nsslapd-import-cachesize
--cache-autosize nsslapd-cache-autosize
--cache-autosize-split nsslapd-cache-autosize-split
--exclude-from-export nsslapd-exclude-from-export
--pagedlookthroughlimit nsslapd-pagedlookthroughlimit
--pagedidlistscanlimit nsslapd-pagedidlistscanlimit
--rangelookthroughlimit nsslapd-rangelookthroughlimit
--backend-opt-level nsslapd-backend-opt-level
--deadlock-policy nsslapd-db-deadlock-policy
--db-home-directory nsslapd-db-home-directory
--db-lib nsslapd-backend-implement

1.9. 更改 LDAP 和 LDAPS 端口号

默认情况下,Directory 服务器使用端口 389 作为 LDAP,如果启用,则 LDAPS 协议的端口 636。您可以更改这些端口号,例如,在一个主机上运行多个目录服务器实例。
重要
您分配给实例的协议的新端口不得被其他服务使用。

1.9.1. 使用命令行更改端口号

要使用命令行更改端口号,请更新以下参数:
  • nsslapd-port :存储实例用于 LDAP 协议的端口号。
  • nsslapd-secureport :存储实例用于 LDAPS 协议的端口号。
使用命令行更改 LDAP 和 LDAPS 协议的端口号:
  1. 另外,还可显示实例当前配置的端口号:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com config get nsslapd-port nsslapd-secureport
    nsslapd-port: 389
    nsslapd-secureport: 636
  2. 更改 LDAP 端口:
    1. 设置 LDAP 协议的端口。例如,将其设置为 1389
      # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-port=1389
      Successfully replaced "nsslapd-port"
    2. 为您在上一步中分配的 LDAP 端口设置 ldap_port_t 类型:
      # semanage port -a -t ldap_port_t -p tcp 1389
  3. 更改 LDAPS 端口:
    1. 设置 LDAPS 协议的端口。例如,将其设置为 1636
      # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-secureport=1636
      Successfully replaced "nsslapd-secureport"
    2. 为您在上一步中分配的 LDAPS 端口设置 ldap_port_t 类型:
      # semanage port -a -t ldap_port_t -p tcp 1636
  4. 重启实例:
    # dsctl instance_name restart

1.9.2. 使用 Web 控制台更改端口号

使用 Web 控制台更改 LDAP 和 LDAPS 协议的端口号:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 更改 LDAP 端口:
    1. 打开 Server Settings 菜单。
    2. Server Settings 选项卡中,将新端口号填写到 LDAP Port 字段中。
    3. 点击 Save
  4. 更改 LDAPS 端口:
    1. 打开 Server Settings 菜单。
    2. General Settings 选项卡中,将新端口号填写到 LDAPS Port 字段中。
    3. 点击 Save

1.10. 使用目录服务器插件

目录服务器提供多个核心插件,如复制、服务类和属性语法验证。核心插件默认启用。
此外,Directory 服务器软件包包含进一步的插件,用于增强功能,如属性唯一性和属性链接。但是,并非所有插件都默认启用。

1.10.1. 列出可用的插件

1.10.1.1. 使用命令行列出可用的插件

使用命令行列出所有可用的插件:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin list
7-bit check
Account Policy Plugin
...
您需要插件的确切名称,例如使用命令行启用或禁用它。

1.10.1.2. 使用 Web 控制台列出可用的插件

使用 Web 控制台显示所有可用插件:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 选择 Plugins 菜单。
另外,您可以通过在 Filter Plugins 字段中输入名称来过滤插件。

1.10.2. 启用和禁用插件

1.10.2.1. 使用命令行启用和禁用插件

要使用命令行启用或禁用插件,请使用 dsconf 实用程序。
注意
dsconf 命令要求您提供插件的名称。有关显示所有插件名称的详情,请参考 第 1.10.1.1 节 “使用命令行列出可用的插件”
例如,要启用自动 成员 插件:
  1. 启用插件:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin automember enable
  2. 重启实例:
    # dsctl instance_name restart

1.10.2.2. 使用 Web 控制台启用和禁用插件

使用 Web 控制台启用或禁用插件:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 选择 Plugins 菜单。
  4. 选择 All Plugins 选项卡。
  5. 点击您要启用或禁用的插件右侧的 Edit Plugin 按钮。
  6. 将状态更改为 ON,以启用或设置为 OFF 来禁用插件。

1.10.3. 配置插件

1.10.3.1. 使用命令行配置插件

要配置插件设置,请使用 dsconf plugin 命令:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin \
     plug-in-specific_subcommand ...
如需您可以配置的插件列表,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin --help

1.10.3.2. 使用 Web 控制台配置插件

使用 Web 控制台配置插件:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 选择 Plugins 菜单。
  4. 选择 All Plugins 选项卡。
  5. 选择插件并单击 Show Advanced Settings
  6. 打开特定于插件的选项卡。
  7. 设置适当的设置。

1.10.4. 设置插件优先级

插件优先级是其按照插件执行顺序的优先级。对于预和发布插件,这可让在启动下一个插件前执行和完成插件,以便下一个插件利用以前的插件的结果。
优先级可以设置为从 1(最高优先级)到 99(最低优先级)。如果没有设置任何优先级,则默认为 50
警告
仅在自定义插件中设置优先级值。更新核心插件的值可能会导致 Directory 服务器无法正常工作,不受红帽支持。

1.10.4.1. 使用命令行设置插件优先级

使用命令行更新插件的优先级值:
  1. 设置插件的优先级。例如,要将 示例 插件的优先级设置为 1
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin edit example --precedence 1
  2. 重启实例:
    # dsctl instance_name restart

1.10.4.2. 使用 Web 控制台设置插件优先级

使用 Web 控制台更新插件的优先级值:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Plugins 菜单。
  4. 选择 All Plugins
  5. 按您要为其配置优先级值的插件旁边的 Edit Plugin 按钮。
  6. 更新 Plugin Precedence 字段中的值。
  7. 点击 Save

1.11. 创建并使用 .dsrc 文件为目录服务器命令行工具设置默认选项

~/.dsrc 文件简化了使用 Directory Server 命令行工具的命令。默认情况下,这些工具要求您通过 LDAP URL 或将可分辨名称(DN)绑定到命令。如果您将这些设置存储在 ~/dsrc 文件中,您可以使用命令行工具而无需每次指定这些设置。

1.11.1. .dsrc File Simplifies commands

以下是 ~/.dsrc 文件示例,用于指定实例的 LDAP URL 和绑定 DN:
[server1]
uri = ldap://server1.example.com
binddn = cn=Directory Manager
basedn = dc=example,dc=com
使用这些设置,您可以使用较短的目录服务器命令。例如,创建用户帐户:
# dsidm server1 user create
如果没有 ~/.dsrc 文件,您必须在命令中指定绑定 DN、LDAP URL 和基本 DN:
# dsidm -D cn=Directory Manager ldap://server1.example.com -b "dc=example,dc=com" user create

1.11.2. 使用 dsctl 实用程序创建一个 .dsrc 文件

您可以使用 dsctl 工具创建它,而不是手动创建 ~/.dsrc 文件:
# dsctl instance_name dsrc create ...
您可以将以下选项传递给命令:
  • --URI :设置实例的 URL,格式为 protocol://host_name_or_IP_address_or_socket
    示例:
    • --uri ldap://server.example.com
    • --uri = ldaps://server.example.com
    • --uri = ldapi://%%2fvar%%2frun%%2fslapd-instance_name.socket
      如果您设置了目录服务器套接字的路径,请在路径中使用 %%02 而不是斜杠(/)。
      重要
      如果您使用 ldapi URL,服务器会识别运行 Directory Server 命令行工具的用户 ID (UID)和组 ID (GID)。如果您以 root 用户身份运行该命令,则 UID 和 GID 为 0, Directory 服务器将自动验证您是否作为 cn=Directory Manager 进行验证,而无需输入对应的密码。
  • --Start TLS :设置将工具配置为连接到 LDAP 端口,然后发送 STARTTLS 命令来切换到加密的连接。
  • --base DN :设置基本可分辨名称(DN)。例如: --basedn dc=example,dc=com
  • --bind DN :设置绑定 DN。例如 :--binddn cn=Directory Manager
  • --pwdfile :设置包含绑定 DN 密码的文件的路径。例如 :--pwdfile /root/rhds.pwd
  • --tls-cacertdir :当您使用 LDAPS 连接时,此参数中设置的路径定义了带有验证服务器证书所需的证书颁发机构(CA)证书的目录。例如 :--tls-cacertdir /etc/pki/CA/certs/
    请注意,在将 CA 证书复制到指定目录后,您必须使用 c_rehash /etc/pki/CA/certs/ 命令。
  • --tls-cert :设置到服务器证书的绝对路径。例如 :--tls-cert /etc/dirsrv/slapd-instance_name/Server-Cert.crt
  • --tls-key :设置到服务器私钥的绝对路径。例如 :--tls-key /etc/dirsrv/slapd-instance_name/Server-Cert.key
  • --tls-reqcert :设置在 TLS 会话中的服务器证书上执行哪些检查客户端实用程序。例如 :--tls-reqcert hard
    可用的参数如下:
    • Never :工具不请求或检查服务器证书。
    • Allow :实用程序忽略证书错误,连接建立。
    • hard :实用程序终止证书错误的连接。
  • --saslmech :设置用于 PLAINEXTERNAL 的 SASL 机制。例如 :--saslmech PLAIN

1.11.3. 使用目录服务器工具时的远程和本地连接解析

在保护目录服务器连接时,务必要区分远程和本地调用目录服务器命令。
当您使用指定的 LDAP URL 运行目录服务器命令时,服务器会将其视为远程连接,并检查 /etc/openldap/ldap.conf 配置文件以及系统范围的设置以继续该命令。
当您使用指定实例名称运行目录服务器命令时,服务器会检查 ~/.dsrc 文件是否存在,并应用以下逻辑继续:
  • 如果 ~/.dsrc 文件存在并包含实例名称和 LDAP URL,目录服务器将其视为远程连接,并检查 /etc/openldap/ldap.conf 配置文件和系统范围的设置。
  • 如果 ~/.dsrc 文件存在并且只包含指定的实例名称,或者 ~/.dsrc 文件不存在,目录服务器将其视为本地连接,并使用本地 dse.ldif 文件中的 nsslapd-certdir 设置来保护连接。如果没有 nsslapd-certdir,服务器使用默认路径 /etc/dirsrv/slapd-instance_name/ 来存储实例的网络安全服务(NSS)数据库。
有关 nsslapd-certdir 参数的更多信息,请参阅 nsslapd-certdir (证书和密钥数据库目录) 部分。

第 2 章 配置目录数据库

目录由数据库组成,目录树分布在数据库中。本章论述了如何创建 后缀、目录树的分支点,以及如何创建与每个后缀关联的数据库。本章还介绍了如何创建数据库链接来引用远程服务器上的数据库链接,以及如何使用引用将客户端指向目录数据的外部来源。

2.1. 创建和维护后缀

目录树的不同部分可以存储在不同的数据库中,然后这些数据库可以分布到多个服务器上。目录树包含名为节点的分支点。这些节点可以与数据库关联。后缀是与特定数据库关联的目录树的节点。以下是一个简单的目录树:

图 2.1. 具有一个根后缀的目录树

具有一个根后缀的目录树
ou=body 后缀以及它下面的所有条目和节点可能存储在一个数据库中,而 ou=groups 后缀在另一个数据库中,而 ou=contractors 后缀也位于另一个数据库中。

2.1.1. 创建后缀

root 后缀 是子修复的父项。它可以是为目录服务器设计的一个更大的树的一部分。sub-suffix 是根后缀下的分支。root 和 sub-suffixes 用于组织目录树的内容。root 和 sub-suffixes 的数据存储在数据库中。

2.1.1.1. 创建根后缀

目录可以包含多个根后缀。例如,一个托管多个网站的互联网服务提供商,一个用于 example.com,另一个用于 redhat.com。在这种情况下,需要两个 root 后缀。与 dc=example,dc=com 命名上下文对应,另一个对应于 dc=redhat,dc=com 命名上下文,如下图所示:

图 2.2. 具有两个根后缀的目录

具有两个根后缀的目录
也可以创建根后缀,从搜索操作中排除目录树的部分。例如,如果示例公司希望从一般 Example 公司目录的搜索中排除其办公室办公室。要实现此操作,目录需要两个 root 后缀。一个根后缀对应于常规示例公司目录树 dc=example,dc=com,一个根后缀对应于其目录树的关联分支 ou=europe,dc=example,dc=com。从客户端应用程序的角度来看,目录树如下所示:

图 2.3. 具有根后缀离线限制的目录搜索操作

具有根后缀离线限制的目录搜索操作
由目录的 dc=example,dc=com 分支上的客户端应用程序执行的搜索不会返回来自目录的 ou=europe,dc=example,dc=com 分支中的条目,因为它是一个单独的根后缀。
2.1.1.1.1. 使用命令行创建根后缀
使用 dsconf backend create 命令创建一个新的 root 后缀:
  1. 可选:识别已在使用的后缀和后端数据库:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list
    dc=example,dc=com (userroot)
    括号中的名称是存储对应后缀数据的后端数据库。在下一步中创建 root 后缀时,您无法使用现有数据库名称。
  2. example 后端数据库中创建 dc=example,dc=net root 后缀:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend create \
         --suffix="dc=example,dc=net" --be-name="example"
2.1.1.1.2. 使用 Web 控制台创建根后缀
使用 Web 控制台创建新的 root 后缀:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Database 菜单。
  4. Create Suffix
  5. 输入后缀 DN 和后端名称。例如:
  6. 选择 Create The Top Suffix Entry
  7. Create Suffix

2.1.1.2. 创建子修复

在某些情况下,管理员希望将目录树的分支存储在单独的数据库中。例如,如果管理员创建 ou=europe,dc=example,dc=com 条目,则此后缀存储在单独的数据库中。同时,dc=example,com root 后缀及其所有子条目(除 ou=europe、dc=example、dc=com 和 subentries 除外)也存储在单独的数据库中。

图 2.4. 带有子后缀的目录树

带有子后缀的目录树
2.1.1.2.1. 使用命令行创建子修复
使用 dsconf backend create 命令创建一个新的子修复。例如,在 dc=example,dc=com root 后缀下的一个新的、名为 people 的数据库中创建 ou=People,dc=example,dc=com 子后缀:
  1. 可选:识别已在使用的后缀和后端数据库:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list
    dc=example,dc=com (userroot)
    括号中的名称是存储对应后缀数据的后端数据库。在下一步中创建子命令时,您无法使用现有数据库名称。
  2. 创建子命令。例如,要创建 ou=People,dc=example,dc=com 子组件 以及示例 后端数据库,请输入:
    # 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"
2.1.1.2.2. 使用 Web 控制台创建子修复
使用 Web 控制台创建新的子修复:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Database 菜单。
  4. 选择您要创建子跟踪的后缀,单击 Suffix Tasks,然后选择 Create Sub-Suffix
  5. 输入子修复 DN 和后端名称。例如:
  6. 选择 Create The Top Sub-Suffix Entry
  7. Create Sub-Suffix

2.1.2. 维护后缀

2.1.2.1. 查看默认命名上下文

命名上下文与后缀类似,它是命名目录条目的 root 结构。根据目录和数据结构,可以有多个命名上下文。例如,标准目录服务器配置具有用户后缀,如 dc=example,dc=com,以及 cn=config 中的配置后缀。
许多目录树有多个命名上下文,用于不同类型的条目或逻辑数据划分。访问目录服务器的客户端可能不知道他们需要使用哪些命名上下文。目录服务器有一个服务器配置属性,如果客户端没有其他命名上下文配置,则向客户端发送默认命名上下文。
默认命名上下文在 cn=config 中的 nsslapd-defaultnamingcontext 属性中设置。这个值被传播到 root DSE (Directory Server Agent Service Entry),可通过检查根 DSE 中的 默认的namingcontext 属性来匿名查询客户端:
# ldapsearch -p 389 -h server.example.com -x -b "" -s base | egrep namingcontext
namingContexts: dc=example,dc=com
namingContexts: dc=example,dc=net
namingContexts: dc=redhat,dc=com
defaultnamingcontext: dc=example,dc=com
重要
为保持配置一致性,请不要从 nsslapd-allowed-to-delete-attrs 列表中删除 nsslapd-defaultnamingcontext 属性。
默认情况下,nsslapd-defaultnamingcontext 属性包含在可以被删除的属性列表中,在 nsslapd-allowed-to-delete-attrs 属性中。这允许删除当前的默认后缀,然后相应地更新服务器配置。
如果出于某种原因,nsslapd-defaultnamingcontext 属性会从可以删除的配置属性列表中删除,则不会保留对该属性的更改。如果删除了默认后缀,则该更改无法传播到服务器配置。这意味着 nsslapd-defaultnamingcontext 属性保留旧信息,而不是为空(removed),这是正确的和当前的配置。

2.1.2.2. 禁用后缀

在某些情况下,需要禁用目录中的后缀。如果禁用后缀,客户端无法再访问与后缀相关的数据库内容。
2.1.2.2.1. 使用命令行禁用后缀
要使用命令行禁用后缀,请将后端数据库名称传递给 dsconf 后端后缀 set --disable 命令。例如,禁用 o=test 后缀:
  1. 显示后缀及其对应的后端:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list
    dc=example,dc=com (userroot)
    o=test (test_database)
    这个命令显示每个后缀旁的后端数据库名称。下一步需要后缀的数据库名称。
  2. 禁用后缀:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend \
         suffix set --disable "test_database"

2.1.2.3. 删除后缀

如果不再需要后缀,管理员可以将其从数据库中删除。
警告
删除后缀也会删除与该后缀关联的所有数据库条目和复制信息。
2.1.2.3.1. 使用命令行删除后缀
要使用命令行删除后缀,请使用 dsconf backend delete 命令。例如,要删除 o=test 后缀:
  1. 显示后缀及其对应的后端:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list
    dc=example,dc=com (userroot)
    o=test (test_database)
    这个命令显示每个后缀旁的后端数据库名称。下一步需要后缀的数据库名称。
  2. 删除后端数据库和对应的后缀:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend delete test_database
    Deleting Backend cn=test_database,cn=ldbm database,cn=plugins,cn=config :
    Type 'Yes I am sure' to continue: Yes I am sure
    The database, and any sub-suffixes, were successfully deleted
2.1.2.3.2. 使用 Web 控制台删除后缀
使用 Web 控制台删除后缀:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Database 菜单。
  4. 选择后缀,单击 后缀任务,然后选择 Delete Suffix。
  5. 单击 Yes 以确认。

2.2. 创建和维护数据库

创建后缀以整理目录数据后,创建数据库以包含该目录的数据。
注意
如果您使用 dsconf 实用程序或 Web 控制台创建后缀,目录服务器会自动创建数据库。

2.2.1. 创建数据库

目录树可以通过多个目录服务器数据库分发。在多个数据库间分发数据的方法有两种:
每个后缀有一个数据库。每个后缀的数据都包含在单独的数据库中。
添加三个数据库来存储独立后缀中包含的数据:
树单元的这个划分对应于三个数据库,例如:
在本例中,DB1 包含 ou=body 的数据以及 dc=example,dc=com 的数据,因此客户端可以根据 dc=example,dc=com 进行搜索。但是,DB2 仅包含 ou=groups 的数据,DB3 仅包含 ou=contractors 的数据:
一个后缀的多个数据库。
假设目录树的 ou=body 分支中的条目数量较大,因此需要两个数据库来存储它们。在这种情况下,ou=body 中包含的数据 可以在两个数据库中分发:
DB1 包含来自 A-K、DB2 的名称的人员,DB2 则包含来自 L-Z 的人。DB3 包含 ou=groups 数据,DB4 包含 ou=contractors 数据。
自定义插件可在多个数据库之间从单个后缀分发数据。请联络红帽咨询,了解如何为目录服务器创建分发逻辑。

2.2.1.1. 使用命令行为单后缀创建新数据库

使用 ldapmodify 命令行工具向目录配置文件添加新数据库。数据库配置信息存储在 cn=ldbm database,cn=plugins,cn=config 条目中。添加新数据库:
  1. 运行 ldapmodify,并为新数据库创建条目。
    # ldapmodify -a -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    
    dn: cn=UserData,cn=ldbm database,cn=plugins,cn=config
    changetype: add
    objectclass: extensibleObject
    objectclass: nsBackendInstance
    nsslapd-suffix: ou=people,dc=example,dc=com
    添加的条目对应于名为 UserData 的数据库,其中包含 root 或 sub-suffix ou=body,dc=example,dc=com 的数据。
  2. 创建 root 或子修复,如 第 2.1.1.1.1 节 “使用命令行创建根后缀”第 2.1.1.2.1 节 “使用命令行创建子修复” 所述。DN 属性中给出的数据库名称必须与后缀条目的 nsslapd-backend 属性中的值对应。

2.2.1.2. 为单个后缀添加多个数据库

单个后缀可以在多个数据库之间分布。但是,若要分发后缀,必须创建自定义分发功能来扩展目录。有关创建自定义发布功能的更多信息,请联系红帽咨询。
注意
分发条目后,无法重新分发它们。适用以下限制:
  • 部署条目分发后无法更改分发功能。
  • 如果将 LDAP modrdn 操作分发到不同的数据库中,则无法使用 LDAP modrdn 操作来重命名条目。
  • 无法复制分布式本地数据库。
  • 如果将它们分发到不同的数据库中,则无法使用 ldapmodify 操作来更改条目。
违反这些限制可防止目录服务器正确查找和返回条目。
创建自定义分发逻辑插件后,将其添加到目录中。
分发逻辑是后缀中声明的功能。对于到达这个后缀的每个操作都会调用此功能,包括在后缀上面启动的子树搜索操作。可使用 Web 控制台和命令行界面将分发功能插入到后缀中。
在后缀中添加自定义发布功能:
  1. 运行 ldapmodify
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
  2. 在后缀条目本身中添加以下属性,提供有关自定义分发逻辑的信息:
    dn: suffix
    changetype: modify
    add: nsslapd-backend
    nsslapd-backend: Database1
    -
    add: nsslapd-backend
    nsslapd-backend: Database2
    -
    add: nsslapd-backend
    nsslapd-backend: Database3
    -
    add: nsslapd-distribution-plugin
    nsslapd-distribution-plugin: /full/name/of/a/shared/library
    -
    add: nsslapd-distribution-funct
    nsslapd-distribution-funct: distribution-function-name
    nsslapd-backend 属性指定与此后缀关联的所有数据库。nsslapd-distribution-plugin 属性指定插件使用的库名称。nsslapd-distribution-funct 属性提供分发功能本身的名称。

2.2.2. 维护目录数据库

2.2.2.1. 在只读模式下设置数据库

当数据库处于只读模式时,您无法创建、修改或删除任何条目。当只读模式很有用时,其中一个情况是手动初始化消费者或从目录服务器备份或导出数据。只读模式可确保给定时间使用这些数据库状态的传真镜像。
命令行工具和 Web 控制台不会在导出或备份操作前自动将目录置于只读模式,因为这会使您的目录无法进行更新。但是,对于多层次复制,这可能不是问题。
2.2.2.1.1. 使用命令行在只读模式下设置数据库
要在只读模式下设置数据库,请使用 dsconf backend suffix set 命令。例如,要在只读模式下设置 o=test 后缀的数据库:
  1. 显示后缀及其对应的后端:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list
    dc=example,dc=com (userroot)
    o=test (test_database)
    这个命令显示每个后缀旁的后端数据库名称。下一步需要后缀的数据库名称。
  2. 以只读模式设置数据库:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix set --enable-readonly "test_database"
2.2.2.1.2. 使用 Web 控制台在只读模式下设置数据库
以只读模式设置数据库:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Database 菜单。
  4. 选择后缀条目。
  5. 选择 Database Read-Only Mode
  6. 单击 Save Configuration

2.2.2.2. 将 Entire 目录服务器置于只读模式

如果目录服务器维护多个数据库,且所有数据库都需要放在只读模式下,则可以在单个操作中完成此操作。
警告
此操作还使目录服务器配置为只读;因此,您无法更新服务器配置、启用或禁用插件,甚至重启目录服务器,即使它处于只读模式。启用只读模式后,除非您手动修改配置文件,否则 无法撤消
注意
如果目录服务器包含副本,请不要使用 只读模式,因为它将禁用复制。
2.2.2.2.1. 使用命令行将 Entire Directory Server 置于只读模式
为目录服务器启用只读模式:
  1. nsslapd-readonly 参数设置为 on
    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-readonly=on
  2. 重启实例:
    # dsctl instance_name restart
2.2.2.2.2. 使用 Web 控制台将 Entire Directory Server 置于只读模式
为目录服务器启用只读模式:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings 菜单,然后选择 Server Settings 条目。
  4. Advanced Settings 选项卡中,选择 Server Read-Only
  5. 点击 Save

2.2.2.3. 删除数据库

如果不再需要后缀,您可以删除存储后缀的数据库。
2.2.2.3.1. 使用命令行删除数据库
要删除数据库,可使用 dsconf backend delete 命令。例如,要删除 o=test 后缀的数据库:
  1. 显示后缀及其对应的后端:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list
    dc=example,dc=com (userroot)
    o=test (test_database)
    在下一步中,您需要后端数据库的名称(在后缀旁边显示)。
  2. 删除数据库:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend delete "test_database"
2.2.2.3.2. 使用 Web 控制台删除数据库
使用 Web 控制台删除数据库:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Database 菜单。
  4. 选择要删除的后缀,单击 后缀任务,然后选择 Delete Suffix
  5. 单击 Yes 以确认。

2.2.2.4. 更改交易日志目录

事务日志可让 Directory 服务器在实例意外关闭后恢复数据库。在某些情况下,管理员想要更改事务日志的路径。例如,要将它们存储在与目录服务器数据库不同的物理磁盘中。
注意
要实现更高的性能,请将一个更快的磁盘挂载到包含事务日志的目录,而不是更改位置。详情请查看 红帽目录服务器性能调优指南 中的相应部分。
更改事务日志目录的位置:
  1. 停止目录服务器实例:
    # dsctl instance_name stop
  2. 为事务日志创建新位置。例如:
    # mkdir -p /srv/dirsrv/instance_name/db/
  3. 设置权限,使其只启用 Directory 服务器访问该目录:
    # chown dirsrv:dirsrv /srv/dirsrv/instance_name/db/
    # chmod 770 /srv/dirsrv/instance_name/db/
  4. 从以前的事务日志目录中删除所有 __db the 文件。例如:
    # rm /var/lib/dirsrv/slapd-instance_name/db/__db.*
  5. 所有日志站 文件从之前移到新的事务日志目录中。例如:
    # mv /var/lib/dirsrv/slapd-instance_name/db/log.* \
         /srv/dirsrv/instance_name/db/
  6. 如果 SELinux 在 enforcing 模式下运行,请在目录中设置 dirsrv_var_lib_t 上下文:
    # semanage fcontext -a -t dirsrv_var_lib_t /srv/dirsrv/instance_name/db/
    # restorecon -Rv /srv/dirsrv/instance_name/db/
  7. 编辑 /etc/dirsrv/slapd-instance_name/dse.ldif 文件,并更新 cn=config,cn=ldbm database,cn=plugins,cn=config 条目下的 nsslapd-db-logdirectory 参数。例如:
    dn: cn=config,cn=ldbm database,cn=plugins,cn=config
    ...
    nsslapd-db-logdirectory: /srv/dirsrv/instance_name/db/
  8. 启动实例:
    # dsctl instance_name start

2.5. 使用引用

引用告知客户端应用程序要联系哪些服务器以获取特定信息。当客户端应用程序请求本地服务器上不存在的目录条目或数据库已脱机进行维护时,会发生此重定向。本节包含有关引用的以下信息:
有关如何在目录中使用引用的概念信息,请参阅 红帽目录服务器部署指南

2.5.1. 以引用模式启动服务器

引用用于将客户端应用程序重定向到另一台服务器,而当前服务器不可用时,或者客户端请求未保存在当前服务器上的客户端请求信息。例如,在对目录服务器进行配置更改时,以引用模式启动目录服务器将在该服务器不可用时引用所有客户端。以引用 模式启动目录服务器通过 refer 命令完成。
使用 refer 选项运行 nsslapd
# ns-slapd refer -D /etc/dirsrv/slapd-instance_name [-p port] -r referral_url
  • /etc/dirsrv/slapd-instance_name/ 是目录服务器配置文件所在的目录。这是 Red Hat Enterprise Linux 中的默认位置。
  • port 是以引用模式启动的目录服务器的可选端口号。
  • referral_url 是返回到客户端的引用。LDAP URL 的格式在 附录 C, LDAP URL 中介绍。

2.5.2. 设置默认引用

目录服务器将默认引用返回到客户端应用程序,该应用提交在目录中维护的任何后缀中不包含的 DN 上的操作。以下流程描述了使用命令行为目录设置默认引用。

2.5.2.1. 使用命令行设置默认引用

使用 dsconf config replace 命令在 nsslapd-referral 参数中设置默认引用。例如,要将 ldap://directory.example.com/ 设置为默认引用:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-referral="ldap://directory.example.com/"

2.5.3. 创建智能引用

智能引用将目录条目或目录树映射到特定的 LDAP URL。通过使用智能引用,客户端应用程序可以引用特定服务器或特定服务器上的特定条目。
例如,客户端应用程序请求目录条目 uid=jdoe,ou=body,dc=example,dc=com。为客户端返回一个智能引用,它指向服务器 directory.europe.example.com 中的条目 cn=john doe,o=people,ou=europe,dc=example,dc=com
目录使用智能引用的方式符合 RFC 2251 第 4.1.11 中指定的标准。RFC 可从 http://www.ietf.org/rfc/rfc2251.txt 下载。

2.5.3.1. 使用命令行创建智能引用

要创建一个智能引用,创建带有 referral 对象类的相对目录条目,并将 ref 属性设置为引用 LDAP URL。
例如,要创建一个名为 uid=user,ou=body,dc=example,dc=com 的智能引用,引用 ldap://directory.europe.example.com/cn=user,ou=people,ou=europe,dc=example,dc=com
# ldapadd -D "cn=Directory Manager" -W -p 389 -h server2.example.com -x
dn: uid=user,ou=people,dc=example,dc=com
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
objectclass: referral
sn: user
uid: user
cn: user
ref: ldap://directory.europe.example.com/cn=user,ou=people,ou=europe,dc=example,dc=com
注意
目录服务器在 LDAP URL 中的空格后忽略任何信息。因此,在用作引用的 LDAP URL 中使用 %20 而不是空格。
如果 DN 路径中已有引用,请将 -M 选项与 ldapadd 一起使用。有关智能引用的更多信息,请参阅 目录服务器部署指南

2.5.4. 创建后缀引用

以下流程描述了在 后缀 中创建引用。这意味着后缀使用引用而不是数据库链接处理操作。
警告
当您将后缀配置为返回引用时,会忽略与后缀关联的数据库中的 ACI。另外,创建后缀引用仅适用于非复制后缀。

2.5.4.1. 使用命令行创建后缀引用

创建后缀引用:
  1. (可选)创建 root 或子修复(如果尚不存在)。详情请查看 第 2.1.1 节 “创建后缀”
  2. 将引用添加到后缀。例如:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix set --add-referral="ldap://directory.example.com/" database_name

2.5.4.2. 使用 Web 控制台创建后缀引用

创建后缀引用:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Database 菜单。
  4. (可选)创建 root 或子修复(如果尚不存在)。详情请查看 第 2.1.1 节 “创建后缀”
  5. 选择列表中的后缀,并打开 referrals 选项卡
  6. Create referral
  7. 填写字段以创建引用 URL。
  8. Create referral

2.6. 验证后端数据库的完整性

dsctl dbverify 命令可让管理员验证后端数据库的完整性。例如,验证 userroot 数据库:
  1. 另外,还可列出实例的后端数据库:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list
    dc=example,dc=com (userroot)
    稍后的步骤需要数据库的名称。
  2. 停止 Directory 服务器实例:
    # dsctl instance_name stop
  3. 验证数据库:
    # dsctl instance_name dbverify userroot
    [04/Feb/2020:13:11:02.453624171 +0100] - INFO - ldbm_instance_config_cachememsize_set - force a minimal value 512000
    [04/Feb/2020:13:11:02.465339507 +0100] - WARN - ldbm_instance_add_instance_entry_callback - ldbm instance userroot already exists
    [04/Feb/2020: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/2020:13:11:02.471079045 +0100] - ERR - bdb_config_load_dse_info - failed to read instance entries
    [04/Feb/2020:13:11:02.476173304 +0100] - ERR - libdb - BDB0522 Page 0: metadata page corrupted
    [04/Feb/2020:13:11:02.481684604 +0100] - ERR - libdb - BDB0523 Page 0: could not check metadata page
    [04/Feb/2020: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/2020: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. 启动 Directory 服务器实例:
    # dsctl instance_name start

第 3 章 管理目录条目

您可以使用命令行或 Web 控制台管理目录条目。

3.1. 使用命令行管理目录条目

要使用命令行执行 LDAP 操作,请安装 openldap-clients 软件包。这个软件包安装的工具可让您:
  • 添加新条目
  • 在现有条目中添加新属性
  • 更新现有条目和属性
  • 从条目中删除条目和属性
  • 执行批量操作
安装 openldap-clients 软件包:
# yum install openldap-clients
注意
要执行 LDAP 操作,您需要适当的权限。有关访问控制的详情,请参考 第 18 章 管理访问控制

3.1.1. 为 ldapadd,ldapmodify, 和 ldapdelete 工具提供输入

当您在目录中添加、更新或删除条目或属性时,您可以使用工具的交互模式进入 LDAP 数据交换格式(LDIF)语句或将 LDIF 文件传递给它们。
有关 LDIF 的详情,请参考 第 B.1 节 “关于 LDIF 文件格式”

3.1.1.1. 使用互动模式提供输入

在交互模式中,ldapaddldapmodifyldapdelete 工具会从命令行读取输入。要退出互动模式,请按 Ctrl+D (^D)组合来发送 End Of File (EOF)转义序列。
在交互模式中,当按 Enter 两次或发送 EOF 序列时,实用程序会将语句发送到 LDAP 服务器。
使用互动模式:
  • 在不创建文件的情况下输入 LDIF 语句:

    例 3.1. 使用 ldapmodify 互动模式输入 LDIF 声明

    以下示例以交互模式启动 ldapmodify,删除 telephoneNumber 属性,并使用 cn=manager_name,ou=body,dc=example,dc=com 值添加到 uid=user,ou=body,dc=com 条目。在最后的声明后按 Ctrl+D 退出交互模式。
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    
    dn: uid=user,ou=people,dc=example,dc=com
    changetype: modify
    delete: telephoneNumber
    -
    add: manager
    manager: cn=manager_name,ou=people,dc=example,dc=com
    ^D
  • 要将 LDIF 语句重定向到目录服务器,由其他命令输出:

    例 3.2. 使用带有重定向内容的 ldapmodify 互动模式

    以下示例将 command_that_outputs_LDIF 命令的输出重定向到 ldapmodify。交互模式会在重定向的命令退出后自动退出。
    # command_that_outputs_LDIF | ldapmodify -D "cn=Directory Manager" \
         -W -p 389 -h server.example.com -x

3.1.1.2. 使用 LDIF 文件提供输入

在交互模式中,ldapaddldapmodifyldapdelete 工具从文件中读取 LDIF 语句。使用此模式向目录服务器发送大量 LDIF 语句。

例 3.3. 将带有 LDIF 声明的文件传递给 ldapmodify

  1. 使用 LDIF 语句创建一个文件。例如,使用以下语句创建 ~/example.ldif 文件:
    dn: uid=user,ou=people,dc=example,dc=com
    changetype: modify
    delete: telephoneNumber
    -
    add: manager
    manager: cn=manager_name,ou=people,dc=example,dc=com
    本例删除 telephoneNumber 属性,并将带有 cn=manager_name,ou=body,dc=example,dc=com 值的 manager 属性添加到 uid=user,ou=body,dc=example,dc=com 条目。
  2. 使用 -f file_name 选项将文件传递给 ldapmodify 命令:
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x \
         -f ~/example.ldif

3.1.2. 持续操作模式

如果您将多个 LDIF 语句发送到 Directory 服务器,且一个操作失败,该过程将停止。但是,在成功添加、修改或删除错误前处理的条目。
要忽略错误并继续批处理中的其他 LDIF 语句,请将 -c 选项传给 ldapaddldapmodify。例如:
# ldpamodify -c -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

3.1.3. 添加条目

要在目录中添加新条目,请使用 ldapaddldapmodify 工具。请注意,ldapadd 是到 /bin/ldapmodify 的符号链接。因此,ldapadd 执行与 ldapmodify -a 相同的操作。
注意
如果父条目已存在,您只能添加新目录条目。例如,如果 ou=body,dc=example,dc=com 父条目不存在,则无法添加 cn=user ,ou=body,dc=example,dc=com 父条目。

3.1.3.1. 使用 ldapadd添加条目

使用 ldapadd 工具来添加 cn=user,ou=body,dc=example,dc=com 用户条目:
# ldapadd -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user,ou=People,dc=example,dc=com
uid: user
givenName: given_name
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetorgperson
sn: surname
cn: user
注意
运行 ldapadd 会自动执行 changetype: add operation。因此,您不需要在 LDIF 语句中指定 changetype: add
有关命令中使用的参数的详情,请查看 ldapadd(1) man page。

3.1.3.2. 使用 ldapmodify 添加一个条目

使用 ldapmodify 工具来添加 cn=user,ou=body,dc=example,dc=com 用户条目:
# ldapmodify -a -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user,ou=People,dc=example,dc=com
uid: user
givenName: given_name
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetorgperson
sn: surname
cn: user
注意
-a 选项传给 ldapmodify 命令时,实用程序会自动执行 changetype: add operation。因此,您不需要在 LDIF 语句中指定 changetype: add
有关命令中使用的参数的详情,请查看 ldapmodify(1) man page。

3.1.3.3. 创建根条目

要创建数据库后缀的 root 条目,如 dc=example,dc=com,以 cn=Directory Manager 用户绑定并添加该条目。
DN 对应于数据库的 root 或子跟踪的 DN。
例如,添加 dc=example,dc=com 后缀:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: dc=example,dc=com
changetype: add
objectClass: top
objectClass: domain
dc: example
注意
只有在每个后缀都有一个数据库时,才能添加 root 对象。如果创建一个存储在多个数据库的后缀,则必须使用带有 -n back_end 选项的 ldif2db 工具来设置保存新条目的数据库。详情请查看 第 6.1.2 节 “使用命令行导入”

3.1.4. 更新目录条目

修改目录条目时,请使用 changetype: modify 语句。根据更改操作,您可以从条目中添加、更改或删除属性。
使用 ldapmodify 实用程序将 LDIF 语句发送到目录服务器。例如,在互动模式中:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
有关 ldapmodify 命令中使用的参数的详情,请查看 ldapmodify(1) man page。

3.1.4.1. 在条目中添加属性

若要向条目添加属性,请使用 add 操作。
例如,要将带有 555-1234567 值的 telephoneNumber 属性添加到 uid=user,ou=People,dc=example,dc=com 条目:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user,ou=People,dc=example,dc=com
changetype: modify
add: telephoneNumber
telephoneNumber: 555-1234567
如果属性是多值,您可以多次指定属性名称,以在单个操作中添加所有值。例如,要将两个 telephoneNumber 属性一次添加到 uid=user,ou=People,dc=example,dc=com
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user,ou=People,dc=example,dc=com
changetype: modify
add: telephoneNumber
telephoneNumber: 555-1234567
telephoneNumber: 555-7654321

3.1.4.2. 更新属性的值

更新属性值的步骤取决于属性是单值还是多值。

更新单值属性

更新单值属性时,请使用 replace 操作来覆盖现有值。以下命令更新 uid=user,ou=People,dc=example,dc=com 条目的 manager 属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user,ou=People,dc=example,dc=com
changetype: modify
replace: manager
manager: uid=manager_name,ou=People,dc=example,dc=com

更新多值属性的特定值

要更新多值属性的特定值,您必须首先删除您要替换的条目,然后添加新值。以下命令只更新 uid=用户,ou=People,dc=example,dc=com 条目中当前设置为 555-1234567telephoneNumber 属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user,ou=People,dc=example,dc=com
changetype: modify
delete: telephoneNumber
telephoneNumber: 555-1234567
-
add: telephoneNumber
telephoneNumber: 555-9876543

3.1.4.3. 从条目中删除属性

要从条目中删除属性,请使用 delete 操作。

删除属性

例如,要从 uid=user,ou=People,dc=example,dc=com 条目中删除 manager 属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user,ou=People,dc=example,dc=com
changetype: modify
delete: manager
注意
如果属性包含多个值,则此操作会删除所有这些值。

删除多值属性的特定值

如果要从多值属性中删除特定值,请在 LDIF 语句中列出属性及其值。例如,要从 uid=用户,ou=People,dc=example,dc=com 条目中只删除设为 555-1234567telephoneNumber 属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user,ou=People,dc=example,dc=com
changetype: modify
delete: telephoneNumber
telephoneNumber: 555-1234567

3.1.5. 删除条目

删除条目会从目录中删除该条目。
注意
您只能删除没有子条目的条目。例如,如果 uid=user,ou=People,dc=example,dc=com 条目仍然存在,则无法删除 ou=People,dc=example,dc=com 条目。

3.1.5.1. 使用 ldapdelete 删除一个条目

ldapdelete 工具允许您删除一个或多个条目。例如,要删除 uid=user,ou=People,dc=example,dc=com 条目:
# ldapdelete -D "cn=Directory Manager" -W -p 389 -h server.example.com -x "uid=user,ou=People,dc=example,dc=com"
若要删除一个操作中的多个条目,请将其附加到命令中。例如:
# ldapdelete -D "cn=Directory Manager" -W -p 389 -h server.example.com -x \
     "uid=user1,ou=People,dc=example,dc=com" \
     "uid=user2,ou=People,dc=example,dc=com"
有关使用的参数的详情,请查看 ldapdelete(1) man page。

3.1.5.2. 使用 ldapmodify 删除一个条目

要使用 ldapmodify 工具删除条目,请使用 changetype: delete 操作。例如,要删除 uid=user,ou=People,dc=example,dc=com 条目:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user,ou=People,dc=example,dc=com
changetype: delete

3.1.6. 重命名和移动条目

本节介绍如何重命名或移动条目。
注意
使用 moddn 访问控制列表(ACL)授予权限来移动条目。详情请查看 第 18.9.2.1 节 “目标源和目标 DN”
存在以下重命名操作:
重命名条目
如果您重命名条目,modrdn 操作会更改条目的 Relative Distinguished Name (RDN):
重命名子条目
对于子树条目,modrdn 操作重命名子树以及子条目的 DN 组件:
请注意,对于大型子树,这个过程可能需要大量时间和资源。
将条目移到新父条目
重命名子树的类似操作是将条目从一个子树移到另一个子树。这是 modrdn 操作的扩展类型,同时重命名条目并设置 newSuperior 属性,它将条目从一个父项移到另一个父项:

3.1.6.1. 重命名条目的注意事项

执行重命名操作时请记住以下几点:
  • 您无法重命名 root 后缀。
  • 子树重命名操作对复制的影响最小。复制协议应用于整个数据库,而不是数据库中的子树。因此,子树重命名操作不需要重新配置复制协议。子树重命名操作之后的所有名称都会正常进行复制。
  • 重命名子树可能需要重新配置任何同步协议。同步协议在后缀或子树级别上设置。因此,重命名子树可能会破坏同步。
  • 重命名子树要求手动重新配置子树设置的所有子树级别访问控制指令(ACI),以及为子树的子条目设置的任何条目级别 ACI。
  • 尝试更改子树的组件(如从 ou 移到 dc )可能会失败,并显示模式违反情况。例如,organizationUnit 对象类需要 ou 属性。如果作为重命名子树的一部分删除了该属性,则操作会失败。
  • 如果您移动组,MemberOf 插件会自动更新 memberOf 属性。但是,如果您移动包含组的子树,您必须在 cn=memberof 任务条目中手动创建任务,或使用 fixup-memberof.pl 更新相关的 memberOf 属性。
    有关清理 memberOf 属性引用的详情,请参考 第 8.1.4.8 节 “重新生成 memberOf 值”

3.1.6.2. 重命名用户、组、POSIX 组和 OUs

dsidm 工具可以重命名多种类型的对象:
  • Users:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" user rename current_user_name new_user_name
    请注意,dsidm user rename 命令会自动将 ou=People 放置到您指定的基本 DN 前面。
  • groups:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" group rename current_group_name new_group_name
    请注意,dsidm group rename 命令会自动将 ou=Groups 放置到您指定的基本 DN 前面。
  • POSIX 组:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" posixgroup rename current_posix_group_name new_posix_group_name
    请注意,dsidm posixgroup rename 命令会在您指定的基本 DN 之前自动放置 ou=Groups
  • 机构单元(OU)
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" organizationalunit rename current_ou_name new_ou_name
    dsidm organizationalunit rename 命令直接在您指定的基本 DN 中执行重命名操作。

3.1.6.3. 使用 LDIF 声明重命名条目时 deleteOldRDN 参数

当您重命名条目时,deleteOldRDN 参数控制是否删除或保留旧的 RDN。
deleteOldRDN: 0
现有 RDN 保留为新条目中的值。生成的条目包含两个 cn 属性:一个具有旧属性,另一个具有新的通用名称(CN)。
例如,以下属性属于从 cn=old_group,dc=example,dc=com 重命名为 cn=new_group,dc=example,dc=com 的组,它设置了 deleteOldRDN: 0。
dn: cn=new_group,ou=Groups,dc=example,dc=com
objectClass: top
objectClass: groupOfUniqueNames
cn: old_group
cn: new_group
deleteOldRDN: 1
目录服务器删除旧条目,并使用新的 RDN 创建新条目。新条目仅包含新条目的 cn 属性。
例如,以下组被重命名为 cn=new_group,dc=example,dc=com,设置了 deleteOldRDN: 1 参数:
dn: cn=new_group,ou=Groups,dc=example,dc=com
objectClass: top
objectClass: groupofuniquenames
cn: new_group

3.1.6.4. 使用 LDIF 声明重命名条目或子树

要重命名条目或子树,请使用 changetype: modrdn 操作,并在 newrdn 属性中设置新的 RDN。
例如,要将 cn=demo1,dc=example,dc=com 条目重命名为 cn=example_user,dc=example,dc=com
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: cn=example_user,cn=ldap_connect,dc=example,dc=com
changetype: modrdn
newrdn: cn=example_user
deleteOldRDN: 1
newSuperior: dc=example,dc=com

3.1.6.5. 使用 LDIF 声明将条目移动到新父条目

要将条目移到新父项中,请使用 changetype: modrdn 操作,并将以下内容设置为属性:
newrdn
设置移动条目的 RDN。您必须设置此条目,即使 RDN 保持不变。
Eopuperior
设置新父条目的 DN。
例如,要将 cn=demo 条目从 ou=Germany,dc=example,dc=com 移到 ou=France,dc=example,dc=com
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: cn=demo,ou=Germany,dc=example,dc=com
changetype: modrdn
newrdn: cn=demo
deleteOldRDN: 1
newSuperior: ou=France,dc=example,dc=com

3.1.7. 使用特殊 Characters

使用命令行时,使用引号括起对命令行解释器(如空格()、星号或反斜杠(\)具有特殊含义的字符。根据命令行解释器,使用单引号或双引号。
例如,要以 cn=Directory Manager 用户进行身份验证,请将用户的 DN 放在引号中:
# ldapmodify -a -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
另外,如果 DN 在组件中包含逗号,请使用反斜杠转义它。例如,要以 uid=用户,ou=People,dc=example.com Chicago 进行身份验证:
# ldapmodify -a -D "cn=uid=user,ou=People,dc=example.com Chicago\, IL" \
     -W -p 389 -h server.example.com -x

3.1.8. 使用 Binary 属性

某些属性支持二进制值,如 jpegPhoto 属性。当您添加或更新此类属性时,实用程序会从文件中读取属性值。要添加或更新这样的属性,您可以使用 ldapmodify 工具。
例如,要将 jpegPhoto 属性添加到 uid=user,ou=People,dc=example,dc=com 条目,并从 /home/user_name/photo.jpg 文件中读取属性值,请输入:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user,ou=People,dc=example,dc=com
changetype: modify
add: jpegPhoto
jpegPhoto:< file:///home/user_name/photo.jpg
重要
请注意,:和 &lt ; 之间 没有空格

3.1.9. 更新国际化目录中的条目

要将属性值与英语以外的语言搭配使用,请将属性值与语言标签关联。
当使用 ldapmodify 更新设置了语言标签的属性时,您必须将值和语言标签完全匹配,否则操作将失败。
例如,要修改设置了 lang-fr 语言标签的属性值,请在 modify 操作中包含该标签:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user,ou=People,dc=example,dc=com
changetype: modify
replace: homePostalAddress;lang-fr
homePostalAddress;lang-fr: 34 rue de Seine

3.2. 使用 Web 控制台管理目录条目

您可以使用 Web 控制台添加、编辑、重命名和删除 LDAP 条目。

3.2.1. 使用 Web 控制台添加 LDAP 条目

您可以使用 Web 控制台中的 LDAP 浏览器搜索目录服务器数据库中的条目。
您可以使用 Web 控制台创建以下条目:
  • users
  • groups
  • roles
  • 机构单元(OU)
  • 自定义条目
例如,您要创建一个具有密码的 POSIX 用户 cn=John Smith,ou=body,dc=example,dc=com

先决条件

  • 已登陆到 Directory Server web 控制台。
  • 父条目存在。例如,ou=body,dc=example,dc=com

流程

  1. 在 Web 控制台中,打开 LDAP 浏览器菜单,以显示现有后缀的列表。
  2. 使用 TreeTable 视图,展开您要创建用户的父条目 ou=body,dc=example,dc=com
  3. Options 菜单(Demo) 并选择 New 以打开向导窗口。
  4. 选择 Create a new User 选项,再点 Next
  5. 对于用户条目,选择 Posix Account type,然后单击 Next
  6. 可选: 选择附加属性,如 userPassword,然后点 Next。您可以通过在步骤名称旁扩展下拉列表来查看所有选择的属性。
  7. 为每个属性设置一个值:
    1. 点属性的铅笔图标并添加值。
      请注意,当您设置 userPassword 值时,会打开一个单独的菜单。该值用星号填充,以隐藏纯文本。
    2. 单击检查按钮以保存更改。
    3. 可选:点 Options 菜单(DSL)Add Another Value 来设置附加属性值。
    4. 设置所有值后,点 Next
  8. 验证所有条目详细信息是否正确,然后单击 创建用户。目录服务器为 POSIX 用户创建具有强制属性的条目,并将密码设置为它。您可以点击 Back 来修改条目设置,或者点击 Cancel 来取消创建条目。
  9. 查看 Entry Creation 的结果,然后点 Finish

验证

  1. 导航到 LDAP 浏览器搜索
  2. 选择包含该条目的数据库后缀,如 dc=example,cd=com
  3. 在字段中输入您的搜索条件,如 John,然后按 Enter 键。
  4. 在条目列表中找到您最近创建的条目。

3.2.2. 使用 Web 控制台编辑 LDAP 条目

您可以使用 Web 控制台修改目录条目。这个示例修改用户条目 cn=John Smith,ou=body,dc=example,dc=com
  • 添加电话号码 556778987556897445
  • adding email jsmith@example.com.
  • 更改密码。

先决条件

已登陆到 Directory Server web 控制台。

流程

  1. 在 Web 控制台中,打开 LDAP 浏览器菜单,以显示现有后缀的列表。
  2. 使用 TreeTable 视图,展开您要编辑的条目,如 cn=John Smith,ou=body,dc=example,dc=com
  3. Options 菜单(Demo) 并选择 Edit 以打开向导窗口。
  4. 可选:在 Select ObjectClasses 步骤中,为该条目添加或删除对象类。点 Next
  5. Select Attributes 步骤中,将 telephoneNumbermail 属性添加到该条目,然后单击 Next。如果您没有看到您要添加到条目的属性,这意味着您没有在上一步中添加对应的对象类。
    注意
    在这一步中,您无法删除所选对象类的强制属性。
  6. Edit Attribute Values 步骤中,将 telephoneNumber 设置为 556778987556897445mail 改为 jsmith@example.com 并更改 userPassword 值:
    1. 单击属性的铅笔图标,并添加或更改新值。
    2. 单击检查按钮以保存更改。
    3. 可选:点 Options 菜单(DSL)Add Another Value 来为属性设置额外的值。本例中的 telephoneNumber 属性有两个值。设置所有值时,点 Next
  7. 检查您的更改并点击 Next
  8. 若要编辑该条目,请单击 Modify Entry。您可以点击 Back 来修改条目设置,或者点击 Cancel 来取消条目编辑。
  9. 查看 Entry 修改的结果, 然后单击 Finish

验证

  • 展开条目详情,并查看新更改会出现在条目属性中。

3.2.3. 使用 Web 控制台重命名和查找 LDAP Entry 或 Subtree

您可以使用 Web 控制台重命名或重新定位目录条目或子树。这个示例会将条目 cn=John Smith,ou=people,dc=example,dc=com 重新命名并重新定位到 cn=Tom Smith,ou=clients,dc=example,dc=com

先决条件

已登陆到 Directory Server web 控制台。

流程

  1. 在 Web 控制台中,打开 LDAP 浏览器菜单,以显示现有后缀的列表。
  2. 使用 TreeTable 视图,展开您要修改的条目,如 cn=John Smith,ou=body,dc=example,dc=com
  3. Options 菜单(Demo) 并选择 Rename 来打开向导窗口。
  4. Select The naming Attribute and Value 步骤中:
    1. 为命名属性 cn 设置一个新的值 Tom Smith,然后单击 Next
    2. 可选:从下拉菜单中选择另一个命名属性。
    3. 可选:在您要删除旧条目并使用新 RDN 创建新条目时,选择 删除旧的 RDN
  5. Select The Entry Location 步骤中,选择新位置的父条目,然后单击 Next
  6. 检查您对条目所做的更改,然后点 Next
  7. 如果条目详情正确,点 Change Entry Name。您可以点击 Back 对条目进行其他更改,或者点击 Cancel 来取消条目修改。
  8. 检查 Result for Entry Modification 并点 Finish

验证

  • 展开条目详情并查看更新的条目。

3.2.4. 使用 Web 控制台删除 LDAP 条目

您可以使用 Web 控制台删除目录条目或子树。这个示例删除条目 cn=Tom Smith,ou=clients,dc=example,dc=com

先决条件

已登陆到 Directory Server web 控制台。

流程

  1. 在 Web 控制台中,打开 LDAP 浏览器菜单,以显示现有后缀的列表。
  2. 使用 TreeTable 视图,展开您要删除的条目,如 cn=Tom Smith,ou=clients,dc=example,dc=com
  3. Options 菜单(Demo) 并选择 Delete 以打开向导窗口。
  4. 在查看您要删除的条目的数据后,点 Next
  5. Deletion 步骤中,将开关切换到 Yes, I'm sure position,然后单击 Delete。您可以点击 Cancel 来取消删除条目。
  6. 查看 Entry Deletion 的 Result,然后单击 Finish

验证

  1. 导航到 LDAP 浏览器搜索
  2. 选择之前存在条目的后缀,如 dc=example,cd=com
  3. 在字段中输入您的搜索条件,如 Tom,然后按 Enter 键。
  4. 验证删除的条目不再存在。

第 4 章 跟踪对目录条目的修改

在某些情况下,跟踪何时对条目进行更改非常有用。目录服务器跟踪条目修改有两个方面:
  • 使用更改序列号来跟踪对数据库的更改。这与修改复制和同步中使用的序列号操作类似。每个普通目录操作都会触发序列号。
  • 分配创建或修改信息。这些属性记录了创建和最近修改条目的用户的名称,以及创建和修改的时间戳。
注意
条目更新序列号(USN)、修改时间和名称,以及创建时间和名称都是操作属性,且不会在常规 ldapsearch 中返回。有关运行搜索操作属性的详情,请参考 第 14.4.7 节 “搜索过期属性”

4.1. 通过更新序列号跟踪数据库修改

USN 插件使 LDAP 客户端和服务器能够识别是否更改了条目。

4.1.1. 条目序列号概述

启用 USN 插件后,更新序列号(USN)是对条目执行写入操作时分配给条目的序列号。(写操作包括 add、modify、modrdn 和 delete 操作。内部数据库操作(如导出操作)没有在更新序列中计算。 USN 计数器跟踪最近分配的 USN。

4.1.1.1. 本地和全球美国

USN 全局评估整个数据库,而不是单个条目。USN 与复制和同步的更改序列号类似,因此只需选择来跟踪数据库或目录中的任何更改。但是,条目 USN 独立于 CSNs 维护,而 USN 不会被复制。
条目显示在 entryUSN 操作属性中对该条目最后一次修改的更改号。有关操作属性的详情,请参考 第 14.4.7 节 “搜索过期属性”

例 4.1. Entry USN 示例

要显示 uid=example,ou=People,dc=example,dc=com 用户条目的 entryusn 属性:
# ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com:389 -x -b "uid=example,ou=People,dc=example,dc=com" -s base -x entryusn

dn: uid=example,ou=People,dc=example,dc=com
entryusn: 17653
USN 插件有两种模式,本地模式和全局模式:
  • 在本地模式中,每个后端数据库都有一个 USN 插件实例,它带有特定于该后端数据库的 USN 计数器。这是默认的设置。
  • 在全局模式中,有 USN 插件的全局实例,其具有适用于整个目录进行的全局 USN 计数器。
当 USN 插件设置为 local 模式时,结果将限制为本地后端数据库。当 USN 插件设置为全局模式时,返回的结果将整个目录。
root DSE 显示分配给 lastusn 属性中数据库中任何条目的最新 USN。当 USN 插件被设置为 local 模式时,因此每个数据库都有自己的本地 USN 计数器,最后一个USN 会显示分配 USN 和 USN 的数据库:
lastusn;database_name:USN
例如:
lastusn;example1: 2130
lastusn;example2: 2070
在全局模式中,当数据库使用共享 USN 计数器时,最后一个USN 属性仅显示最新的 USN :
lastusn: 4200

4.1.1.2. 导入 USN 条目

导入条目后,USN 插件使用 nsslapd-entryusn-import-initval 属性来检查条目是否分配了 USN。如果 nsslapd-entryusn-import-initval 的值为 number,导入的条目将使用这个数字值作为条目的 USN。如果 nsslapd-entryusn-import-initval 的值不是数字,则 USN 插件将使用 lastUSN 属性的值,并将它递增为导入条目的 USN。

4.1.2. 启用 USN 插件

这部分论述了如何启用 USN 插件来记录条目上的 USNs。

4.1.2.1. 使用命令行启用 USN 插件

使用命令行启用 USN 插件:
  1. 使用 dsconf 工具启用插件:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin usn enable
  2. 重启实例:
    # dsctl instance_name restart

4.1.2.2. 使用 Web 控制台启用 USN 插件

使用 Web 控制台启用 USN 插件:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 选择 Plugins 菜单。
  4. 选择 USN 插件。
  5. 将状态更改为 ON 以启用插件。

4.1.3. Global USNs

使用默认设置时,Directory 服务器为每个后端数据库使用唯一的更新序列号(USN)。或者,您可以在所有后端数据库中启用唯一的 USN。
注意
必须启用 USN 插件才能使用此功能。请参阅 第 4.1.2 节 “启用 USN 插件”

4.1.3.1. 确定是否启用全球美国

这部分论述了如何识别是否在所有后端数据库中启用 USN。
4.1.3.1.1. 使用命令行识别是否启用全局美国
使用命令行显示全局 USN 功能的当前状态:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin usn global
USN global mode is disabled
4.1.3.1.2. 确定是否通过 Web 控制台启用全局美国
使用 Web 控制台显示全局 USN 功能的当前状态:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 选择 Plugins 菜单。
  4. 选择 USN 插件。
  5. 验证 USN Global 开关是否已设置为 On

4.1.3.2. 启用全球美国

4.1.3.2.1. 使用命令行启用全局 USN
使用命令行启用全局 USN :
  1. 启用全局 USN:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin usn global on
  2. 重启实例:
    # dsctl instance_name restart
4.1.3.2.2. 使用 Web 控制台启用全局 USN
使用 Web 控制台启用全局 USN:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Plugins 菜单。
  4. 选择 USN 插件。
  5. 将插件的状态更改为 On
  6. USN Global 状态更改为 On

4.1.4. 清理 USN Tombstone 条目

当删除该条目时,USN 插件会将条目移到 tombstone 条目。如果启用了复制,则 USNReplication 插件都会保留单独的 tombstone 条目。两个 tombstone 条目都由复制过程删除,但对于服务器性能,删除 USN tombstones 有助于:
  • 在将服务器转换为副本前
  • 为服务器可用内存

4.1.4.1. 使用命令行清理 USN Tombstone 条目

使用命令行从 dc=example,dc=com 后缀中删除所有 USN tombstone 条目:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin usn cleanup -s "dc=example,dc=com"
(可选)将 -o max_USN 选项传给命令,以删除到指定的值的 USN tombstone 条目。

4.1.4.2. 使用 Web 控制台清理 USN Tombstone 条目

使用 Web 控制台从 dc=example,dc=com 后缀中删除所有 USN tombstone 条目:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Plugins 菜单。
  4. 选择 USN 插件。
  5. Run Fixup Task 按钮。
  6. 填写字段,然后按 Run

4.2. 通过过期属性跟踪条目修改

使用默认设置,Directory 服务器会为每个条目跟踪以下操作属性:
  • creatorsName :最初创建该条目的用户的可分辨名称(DN)。
  • createTimestamp :创建条目时,Greenwich Mean Time (GMT)格式的时间戳。
  • modifiersName :上次修改条目的用户的可分辨名称。
  • modifyTimestamp :最后一次修改条目时 GMT 格式的时间戳。
请注意,操作属性不会在默认搜索中返回。您必须在查询中明确请求这些属性。详情请查看 第 14.4.7 节 “搜索过期属性”
重要
红帽建议不要禁用跟踪这些操作属性。如果禁用,条目不会获得在 nsUniqueID 属性中分配的唯一 ID,且复制不起作用。

4.2.2. 启用修改的跟踪

默认情况下,Directory 服务器跟踪操作属性中的修改。
注意
红帽建议不要禁用此功能。
这部分论述了如何在禁用该功能时重新启用修改跟踪。

4.2.2.1. 使用命令行启用跟踪修改

使用命令行重新启用条目修改的跟踪:
  1. nsslapd-lastmod 参数设置为 on
    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-lastmod=on
  2. (可选)要重新生成缺少的 nsUniqueID 属性:
    1. 将数据库导出到 LDAP 数据交换格式(LDIF)文件中。请参阅 第 6.2.1 节 “使用命令行将数据导出到 LDIF 文件中”
    2. 从 LDIF 文件导入数据库。请参阅 第 6.1.2 节 “使用命令行导入”

4.3. 跟踪用于插件初始更新的绑定 DN

对条目的一个更改可以在目录树之间触发其他自动更改。例如,当用户被删除时,该用户将自动从其所属的任何组中删除,由 参考完整性后 插件删除。
初始操作显示在由任何用户帐户绑定到服务器的条目中,但所有相关更新(默认)都显示为由插件执行,没有有关哪个用户启动该更新的信息。例如,使用 MemberOf 插件更新带有组成员资格的用户条目,对组帐户的更新将显示为由绑定用户执行的,而编辑用户条目则显示为 MemberOf 插件执行的:
dn: cn=example_group,ou=groups,dc=example,dc=com
modifiersname: uid=example,ou=people,dc=example,dc=com

dn: uid=example,ou=people,dc=example,dc=com
modifiersname: cn=memberOf plugin,cn=plugins,cn=config
nsslapd-plugin-binddn-tracking 参数可让服务器跟踪哪个用户源自更新操作,以及实际执行它的内部插件。绑定的用户显示在 修饰符创建者 操作属性中,而执行它的插件则显示在 internalModifiersnameinternalCreatorsname 操作属性中。例如:
dn: uid=example,ou=people,dc=example,dc=com
modifiersname: uid=admin,ou=people,dc=example,dc=com
internalModifiersname: cn=memberOf plugin,cn=plugins,cn=config
nsslapd-plugin-binddn-tracking 参数跟踪和维护绑定用户与为该连接执行的任何更新之间的关系。
注意
internalModifiersnameinternalCreatorsname 属性始终以身份的形式显示插件。此插件可以是额外的插件,如 MemberOf 插件。如果更改由核心目录服务器完成,则插件是数据库插件 cn=ldbm database,cn=plugins,cn=config

4.3.1. 使用命令行为插件发起的更新启用跟踪 DN

使用命令行为插件发起的更新启用跟踪绑定 DN:
  1. nsslapd-plugin-binddn-tracking 参数设置为 on
    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-plugin-binddn-tracking=on
  2. 重启实例:
    # dsctl instance_name restart

4.3.2. 使用 Web 控制台为插件初始更新启用跟踪 DN

使用 Web 控制台为插件更新启用跟踪绑定 DN:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings 菜单,然后选择 Server Settings 条目。
  4. Advanced Settings 选项卡中,选择 Enable Plugin Bind DN Tracking
  5. 点击 Save

4.4. 跟踪密码更改时间

密码更改操作通常被视为对条目的任何其他修改,因此更新时间记录在 最后 修改的操作属性中。但是,有时可能需要单独记录上次密码更改的时间,以便更轻松地在 Active Directory 同步中更新密码或与其他 LDAP 客户端连接。
密码策略中的 passwordTrackUpdateTime 属性告知服务器最后一次为条目更新密码的时间戳。密码更改时间本身作为操作属性存储在用户条目 pwdUpdateTime 上(与 modifyTimestamplastModified ified 操作属性分开)。
passwordTrackUpdateTime 属性可以设置为全局密码策略的一部分或子树或用户级别策略,具体取决于客户端需要访问密码更改时间。第 20.4 节 “管理密码策略” 中描述了设置密码策略。

第 5 章 维护参考完整性

参考完整性 是一种数据库机制,可确保维护相关条目之间的关系。在目录服务器中,可以使用引用完整性来确保对目录中一个条目的更新正确反映在引用更新条目的任何其他条目中。
例如,如果从目录中删除了用户条目,并且启用了引用完整性,服务器也会从该用户所属的任何组中删除该用户。如果没有启用引用完整性,则用户会保持组成员,直到管理员手动删除为止。如果要将目录服务器与其他依赖目录进行用户和组管理的产品集成,则这是一个重要功能。

5.1. 参考完整性的工作方式

启用 参考完整性后插件后,它会在删除或重命名操作 后立即对指定属性执行完整性更新。默认情况下,参考完整性后 插件被禁用。
注意
您必须在多层次复制环境中在所有供应商上启用 参考完整性后 插件。
当您删除、重命名或移动目录中的用户或组条目时,操作将记录到参考完整性日志文件。对于日志文件中的可分辨名称(DN),目录服务器会按照插件配置中设置的属性搜索和更新:
  • 对于条目,在日志文件中标记为已删除,会删除目录中的对应属性。
  • 对于条目,在日志文件中标记为重命名或移动,目录中对应的属性值将被重命名。
默认情况下,当启用 referential Integrity Postoperation 插件时,它会在 deleterename 操作后,立即对 member, uniquemember, owner, and seeAlso 属性执行完整性更新。但是,您可以配置引用 完整性后 插件的行为,以几种不同的方式满足目录的需求:
  • 记录在复制更改日志中引用完整性更新。
  • 修改更新间隔。
  • 选择要将引用完整性应用到的属性。
  • 禁用参考完整性。
对于存在、相等和子字符串,必须 索引引用完整性中的所有属性;不索引这些属性导致修改和删除操作的服务器性能不佳。
nsIndexType: pres
nsIndexType: eq
nsIndexType: sub
有关检查和创建索引的更多信息,请参阅 第 13.2 节 “创建标准索引”

5.2. 在复制中使用参考完整性

在复制环境中使用 引用完整性后 插件时有一些限制:
  • 永远不会 在专用消费者服务器上启用它(仅包含只读副本的服务器)。
  • 永远不会 在包含读写副本和只读副本组合的服务器上启用它。
  • 仅包含 读写副本的供应商服务器上启用它。
  • 在多层次复制拓扑中为每个供应商服务器启用插件。插件配置在所有供应商服务器上必须相同。
注意
由于供应商服务器向消费者服务器发送了 参考完整性后 插件所做的任何更改,因此需要在消费者和 hub 服务器上运行 参考完整性后 插件。

5.3. 启用参考完整性

这部分论述了如何启用 参考完整性后 插件。

5.3.1. 使用命令行启用参考完整性

使用命令行 启用参考完整性后 插件:
  1. 使用 dsconf 工具启用插件:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin referential-integrity enable
  2. 重启实例:
    # dsctl instance_name restart

5.3.2. 使用 Web 控制台启用参考完整性

使用 Web 控制台启用参考完整性 插件:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 选择 Plugins 菜单。
  4. 选择" 参考完整性 "插件,然后单击 Show Advanced Settings
  5. 将状态更改为 ON 以启用插件。

5.4. 参考完整性更新间隔

默认情况下,服务器会在 deleterename 操作后立即执行引用完整性更新。根据操作量,这可能导致性能影响。要降低性能影响,您可以增加更新之间的时间。
您可以设置更新间隔(以秒为单位)。另外,您可以设置以下值:
  • 0 :立即执行引用完整性的检查。
  • -1 :不检查引用完整性。
重要
在多层次复制环境中,红帽建议在所有供应商中将 更新间隔设置为 0。
注意
在一个供应商中,如果将间隔设置为一个大于 0 的值(例如 5),则可能会出现在它清理到目标条目引用前,供应商会接收到一个直接的 deleterename 操作,复制这个操作并进入离线状态的情况。在这种情况下,拓扑的其余部分仍然包含对目标条目的引用,直到服务器再次启动(可能超过 5 秒)。

5.4.1. 使用命令行显示更新间隔

使用命令行显示更新间隔:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin referential-integrity show
referint-update-delay: 0
...

5.4.2. 使用 Web 控制台显示更新间隔

使用 Web 控制台显示更新间隔:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Plugins 菜单。
  4. 选择 参考完整性 插件。
  5. 如需更新间隔,请参阅 Update Delay 字段。

5.4.3. 使用命令行修改更新间隔

要使用命令行设置更新间隔,例如立即更新:
  1. 将更新间隔设置为 0
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin referential-integrity set --update-delay=0
  2. 重启实例:
    # dsctl instance_name restart

5.4.4. 使用 Web 控制台修改 Update Interval

要使用 Web 控制台设置更新间隔,例如立即更新:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Plugins 菜单。
  4. 选择 参考完整性 插件。
  5. Update Delay 字段中设置间隔。
  6. Save Config

5.5. 显示和修改属性列表

默认情况下,将 referential Integrity 插件设置为检查和更新 成员唯一的成员所有者和 seeAlso 属性。您可以使用命令行或 Web 控制台来添加或删除要更新的属性。
注意
在引用 完整性 插件的参数列表中设置的属性必须对所有数据库有相等的索引。否则,插件扫描数据库的每个条目以匹配已删除或修改的 DN。这可能会对性能产生显著影响。有关检查和创建索引的详情,请参考 第 13.2 节 “创建标准索引”

5.5.1. 使用命令行显示属性列表

使用命令行显示属性列表:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin referential-integrity show

5.5.2. 使用 Web 控制台显示属性列表

使用 Web 控制台显示属性列表:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Plugins 菜单。
  4. 选择 参考完整性 插件。
  5. 有关属性列表,请参阅 Membership Attribute 字段。

5.5.3. 使用命令行配置属性列表

使用命令行更新属性列表:
  1. (可选)显示当前的属性列表。请参阅 第 5.5.1 节 “使用命令行显示属性列表”
  2. 更新属性列表:
    • 设置应由插件检查和更新的属性列表:
      # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin referential-integrity set --membership-attr attribute_name_1 attribute_name_2
    • 删除插件不再检查和更新的所有属性:
      # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin referential-integrity set --membership-attr delete
  3. 重启实例:
    # dsctl instance_name restart

5.5.4. 使用 Web 控制台配置属性列表

使用 Web 控制台更新属性列表:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Plugins 菜单。
  4. 选择 参考完整性 插件。
  5. 更新 Membership Attribute 字段,以设置属性。
    • 要添加属性,请在 Membership Attribute 字段中输入名称。
    • 要删除属性,请在 Membership Attribute 字段中按属性名称右边的 X 按钮。
  6. Save Config

5.6. 为参考完整性配置范围

如果删除了条目,则会删除或修改对其的引用以反映更改。当这个更新适用于所有条目和所有组时,它可能会影响性能,并防止对所选子树限制引用完整性的灵活性。定义 范围 可以解决这个问题。
例如,可能有一个后缀 dc=example,dc=com,包含两个子树: ou=active users,dc=example,dc=comou=deleted users,dc=example,dc=com。对于参考完整性,不应处理 已删除用户 中的条目。

5.6.1. 控制引用完整性范围的参数

以下三个参数可用于定义 参考完整性后插件配置中的 范围:
nsslapd-pluginEntryScope
此多值参数控制已删除或重命名的条目的范围。它定义了 参考完整性后 插件查找用户条目删除或重命名操作的子树。如果用户被删除或重命名在定义的子树下不存在,则插件会忽略该操作。参数允许您指定插件应应用该操作的数据库分支。
nsslapd-pluginExcludeEntryScope
这个参数还控制已删除或重命名的条目的范围。它定义了 参考完整性后插件会 忽略任何删除或重命名用户的操作的子树。
nsslapd-pluginContainerScope
此参数控制更新引用的组范围。删除用户后,参考完整性后 插件会查找用户所属的组并相应地更新它们。参数指定插件搜索用户所属的组的分支。参考完整性后 插件仅更新指定容器分支下的组,并保留所有其他组没有更新。

5.6.2. 使用命令行显示参考完整性范围

以下命令显示如何使用命令行显示范围设置:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin referential-integrity show
...
nsslapd-pluginEntryScope: DN
nsslapd-pluginExcludeEntryScope: DN
nsslapd-pluginContainerScope: DN

5.6.3. 使用 Web 控制台显示参考完整性范围

以下流程演示了如何使用 Web 控制台显示范围设置:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Plugins 菜单。
  4. 选择 参考完整性 插件。
  5. 有关当前配置的范围,请参阅 Entry ScopeExclude Entry Scope、和 Container Scope 字段。

5.6.4. 使用命令行配置参考完整性范围

使用命令行配置引用完整性范围:
  1. 另外,还可显示范围设置。请参阅 第 5.6.2 节 “使用命令行显示参考完整性范围”
  2. 以下命令显示如何使用命令行配置单个引用完整性范围设置:
    • 要设置可分辨名称(DN):
      • nsslapd-pluginEntryScope 参数:
        # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin referential-integrity set --entry-scope="DN"
      • nsslapd-pluginExcludeEntryScope 参数:
        # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin referential-integrity set --exclude-entry-scope="DN"
      • nsslapd-pluginContainerScope 参数:
        # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin referential-integrity set --container-scope="DN"
    • 删除 DN:
      • nsslapd-pluginEntryScope 参数中:
        # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin referential-integrity set --entry-scope=delete
      • nsslapd-pluginExcludeEntryScope 参数中:
        # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin referential-integrity set --exclude-entry-scope=delete
      • nsslapd-pluginContainerScope 参数中:
        # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin referential-integrity set --container-scope=delete
  3. 重启实例:
    # dsctl instance_name restart

5.6.5. 使用 Web 控制台配置参考完整性范围

使用 Web 控制台配置引用完整性范围:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 选择 Plugins 菜单。
  4. 选择 参考完整性 插件。
  5. Entry ScopeExclude Entry ScopeContainer Scope 字段中设置范围。
  6. 单击 Save Config

第 6 章 填充目录数据库

数据库包含 Red Hat Directory Server 管理的目录数据。

6.1. 导入数据

目录服务器可通过以下方法填充数据的数据库:
  • 导入数据
    重要
    要导入数据,您必须将您要导入的 LDIF 文件存储在 /var/lib/dirsrv/slapd-instance_name/ldif/ 目录中。目录服务器默认使用 PrivateTmp systemd 指令。因此,如果您将 LDIF 文件导出到 /tmp//var/tmp/ 系统目录中,Directory 服务器在导入过程中不会看到这些 LDIF 文件。有关 PrivateTmp 的更多信息,请参阅 systemd.exec (5) 手册页。
  • 为复制初始化数据库
下表描述了导入和初始化数据库之间的区别:

表 6.1. 导入方法

操作 Import 初始化数据库
覆盖数据库
LDAP 操作 添加、修改、删除 仅添加
性能 更多耗时 速度快
分区特殊 适用于所有分区 仅本地分区
对服务器故障的响应 最佳工作(所有对故障点所做的更改仍保留) Atomic (所有更改都将在失败后丢失)
LDIF 文件位置 Web 控制台本地 到 web 控制台或服务器本地
导入配置信息(cn=config)

6.1.1. 在导入过程中设置 EntryUSN Initial 值

当条目从一个服务器导出并导入到另一个服务器时,条目更新序列号(USN)不会被保留。作为 第 4.1 节 “通过更新序列号跟踪数据库修改” 解释了,为本地服务器上发生的操作分配条目 USN,因此将这些 USN 导入到另一台服务器并不有意义。
但是,在导入数据库或初始化数据库(例如,为复制初始化进行复制)时,可以为条目配置初始条目 USN 值。这可以通过设置 nsslapd-entryusn-import-initval 参数来实现,该参数为所有导入的条目设置开始 USN。
nsslapd-entryusn-import-initval 有两个可能的值:
  • 整数,这是用于每个导入条目的显式开始号。
  • 接下来,这意味着每个导入的条目都会在导入操作前在服务器上使用最高条目 USN 值的任何值,由一递增。
如果没有设置 nsslapd-entryusn-import-initval,则所有条目 USNs 从零开始。

例 6.1. nsslapd-entryusn-import-initval 参数的工作方式

例如,如果在导入或初始化操作前,服务器上的最高值为 1000,并且 nsslapd-entryusn-import-initval 值为 下一个,则每个导入的条目都会被分配一个 1001 的 USN :
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -x "(cn=*)" entryusn

dn: dc=example,dc=com
entryusn: 1001
dn: ou=Accounting,dc=example,dc=com
entryusn: 1001
dn: ou=Product Development,dc=example,dc=com
entryusn: 1001
...
dn: uid=user_name,ou=people,dc=example,dc=com
entryusn: 1001
...
要为条目 USN 设置初始值,请将 nsslapd-entryusn-import-initval 参数添加到要导入数据的服务器或要执行初始化的供应商服务器中。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-entryusn-import-initval=next
注意
在 multi-supplier 复制中,nsslapd-entryusn-import-initval 参数 不会在 服务器之间复制。这意味着,该值必须专门设置用于初始化副本的供应商服务器。
例如,如果 Supplier1 主机将 nsslapd-entryusn-import-initval 设置为 next,并且用于初始化副本,则导入条目的 entry USNs 带有最高值加上一。如果 Supplier2 主机没有设置 nsslapd-entryusn-import-initval,并且用于初始化副本,则导入条目的所有条目都以零开始 - 即使 Supplier1Supplier2 在它们之间都有多层次复制协议。

6.1.2. 使用命令行导入

目录服务器支持在实例正在运行或实例离线时导入数据:
警告
当您启动导入操作时,目录服务器首先从数据库中删除所有现有的数据,然后从 LDIF 文件中导入数据。如果导入失败,例如,因为 LDIF 文件不存在,服务器已经从数据库中删除之前的数据。
请注意,用于导入操作的 LDIF 文件必须使用 UTF-8 字符集编码。导入操作不会将数据从本地字符集编码转换为 UTF-8。另外,所有导入的 LDIF 文件必须包含 root 后缀条目。
目录服务器以 dirsrv 用户身份运行导入操作。因此,LDIF 文件的权限必须允许此用户读取该文件。

6.1.2.1. 导入服务器正在运行的数据

本节论述了如何在目录服务器运行时导入数据。
6.1.2.1.1. 使用 dsconf backend 导入命令导入
使用 dsconf backend import 命令自动创建从 LDIF 文件中导入数据的任务。例如,要将 /var/lib/dirsrv/slapd-instance_name/ldif/instance_name-database_name-time_stamp.ldif 文件导入到 userRoot 数据库中:
  1. 如果后缀不存在,请创建后缀。详情请查看 第 2.1.1 节 “创建后缀”
  2. 如果您要导入的 LDIF 不包含添加后缀条目的声明,请手动创建此条目,如 第 3.1.3.3 节 “创建根条目” 所述。
  3. 导入 LDIF 文件:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend import userRoot /var/lib/dirsrv/slapd-instance_name/ldif/instance_name-database_name-time_stamp.ldif
    The import task has finished successfully
    dsconf backend import 命令支持额外的选项,例如排除特定的后缀。要显示所有可用选项,请输入:
    # dsconf ldap://server.example.com backend import --help
6.1.2.1.2. 使用 cn=tasks 条目导入数据
Directory 服务器配置中的 cn=tasks,cn=config 条目是服务器用来管理任务的临时条目的容器条目。要启动导入操作,请在 cn=import,cn=tasks,cn=config 条目中创建任务。
导入任务条目需要以下属性:
  • cn :设置任务的唯一名称。
  • nsFilename :设置要导入的 LDIF 文件的名称。
  • nsInstance :设置应导入该文件的数据库的名称。
导入任务支持额外的参数,例如排除后缀。有关完整列表,请参阅 红帽目录服务器配置、命令和文件参考 中的 cn=import 部分
例如,要添加一个任务,将 /var/lib/dirsrv/slapd-instance_name/ldif/example.ldif 文件的内容导入到 userRoot 数据库中:
  1. 如果后缀不存在,请创建后缀。详情请查看 第 2.1.1 节 “创建后缀”
  2. 如果您要导入的 LDIF 不包含添加后缀条目的声明,请手动创建此条目,如 第 3.1.3.3 节 “创建根条目” 所述。
  3. 添加导入任务:
    # ldapadd -D "cn=Directory Manager" -W -H ldap://server.example.com -x
    
    dn: cn=example_import,cn=import,cn=tasks,cn=config
    changetype: add
    objectclass: extensibleObject
    cn: example_import
    nsFilename: /var/lib/dirsrv/slapd-instance_name/ldif/example.ldif
    nsInstance: userRoot
任务完成后,该条目将从目录配置中删除。

6.1.2.2. 导入服务器为 Offline 的数据

如果在导入数据时服务器离线,请使用 dsctl ldif2db 命令:
  1. 如果后缀不存在,请创建后缀。详情请查看 第 2.1.1 节 “创建后缀”
  2. 如果您要导入的 LDIF 不包含添加后缀条目的声明,请手动创建此条目,如 第 3.1.3.3 节 “创建根条目” 所述。
  3. 停止实例:
    # dsctl instance_name stop
  4. 从 LDIF 文件中导入数据。例如,要将 /var/lib/dirsrv/slapd-instance_name/ldif/example.ldif 文件导入到 userRoot 数据库中:
    # dsctl instance_name ldif2db userroot /var/lib/dirsrv/slapd-instance_name/ldif/example.ldif 
    OK group dirsrv exists
    OK user dirsrv exists
    [17/Jul/2018:13:42:42.015554231 +0200] - INFO - ldbm_instance_config_cachememsize_set - force a minimal value 512000
    ...
    [17/Jul/2018:13:42:44.302630629 +0200] - INFO - import_main_offline - import userroot: Import complete.  Processed 160 entries in 2 seconds. (80.00 entries/sec)
    ldif2db successful
    警告
    如果命令中指定的数据库与 LDIF 文件中包含的后缀不对应,数据库中包含的所有数据都会被删除,导入会失败。
  5. 启动实例:
    # dsctl instance_name start

6.1.3. 使用 Web 控制台导入数据

使用 Web 控制台从 LDIF 文件中导入数据:
  1. 如果后缀不存在,请创建后缀。详情请查看 第 2.1.1 节 “创建后缀”
  2. 如果您要导入的 LDIF 不包含添加后缀条目的声明,请手动创建此条目,如 第 3.1.3.3 节 “创建根条目” 所述。
  3. 将您要导入的 LDIF 文件存储在 /var/lib/dirsrv/slapd-instance_name/ldif/ 目录中。
  4. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  5. 选择实例。
  6. 打开 Database 菜单。
  7. 选择后缀条目。
  8. 单击 后缀任务,然后选择 Initialize Suffix
  9. 选择要导入的 LDIF 文件,或输入到该文件的完整路径。
  10. 选择 Yes, I am sure.,然后单击 Initialize Database 进行确认。

6.2. 导出数据

LDAP 数据交换格式(LDIF)文件用于从目录服务器数据库导出数据库条目。LDIF 是 RFC 2849 中描述的标准格式。
注意
导出操作不导出配置信息(cn=config)、模式信息(cn=schema)或监控信息(cn=monitor)。
导出数据对以下内容很有用:
  • 备份数据库中的数据。
  • 将数据复制到另一个目录服务器。
  • 将数据导出到另一个应用程序。
  • 在更改目录拓扑后重新填充数据库。
    例如,如果目录包含一个数据库,并且其内容应分成两个数据库,则两个新数据库应通过导出旧数据库的内容并将其导入到两个新数据库,如 图 6.1 “将数据库内容分成两个数据库” 所示。

    图 6.1. 将数据库内容分成两个数据库

    将数据库内容分成两个数据库
警告
不要在导出操作期间停止服务器。
目录服务器以 dirsrv 用户身份运行导出操作。因此,目标目录的权限必须允许此用户写入该文件。

6.2.1. 使用命令行将数据导出到 LDIF 文件中

目录服务器支持在实例正在运行或实例离线时导出数据:
重要
不要因为以下原因,将 LDIF 文件导出到 /tmp 或 /var /tmp/ 目录:
  • 目录服务器默认使用 systemdPrivateTmp 功能。如果您将 LDIF 文件放在 /tmp/var/tmp/ 系统目录中,则目录服务器在导入过程中不会看到这些 LDIF 文件。有关 PrivateTmp 的更多信息,请参阅 systemd.exec (5) 手册页。
  • LDIF 文件通常包含敏感数据,如用户密码。因此,您不能使用临时系统目录来存储这些文件。

6.2.1.1. 导出服务器正在运行的数据库

6.2.1.1.1. 使用 dsconf backend export 命令导出数据库
使用 dsconf backend export 命令自动创建将数据导出到 LDIF 文件的任务。
例如,要导出 userRoot 数据库:
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend export userRoot
The export task has finished successfully
默认情况下,dsconf 将导出存储在名为 instance_name_database_name-time_stamp.ldif 的文件中,存储在 /var/lib/dirsrv/slapd-instance_name/export/ 目录中。或者,在命令中添加 -l file_name 选项来指定不同的位置。
dsconf backend export 命令支持额外的选项,例如排除特定的后缀。要显示所有可用选项,请输入:
# dsconf ldap://server.example.com backend export --help
6.2.1.1.2. 使用 cn=tasks 条目导出数据库
Directory 服务器配置中的 cn=tasks,cn=config 条目是服务器用来管理任务的临时条目的容器条目。要启动导出操作,请在 cn=export,cn=tasks,cn=config 条目中创建任务。
通过使用任务条目,您可以在服务器运行时导出数据。
导出任务条目需要以下属性:
  • cn :设置任务的唯一名称。
  • nsInstance :将数据库的名称设置为导出。
  • nsFilename :设置应存储导出的文件的名称。
导出任务支持额外的参数,例如排除后缀。有关完整列表,请参阅 红帽目录服务器配置、命令和文件参考中的 cn=export 部分。
例如,要添加一个任务,将 userRoot 数据库的内容导出到 /var/lib/dirsrv/slapd-instance_name/ldif/example.ldif 文件中:
# ldapadd -D "cn=Directory Manager" -W -H ldap://server.example.com -x

dn: cn=example_export,cn=export,cn=tasks,cn=config
changetype: add
objectclass: extensibleObject
cn: example_export
nsInstance: userRoot
nsFilename: /var/lib/dirsrv/slapd-instance_name/ldif/example.ldif
任务完成后,该条目将从目录配置中删除。

6.2.1.2. 导出服务器为 Offline 的数据库

如果在导出数据时服务器离线,请使用 dsctl db2ldif 命令:
  1. 停止实例:
    # dsctl instance_name stop
  2. 将数据库导出到 LDIF 文件中。例如,将 userRoot 数据库导出到 /var/lib/dirsrv/slapd-instance_name/ldif/example.ldif 文件中:
    # dsctl instance_name db2ldif userroot /var/lib/dirsrv/slapd-instance_name/ldif/example.ldif 
    OK group dirsrv exists
    OK user dirsrv exists
    ldiffile: /var/lib/dirsrv/slapd-instance_name/ldif/example.ldif
    [18/Jul/2018:10:46:03.353656777 +0200] - INFO - ldbm_instance_config_cachememsize_set - force a minimal value 512000
    [18/Jul/2018:10:46:03.383101305 +0200] - INFO - ldbm_back_ldbm2ldif - export userroot: Processed 160 entries (100%).
    [18/Jul/2018:10:46:03.391553963 +0200] - INFO - dblayer_pre_close - All database threads now stopped
    db2ldif successful
  3. 启动实例:
    # dsctl instance_name start

6.2.2. 使用 Web 控制台将后缀导出到 LDIF 文件

使用 Web 控制台导出后缀:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Database 菜单。
  4. 选择后缀条目。
  5. Suffix Tasks,并选择 Export Suffix
  6. 输入您要存储导出的 LDIF 文件的名称。目录服务器将使用指定的文件名将文件存储在 /var/lib/dirsrv/slapd-instance_name/ldif/ 目录中。
  7. 单击 Export Database

6.2.3. 启用组成员导出数据,并将导出作为其中一个组成员执行

您可以配置组的成员具有导出数据的权限。这会提高安全性,因为您不再需要在脚本中设置 cn=Directory Manager 的凭证。另外,您可以通过修改组来轻松地授予和撤销导出权限。

6.2.3.1. 启用组导出数据

使用这个流程添加 cn=export_users,ou=groups,dc=example,dc=com 组成员,并启用此组的成员创建导出任务。

流程

  1. 创建 cn=export_users,ou=groups,dc=example,dc=com 组:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" group create --cn export_users
  2. 添加访问控制指令(ACI),允许 cn=export_users,ou=groups,dc=example,dc=com 组的成员创建导出任务:
    # ldapadd -D "cn=Directory Manager" -W -H ldap://server.example.com
    
    dn: cn=config
    changetype: modify
    add: aci
    aci: (target = "ldap:///cn=export,cn=tasks,cn=config")(targetattr="*")
     (version 3.0 ; acl "permission: Allow export_users
      group to export data" ; allow (add, read, search) groupdn
      = "ldap:///cn=export_users,ou=groups,dc=example,dc=com";)
    -
    add: aci
    aci: (target = "ldap:///cn=config")(targetattr =
      "objectclass || cn || nsslapd-suffix || nsslapd-ldifdir")
     (version 3.0 ; acl "permission: Allow export_users
      group to access ldifdir attribute" ; allow
      (read,search) groupdn = "ldap:///cn=export_users,ou=groups,dc=example,dc=com";)
  3. 创建用户:
    1. 创建用户帐户:
      # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" user create --uid="example" --cn="example" --uidNumber="1000" --gidNumber="1000" --homeDirectory="/home/example/" --displayName="Example User"
    2. 在用户帐户中设置密码:
      # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" account reset_password "uid=example,ou=People,dc=example,dc=com" "password"
  4. uid=example,ou=People,dc=example,dc=com 用户添加到 cn=export_users,ou=groups,dc=example,dc=com 组中:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" group add_member export_users uid=example,ou=People,dc=example,dc=com

验证

  • 显示 cn=config 上设置的 ACI:
    # ldapsearch -o ldif-wrap=no -LLLx -D "cn=Directory Manager" -W -H ldap://server.example.com -b cn=config aci=* aci -s base
    dn: cn=config
    aci: (target = "ldap:///cn=export,cn=tasks,cn=config")(targetattr="*")(version 3.0 ; acl "permission: Allow export_users group to export data" ; allow (add, read, search) groupdn = "ldap:///cn=export_users,ou=groups,dc=example,dc=com";)
    aci: (target = "ldap:///cn=config")(targetattr = "objectclass || cn || nsslapd-suffix || nsslapd-ldifdir")(version 3.0 ; acl "permission: Allow export_users group to access ldifdir attribute" ; allow (read,search) groupdn = "ldap:///cn=export_users,ou=groups,dc=example,dc=com";)
    ...

6.2.3.2. 以普通用户身份执行导出

您可以以普通用户而不是 cn=Directory Manager 执行导出。

先决条件

  • 您已启用了 cn=export_users,ou=groups,dc=example,dc=com 组的成员导出数据。请参阅 第 6.2.3.1 节 “启用组导出数据”
  • 您用于执行导出的用户是 cn=export_users,ou=groups,dc=example,dc=com 组的成员。

流程

  • 使用以下方法之一创建导出任务:
    • 使用 dsconf backend export 命令:
      # dsconf -D "uid=example,ou=People,dc=example,dc=com" ldap://server.example.com backend export userRoot
    • 通过手动创建任务:
      # ldapadd -D "uid=example,ou=People,dc=example,dc=com" -W -H ldap://server.example.com
      
      dn: cn=userRoot-2021_07_23_12:55_00,cn=export,cn=tasks,cn=config
      changetype: add
      objectClass: extensibleObject
      nsFilename: /var/lib/dirsrv/slapd-instance_name/ldif/None-userroot-2021_07_23_12:55_00.ldif
      nsInstance: userRoot
      cn: export-2021_07_23_12:55_00

验证

  • 验证备份是否已创建:
    # ls -l /var/lib/dirsrv/slapd-instance_name/ldif/*.ldif
    total 0
    -rw-------. 1 dirsrv dirsrv 10306 Jul 23 12:55 None-userroot-2021_07_23_12_55_00.ldif
    ...

6.3. 备份目录服务器

目录服务器中的备份包含:
  • 所有数据库文件,包括存储在这些数据库中的数据
    注意
    目录服务器不支持备份单个数据库。
  • 事务日志
  • Indices
与备份不同,您可以导出数据,如 第 6.2 节 “导出数据” 所述。使用导出功能从 LDAP 数据交换格式(LDIF)格式的服务器导出特定数据,如子树。
警告
不要在备份操作期间停止服务器。
目录服务器以 dirsrv 用户身份运行备份任务。因此,目标目录的权限必须允许此用户创建文件。

6.3.1. 使用命令行备份所有数据库

目录服务器支持在实例正在运行或实例离线时备份数据库:
重要
这些方法仅备份数据库。有关备份其他重要文件的详情,如配置,请参阅 第 6.3.3 节 “备份配置文件、证书数据库和自定义架构文件”

6.3.1.1. 备份服务器的所有数据库正在运行

6.3.1.1.1. 使用 dsconf backup create 命令备份所有数据库
使用 dsconf backup create 命令自动创建备份所有数据库的任务。
重要
当数据库从在线备份中恢复时,目录服务器会清理 changelog。因此,使用在线备份需要在数据库恢复后重新初始化副本。要避免重新初始化,请使用离线备份。
例如,要备份所有数据库,请运行:
# dsconf -D "cn=Directory Manager" ldap://server.example.com backup create
The backup create task has finished successfully
默认情况下,dsconf/var/lib/dirsrv/slapd-instance_name/bak/ 目录中的名为 instance_name-time_stamp 的子目录中保存备份。要指定不同的位置,请在命令中附加目录名称。
6.3.1.1.2. 使用 cn=tasks 条目备份所有数据库
Directory 服务器配置中的 cn=tasks,cn=config 条目是服务器用来管理任务的临时条目的容器条目。要启动备份操作,请在 cn=backup,cn=tasks,cn=config 条目中创建任务。
通过使用任务条目,您可以在服务器运行时备份数据库。
备份任务条目需要以下属性:
  • cn :设置任务的唯一名称。
  • nsDatabaseType :将数据库的类型设置为备份。目录服务器仅支持此属性中的 ldbm 数据库 值。
备份任务支持额外的参数,例如,将不同的目标目录指定为默认值 /var/lib/dirsrv/slapd-instance_name/bak/。有关完整列表,请参阅红帽目录服务器配置、命令和文件参考中的 cn=backup 部分。
例如,备份所有数据库并将存档存储在默认备份目录中:
# ldapadd -D "cn=Directory Manager" -W -H ldap://server.example.com -x

dn: cn=example_backup,cn=export,cn=tasks,cn=config
changetype: add
objectclass: extensibleObject
cn: example_backup
nsDatabaseType: ldbm database
如果没有指定 nsArchiveDir 属性,服务器会将备份存储在 /var/lib/dirsrv/slapd-instance_name/bak/ 目录中的名为 instance_name-time_stamp 的子目录中。
任务完成后,该条目将从目录配置中删除。

6.3.1.2. 备份所有数据库,但服务器为 Offline

如果在备份数据库时服务器离线,请使用 dsctl db2bak 命令:
  1. 停止实例:
    # dsctl instance_name stop
  2. 备份数据库:
    # dsctl instance_name db2bak
    db2bak successful
    注意
    dsctl db2bak 命令以 dirsrv 用户身份运行备份。因此,目标目录的权限必须允许此用户创建文件和目录。
    如果您没有将目标目录附加到命令,服务器会将备份存储在 /var/lib/dirsrv/slapd-instance_name/bak/ 目录中的名为 instance_name-time_stamp 的子目录中。
  3. 启动实例:
    # dsctl instance_name start

6.3.2. 使用 Web 控制台备份所有数据库

使用 Web 控制台,您可以在线备份。
重要
当数据库从在线备份中恢复时,目录服务器会清理 changelog。因此,使用在线备份需要在数据库恢复后重新初始化副本。要避免重新初始化,请使用离线备份。
使用 Web 控制台备份实例的所有数据库:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 单击 Actions 按钮,然后选择 Manage Backup
  4. Create Backup
  5. 输入备份的名称,如指示备份的创建日期和时间的时间戳。
  6. Create Backup
服务器将备份存储在 /var/lib/dirsrv/slapd-instance_name/bak/ 目录中的名称的子目录。

6.3.3. 备份配置文件、证书数据库和自定义架构文件

集成到目录服务器中的备份机制只备份数据库。但是,在 /etc/dirsrv/slapd-instance_name/ 目录中存储了额外的文件,例如,在硬件故障后恢复不同服务器上的实例。
注意
Web 控制台中不支持备份配置目录。

例 6.2. 如何备份 /etc/dirsrv/slapd-instance_name/ Directory

要备份 /etc/dirsrv/slapd-instance_name/ 的内容,您可以复制目录或将其存储在存档文件中。例如,要将 /etc/dirsrv/slapd-instance_name/ 目录中的内容存储在 / root/config_slapd-instance_name_time_stamp.tar.gz 文件中:
# cd /etc/dirsrv/
# tar -zcvf /root/config_slapd-instance_name_$(date +%Y-%m-%d_%H-%M-%S).tar.gz slapd-instance_name/
重要
在备份过程中,不要更新证书数据库。否则,这个数据库在备份中可能不一致。

6.3.4. 启用组的成员来备份目录服务器,并以一个组成员身份执行备份

您可以配置组的成员具有备份实例的权限并执行备份。这提高了安全性,因为您不再需要在备份脚本或 cron 作业中设置 cn=Directory Manager 的凭证。另外,您可以通过修改组来轻松地授予和撤销备份权限。

6.3.4.1. 启用组备份目录服务器

使用这个流程添加 cn=backup_users,ou=groups,dc=example,dc=com 组成员,并启用此组的成员创建备份任务。

流程

  1. 创建 cn=backup_users,ou=groups,dc=example,dc=com 组:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" group create --cn backup_users
  2. 添加访问控制指令(ACI),允许 cn=backup_users,ou=groups,dc=example,dc=com 组的成员创建备份任务:
    # ldapadd -D "cn=Directory Manager" -W -H ldap://server.example.com
    
    dn: cn=config
    changetype: modify
    add: aci
    aci: (target = "ldap:///cn=backup,cn=tasks,cn=config")(targetattr="*")
     (version 3.0 ; acl "permission: Allow backup_users
      group to create backup tasks" ; allow (add, read, search) groupdn
      = "ldap:///cn=backup_users,ou=groups,dc=example,dc=com";)
    -
    add: aci
    aci: (target = "ldap:///cn=config")(targetattr = "nsslapd-bakdir || objectClass")
     (version 3.0 ; acl "permission: Allow backup_users group
      to access bakdir attribute" ; allow (read,search) groupdn
      = "ldap:///cn=backup_users,ou=groups,dc=example,dc=com";)
  3. 创建用户:
    1. 创建用户帐户:
      # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" user create --uid="example" --cn="example" --uidNumber="1000" --gidNumber="1000" --homeDirectory="/home/example/" --displayName="Example User"
    2. 在用户帐户中设置密码:
      # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" account reset_password "uid=example,ou=People,dc=example,dc=com" "password"
  4. uid=example,ou=People,dc=example,dc=com 用户添加到 cn=backup_users,ou=groups,dc=example,dc=com 组中:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" group add_member backup_users uid=example,ou=People,dc=example,dc=com

验证

  • 显示 cn=config 条目中设置的 ACI:
    # ldapsearch -o ldif-wrap=no -LLLx -D "cn=directory manager" -W -H ldap://server.example.com -b cn=config aci=* aci -s base
    dn: cn=config
    aci: (target = "ldap:///cn=backup,cn=tasks,cn=config")(targetattr="*")(version 3.0 ; acl "permission: Allow backup_users group to create backup tasks" ; allow (add, read, search) groupdn = "ldap:///cn=backup_users,ou=groups,dc=example,dc=com";)
    aci: (target = "ldap:///cn=config")(targetattr = "nsslapd-bakdir || objectClass")(version 3.0 ; acl "permission: Allow backup_users group to access bakdir attribute" ; allow (read,search) groupdn = "ldap:///cn=backup_users,ou=groups,dc=example,dc=com";)
    ...

6.3.4.2. 以普通用户身份执行备份

您可以以普通用户而不是 cn=Directory Manager 执行备份。

先决条件

流程

  • 使用以下方法之一创建备份任务:
    • 使用 dsconf backup create 命令:
      # dsconf -D uid=example,ou=People,dc=example,dc=com ldap://server.example.com backup create
    • 通过手动创建任务:
      # ldapadd -D uid=example,ou=People,dc=example,dc=com -W -H ldap://server.example.com
      
      dn: cn=backup-2021_07_23_12:55_00,cn=backup,cn=tasks,cn=config
      changetype: add
      objectClass: extensibleObject
      nsarchivedir: /var/lib/dirsrv/slapd-instance_name/bak/backup-2021_07_23_12:55_00
      nsdatabasetype: ldbm database
      cn: backup-2021_07_23_12:55_00

验证

  • 验证备份是否已创建:
    # ls -l /var/lib/dirsrv/slapd-instance_name/bak/
    total 0
    drwx------. 3 dirsrv dirsrv 108 Jul 23 12:55 backup-2021_07_23_12_55_00
    ...

6.4. 恢复目录服务器

在某些情况下,管理员想要恢复目录服务器,例如在硬件故障后。本节描述了支持的恢复方法。
注意
目录服务器不支持恢复单个数据库。
目录服务器以 dirsrv 用户身份运行恢复操作。因此,包含备份的目录的权限必须允许此用户读取文件。

6.4.1. 使用命令行恢复所有数据库

目录服务器支持在实例正在运行或实例离线时恢复数据库:

6.4.1.1. 恢复服务器正在运行的所有数据库

6.4.1.1.1. 使用 dsconf 备份恢复命令恢复 所有数据库
使用 dsconf backup restore 命令自动创建从备份目录中恢复所有数据库的任务。
例如,要恢复存储在 /var/lib/dirsrv/slapd-instance_name/bak/instance_name-time_stamp/ 目录中的备份:
# dsconf -D "cn=Directory Manager" ldap://server.example.com backup restore /var/lib/dirsrv/slapd-instance_name/bak/instance_name-time_stamp/
The backup restore task has finished successfully
6.4.1.1.2. 使用 cn=tasks 条目恢复所有数据库
Directory 服务器配置中的 cn=tasks,cn=config 条目是服务器用来管理任务的临时条目的容器条目。要启动恢复操作,请在 cn=restore,cn=tasks,cn=config 条目中创建任务。
警告
使用恢复任务会覆盖实例中的所有数据。
恢复任务条目需要以下属性:
  • cn :设置任务的唯一名称。
  • nsArchiveDir :设置包含备份的目录的路径。
  • nsDatabaseType :设置要恢复的数据库类型。目录服务器仅支持此属性中的 ldbm 数据库 值。
例如,添加一个任务来从存储在 /var/lib/dirsrv/slapd-instance_name/bak/instance_name-time_stamp/ 目录中的备份中恢复所有数据库:
# ldapadd -D "cn=Directory Manager" -W -H ldap://server.example.com -x

dn: cn=example_restore,cn=import,cn=tasks,cn=config
changetype: add
objectclass: extensibleObject
cn: example_restore
nsArchiveDir: /var/lib/dirsrv/slapd-instance_name/bak/instance_name-time_stamp/
nsDatabaseType: ldbm database
任务完成后,该条目将从目录配置中删除。

6.4.1.2. 恢复服务器的所有数据库为 Offline

如果在恢复数据库时服务器离线,请使用 dsctl bak2db 命令:
  1. 停止实例:
    # dsctl instance_name stop
  2. 恢复数据库。例如,添加一个任务来从存储在 /var/lib/dirsrv/slapd-instance_name/bak/instance_name-time_stamp/ 目录中的备份中恢复所有数据库:
    # dsctl instance_name bak2db /var/lib/dirsrv/slapd-instance_name/bak/instance_name-time_stamp/
    bak2db successful
    注意
    dsctl bak2db 命令以 dirsrv 用户身份运行。因此,源目录的权限必须允许此用户读取文件和目录。
  3. 启动实例:
    # dsctl instance_name start

6.4.2. 使用 Web 控制台恢复所有数据库

使用 Web 控制台恢复所有数据库:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 单击 Actions 按钮,然后选择 Manage Backups
    显示的窗口列出了 /var/lib/dirsrv/slapd-instance_name/bak/ 目录中的可用备份。
  4. 打开您要恢复的备份旁边的 Actions 菜单,然后选择 Restore Backup
  5. 单击 Yes 以确认。

6.4.3. 恢复包含复制条目的数据库

恢复供应商服务器时可能会出现一些情况:
  • 消费者服务器也会恢复。
    对于不太可能的情况,所有数据库都会从备份中恢复(因此数据保持同步),用户仍然与供应商同步,因此不需要做其他操作。复制可在不中断的情况下恢复。
  • 仅恢复供应商。
    如果只恢复供应商,或者消费者从不同时间进行的备份中恢复,请重新初始化供应商的用户以更新数据库中的数据。如果只恢复供应商,或者消费者从不同时间进行的备份中恢复,请重新初始化供应商的用户以更新数据库中的数据。
  • 在供应商服务器上,changelog 条目还没有过期。
    如果自进行数据库备份以来供应商的 changelog 尚未过期,则恢复本地消费者并继续正常操作。只有在 cn=changelog5,cn=config 条目中的最大更改期限属性 nsslapd-changelogmaxage 设定的值短时,才会发生这种情况。有关这个选项的更多信息,请参阅 红帽目录服务器配置、命令和文件参考
    目录服务器自动检测副本及其更改日志之间的兼容性。如果检测到不匹配,服务器会删除旧的 changelog 文件,并创建一个新的空 changelog 文件。
  • 由于本地备份的时间,changelog 条目已在供应商服务器上过期。
    如果 changelog 条目已过期,请重新初始化消费者。有关重新初始化消费者的详情,请参考 第 15.8.3 节 “初始化消费者”

例 6.3. 恢复目录服务器复制拓扑

例如,要恢复复制环境中所有服务器,由两个供应商和两个消费者服务器组成:
  1. 恢复第一个供应商。使用 dsconf backend import 命令导入数据。请参阅 第 6.1.2 节 “使用命令行导入”
  2. 使用复制在线重新初始化剩余的服务器:
    1. 从第一个供应商初始化第二个供应商。
    2. 初始化来自供应商的用户。
  3. 在每个服务器上,显示复制状态以验证复制是否正常工作。详情请查看 第 15.22 节 “显示特定复制协议的状态”
在恢复操作过程中,与恢复数据库关联的更改日志会被清除。消息将记录到供应商服务器的日志文件,表示需要重新初始化。
有关管理复制的详情,请参考 第 15 章 管理复制

第 7 章 管理属性和值

Red Hat Directory Server 为动态和自动维护目录条目上的某些属性提供几种不同的机制。这些插件和配置选项简化了管理目录数据并表达条目之间的关系。
条目特性的一部分是它们相互 的关系。值得注意的是,经理有一个员工,因此这两个条目都相关。组与其成员关联。也有不太明显的关系,如共享一个通用物理位置的条目之间。
Red Hat Directory Server 提供了几种不同方法,这些条目间的关系可以平稳且一致地维护。有几个插件可作为目录中的数据的一部分自动应用或生成属性,包括服务类、链接属性和生成唯一的数字属性值。

7.1. 强制属性唯一性

为确保属性值在目录或子树之间是唯一的,请使用 属性唯一 插件。
如果您希望多个属性是唯一的,或者想要使用不同的条件,请创建插件的多个配置记录。

7.1.1. 创建 属性唯一插件的新配置 记录

对于值必须是唯一的的每个属性,请创建一个 属性插件的 新配置记录。
注意
您只能从命令行创建插件的新配置记录。
为插件创建一个新的未配置和禁用的配置记录,名为 Example Attribute Uniqueness
dsconf -D "cn=Directory Manager" ldap://server.example.com plugin attr-uniq add "Example" --attr-name uid

7.1.2. 通过后缀或子树配置属性唯一性

您可以配置 属性唯一 插件,以确保属性值在某些后缀、子树或后缀和子树中是唯一的。

7.1.2.1. 使用命令行通过后缀或子树配置属性唯一性

要配置,例如,存储在 mail 属性中的值是唯一的:
  1. 属性唯一 插件创建一个新的配置记录,例如,邮件属性唯一性。详情请查看 第 7.1.1 节 “创建 属性唯一插件的新配置 记录”
  2. 启用插件配置记录:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin attr-uniq enable "mail Attribute Uniqueness"
  3. 配置存储在 邮件 属性中的值必须在内唯一,例如 ou=Engineering,dc=example,dc=comou=sales,dc=example,dc=com 子树:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin attr-uniq set "mail Attribute Uniqueness" --attr-name mail --subtree ou=Engineering,dc=example,dc=com ou=Sales,dc=example,dc=com
  4. 另外,要选择性地配置此插件配置记录中配置的所有子树的唯一性:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin attr-uniq set "mail Attribute Uniqueness" --across--all-subtrees=on
  5. 重启实例:
    # dsctl instance_name restart

7.1.2.2. 使用 Web 控制台通过后缀或子树配置属性唯一性

要配置,例如,存储在 mail 属性中的值是唯一的:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Plugins 菜单。
  4. 选择 Attribute Uniqueness 插件。
  5. 单击 Add Config
  6. 填写字段并启用配置。例如:

    图 7.1. 添加属性唯一配置

    添加属性唯一配置

7.1.3. 配置对象类的属性唯一性

您可以配置 Attribute Uniqueness 插件,以确保属性值在包含特定对象类的子树条目中是唯一的。目录服务器在更新对象的父条目中搜索此对象类。如果目录服务器找不到对象类,搜索将继续在目录树的根目录的下一个更高级别的条目中。如果找到对象类,Directory 服务器会验证 uniqueness-attribute-name 中设置的属性值在此子树中是唯一的。
要配置,例如,存储在 mail 属性中的值在包含 nsContainer 对象类的条目下是唯一的:
  1. 属性唯一 插件创建一个新的配置记录,例如,邮件属性唯一性。详情请查看 第 7.1.1 节 “创建 属性唯一插件的新配置 记录”
  2. 启用插件配置记录:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin attr-uniq enable "mail Attribute Uniqueness"
  3. 在包含 nsContainer 对象类的条目下,配置存储在 mail 属性中的值必须是唯一的:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin attr-uniq set "mail Attribute Uniqueness" --top-entry-oc=nsContainer
  4. 另外,您还可以限制正在检查的对象范围。如果您希望服务器只检查包含 nsContainer 对象类的条目子集,请在 uniqueness-subtree-entries-oc 参数中设置额外的对象类。另外,还需要存在这个其他类。
    例如,mail 属性在包含 nsContainer 对象类集的条目下的所有条目中必须是唯一的。但是,您希望插件只在包含提供此属性的对象类的条目中搜索 邮件,如 inetOrgPerson。在这种情况下,请输入:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin attr-uniq set "mail Attribute Uniqueness" --subtree-entries-oc=inetOrgPerson
  5. 重启实例:
    # dsctl instance_name restart

7.1.4. 属性唯一插件配置参数

要配置 属性唯一插件配置 记录,请在 cn=attribute_uniqueness_configuration_record_name,cn=plugins,cn=config 条目中设置插件的配置属性。

例 7.1. 使用特定于插件的属性的属性进行属性插件插件配置

dn: cn=Example Attribute Uniqueness,cn=plugins,cn=config
nsslapd-pluginEnabled: on
uniqueness-attribute-name: attribute_name
uniqueness-top-entry-oc: objectclass1 
uniqueness-subtree-entries-oc: objectclass2
有关您可以配置 属性唯一 插件的参数列表,请查看 Red Hat Directory Server 配置、命令和文件参考 中的相应部分

7.2. 分配服务类

一类服务定义 (CoS)以对应用程序透明的方式在条目间共享属性。COS 简化了条目管理并降低存储要求。
目录服务器的客户端读取用户条目中的属性。使用 CoS 时,一些属性值可能无法存储在条目本身中。相反,这些属性值由服务逻辑类生成,因为条目发送到客户端应用程序。
每个 CoS 都由目录中的两种类型的条目组成:
  • COS 定义条目。CoS 定义条目标识使用的 CoS 类型。与角色定义条目一样,它继承自 LDAP 子条目 对象类。CoS 定义条目低于其有效的分支。
  • 模板条目。CoS 模板条目包含共享属性值的列表。对模板条目属性值的更改会自动应用到 CoS 范围内的所有条目。单个 CoS 可能会有多个与它关联的模板条目。
CoS 定义条目和模板条目交互,为其目标条目提供属性信息,在 CoS 范围内任何条目。

7.2.1. 关于 CoS 定义条目

CoS 定义条目是 cosSuperDefinition 对象类的实例。CoS 定义条目还包含三种对象类中的一个,用于指定它用来生成条目的模板条目类型。与 CoS 交互的目标条目共享与 CoS 定义条目相同的父项。
CoS 有三种类型,使用三种类型的 CoS 定义条目定义:
  • 指针 CoS。指针 CoS 仅使用模板 DN 识别模板条目。
  • 间接 CoS。间接 CoS 使用其中一个目标条目属性的值来识别模板条目。例如,间接 CoS 可能会指定目标条目的 manager 属性。然后,使用 manager 属性的值来标识模板条目。
    目标条目的属性必须是单值,并包含一个 DN。
  • 经典 CoS。经典 CoS 使用模板条目的基本 DN 和其中一个目标条目的属性的组合来识别模板条目。
有关与每种 CoS 关联的对象类和属性的更多信息,请参阅 第 7.2.10 节 “从命令行管理 CoS”
如果 CoS 逻辑检测到条目包含生成值的属性,CoS 默认为客户端应用程序提供条目本身中的属性值。但是,CoS 定义条目可以控制此行为。

7.2.2. 关于 CoS 模板条目

CoS 模板条目包含 CoS 逻辑生成的属性的值或值。CoS 模板条目包含 cosTemplate 的常规对象类。给定 CoS 的 CoS 模板条目存储在目录树中,以及 CoS 定义。
模板条目的相对可分辨名称(RDN)由以下之一决定:
  • 仅模板条目的 DN。这种类型的模板与指针 CoS 定义关联。
  • 目标条目的属性之一的值。用于向模板条目提供相对 DN 的属性使用 cosIndirectSpecifier 属性在 CoS 定义条目中指定。这种类型的模板与间接 CoS 定义关联。
  • 通过组合使用 CoS 对模板执行一个级别的搜索,以及其中一个目标条目属性的值。这种类型的模板与经典 CoS 定义关联。

7.2.3. A Pointer CoS Works

管理员会创建一个指针 CoS,它将通用后代码与存储在 dc=example,dc=com 下的所有条目共享。这个 CoS 的三个条目如 图 7.2 “Pointer CoS 示例” 所示。

图 7.2. Pointer CoS 示例

Pointer CoS 示例
在本例中,模板条目由 CoS 定义条目中的 DN cn=exampleUS,cn=data 来标识。每次查询 postalCode 属性时,条目 cn=wholiday,ou=body,dc=example,dc=com 都会返回模板条目 cn=exampleUS,cn=data 中可用的值。

7.2.4. 间接 CoS 工作方式

管理员会创建一个间接 CoS,它使用目标条目的 manager 属性来识别模板条目。三个 CoS 条目如 图 7.3 “Indirect CoS 示例” 所示。

图 7.3. Indirect CoS 示例

Indirect CoS 示例
在本例中,William Holiday 的目标条目包含间接指定符( manager 属性)。William 的管理器是 Applela Fuentes,因此 管理器 属性包含指向模板条目的 DN cn=Carla Fuentes,ou=body,dc=example,dc=com 的指针。然后,模板条目提供了 departmentNumber 属性值 318842

7.2.5. 经典 CoS 工作方式

管理员会创建一个典型的 CoS,它使用模板 DN 和 CoS specifier 来标识包含 postal 代码的模板条目。出现三个 CoS 条目,如 图 7.4 “Classic CoS 示例” 所示:

图 7.4. Classic CoS 示例

Classic CoS 示例
在本例中,CoS 定义条目的 cosSpecifier 属性指定 employeeType 属性。此属性与模板 DN 相结合,将模板条目识别为 cn=sales,cn=exampleUS,cn=data。然后,模板条目向目标条目提供 postalCode 属性的值。

7.2.6. 处理物理属性值

cosAttribute 属性包含由服务类管理的另一个属性的名称。此属性允许在属性值后 覆盖 限定符,该属性值在 CoS 在生成属性值时如何处理条目上的现有属性值。
cosAttribute: attribute_name override
有四个 覆盖 限定符:
  • Default :只有在没有与该条目存储的对应属性值时,才会返回生成的值。
  • override: Always 返回 CoS 生成的值,即使条目存储了值。
  • 操作 :仅在搜索中明确请求时返回生成的属性。操作属性不需要传递 schema 检查才能返回。使用 操作时,它还会覆盖任何现有属性值。
    注意
    属性只能在 schema 中定义为可操作时才可以正常工作。例如,如果 CoS 为 description 属性生成一个值,则无法使用 操作 限定符,因为此属性没有在 schema 中标记为操作。
  • Operation-default :只有在没有与条目存储的对应属性值且搜索中明确请求时,才会返回生成的值。
如果没有设置限定符,则假定 默认值
例如,此指针 CoS 定义条目表示它与模板条目 cn=exampleUS,ou=data,dc=example,dc=com 相关联,它生成 postalCode 属性的值。覆盖 限定符表示这个值优先于 postalCode 属性的条目存储的值:
dn: cn=pointerCoS,dc=example,dc=com
objectclass: top
objectclass: cosSuperDefinition
objectclass: cosPointerDefinition
cosTemplateDn: cn=exampleUS,ou=data,dc=example,dc=com
cosAttribute: postalCode override
注意
如果条目包含 CoS 生成的属性值,如果属性使用操作或覆盖限定符定义,则无法 手动更新该属性值。
有关 CoS 属性的更多信息,请参阅 红帽目录服务器配置、命令和文件参考

7.2.7. 使用 CoS 处理多值属性

可以使用 service 类生成任何属性 - 包括多值属性。这引入了混淆的可能性。哪个 CoS 提供值?它们中的任何一个或全部?从竞争 CoS 模板中选择的值如何?生成的属性是否使用单个值或多个值?
可以通过两种方式解决这个问题:
  • 创建一个规则,将多个 CoS 生成的属性合并到目标条目中。这会在目标条目中生成多个值。
  • 设置 priority 以从竞争 CoS 定义中选择一个 CoS 值。这会为目标条目生成一个值。
注意
间接 CoS 不支持 cosPriority 属性。
CoS 处理 CoS 属性的多个值的定义方式在它使用了 merge-schemes 限定符。
cosAttribute: attribute override merge-schemes
注意
merge-schemes 限定符不会影响 CoS 处理物理属性值 或覆盖 限定符的方式。如果有多个竞争 CoS 模板或定义,则对于每个竞争 CoS 定义,需要在每个 cosAttribute 中设置相同的 merge-schemesoverride qualifiers。否则,会从所有可能的 CoS 定义中随机选择一个组合。
使用 merge-schemes 限定符告知 CoS 将为受管属性生成多个值。具有多值 CoS 属性可能有两个可能的情况:
  • 一个 CoS 模板条目包含多个受管 CoS 属性实例,从而在目标条目上生成多个值。例如:
    dn: cn=server access template,dc=example,dc=com
    objectclass: top
    objectclass: extensibleObject
    objectclass: cosTemplate
    accessTo: mail.example.com
    accessTo: irc.example.com
    注意
    这个方法只适用于经典 CoS。
  • 多个 CoS 定义可以为同一目标属性定义一系列服务,因此有多个模板条目。例如:
    dn: cn=mail template,dc=example,dc=com
    objectclass: top
    objectclass: extensibleObject
    objectclass: cosTemplate
    accessTo: mail.example.com
    
    dn: cn=chat template,dc=example,dc=com
    objectclass: top
    objectclass: extensibleObject
    objectclass: cosTemplate
    accessTo: irc.example.com
但是,即使有多个 CoS 定义,也应该只为属性生成一个值。如果有多个 CoS 定义,则会随机选择该值。这是一个无法预测的、unwieldy 选项。控制要使用的 CoS 模板的方式是在模板中设置排名 - 优先级 - 以及最高优先级 CoS 始终"wins"并提供值。
通常会完成多个模板,以提供值。例如,CoS 定义条目中可以有一个多值 cosSpecifier 属性。使用 cosPriority 属性设置模板优先级。此属性代表特定模板的全局优先级。优先级为零是最高优先级。
例如,用于生成部门数的 CoS 模板条目如下所示:
dn: cn=data,dc=example,dc=com
objectclass: top
objectclass: extensibleObject
objectclass: cosTemplate
departmentNumber: 71776
cosPriority: 0
此模板条目包含 departmentNumber 属性的值。它的优先级为零,这意味着此模板优先于定义不同的 departmentNumber 值的任何其他冲突模板。
不包含 cosPriority 属性的模板被视为最低优先级。其中两个或更多模板被认为提供属性值,并且它们具有相同的(或无)优先级,则会随机选择值。
注意
在 Directory Server 中没有定义负的 cosPriority 值的行为,因此不要输入负值。

7.2.8. 搜索 CoS-Specified 属性

COS 定义为条目中的属性提供值。例如,CoS 可以为子树中的每个条目设置 postalCode 属性。但是,搜索这些 CoS 定义的属性并不像对常规条目的搜索一样。
如果 CoS-defined 属性使用任何类型的索引(包括存在)进行索引,那么任何具有由 CoS 设置的值的属性都不会通过搜索返回。例如:
  • Ted Morris 的 postalCode 属性由 CoS 定义。
  • Barbara Jensen 的 postalCode 属性在她条目中设置。
  • postalCode 属性被索引。
如果 ldapsearch 命令使用过滤器 (postalCode=*),则会返回 Barbara Jensen 条目,而 Ted Morris 的条目没有被返回。
如果没有 索引 CoS-defined 属性,则搜索中每个匹配的条目都会返回,无论属性值是本地设置的还是使用 CoS。例如:
  • Ted Morris 的 postalCode 属性由 CoS 定义。
  • Barbara Jensen 的 postalCode 属性在她条目中设置。
  • postalCode 属性 没有 索引。
如果 ldapsearch 命令使用过滤器 (postalCode=*),则返回 Barbara Jensen 和 Ted Morris 的条目。
COS 允许 覆盖,为 CoS 条目中的 cosAttribute 属性给出的标识符,这意味着属性的本地值可以覆盖 CoS 值。如果在 CoS 上设置了覆盖,则 ldapsearch 操作会返回一个条目的值,即使属性被索引,只要条目有一个本地值。具有 CoS 但没有本地值的其他条目仍会在 ldapsearch 操作中返回。
由于在 CoS 定义的属性上运行 LDAP 搜索请求的潜在问题,请在决定使用 CoS 生成哪些属性时要小心。

7.2.9. 访问控制和 CoS

服务器控制对 CoS 生成的属性的访问,其方式与常规存储的属性完全相同。但是,根据 CoS 生成的属性值,访问控制规则将无法正常工作。这与在搜索过滤器中使用 CoS 生成的属性的限制相同。

7.2.10. 从命令行管理 CoS

由于所有配置信息和模板数据都作为条目存储在目录中,因此标准 LDAP 工具可用于 CoS 配置和管理。

7.2.10.1. 从命令行创建 CoS 定义条目

每种 CoS 类型都需要在定义条目中指定特定的对象类。所有 CoS 定义对象类都继承自 LDAPsubentry 对象类和 cosSuperDefinition 对象类。
指针 CoS 使用 cosPointerDefinition 对象类。此对象类使用 cosTemplateDn 属性中指定的条目 DN 值来标识模板条目,如 例 7.2 “一个 Pointer CoS Entry 示例” 所示。

例 7.2. 一个 Pointer CoS Entry 示例

 dn: cn=pointerCoS,dc=example,dc=com
 objectclass: top
 objectclass: cosSuperDefinition
 objectclass: cosPointerDefinition  
 cosTemplateDn:DN_string  
 cosAttribute:list_of_attributes qualifier  
 cn: pointerCoS
间接 CoS 使用 cosIndirectDefinition 对象类。这种类型的 CoS 根据目标条目的属性的值标识模板条目,如 cosIndirectSpecifier 属性中指定的。这在 例 7.3 “一个间接 CoS 条目示例” 中显示。

例 7.3. 一个间接 CoS 条目示例

 dn: cn=indirectCoS,dc=example,dc=com
 objectclass: top
 objectclass: cosSuperDefinition
 objectclass: cosIndirectDefinition  
 cosIndirectSpecifier:attribute_name  
 cosAttribute:list_of_attributes qualifier  
 cn: indirectCoS
经典 CoS 使用 cosClassicDefinition 对象类。这通过使用模板条目的 DN ( cosTemplateDn 属性中的设置)和其中一个目标条目的属性(在 cosSpecifier 属性中设置)来识别模板条目。这在 例 7.4 “经典 CoS 条目示例” 中显示。

例 7.4. 经典 CoS 条目示例

 dn: cn=classicCoS,dc=example,dc=com
 objectclass: top
 objectclass: cosSuperDefinition
 objectclass: cosClassicDefinition  
 cosTemplateDn:DN_string  
 cosSpecifier:attribute_name  
 cosAttribute:list_of_attributes qualifier  
 cn: classicCoS
对于服务类,对象类定义 CoS 的类型,支持的属性通过定义 CoS 模板来识别影响哪些目录条目。每个 CoS 都有一个额外的属性,可为其定义: cosAttribute。CoS 的目的是在多个条目间提供属性值;cos Attribute 属性定义 CoS 为哪个属性生成值。

7.2.10.2. 从命令行创建 CoS 模板条目

每个模板条目都是 cosTemplate 对象类的实例。
注意
考虑将 LDAPsubentry 对象类添加到新模板条目中。使 CoS 模板条目成为 LDAP 子条目 对象类的实例,允许执行常规搜索。但是,如果模板条目已存在,并且用于其他项,如用户条目,则 LDAPsubentry 对象类不需要添加到模板条目中。
CoS 模板条目还包含由 CoS 定义条目的 cosAttribute 属性生成的属性,以及该属性的值。
例如,为 postalCode 属性提供值的 CoS 模板条目如下:
dn:cn=exampleUS,ou=data,dc=example,dc=com
objectclass: top
objectclass: extensibleObject
objectclass: cosTemplate
postalCode: 44438
以下小节提供了模板条目示例,以及每种 CoS 定义条目的示例。

7.2.10.3. Pointer CoS 示例

公司管理员创建指针 CoS 的示例,其与 dc=example,dc=com 树中的所有条目共享一个通用后代码。
  1. 使用 ldapmodifydc=example,dc=com 后缀中添加一个新的指针 CoS 定义条目:
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    dn: cn=pointerCoS,dc=example,dc=com
    changetype: add
    objectclass: top
    objectclass: cosSuperDefinition
    objectclass: cosPointerDefinition
    cosTemplateDn: cn=exampleUS,ou=data,dc=example,dc=com
    cosAttribute: postalCode
  2. 创建模板条目:
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    dn: cn=exampleUS,ou=data,dc=example,dc=com
    changetype: add
    objectclass: top
    objectclass: extensibleObject
    objectclass: cosTemplate
    postalCode: 44438
CoS 模板条目(cn=exampleUS,ou=data,dc=example,dc=com)提供存储在其 postalCode 属性中的值到 dc=example,dc=com 后缀下的任何条目。这些条目是目标条目。

7.2.10.4. Indirect CoS 示例

此间接 CoS 使用目标条目的 manager 属性来识别 CoS 模板条目,它因属性的不同值而异。
  1. 使用 ldapmodifydc=example,dc=com 后缀中添加一个新的间接 CoS 定义条目:
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    dn: cn=indirectCoS,dc=example,dc=com
    changetype: add
    objectclass: top
    objectclass: cosSuperDefinition
    objectclass: cosIndirectDefinition
    cosIndirectSpecifier: manager
    cosAttribute: departmentNumber
如果目录或修改管理器条目已经包含 departmentNumber 属性,则不需要将其他属性添加到管理器条目中。定义条目在目标后缀( dc=example,dc=com下的条目)中查找包含 manager 属性的条目,因为此属性是在定义条目的 cosIndirectSpecifier 属性中指定的。然后,它会在列出的 manager 条目中检查 departmentNumber 值。departmentNumber 属性的值将自动转发到具有 manager 属性的所有管理器下级。departmentNumber 的值会根据不同管理器条目中列出的部门号而有所不同。

7.2.10.5. 经典 CoS 示例

示例公司管理员创建一个经典 CoS,它使用模板 DN 和 cosSpecifier 属性中指定的属性自动生成后代码。
  1. 使用 ldapmodifydc=example,dc=com 后缀中添加一个新的 classic CoS 定义条目:
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    dn: cn=classicCoS,dc=example,dc=com
    changetype: add
    objectclass: top
    objectclass: cosSuperDefinition
    objectclass: cosClassicDefinition
    cosTemplateDn: cn=classicCoS,dc=example,dc=com
    cosSpecifier: businessCategory
    cosAttribute: postalCode override
  2. 为销售和销售部门创建模板条目。将 CoS 属性添加到模板条目。模板的 cn 在目标条目中设置 businessCategory 属性的值,然后根据模板中的值添加或覆盖属性:
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    dn: cn=sales,cn=classicCoS,dc=example,dc=com
    changetype: add
    objectclass: top
    objectclass: extensibleObject
    objectclass: cosTemplate
    postalCode: 44438
    -
    dn: cn=marketing,cn=classicCoS,dc=example,dc=com
    changetype: add
    objectclass: top
    objectclass: extensibleObject
    objectclass: cosTemplate
    postalCode: 99111
经典 CoS 定义条目应用到 dc=example,dc=com 后缀下的所有条目。根据条目中找到的 businessCategory 属性和 cosTemplateDn 的组合,它可以到达两个模板之一。销售模板( Sales 模板)提供了一个特定于销售部门员工的发布代码。市场模板提供了一个特定于市场部门员工的发布代码。

7.2.10.6. 搜索 CoS 条目

COS 定义条目是 操作 条目,默认情况下不会在常规搜索中返回。要在搜索中返回 CoS 定义条目,请将 ldapSubEntry 对象类添加到 CoS 定义条目中。例如:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: cn=pointerCoS,ou=People,dc=example,dc=com
changetype: add
objectclass: ldapSubEntry
然后,使用带有 ldapsearch 工具的 (objectclass=ldapSubEntry) 过滤器来搜索包含 ldapSubEntry 对象类的条目。例如:
# ldapsearch -x -s sub -b ou=People,dc=example,dc=com "(|(objectclass=*)(objectclass=ldapSubEntry))"
除了 ou=People,dc=example,dc=com 子树中的 CoS 定义条目外,此搜索会返回所有常规条目。

7.2.10.7. costargettree 属性

costargettree 属性定义 CoS 模式应用到的子树。模式和多个 CoS 模式的 costargettree 的值可能会随机地重叠其目标树。

表 7.1. costargettree 属性

OID 2.16.840.1.113730.3.1.552
语法 DirectoryString
multi 或 Single-Valued single-valued
定义于 目录服务器

7.2.11. 创建基于角色的属性

Classic CoS 方案根据条目拥有的角色为条目生成属性值。例如,基于角色的属性可用于基于条目设置服务器查找限制。
要创建基于角色的属性,请使用 nsRole 属性作为经典 CoS 的 CoS 定义条目中的 cosSpecifier。因为 nsRole 属性可以是多值,所以可以定义 CoS 方案,它们具有多个可能的模板条目。要解决要使用的模板条目的不确定性,请在 CoS 模板条目中包含 cosPriority 属性。
例如,这个 CoS 允许 manager 角色的成员超过标准邮箱配额。manager 角色条目为:
dn: cn=ManagerRole,ou=people,dc=example,dc=com
objectclass: top
objectclass: nsRoleDefinition
objectclass: nsComplexRoleDefinition
objectclass: nsFilteredRoleDefinition
cn: ManagerRole
nsRoleFilter: ou=managers
Description: filtered role for managers
警告
nsRoleFilter 属性无法接受虚拟属性值。
不要索引虚拟属性值。对虚拟属性运行搜索可能会导致意外的系统性能或搜索结果不正确。未索引的搜索会破坏使用搜索过滤器中的虚拟属性的搜索操作。虚拟属性是动态生成的,不存储在目录服务器后端中。因此,virual 属性不支持索引。
经典 CoS 定义条目类似如下:
dn: cn=managerCOS,dc=example,dc=com
objectclass: top
objectclass: cosSuperDefinition
objectclass: cosClassicDefinition
cosTemplateDn: cn=managerCOS,dc=example,dc=com
cosSpecifier: nsRole
cosAttribute: mailboxquota override
cosTemplateDn 属性提供一个值,与 cosSpecifier 属性中指定的属性(例如,目标条目的 nsRole 属性)结合使用,用于标识 CoS 模板条目。CoS 模板条目为 mailboxquota 属性提供值。额外的 覆盖符 告知 CoS 覆盖目标条目中任何现有的 mailboxquota 属性值。
对应的 CoS 模板条目类似如下:
dn:cn="cn=ManagerRole,ou=people,dc=example,dc=com",cn=managerCOS,dc=example,dc=com
objectclass: top
objectclass: extensibleObject
objectclass: cosTemplate
mailboxquota: 1000000
该模板为 mailboxquota 属性 1000000 提供值。
注意
角色条目和 CoS 定义和模板条目应当位于目录树中的同一级别。

7.3. 链接属性以管理属性值

对于所有 具有相同 值的属性的条目,类服务会动态提供属性值,如构建地址、后代码或主办公室号码。这些是共享属性值,在单个模板条目中更新。
但是,通常情况下,不同条目之间需要有一种表达其之间的链接方式,但显示该关系的值(甚至可能是属性)。Red Hat Directory Server 提供了一种将指定属性链接在一起的方法,以便在一个条目中的一个属性被改变时,会自动更新相关条目上的对应属性。(链接和受管属性均具有 DN 值。link 属性的值包含要更新的插件条目的 DN;第二个条目的 managed 属性具有指向原始链接条目的 DN 值。

7.3.1. 关于链接属性

链接的属性插件允许插件的多个实例。每个实例配置一个属性,它由管理员手动维护(linkType),以及一个由插件自动维护的属性(managedType)。

图 7.5. 基本链接的属性配置

基本链接的属性配置
注意
为了保持数据一致性,只有插件进程才会维护 managed 属性。考虑创建一个 ACI,以限制对任何受管属性的所有写入访问。有关设置 ACI 的详情,请查看 第 18.7.2 节 “添加 ACI”
链接的属性插件实例可以限制为目录中的单个子树。这可允许对属性组合和受影响的条目进行更加灵活的自定义。如果没有设置范围,则插件将在整个目录中运行。

图 7.6. 将链接的属性插件限制为特定子树

将链接的属性插件限制为特定子树
在配置链接的属性插件实例时,需要某些配置:
  • managed 属性和链接的属性都必须在其属性定义中需要 Distinguished Name 语法。链接的属性本质上是跨引用管理的,插件处理这些跨引用的方式是从属性值中提取条目的 DN。
    有关规划自定义架构元素的详情,请参考 第 12 章 管理目录架构
  • 每个链接的属性插件实例都必须是本地的,并且 所有受管 属性都必须禁止使用部分复制进行复制。
    在一个供应商上所做的任何更改都将自动触发插件,以管理对应目录条目上的值,因此数据可以在服务器间保持一致。但是,受管属性必须由插件实例维护,才能在链接条目之间保持一致。这意味着,受管属性值应仅由插件进程(而不是复制过程)单独维护,即使在多层次复制环境中也是如此。
    有关使用部分复制的详情,请参考 第 15.1.7 节 “使用 DNATactional Replication 复制子属性集”

7.3.2. 查看链接属性插件语法

默认链接的属性插件条目是每个插件实例的容器条目,类似于下一部分中的密码语法插件或 DNA 插件。此容器条目下的每个条目都定义不同的 link-managed 属性对。
要创建新的链接属性对,请在容器条目下创建一个新的插件实例。需要定义两个基本链接属性插件实例:
  • 由管理员手动管理的属性在 linkType 属性中
  • 由插件在 managedType 属性中动态创建的属性
  • (可选)将插件限制为目录树的特定部分的范围,在 linkScope 属性中

例 7.5. 链接的属性插件实例条目示例

dn: cn=Manager Link,cn=Linked Attributes,cn=plugins,cn=config
objectClass: top
objectClass: extensibleObject
cn: Manager Link
linkType: directReport
managedType: manager
linkScope: ou=people,dc=example,dc=com
有关可用于 Linked Attributes 插件实例的属性列表,请查看 Red Hat Directory Server 配置、命令和文件参考 中的相应部分

7.4. 分配和管理唯一属性值

有些条目属性需要有一个唯一的数字,如 uidNumbergidNumber。目录服务器可以使用分布式数字分配(DNA)插件为指定属性自动生成并提供唯一数字。
注意
在 DNA 插件中,属性一致性不一定会保留。该插件只分配非重叠范围,但它允许为受管属性手动分配数字,而且不会验证或要求手动分配的数字是唯一的。
分配唯一数字的问题不会生成数字,而是有效地避免复制冲突。DNA 插件 在单个 后端之间分配唯一数字。对于多层次复制,当每个供应商都运行本地 DNA 插件实例时,必须有一种方法来确保每个实例都使用一组实际唯一的数字。这可以通过为每个服务器分配不同的 数字范围 来完成。

7.4.1. 关于动态数字分配

服务器的 DNA 插件分配了实例可能会发布的一系列可用数字。范围定义非常简单,由两个属性设置:服务器的下一个可用数字(范围的低端)和其最大值(范围顶部)。配置插件实例时,会设置初始底部范围。之后,底部值由插件更新。通过将可用数字分成每个副本上的独立范围,服务器可以持续分配数字,而不会相互重叠。

7.4.1.2. 范围和分配号

Directory 服务器有多种方法来处理生成属性值:
  • 在最简单的情形中,用户条目添加到具有对象类的目录中,该对象类需要 unique-number 属性,但没有属性 present。为 managed 属性添加没有值的条目会触发 DNA 插件分配值。只有在配置了 DNA 插件时,此选项才能为单个属性分配唯一值。
  • 类似且更易管理的选项是使用普通 数字。这个音量号是 managed 属性的模板值、服务器范围之外的内容、数字甚至一个单词,插件可识别它需要替换为新分配的值。当使用 magic 值添加条目,且该条目位于配置的 DNA 插件的范围和过滤器中,则使用 magic 号自动触发插件来生成新值。以下示例基于使用 ldapmodify,将 0 添加为含义号:
    dn: uid=jsmith,ou=people,dc=example,dc=com
     changetype: add
     objectClass: top
     objectClass: person
     objectClass: posixAccount
     uid: jsmith
     cn: John Smith
     uidNumber: 0
     gidNumber: 0
     ....
    DNA 插件仅生成新的唯一值。如果向条目添加或修改为 DNA 插件控制的属性使用特定值,则会使用指定的数字; DNA 插件不会覆盖它。

7.4.1.3. 相同范围内的多个属性

DNA 插件可以分配唯一数字到单个属性类型,或者从单个范围唯一数字的多个属性类型分配。
这为属性分配唯一数字的几个选项:
  • 从单一唯一数字范围内分配给单个属性类型的单个数字。
  • 对于一个条目,分配给两个属性的唯一数字相同。
  • 分配了两个不同的属性,与相同范围的唯一数字不同。
在很多情况下,每个属性类型分配了唯一的数字就足够了。当为新的员工条目分配 employeeID 时,务必要为每个员工条目分配一个唯一的 employeeID
然而,在有些情况下,从相同数量分配唯一数字到多个属性可能很有用。例如,当将 uidNumbergidNumber 分配给 posixAccount 条目时,DNA 插件将为这两个属性分配相同的数字。为此,请将两个受管属性传递给修改操作,并指定 magic 值。使用 ldapmodify
#  ldapmodify -D "cn=Directory Manager" -W -x

dn: uid=jsmith,ou=people,dc=example,dc=com
changetype: modify
add: uidNumber
uidNumber: 0
-
add:gidNumber
gidNumber: 0
当 DNA 插件处理多个属性时,如果对象类只允许其中一个属性,则插件只能为其中一个属性分配唯一值。例如,posixGroup 对象类不允许 uidNumber 属性,但它允许 gidNumber。如果 DNA 插件同时管理 uidNumbergidNumber,那么当创建 posixGroup 条目时,从 uidNumbergidNumber 属性分配唯一的 gidNumber 号。对插件管理的所有属性使用相同的池可保持分配唯一数字,并防止不同条目上的 uidNumbergidNumber 从不同范围分配,并导致相同的 唯一数字
如果多个属性由 DNA 插件处理,则相同值将分配给单个修改操作中的条目中的所有给定受管属性。要从同一范围 分配不同的 数字,您必须执行单独的修改操作。以下示例使用 ldapmodify 完成此操作:
# ldapmodify -D "cn=Directory Manager" -W -x
dn: uid=jsmith,ou=people,dc=example,dc=com
changetype: modify
add: uidNumber
uidNumber: 0
^D

# ldapmodify -D "cn=Directory Manager" -W -x
dn: uid=jsmith,ou=people,dc=example,dc=com
changetype: modify
add: employeeId
employeeId: magic
重要
当 DNA 插件配置为为多个属性分配唯一数字时,需要为每个需要唯一数字的属性指定 magic 值。虽然当 DNA 插件被配置为为单个属性提供唯一数字时,这不是必要的,但多个属性需要这样做。可能存在实例,其中条目不允许为范围定义的每种属性类型,或者更重要,条目允许定义所有属性类型,但只有属性的子集需要唯一的值。

例 7.6. DNA 和唯一过期帐户号

人员希望客户 primaryAccountcustomerID 属性使用相同的唯一数字。Example the administrator 配置 DNA 插件,以从同一范围内为这两个属性分配唯一值。
公司还希望从与客户 ID 和主帐户号相同的范围为次要帐户分配数字,但这些数字不能与主帐户号相同。Example Bank 管理员配置 DNA 插件也会管理 secondaryAccount 属性,但仅在条目被创建、primaryAccountcustomerID 被分配,才会将 secondaryAccount 属性添加到条目中。这样可确保 primaryAccountcustomerID 共享相同的唯一数字,任何 次要Account 号都完全是唯一的,但仍然来自相同的数字。

7.4.2. 查看 DNA 插件语法

DNA 插件本身是一个容器条目,类似于 Password Storage Schemes 插件。DNA 插件条目下的每个 DNA 条目都定义了 DNA 插件的新受管范围。
要为 DNA 插件设置新的受管范围,请在容器条目下创建条目。
最基本的配置是在单一服务器上设置分布式数字分配,这意味着不会在服务器之间共享或传输范围。基本 DNA 配置条目定义了四个内容:
  • 正在管理的属性,在 dnaType 属性中设置
  • 用作基础的条目 DN 搜索条目,在 dnaScope 属性中设置
  • 用于识别要管理的条目的搜索过滤器,在 dnaFilter 属性中设置
  • 要分配的下一个可用值,在 dnaNextValue 属性中设置(在创建条目后,这由插件处理)
有关 cn=DNA_config_entry,cn=Distributed Numeric Assignment Plugin,cn=plugins,cn=config 条目 支持的属性列表,请查看红帽目录服务器配置、命令和文件参考
为单个属性类型在单一服务器上配置分布式数字分配:
dn: cn=Account UIDs,cn=Distributed Numeric Assignment Plugin,cn=plugins,cn=config
objectClass: top
objectClass: dnaPluginConfig
cn: Account UIDs
dnatype: uidNumber
dnafilter: (objectclass=posixAccount)
dnascope: ou=people,dc=example,dc=com
dnaNextValue: 1
如果为分布式数字分配配置了多个供应商,则该条目必须包含传输范围所需的信息:
  • 服务器可分配的最大数量;这会为范围设置后续绑定,在分配多个服务器时,逻辑上是必需的。这是在 dnaMaxValue 属性中设置的。
  • 范围较低以触发范围传输的阈值,在 dnaThreshold 属性中设置。如果没有设置,则默认值为 1
  • 超时周期,以便服务器不会挂起等待传输,在 dnaRangeRequestTimeout 属性中设置。如果没有设置,则默认值为 10 秒,即 10 秒。
  • 在所有供应商服务器之间共享的配置条目 DN,它存储每个供应商的范围信息,在 dnaSharedCfgDN 属性中设置。
服务器可分配的特定数字范围在 dnaNextRange 属性中定义。这显示了下一个可用的传输范围,并由插件自动管理,因为范围由服务器分配或使用。这个范围只是"on deck"。 它尚未分配给另一台服务器,仍可用于其本地目录服务器。
dn: cn=Account UIDs,cn=Distributed Numeric Assignment Plugin,cn=plugins,cn=config
objectClass: top
objectClass: dnaPluginConfig
cn: Account UIDs
dnatype: uidNumber
dnafilter: (objectclass=posixAccount)
dnascope: ou=People,dc=example,dc=com
dnanextvalue: 1
dnaMaxValue: 1300
dnasharedcfgdn: cn=Account UIDs,ou=Ranges,dc=example,dc=com
dnathreshold: 100
dnaRangeRequestTimeout: 60
dnaNextRange: 1301-2301
只有在单独的范围必须分配给其他服务器时,应明确设置 dnaNextRange 属性。dnaNextRange 属性中设置的范围都必须在可用范围内唯一,以避免重复。如果没有来自其他服务器的请求,并且明确设置了 dnaNextRange 的服务器已达到其设置的 dnaMaxValue,则从此 deck 中分配下一个值( dnaNextRange)。
dnaNextRange 分配也受 DNA 配置中设置的 dnaThreshold 属性的限制。任何分配给 dnaNextRange 服务器的范围都无法违反服务器的阈值,即使范围在 dnaNextRange 间可用。
注意
如果没有显式设置,如果在内部处理 dnaNextRange 属性。当它被自动处理时,dnaMaxValue 属性将充当下一个范围的上限。
每个供应商都会在单独的配置条目中跟踪其当前范围,其中包含关于其范围及其连接设置的信息。此条目是 dnasharedcfgdn 中位置的子项。配置条目将复制到所有其他供应商,因此每个供应商都可以检查配置以查找要联系新范围的服务器。例如:
dn: dnaHostname=ldap1.example.com+dnaPortNum=389,cn=Account UIDs,ou=Ranges,dc=example,dc=com
objectClass: dnaSharedConfig
objectClass: top
dnahostname: ldap1.example.com
dnaPortNum: 389
dnaSecurePortNum: 636
dnaRemainingValues: 1000

7.4.3. 配置唯一数字分配

唯一的数字分布是通过创建 DNA 插件的不同实例来配置的。

7.4.3.1. 创建 DNA 插件的新实例

要将 DNA 与多个配置搭配使用,请为每个配置创建一个插件的新实例。
注意
您只能使用命令行创建新插件实例。但是,您可以使用命令行和 Web 控制台编辑设置。
创建并启用插件的新实例:
  1. 例如,要创建插件的新实例:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin dna config "Account UIDs" add --type uidNumber --filter "(objectclass=posixAccount)" --scope ou=People,dc=example,dc=com --next-value 1 --max-value 1300 --shared-config-entry "cn=Account UIDs,ou=Ranges,dc=example,dc=com" --threshold 100 --range-request-timeout 60 --magic-regen magic
    有关在 --magic-regen 参数中设置的值的详情,请查看 Configuration, Command and File Reference 中的 dnaMagicRegen 属性描述。
  2. 启用 DNA 插件。详情请查看 第 1.10.2 节 “启用和禁用插件”

7.4.3.2. 使用命令行配置唯一数字分配

注意
任何分配了唯一数字的属性都必须为其设置相等索引。服务器必须在内部执行排序的搜索,以查看是否已经使用了 dnaNextvalue,这需要整数属性上的相等索引,具有正确的排序匹配规则。
第 13.2 节 “创建标准索引” 中描述了创建索引。
注意
在每个供应商服务器上设置 DNA 插件,并且小心不要重叠数字范围值。
  1. 创建插件的新实例。请参阅 第 7.4.3.1 节 “创建 DNA 插件的新实例”
  2. 在复制的子树中创建共享容器条目:
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    dn: ou=Ranges,dc=example,dc=com
    changetype: add
    objectclass: top
    objectclass: extensibleObject
    objectclass: organizationalUnit
    ou: Ranges
    -
    dn: cn=Account UIDs,ou=Ranges,dc=example,dc=com
    changetype: add
    objectclass: top
    objectclass: extensibleObject
    cn: Account UIDs
  3. 重启实例:
    # dsctl instance_name restart

7.4.3.3. 使用 Web 控制台配置唯一数字分配

使用 Web 控制台启用和配置 DNA 插件:
  1. 创建插件的新实例。请参阅 第 7.4.3.1 节 “创建 DNA 插件的新实例”
  2. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  3. 选择实例。
  4. 打开 Plugins 菜单。
  5. 选择 DNA 插件。
  6. 将状态更改为 ON 以启用插件。
  7. 单击 Add Config
  8. 填写字段并启用配置。

7.4.4. 分布式数字分配插件性能备注

可以动态更改 DNA 配置的问题,以便访问 DNA 配置的新操作(如 DNA 任务或 DNA 配置的其他更改)将访问旧的配置,因为新配置的线程尚未发布。这可能导致操作使用旧配置,或者只是导致操作挂起。
要避免这种情况,请在 35 秒的动态 DNA 配置更改之间保留间隔。这意味着 DNA 配置更改和任何目录条目更改之间具有睡眠或延迟,这些更改将触发 DNA 插件操作。

第 8 章 整理和分组条目

目录中包含的条目可以以不同的方式分组,以简化用户帐户的管理。Red Hat Directory Server 支持各种方法对条目进行分组并在条目间共享属性。要充分利用角色和服务类提供的功能,请在规划目录部署时确定目录拓扑。

8.1. 使用组

与操作系统类似,您可以将用户添加到目录服务器中的组中。组以角色的形式工作。如果使用角色,则分配的角色的 DN 存储在用户对象的 nsRoleDN 属性中。如果您使用组,则属于此组成员的用户的 DN 存储在组对象的 成员属性 中。如果启用了 memberOf 插件,则该用户所属的组也存储在用户对象的 memberOf 属性中。启用此插件后,组也具有角色的好处,您可以列出用户的组成员资格,类似于使用角色时类似。另外,组比角色更快。
有关使用 memberOf 插件的详情,请参考 第 8.1.4 节 “列出用户条目中的组成员身份”

8.1.1. 组的不同类型

从命令行创建静态和动态组的过程类似。组条目包含组名称、组的类型和 members 属性。
组类型有几个不同的选项;这些选项在 Red Hat Directory Server 10 配置、命令和文件参考 中进行了更详细的描述。本例中 组的类型 指的是定义成员属性的类型:
  • groupOfNames (推荐)是一个一个简单的组,允许添加任何条目。用于确定此成员的属性是 成员
  • groupOfUniqueNames (如 groupOfNames )只是将用户 DN 列为成员,但成员必须是唯一的。这可防止用户作为组成员添加多次,这是防止自引用组成员资格的方法。用于确定此成员的属性是 uniqueMember
  • groupOfURLs 使用 LDAP URL 列表来过滤和生成其成员资格列表。任何动态组都需要此对象类,并可与 groupOfNamesgroupOfUniqueNames 一起使用。
  • groupOfCertificatesgroupOfURLs 类似,它使用 LDAP 过滤器搜索和识别证书(或实际、证书名称)来识别组成员。这对基于组的访问控制非常有用,因为可以授予组的特殊访问权限。用于确定此成员的属性是 memberCertificate
下表显示了组的默认属性:

表 8.1. 动态和静态组架构

组类型 组对象类 成员属性
Static groupOfNames [a] 成员
groupOfUniqueNames [a] uniqueMember
dynamic groupOfURLs memberURL
groupOfCertificates memberCertificate
[a] 如果此对象类与其中一个动态对象类一同使用,则组将变为动态。
以下两个示例显示了一个静态和动态组条目:

例 8.1. 静态组条目

静态组条目列出了组的特定成员。例如:
objectClass: top
objectClass: groupOfUniqueNames
cn: static group
description: Example static group.
uniqueMember: uid=mwhite,ou=People,dc=example,dc=com
uniqueMember: uid=awhite,ou=People,dc=example,dc=com

例 8.2. 动态组条目

动态组使用至少一个 LDAP URL 来识别属于组的条目,并可指定多个 LDAP URL,或者与 groupOfUniqueNames 等另一个组对象类一起使用,可以明确列出某些组成员以及动态 LDAP URL。例如:
objectClass: top
objectClass: groupOfUniqueNames
objectClass: groupOfURLs
cn: dynamic group
description: Example dynamic group.
memberURL: ldap:///dc=example,dc=com??sub?(&(objectclass=person)(cn=*sen*))
注意
memberOf 插件不支持动态生成的组成员资格。如果您设置了 memberURL 属性而不是列出属性中的组成员,则 memberOf 插件不会将 memberOf 属性添加到与过滤器匹配的用户对象。

8.1.2. 创建静态组

目录服务器仅支持使用命令行创建静态组。

8.1.2.1. 使用命令行创建静态组

这部分论述了如何使用命令行创建不同类型的静态组。
有关不同静态组的详情,请参考 第 8.1.1 节 “组的不同类型”

使用 groupOfNames 对象类创建静态组

dsidm 实用程序在指定的基本 DN 的 cn=Groups 条目中创建静态组。
例如,要在 cn=Groups,dc=example,dc=com 条目中使用 groupOfNames 对象类创建静态 example_group
# dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" group create --cn "example_group"

使用 groupOfUniqueNames 对象类创建静态组

要使用 groupOfUniqueNames 对象类创建静态组,请使用 ldapmodify 工具来添加该条目。
例如,要在 cn=Groups,dc=example,dc=com 条目中使用 groupOfUniqueNames 对象类创建静态 example_group 组:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: cn=example_group,cn=Groups,dc=example,dc=com
changetype: add
objectClass: top
objectClass: groupOfUniqueNames
cn: example_group
description: Example static group with unique members

8.1.3. 创建动态组

目录服务器仅支持使用命令行创建动态组。

8.1.3.1. 使用命令行创建动态组

这部分论述了如何使用命令行创建不同类型的动态组。
有关不同动态组的详情,请参考 第 8.1.1 节 “组的不同类型”

使用 groupOfURLs 对象类创建动态组

例如,要在 cn=Groups,dc=example,dc=com 条目中使用 groupOfURLs 对象类创建动态 example_group 组:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: cn=example_group,cn=Groups,dc=example,dc=com
changetype: add
objectClass: top
objectClass: groupOfURLs
cn: example_group
description: Example dynamic group for user entries
memberURL: ldap:///dc=example,dc=com??sub?(&(objectclass=person)(cn=*sen*))

使用 groupOfCertificates 对象类创建动态组

例如,要在 cn=Groups,dc=example,dc=com 条目中使用 groupOfCertificates 对象类创建动态 example_group 组:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: cn=example_group,cn=Groups,dc=example,dc=com
changetype: add
objectClass: top
objectClass: groupOfURLs
cn: example_group
description: Example dynamic group for certificate entries
memberCertificate: ...

8.1.4. 列出用户条目中的组成员身份

属于组的条目在组条目本身中以某种方式定义。这样便可轻松查看组并查看其成员并集中管理组成员资格。但是,无法找出单个用户所属的组。用户条目中没有指示其成员资格,如角色有。
MemberOf 插件将组成员资格列表与对应的用户条目相关联。
MemberOf 插件分析组条目中的 member 属性,并在成员条目中自动写入对应的 memberOf 属性。(默认情况下,这将检查 member 属性,但可使用多个属性实例来支持多个不同的组类型。)
随着成员资格更改,插件会更新用户条目上的 memberOf 属性。MemberOf 插件提供了一种通过查看条目(包括嵌套组成员资格)查看用户所属的组的方法。通过嵌套组重新跟踪成员资格可能比较困难,但 MemberOf 插件显示所有组的成员资格,直接和间接。
MemberOf 插件管理静态组的成员属性,而不是动态组或循环组。

8.1.4.1. 使用 memberOf 插件时的注意事项

本节论述了在使用 memberOf 插件时的重要注意事项。
在 Replication Topology 中使用 memberOf 插件
在复制拓扑中有两个管理 memberOf 属性的方法:
使用带有分布式数据库的 memberOf 插件
第 2.2.1 节 “创建数据库” 所述,您可以将目录的子树存储在单独的数据库中。默认情况下,memberOf 插件仅更新存储在与组相同的数据库中的用户条目。要启用插件同时将不同数据库中的用户更新为组,您必须将 memberOfAllBackends 参数设置为 on。请参阅 第 8.1.4.5.2 节 “使用 Web 控制台在每个服务器上配置 MemberOf 插件”

8.1.4.2. memberOf Plug-In 所需的对象类

memberOf 插件 默认情况下,memberOf 插件会将 MemberOf 对象类添加到对象中,以提供 memberOf 属性。此对象类可以安全地添加到任何对象,且不需要进一步的操作才能使此插件正常工作。或者,您可以创建包含 inetUserinetAdmin 对象类的用户对象。这两个对象类也支持 memberOf 属性。
要配置嵌套组,组必须使用 Scalable Object 对象类。
注意
如果目录条目不包含支持所需属性的对象类,则操作会失败,并显示以下错误:
LDAP: error code 65 - Object Class Violation

8.1.4.3. MemberOf 插件语法

MemberOf 插件实例定义了两个属性,一个用于组成员属性(memberOfGroupAttr),另一个用于在成员用户条目中创建和管理的属性(memberOfAttr)。
memberOfGroupAttr 属性是多值。由于不同类型的组使用不同的成员属性,因此使用多个 memberOfGroupAttr 属性允许插件管理多种类型的组。
该插件实例还提供插件路径和功能来标识 MemberOf 插件,并包含一个 state 设置来启用插件,这两个插件都是所有插件所必需的。默认 MemberOf 插件显示在 例 8.3 “默认 MemberOf 插件条目” 中。

例 8.3. 默认 MemberOf 插件条目

 dn: cn=MemberOf Plugin,cn=plugins,cn=config
 objectClass: top
 objectClass: nsSlapdPlugin
 objectClass: extensibleObject
 cn: MemberOf Plugin  
 nsslapd-pluginPath: libmemberof-plugin  
 nsslapd-pluginInitfunc: memberof_postop_init  
 nsslapd-pluginType: postoperation
 nsslapd-pluginEnabled: on  
 nsslapd-plugin-depends-on-type: database
 memberOfGroupAttr: member  
 memberOfGroupAttr: uniqueMember  
 memberOfAttr: memberOf  
 memberOfAllBackends: on  
 nsslapd-pluginId: memberOf
 nsslapd-pluginVersion: X.Y.Z
 nsslapd-pluginVendor: Red Hat, Inc.
 nsslapd-pluginDescription: memberOf plugin
有关示例和其他您可以设置的参数的详细信息,请参阅 Red Hat Directory Server Command, Configuration, Configuration, and File Reference 中的 MemberOf Plug-in Attributes 部分。
注意
为了保持与旧版本的目录服务器的向后兼容性,仅允许单个成员属性(默认为 成员),可能需要包含 成员 组属性或之前使用的任何成员属性,除了插件配置中使用的任何新成员属性。
 memberOfGroupAttr: member  
 memberOfGroupAttr: uniqueMember  

8.1.4.4. 启用 MemberOf 插件

本节论述了如何启用 MemberOf 插件。
8.1.4.4.1. 使用命令行启用 MemberOf 插件
使用命令行启用 MemberOf 插件:
  1. 使用 dsconf 工具启用插件:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof enable
  2. 重启实例:
    # dsctl instance_name restart
8.1.4.4.2. 使用 Web 控制台启用 MemberOf 插件
使用 Web 控制台启用 MemberOf 插件:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 选择 Plugins 菜单。
  4. 选择 MemberOf 插件。
  5. 将状态更改为 ON 以启用插件。

8.1.4.5. 在每个服务器上配置 MemberOf 插件

如果您不想复制 MemberOf 插件的配置,请在每台服务器中手动配置插件。
8.1.4.5.1. 使用命令行在每个服务器上配置 MemberOf 插件
使用命令行配置 MemberOf 插件:
  1. 要从与成员不同的属性(这是默认值)检索 组的成员,请将 memberOfGroupAttr 参数设置为对应的属性名称。
    例如,要从 uniqueMember 属性读取组成员,请替换 memberOfGroupAttr 的当前值:
    1. 另外,还可显示当前配置的属性:
      # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof show
      ...
      memberofgroupattr: member
      ...
      命令显示目前只有 member 属性配置为检索组的成员。
    2. 从当前设置的配置中删除所有属性:
      # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof set --groupattr delete
      Successfully changed the cn=MemberOf Plugin,cn=plugins,cn=config
      注意
      无法删除特定的组属性。
    3. 在配置中添加 uniqueMember 属性:
      # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof set --groupattr uniqueMember
      successfully added memberOfGroupAttr value "uniqueMember"
      要设置多个属性,请将全部传递到 --groupattr 参数。例如:
      # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof set --groupattr member uniqueMember ...
  2. 默认情况下,MemberOf 插件将 memberOf 属性添加到用户条目中。要使用其他属性,请在 memberOfAttr 参数中设置属性的名称。
    例如,要将 customMemberOf 属性添加到用户记录中,请替换 memberOfAttr 的当前值:
    1. 另外,还可显示当前配置的属性:
      # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof show
      ...
      memberofattr: memberOf
      ...
    2. 配置 MemberOf 插件,将 customMemberOf 属性添加到用户条目中:
      # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof set --attr customMemberOf
      memberOfAttr set to "customMemberOf"
      注意
      您只能将此参数设置为支持 DN 语法的属性。
  3. 在使用分布式数据库的环境中,您可以将插件配置为在所有数据库中搜索用户条目,而不是只搜索本地数据库:
    dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof set --allbackends on
    memberOfAllBackends enabled successfully
  4. 重启实例:
    # dsctl instance_name restart
8.1.4.5.2. 使用 Web 控制台在每个服务器上配置 MemberOf 插件
使用命令行配置 MemberOf 插件:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Plugins 菜单。
  4. 选择 memberOf 插件。
  5. 将状态更改为 ON 以启用插件。
  6. 填写字段来配置插件。例如,如果将 uniqueMember 属性添加到组中,配置插件会将 customMemberOf 属性添加到用户条目中:
  7. 点击 Save

8.1.4.6. 使用 MemberOf 插件共享配置

默认情况下,MemberOf 插件的配置存储在每台服务器上。使用插件的共享配置功能,配置可以存储在 cn=config 后缀和复制之外。管理员可以使用相同的设置,而无需在每个服务器上手动配置插件。
  1. MemberOf 插件添加共享配置条目。例如:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof config-entry add "cn=shared_MemberOf_config,dc=example,dc=com" --groupattr "member" --attr "memberOf"
    这会在您运行命令的服务器上自动启用共享配置条目。
  2. 重启实例:
    # dsctl instance_name restart
  3. 在应使用共享配置的复制拓扑中的所有其他服务器上,启用共享配置:
    1. 设置存储共享配置的 DN。例如:
      # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof set --config-entry cn=shared_MemberOf_config,dc=example,dc=com
    2. 重启实例:
      # dsctl instance_name restart
重要
启用共享配置后,插件会忽略 cn=MemberOf Plugin,cn=plugins,cn=config 插件条目中设置的所有参数,并使用共享配置条目的设置。

8.1.4.7. 设置 MemberOf 插件的范围

如果您配置了几个后端或多嵌套后缀,您可以使用 memberOfEntryScopememberOfEntryScopeExcludeSubtree 参数来设置 MemberOf 插件在哪些后缀。
如果您将用户添加到组中,则 MemberOf 插件仅当用户和组都位于插件范围内时,才会将 memberOf 属性添加到组中。例如,要将 MemberOf 插件配置为在 dc=example,dc=com 中的所有条目上工作,但要排除 ou=private,dc=example,dc=com 中的条目:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof set --scope "dc=example,com"
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof set --exclude "dc=group,dc=example,com"
如果您使用 --scope DN 参数将用户条目从范围移出:
  • 组成员属性(如 成员 )在组条目中更新,以删除用户 DN 值。
  • memberOf 属性在用户条目中更新,以删除组 DN 值。
注意
--exclude 参数中设置的值的优先级高于 --scope 中设置的值。如果两个参数中设置的范围都重叠,则 MemberOf 插件仅适用于非重叠的目录条目。

8.1.4.8. 重新生成 memberOf

MemberOf 插件根据组条目中的配置自动管理组成员条目上的 memberOf 属性。但是,可以在用户条目中手动编辑 memberOf 属性,或者新条目可以被导入或复制到已设置了 memberOf 属性的服务器。这些情况会在由服务器插件管理的 memberOf 配置和条目中定义的实际成员资格之间造成不一致的情况。
例如,要在 dc=example,dc=com 条目和子条目中重新生成 memberOf 值:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof fixup -f "(|(objectclass=inetuser)(objectclass=inetadmin)(objectclass=nsmemberof))" "dc=example,dc=com"
Attempting to add task entry...
Successfully added task entry
-f filter 选项是可选的。使用过滤器在与过滤器匹配的用户条目中重新生成 memberOf 属性。如果没有指定过滤器,任务会在包含 inetUserinetAdminnsMemberOf 对象类的所有条目中重新生成属性。
注意
重新生成任务在本地运行,即使条目本身被复制。这意味着,在复制更新的条目前,其他服务器上条目的 memberOf 属性不会更新。

8.1.5. 自动添加条目来指定组

组管理是管理目录数据的一个关键因素,特别是对于使用 Directory Server 数据和机构或者组将功能应用到条目的客户端。组可以更轻松地在目录中一致、可靠地应用策略。密码策略、访问控制列表和其他规则都可以基于组成员资格。
能够在创建帐户时自动将新条目分配给组,确保适当的策略和功能会立即应用到这些条目 - 无需管理员干预。
动态组是自动创建组和自动分配成员的方法,因为组中自动包含任何匹配的条目。要应用目录服务器策略和设置,这就足够了。但是,LDAP 应用程序和客户端通常需要静态和显式组成员列表,才能执行任何操作。静态组中的所有成员都必须手动添加到这些组中。
静态组本身无法搜索动态组等成员,但有一种方法允许静态组自动向其添加成员 - Auto Membership 插件
自动成员规则本质上允许静态组像动态组一样操作。不同的自动成员定义创建在所有新目录条目上自动运行的搜索。自动成员规则搜索和识别匹配的条目,就像动态搜索过滤器一样,然后将这些条目作为成员明确添加到静态组中。
注意
默认情况下,cn=Auto Membership Plugin,cn=plugins,cn=config 条目中的 autoMemberProcessModifyOps 参数设置为 on。使用这个设置时,当管理员通过编辑用户条目将用户移到其他组时,自动成员插件也会更新组成员资格。
如果将 autoMemberProcessModifyOps 设置为 off,则目录服务器仅在向用户添加组条目时调用插件,您必须手动运行修复任务来更新组成员资格。
Auto Membership 插件可以针对目录中存储的任何类型的对象:用户、机器和网络设备、客户数据或其他资产。
注意
Auto Membership 插件根据定义的标准添加新成员到现有组中。它不会为新条目创建一个组。
要在创建特定类型的新条目时创建对应的组条目,请使用 Managed Entries 插件。这在 第 8.3 节 “自动创建双条目” 中阐述。

8.1.5.1. 查看自动成员规则的结构

Auto Membership 插件本身是 cn=plugins,cn=config 中的容器条目。组分配通过子条目定义。
8.1.5.1.1. 自动成员配置条目
自动成员规则分配是通过主定义条目(一个 Auto Membership 插件条目的子条目)创建的。每个定义条目定义三个元素:
  • 用于识别条目的 LDAP 搜索,包括搜索范围和搜索过滤器(autoMemberScopeautoMemberFilter)
  • 要添加成员条目的默认组(autoMemberDefaultGroup)
  • 成员条目格式,即组条目中的属性,如 member 和属性值,如 dn (自动MemberGroupingAttr)
定义是自动成员规则的基本配置。它识别所有需要的信息:匹配的成员条目是什么,以及该成员所属的组。
例如,此定义将对象类设置为 ntUser 的所有用户分配给 cn=windows-users 组:
dn: cn=Windows Users,cn=Auto Membership Plugin,cn=plugins,cn=config
objectclass: autoMemberDefinition
autoMemberScope: ou=People,dc=example,dc=com
autoMemberFilter: objectclass=ntUser
autoMemberDefaultGroup: cn=windows-group,cn=groups,dc=example,dc=com
autoMemberGroupingAttr: member:dn
有关此条目中可以设置的属性和其他属性的详情,请查看 红帽目录服务器 配置、命令和文件参考 中的 cn=Auto Membership Plugin,cn=plugins,cn=config 条目描述。
8.1.5.1.2. 其他正则表达式条目
对于与用户组类似,可能所有匹配条目都应当添加为成员,简单的定义就足够了。但是,根据其他属性的值,可能存在与 LDAP 搜索过滤器匹配的实例。例如,可能需要根据其 IP 地址或物理位置将机器添加到不同的组中;用户可能需要根据其员工 ID 号在不同的组中。
自动成员规则可以使用正则表达式在组中包含或排除条目上提供额外的条件,然后是一个新的、特定的组来将这些所选条目添加到其中。
例如,自动成员定义将要添加到通用主机组的所有计算机设置为通用主机组。

例 8.4. 主机组的自动定义

dn: cn=Hostgroups,cn=Auto Membership Plugin,cn=plugins,cn=config
objectclass: autoMemberDefinition
cn: Hostgroups
autoMemberScope: dc=example,dc=com
autoMemberFilter: objectclass=ipHost
autoMemberDefaultGroup: cn=systems,cn=hostgroups,dc=example,dc=com
autoMemberGroupingAttr: member:dn
添加了正则表达式规则,以便给定范围内具有完全限定域名的任何机器都添加到 web 服务器组中。

例 8.5. Web 服务器组的正则表达式条件

dn: cn=webservers,cn=Hostgroups,cn=Auto Membership Plugin,cn=plugins,cn=config
objectclass: autoMemberRegexRule
description: Group for webservers
cn: webservers
autoMemberTargetGroup: cn=webservers,cn=hostgroups,dc=example,dc=com
autoMemberInclusiveRegex: fqdn=^www\.web[0-9]+\.example\.com
因此,添加的任何主机机器都带有一个完全限定域名,它与表达式 ^www\.web[0-9]+\.example\.com (如 www.web1.example.com )添加到为该精确正则表达式定义的 cn=webservers 组中。任何其它机器条目都与 LDAP 过滤器 objectclass=ipHost 匹配,但具有不同的完全限定域名,也会添加到主定义条目中定义的通用主机组 cn=systems
然后,定义中的组是与常规定义匹配的条目的回退,但不满足正则表达式规则中的条件。
正则表达式规则是自动成员定义的子条目。

图 8.1. 正则表达式条件

正则表达式条件
每个规则都可以包含多个包含和排除表达式。(不包括首先评估。) 如果条目与任何包含规则匹配,则会将其添加到组中。
只能指定一个用于正则表达式规则的目标组。

表 8.2. 正则表达式条件属性

属性 描述
autoMemberRegexRule (必需对象类) 将条目标识为正则表达式规则。此条目必须是自动成员定义的子项(对象类:autoMemberDefinition)。
autoMemberInclusiveRegex 设置用于标识要包含的条目的正则表达式。只有匹配的条目才会添加到组中。可以使用多个正则表达式,如果条目与其中任何一个表达式匹配,它将包含在组中。
表达式的格式是一个 Perl 兼容的正则表达式(PCRE)。有关 PCRE 模式的更多信息,请参阅 pcresyntax(3) man page。
这是一个多值属性。
autoMemberExclusiveRegex 设置正则表达式,用于识别要排除的条目。如果条目与排除条件匹配,则 不会包含在 组中。可以使用多个正则表达式,如果条目与其中任何一个表达式匹配,它将包含在组中。
表达式的格式是一个 Perl 兼容的正则表达式(PCRE)。有关 PCRE 模式的更多信息,请参阅 pcresyntax(3) man page。
这是一个多值属性。
注意
排除条件会首先评估,优先于 include 条件。
autoMemberTargetGroup 如果满足正则表达式条件,则设置要将条目添加到成员的组。

8.1.5.2. 配置自动成员资格 定义

要使用 Auto Membership 插件,请为插件创建定义。
8.1.5.2.1. 使用命令行配置 自动成员资格定义
使用命令行创建 Auto Membership 定义:
  1. 启用 Auto Membership 插件:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin automember enable
    Enabled Auto Membership Plugin
  2. 创建 Auto Membership 定义。例如:
    #  dsconf -D "cn=Directory Manager" ldap://server.example.com plugin automember definition definition_name add --default-group "cn=windows-group,cn=groups,dc=example,dc=com" --scope "ou=People,dc=example,dc=com" --filter "objectclass=ntUser" --grouping-attr "member:dn"
    Automember definition created successfully!
  3. 另外,您可以在 Auto Membership 定义中设置更多参数,例如,使用正则表达式来识别条目包含。使用 ldapmodify 工具在 cn=definition_name,cn=Auto Membership Plugin,cn=plugins,cn=config 条目中添加或更新这些参数。有关您可以设置的参数,请参阅 Red Hat Directory Server Configuration, Command, and File Reference 中的 cn=Auto Membership Plugin,cn=plugins,cn=config 条目描述。
  4. 重启实例:
    # dsctl instance_name restart
8.1.5.2.2. 使用 Web 控制台配置自动成员资格定义
使用 Web 控制台创建 Auto Membership 定义:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Plugins 菜单。
  4. 选择 Auto Membership 插件。
  5. 将状态更改为 ON 以启用插件。
  6. Add Definition
  7. 填写字段。例如:
  8. (可选)添加正则表达式过滤器。
  9. 点击 Save

8.1.5.3. 更新现有条目以应用自动成员资格定义

默认情况下,cn=Auto Membership Plugin,cn=plugins,cn=config 条目中的 autoMemberProcessModifyOps 参数被启用。使用这个设置时,当管理员通过编辑用户条目将用户移到其他组时,自动成员 插件也会更新组成员资格。但是,如果您将 autoMemberProcessModifyOps 设置为 off,您必须在向目录添加新条目或更改现有条目时手动运行修复任务。
创建任务条目:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin automember fixup -f "filter" -s scope
任务完成后,该条目将从目录配置中删除。

8.1.5.4. 自动成员规则示例

自动成员规则通常将应用到用户和机器(尽管可应用到任何类型的条目)。有一些示例在规划自动成员规则时可能很有用:
  • 基于 IP 地址的不同主机组
  • Windows 用户组
  • 基于员工 ID 的不同用户组

例 8.6. 按 IP 地址的主机组

自动成员规则首先定义规则的范围和目标。第 8.1.5.1.2 节 “其他正则表达式条目” 中的示例使用配置组来定义 fallback 组和正则表达式条目来排序匹配的条目。
范围用于查找 所有 主机条目。然后,插件通过正则表达式条目进行迭代。如果条目与包含正则表达式匹配,则会将其添加到该主机组中。如果它与任何组不匹配,则会将其添加到默认组中。
实际的插件配置条目配置如下,用于定义条目和两个正则表达式条目,用于将主机过滤到 Web 服务器组或邮件服务器组中。
configuration entry
dn: cn=Hostgroups,cn=Auto Membership Plugin,cn=plugins,cn=config
objectclass: autoMemberDefinition
cn: Hostgroups
autoMemberScope: dc=example,dc=com
autoMemberFilter: objectclass=bootableDevice
autoMemberDefaultGroup: cn=orphans,cn=hostgroups,dc=example,dc=com
autoMemberGroupingAttr: member:dn

regex entry #1
dn: cn=webservers,cn=Hostgroups,cn=Auto Membership Plugin,cn=plugins,cn=config
objectclass: autoMemberRegexRule
description: Group placement for webservers
cn: webservers
autoMemberTargetGroup: cn=webservers,cn=hostgroups,dc=example,dc=com
autoMemberInclusiveRegex: fqdn=^www[0-9]+\.example\.com
autoMemberInclusiveRegex: fqdn=^web[0-9]+\.example\.com
autoMemberExclusiveRegex: fqdn=^www13\.example\.com
autoMemberExclusiveRegex: fqdn=^web13\.example\.com

regex entry #2
dn: cn=mailservers,cn=Hostgroups,cn=Auto Membership Plugin,cn=plugins,cn=config
objectclass: autoMemberRegexRule
description: Group placement for mailservers
cn: mailservers
autoMemberTargetGroup: cn=mailservers,cn=hostgroups,dc=example,dc=com
autoMemberInclusiveRegex: fqdn=^mail[0-9]+\.example\.com
autoMemberInclusiveRegex: fqdn=^smtp[0-9]+\.example\.com
autoMemberExclusiveRegex: fqdn=^mail13\.example\.com
autoMemberExclusiveRegex: fqdn=^smtp13\.example\.com

例 8.7. Windows 用户组

第 8.1.5.1.1 节 “自动成员配置条目” 中显示的基本用户组使用 posixAccount 属性来识别所有新用户。目录服务器内创建的所有新用户都使用 posixAccount 属性创建,因此对于新的目录服务器用户而言,它是安全捕获的。但是,当用户帐户从 Windows 域同步到目录服务器时,会创建 Windows 用户帐户,但没有 posixAccount 属性。
Windows 用户由 ntUser 属性标识。可将所有用户组规则修改为专门用于目标 Windows 用户,然后可以添加到默认的 all-users 组或特定于 Windows 的组中。
dn: cn=Windows Users,cn=Auto Membership Plugin,cn=plugins,cn=config
objectclass: autoMemberDefinition
autoMemberScope: dc=example,dc=com
autoMemberFilter: objectclass=ntUser
autoMemberDefaultGroup: cn=Windows Users,cn=groups,dc=example,dc=com
autoMemberGroupingAttr: member:dn

例 8.8. 按 Employee Type 组成用户组

Auto Membership 插件可用于自定义属性,这对于由其他应用程序管理的条目非常有用。例如,人工资源应用程序可以在自定义 employeeType 属性中根据员工类型创建然后引用用户。
例 8.6 “按 IP 地址的主机组” 一样,用户类型规则使用两种正则表达式过滤器来对完整时间和临时员工进行排序,只有这个示例使用显式值而不是 true 正则表达式。对于其他属性,可能更适合使用正则表达式,如将过滤器放在员工 ID 编号范围上。
configuration entry
dn: cn=Employee groups,cn=Auto Membership Plugin,cn=plugins,cn=config
objectclass: autoMemberDefinition
cn: Hostgroups
autoMemberScope: ou=employees,ou=people,dc=example,dc=com
autoMemberFilter: objectclass=inetorgperson
autoMemberDefaultGroup: cn=general,cn=employee groups,ou=groups,dc=example,dc=com
autoMemberGroupingAttr: member:dn

regex entry #1
dn: cn=full time,cn=Employee groups,cn=Auto Membership Plugin,cn=plugins,cn=config
objectclass: autoMemberRegexRule
description: Group for full time employees
cn: full time
autoMemberTargetGroup: cn=full time,cn=employee groups,ou=groups,dc=example,dc=com
autoMemberInclusiveRegex: employeeType=full

regex entry #2
dn: cn=temporary,cn=Employee groups,cn=Auto Membership Plugin,cn=plugins,cn=config
objectclass: autoMemberRegexRule
description: Group placement for interns, contractors, and seasonal employees
cn: temporary
autoMemberTargetGroup: cn=temporary,cn=employee groups,ou=groups,dc=example,dc=com
autoMemberInclusiveRegex: employeeType=intern
autoMemberInclusiveRegex: employeeType=contractor
autoMemberInclusiveRegex: employeeType=seasonal

8.1.5.5. 测试自动成员定义

由于自动成员插件的每个实例都是一组用于定义和正则表达式的相关目录,因此很难查看用户如何映射到组。当有多个以不同用户子集为目标的规则时,这变得更加困难。
有两个空运行任务可用于确定所有不同的自动成员插件定义是否按照设计正确分配组。

使用现有条目进行测试

cn=automember export updates 针对目录中现存的条目运行,并基于规则导出哪些用户被加入到哪些组的信息。这可用于针对现有用户测试现有规则,以查看您的实际部署方式。

此任务需要与 cn=automember 重建成员资格 任务相同的信息 - 要搜索、搜索过滤器和搜索范围的基本 DN,并有一个额外的参数来指定 export LDIF 文件来记录所提议的条目更新。
# ldapadd -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: cn=test_export,cn=automember export updates,cn=tasks,cn=config
objectClass: top
objectClass: extensibleObject
cn: test_export
basedn: dc=example,dc=com
filter: (uid=*)
scope: sub
ldif: /tmp/automember-updates.ldif

使用导入 LDIF 测试

cn=automember 映射更新 取新用户的 导入 LDIF,然后根据当前的自动成员规则 运行新用户。在将新规则应用到新或现有用户条目之前,这对测试新规则非常有用。

这称为映射任务,因为它将提议的新条目的映射或相关更改映射到现有规则。
此任务只需要两个属性:输入 LDIF 的位置(必须至少包含一些用户条目)和输出 LDIF 文件,用于将建议的条目更新写入。输入和输出 LDIF 文件都是本地机器上的绝对路径。
例如,使用 ldapmodify
# ldapadd -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: cn=test_mapping, cn=automember map updates,cn=tasks,cn=config
objectClass: top
objectClass: extensibleObject
cn: test_mapping
ldif_in: /tmp/entries.ldif
ldif_out: /tmp/automember-updates.ldif

8.1.5.6. 取消 Auto Membership 插件任务

如果目录服务器有复杂的配置(大的组、复杂的规则以及与其他插件交互),则 Auto Membership 插件任务可以在服务器上生成高 CPU 使用量。要防止性能问题,您可以取消 Auto Membership 插件任务。

流程

  • 要取消 Auto Membership 插件任务,请输入:
    # dsconf server.example.com plugin automember abort-fixup

验证

  • 要查看所有 Auto Membership 插件任务列表,包括取消的任务,请输入:
    # dsconf server.example.com plugin automember fixup-status

8.2. 使用角色

角色是一种条目分组机制,用于统一前面章节中描述的静态和动态组。角色设计为更高效、更易于用于应用程序。例如,应用程序可以通过查询条目本身来获取条目所属的角色列表,而不必选择组并浏览多个组的成员列表。

8.2.1. 关于角色

红帽有两种类型的组。静态组 具有有限的和定义的成员列表。动态组 使用过滤器来识别哪些条目是组的成员,因此当与组过滤器更改的条目时,组成员资格会不断改变。(这两种类型的组在 第 8.1 节 “使用组” 中进行了描述。)
角色(role)是一组混合组,可作为静态和动态组。在使用组时,条目作为成员添加到组条目中。使用角色时,role 属性添加到条目中,然后该属性用于自动识别角色条目中的成员。
角色 members 是具有角色的条目。成员可以显式指定或动态指定。指定角色成员资格的方式取决于角色的类型。目录服务器支持三种类型的角色:
  • Managed roles 具有明确枚举的成员列表。
  • Filtered roles 是分配给角色的条目,取决于每个条目包括的属性,在 LDAP filter 中指定。与过滤器匹配的条目具有角色。
  • 嵌套角色是包含其他角色的角色。
受管角色可以执行通常可通过静态组完成的所有操作。角色成员可以使用过滤的角色进行过滤,类似于使用动态组的过滤。角色比组更容易使用,在它们的实施中更灵活,并降低客户端复杂性。
创建角色时,确定用户是否可以添加自己或从角色中删除自己。有关角色和访问控制的更多信息,请参阅 第 8.2.4 节 “安全地使用角色”
注意
与评估组相比,评估角色对目录服务器的资源密集型,因为服务器能够为客户端应用工作。在带有角色时,客户端应用程序可以通过搜索 nsRole 属性来检查角色成员资格。nsRole 属性是一个计算属性,它标识条目所属的角色; nsRole 属性不存储在条目本身中。从客户端应用程序视图中,检查成员资格的方法统一并在服务器端执行。
红帽目录服务器部署指南 中介绍了使用角色的注意事项。

8.2.2. 使用命令行管理角色

您可以使用命令行查看、创建和删除角色。

8.2.2.1. 创建受管角色

受管角色具有明确枚举的成员列表。通过向条目中添加 nsRoleDN 属性,将受管角色添加到条目中。
8.2.2.1.1. 使用命令行创建受管角色
角色继承自 ldapsubentry 对象类,该对象类在 ITU X.509 标准中定义。另外,每个受管角色需要两个对象类,它们继承自 nsRoleDefinition 对象类:
  • nsSimpleRoleDefinition
  • nsManagedRoleDefinition
managed 角色还允许一个可选的 description 属性。
受管角色的成员在其条目中具有 nsRoleDN 属性。
这个示例创建了一个可分配给市场部门的角色。
  1. 使用带有 -a 选项的 ldapmodify 来添加受管角色条目。新条目必须包含 nsManagedRoleDefinition 对象类,后者从 LdapSubEntrynsRoleDefinitionnsSimpleRoleDefinition 对象类继承。
    dn: cn=Marketing,ou=people,dc=example,dc=com
    objectclass: top
    objectclass: LdapSubEntry
    objectclass: nsRoleDefinition
    objectclass: nsSimpleRoleDefinition
    objectclass: nsManagedRoleDefinition
    cn: Marketing
    description: managed role for marketing staff
  2. 使用 ldapmodify 为市场员工成员分配角色:
    dn: cn=Bob,ou=people,dc=example,dc=com
    changetype: modify
    add: nsRoleDN
    nsRoleDN: cn=Marketing,ou=people,dc=example,dc=com
    条目的 nsRoleDN 属性表示该条目是受管角色 cn=Marketing,ou=body,dc=example,dc=com 的成员。

8.2.2.2. 创建过滤的角色

根据条目是否具有角色中定义的特定属性,条目是否被分配给过滤的角色。角色定义为目标属性指定 LDAP 过滤器。与过滤器匹配的条目(检查成员)角色。
8.2.2.2.1. 使用命令行创建过滤的角色
角色继承自 ldapsubentry 对象类,该对象类在 ITU X.509 标准中定义。另外,每个过滤的角色都需要两个对象类,它们继承自 nsRoleDefinition 对象类:
  • nsComplexRoleDefinition
  • nsFilteredRoleDefinition
过滤的角色条目还需要 nsRoleFilter 属性来定义 LDAP 过滤器来确定角色成员。(可选)角色可以获取 description 属性。
过滤的角色成员是与 nsRoleFilter 属性中指定的过滤器匹配的条目。
这个示例创建了一个过滤的角色,适用于所有销售管理器。
  1. 运行带有 -a 选项的 ldapmodify 来添加新条目。
  2. 创建过滤的角色条目。
    角色条目具有 nsFilteredRoleDefinition 对象类,它继承 LdapSubEntrynsRoleDefinitionnsComplexRoleDefinition 对象类。
    nsRoleFilter 属性为包含 Sales manager 值的 o (organization)属性设置过滤器。
    dn: cn=SalesManagerFilter,ou=people,dc=example,dc=com
    changetype: add
    objectclass: top
    objectclass: LDAPsubentry
    objectclass: nsRoleDefinition
    objectclass: nsComplexRoleDefinition
    objectclass: nsFilteredRoleDefinition
    cn: SalesManagerFilter
    nsRoleFilter: o=sales managers
    Description: filtered role for sales managers
以下条目与过滤器匹配(将 o 属性与值 Sales manager匹配),因此它会自动是这个过滤角色的成员:
dn: cn=Pat Smith,ou=people,dc=example,dc=com
objectclass: person
cn: Pat
sn: Smith
userPassword: secret
o: sales managers

8.2.2.3. 创建嵌套角色

嵌套角色是包含其他角色的角色。在可以创建嵌套角色前,必须存在另一个角色。嵌套在嵌套角色中的角色使用 nsRoleDN 属性来指定。
8.2.2.3.1. 使用命令行创建嵌套角色
角色继承自 ldapsubentry 对象类,该对象类在 ITU X.509 标准中定义。另外,每个嵌套角色需要两个对象类,它们继承自 nsRoleDefinition 对象类:
  • nsComplexRoleDefinition
  • nsNestedRoleDefinition
嵌套角色条目还需要 nsRoleDN 属性来识别容器角色内嵌套的角色。(可选)角色可以获取 description 属性。
嵌套角色的成员是嵌套角色定义条目的 nsRoleDN 属性中指定的角色的成员。
这个示例从受管市场角色中创建了一个角色,并过滤了销售经理角色。
  1. 运行带有 -a 选项的 ldapmodify 来添加新条目。
  2. 创建嵌套角色条目。嵌套角色有四个对象类:
    • nsNestedRoleDefinition
    • ldapsubentry (inherited)
    • nsRoleDefinition (inherited)
    • nsComplexRoleDefinition (inherited)
    nsRoleDN 属性包含市场管理角色和销售管理器过滤角色的 DN。
    dn: cn=MarketingSales,ou=people,dc=example,dc=com
    objectclass: top
    objectclass: LDAPsubentry
    objectclass: nsRoleDefinition
    objectclass: nsComplexRoleDefinition
    objectclass: nsNestedRoleDefinition
    cn: MarketingSales
    nsRoleDN: cn=SalesManagerFilter,ou=people,dc=example,dc=com
    nsRoleDN: cn=Marketing,ou=people,dc=example,dc=com
上例中的这两个用户都是此新嵌套角色的成员。

8.2.2.4. 使用命令行查看条目的角色

角色分配不会通过命令行自动返回。
nsRole 属性是一个操作属性。在 LDAP 中,必须明确请求操作属性。默认情况下,它们不会被返回,并带有条目的 schema 中的常规属性。您可以通过列出单个操作属性或使用 + 输出结果对象的所有操作属性来明确请求它们。例如,除了条目的常规属性外,这个 ldapsearch 命令会返回哪些 uid=user_name 是成员的角色列表:
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -b "dc=example,dc=com" -s sub -x "(uid=user_name)"” \* nsRole

dn: uid=user_name,ou=people,dc=example,dc=com
...
nsRole: cn=Role for Managers,dc=example,dc=com
nsRole: cn=Role for Accounting,dc=example,dc=com

8.2.2.5. 关于删除角色

删除角色会删除角色条目,但不会删除每个角色成员的 nsRoleDN 属性。要删除每个角色成员的 nsRoleDN 属性,请启用 referential Integrity 插件,并将其配置为管理 nsRoleDN 属性。有关参考完整性插件的详情,请参考 第 5 章 维护参考完整性

8.2.3. 使用 LDAP 浏览器管理目录服务器中的角色

角色是一种分组机制,用于统一静态和动态组。

8.2.3.1. 在 LDAP 浏览器中创建角色

您可以使用 web 控制台中的 LDAP 浏览器 向导为 Red Hat Directory Server 条目创建角色。

先决条件

  • 访问 Web 控制台。
  • Red Hat Directory Server 中存在父条目。

流程

  1. 登录 Web 控制台并点击 Red Hat Directory Server
  2. Web 控制台加载 Red Hat Directory Server 界面后,单击 LDAP 浏览器
  3. 选择一个 LDAP 条目并点击 Options 菜单。
  4. 从下拉菜单中,选择 New 并点 Create a new role
  5. 按照向导中的步骤,在完成每个步骤后点 Next 按钮。
  6. 要创建角色,请查看 Create Role 步骤中的角色设置,再单击 Create 按钮。您可以点击 Back 按钮来修改角色设置,或者点击 Cancel 按钮取消角色创建。
  7. 要关闭向导窗口,请点击 Finish 按钮。

验证

  • 展开 LDAP 条目,并验证新角色出现在条目参数中。

8.2.3.2. 在 LDAP 浏览器中修改角色

您可以使用 web 控制台中的 LDAP 浏览器 修改 Red Hat Directory Server 条目的角色参数。

先决条件

  • 访问 Web 控制台。
  • Red Hat Directory Server 中存在父条目。

流程

  1. 登录 Web 控制台并点击 Red Hat Directory Server
  2. Web 控制台加载 Red Hat Directory Server 界面后,单击 LDAP 浏览器
  3. 展开 LDAP 条目,再选择您要修改的角色。
  4. 点 Options 菜单,选择 Edit 来修改角色的参数或 Rename 来重命名角色。
  5. 在向导窗口中,修改必要的参数,并在每个步骤后点 Next,直到您观察 LDIF 声明 步骤。
  6. 检查更新的参数并点击 Modify EntryChange Entry Name
  7. 要关闭向导窗口,请点击 Finish 按钮。

验证

  • 展开 LDAP 条目,并验证为角色列出了更新的参数。

8.2.3.3. 在 LDAP 浏览器中删除角色

您可以使用 web 控制台中的 LDAP 浏览器 从 Red Hat Directory Server 条目中删除角色。

先决条件

  • 访问 Web 控制台。
  • Red Hat Directory Server 中存在父条目。

流程

  1. 登录 Web 控制台并点击 Red Hat Directory Server
  2. Web 控制台加载 Red Hat Directory Server 界面后,单击 LDAP 浏览器
  3. 展开 LDAP 条目,再选择您要删除的角色。
  4. 打开 Options 菜单并选择 Delete
  5. 验证您要删除的角色的数据,然后单击 Next 按钮,直到您到达 Deletion 步骤。
  6. 将开关切换到 Yes, I'm sure location,再单击 Delete 按钮。
  7. 要关闭向导窗口,请点击 Finish 按钮。

验证

  • 展开 LDAP 条目,并验证角色不再是条目详细信息的一部分。

8.2.4. 安全地使用角色

并非所有角色都适合在安全上下文中使用。在创建新角色时,请考虑如何将角色分配给或从条目中删除。有时,用户可以轻松从角色中添加或删除自己。例如,如果有一个名为 Mountain Biking 的感兴趣的组角色,则感兴趣的用户应该可以轻松地添加或删除自己。
但是,对于某些安全情况,不适合于具有此类开放角色。一个潜在的安全风险是通过停用角色来取消激活用户帐户。不活动角色为其后缀定义了特殊的 ACI。如果管理员允许用户自由地从角色中添加和删除自己,那么在某种情形中,他们可能无法从不活跃的角色中删除自己,以防止其帐户被锁定。
例如,用户 A 具有受管角色 MRMR 角色已在激活中使用 account 锁定。这意味着用户 A 无法绑定到服务器,因为 nsAccountLock 属性被计算为该用户的 true。但是,如果用户 A 已绑定到目录服务器,并注意到他现在通过 MR 角色锁定,用户可以从其条目中删除 nsRoleDN 属性,并在没有 ACI 阻止了 ACI 时解锁自己。
要防止用户删除 nsRoleDN 属性,请根据所使用的角色类型,使用以下 ACI。
  • 受管角色。对于作为受管角色成员的条目,请使用以下 ACI 通过删除适当的 nsRoleDN 来防止用户解锁其自身:
    aci: (targetattr="nsRoleDN") (targattrfilters= add=nsRoleDN:(!(nsRoleDN=cn=AdministratorRole,dc=example,dc=com)), del=nsRoleDN:(!(nsRoleDN=cn=nsManagedDisabledRole,dc=example,dc=com))) (version3.0;acl "allow mod of nsRoleDN by self but not to critical values"; allow(write) userdn=ldap:///self;)
  • 过滤的角色。作为过滤器一部分的属性应该受到保护,以便用户无法通过修改属性来重新简化过滤的角色。不应该允许用户添加、删除或修改过滤角色使用的属性。如果计算了 filter 属性的值,则所有可以修改 filter 属性的值的属性都应以同样的方式进行保护。
  • 嵌套角色。嵌套角色由过滤和受管角色组成,因此两个 ACI 都应考虑修改组成嵌套角色的角色的属性(nsRoleDN 或其他)。
有关激活中的帐户的详情,请参考 第 20.16 节 “手动取消激活用户和角色”

8.3. 自动创建双条目

有些客户端以及与红帽目录服务器集成需要双条目。例如,两个 Posix 系统通常为每个用户都有一个组。目录服务器的 Managed Entries 插件会在 创建适当的原始条目时自动创建一个新的受管条目,其具有准确和特定属性值。

8.3.1. 关于受管条目

Managed Entries 插件后的基本概念是,在创建 Entry A 时,应该自动有一个带有相关属性值的 Entry B。例如,当创建 Posix 用户(posixAccount 条目)时,还应创建对应的组条目(posixGroup 条目)。Managed Entries 插件的实例标识哪个条目( 原始条目)会触发插件自动生成新条目( 受管条目)。
该插件可在目录树的定义范围内工作,因此只有该子树中的条目才会触发与给定搜索过滤器匹配的条目操作。
类似于配置服务类,受管条目通过两个条目进行配置:
  • 定义条目,用于标识插件实例和要使用的模板的范围
  • 模板条目,它建模最终受管条目是什么

8.3.1.1. 关于实例定义条目

与 Linked Attributes 和 DNA 插件一样,受管条目插件在 cn=plugins,cn=config 中有一个容器条目,插件的每个唯一配置实例在该容器下都有一个定义条目。
受管条目插件的实例定义了三项:
  • 用于标识原始条目的搜索条件(使用搜索范围和搜索过滤器)
  • 在其中创建受管条目(新条目位置)的子树
  • 用于受管条目的模板条目

图 8.2. 定义受管条目

定义受管条目
例如:
dn: cn=Posix User-Group,cn=Managed Entries,cn=plugins,cn=config
objectclass: extensibleObject
cn: Posix User-Group
originScope: ou=people,dc=example,dc=com
originFilter: objectclass=posixAccount
managedBase: ou=groups,dc=example,dc=com
managedTemplate: cn=Posix User-Group Template,ou=Templates,dc=example,dc=com
原始条目不必具有创建受管条目的任何特殊配置或设置;只需在插件范围内创建它,并与给定的搜索过滤器匹配。

8.3.1.2. 关于模板条目

插件的每个实例都使用模板条目来定义受管条目配置。模板实际上将条目从对象类提升到条目值。
注意
由于模板在定义条目中被引用,因此它可以位于目录中的任意位置。但是,建议模板条目采用复制后缀,以便多层次复制中的任何其他供应商都对受管条目插件的本地实例使用相同的模板。
模板条目的概念与 CoS 中使用的模板类似,但有一些重要的区别。受管条目模板与用于服务类的模板类型稍有不同。对于服务类,模板包含一个属性,它带有特定于该 CoS 的所有条目的特定值。对服务类的任何更改都会立即反映在关联的条目中,因为这些条目中的 CoS 属性都是虚拟属性,而不是实际在条目上设置的属性。
另一方面,Managed Entries 插件的模板条目不是为关联条目提供值的中央条目。这是一个 true 模板 - 它是条目中的内容。模板条目可以包含静态属性(一个带有预定义值,类似于 CoS)和映射的属性(从原始条目中提取其值或值部分)。模板在创建受管条目时被引用,然后在原始条目更改 时才会 应用到受管条目,并且插件再次评估该模板以应用这些更新。

图 8.3. 模板、受管条目和原始条目

模板、受管条目和原始条目
模板可以使用模板中的 static 属性为受管条目中的属性提供特定值。模板也可以使用来自原始条目中某些属性的值,因此该值可能与条目的不同;这是一个 映射 的属性,因为它引用了原始条目中的属性类型,而不是值。
映射的值使用令牌(动态值)和静态值的组合,但它只能在 映射的属性中使用一个令牌
dn: cn=Posix User-Group Template,ou=Templates,dc=example,dc=com
objectclass: mepTemplateEntry
cn: Posix User-Group Template
mepRDNAttr: cn
mepStaticAttr: objectclass: posixGroup
mepMappedAttr: cn: $cn Group Entry
mepMappedAttr: gidNumber: $gidNumber
mepMappedAttr: memberUid: $uid
模板中映射的属性使用令牌(以分号符号($)开头)从原始条目中提取值并在受管条目中使用它。(如果实际是 managed 属性值中的符号,则可以通过在一行中使用两个数字符号来转义该符号。)
映射的属性定义可以使用大括号括起来,如 Attr: ${cn}test。如果令牌名称不紧接在属性名称中有效的字符,则不需要引用令牌值,如空格或逗号。例如,$cn test 在属性定义中可以接受,因为空格字符会立即遵循属性名称,但 $cntest 无效,因为 Managed Entries 插件尝试在原始条目中查找名为 cntest 的属性。使用大括号标识属性令牌名称。
注意
确保为静态和映射的属性赋予的值符合所需的属性语法。

8.3.1.3. 由受管条目插件编写的条目属性

原始条目和受管条目都具有特殊的受管条目属性,表明它们由 Managed Entries 插件的实例管理。对于原始条目,插件会添加指向关联的受管条目的链接。
dn: uid=jsmith,ou=people,dc=example,dc=com
objectclass: mepOriginEntry
objectclass: posixAccount
...
sn: Smith
mail: jsmith@example.com
mepManagedEntry: cn=jsmith Posix Group,ou=groups,dc=example,dc=com
除了模板中定义的属性外,插件还会添加指向原始条目的属性。
dn: cn=jsmith Posix Group,ou=groups,dc=example,dc=com
objectclass: mepManagedEntry
objectclass: posixGroup
...
mepManagedBy: uid=jsmith,ou=people,dc=example,dc=com
使用特殊属性来指示受管和原始条目,可以轻松地识别相关条目并评估由 Managed Entries 插件所做的更改。

8.3.1.4. 受管条目插件和目录服务器操作

Managed Entries 插件对目录服务器执行常见操作(如添加和删除操作)有一些影响。

表 8.3. 受管条目插件和目录服务器操作

操作 受管条目插件的影响
添加 对于每个添加操作,服务器会检查新条目是否在任何受管条目插件实例范围内。如果达到原始条目的条件,则会创建一个受管条目,并将受管条目相关属性添加到原始和受管条目中。
修改
如果修改了原始条目,它会触发插件来更新受管条目。但是,更改 模板 条目不会自动更新受管条目。对模板条目的任何更改都不会反映在受管条目中,直到下次修改原始条目后。
在受管条目映射的受管属性无法手动修改,只有通过 Managed Entry 插件进行修改。受管条目中的其他属性(包括由 Managed Entry 插件添加的静态属性)可以手动修改。
删除 如果删除了原始条目,则 Managed Entries 插件也会删除与该条目关联的任何受管条目。对可以删除的条目有一些限制。
  • 如果模板条目当前由插件实例定义引用,则无法删除它。
  • 除了 Managed Entries 插件外,无法删除受管条目。
rename 如果重命名了原始条目,则插件会更新对应的受管条目。如果条目从插件范围 移出,则删除受管条目;而如果某个条目 移至 插件范围,它将被视为 add 操作,并且创建新的受管条目。与删除操作一样,可以重命名或移动条目的限制。
  • 配置定义条目不能从 Managed Entries 插件容器条目中移出。如果删除了该条目,则该插件实例将处于激活状态。
  • 如果条目 被移到 Managed Entries 插件容器条目中,则会验证它并将其视为活跃的配置定义。
  • 如果模板条目目前由插件实例定义引用,则无法重命名或移动。
  • 除了 Managed Entries 插件外,无法重命名或移动受管条目。
复制 Managed Entries 插件操作 由复制更新启动。如果插件范围中某个条目的添加或修改操作被复制到另一个副本,则该操作不会触发副本上的 Managed Entries 插件实例来创建或更新条目。要复制受管条目的更新的唯一方法是将最终受管条目复制到副本。

8.3.2. 创建受管条目模板条目

要创建的第一个条目是模板条目。模板条目必须包含生成的、受管条目所需的所有配置。这可以通过在模板的静态和映射的属性中设置 attribute-value assertions 来实现:
mepStaticAttr: attribute: specific_value
mepMappedAttr: attribute: $token_value
static 属性设置一个显式值;映射的属性从原始条目中提取一些值,以提供给定的属性。这些属性的值将是 form 属性中的令牌 : $attr。只要属性展开令牌的语法不会违反所需的属性语法,则属性中可以使用其他术语和字符串。例如:
mepMappedAttr: cn: Managed Group for $cn
受管条目必须遵循一些语法规则:
  • 映射的值使用令牌(动态值)和静态值的组合,但只能使用每个映射 的属性使用一个令牌
  • 模板中映射的属性使用令牌(以分号符号($)开头)从原始条目中提取值并在受管条目中使用它。(如果实际是 managed 属性值中的符号,则可以通过在一行中使用两个数字符号来转义该符号。)
  • 映射的属性定义可以使用大括号括起来,如 Attr: ${cn}test。如果令牌名称不紧接在属性名称中有效的字符,则不需要引用令牌值,如空格或逗号。例如,$cn test 在属性定义中可以接受,因为空格字符会立即遵循属性名称,但 $cntest 无效,因为 Managed Entries 插件尝试在原始条目中查找名为 cntest 的属性。使用大括号标识属性令牌名称。
  • 确保为静态和映射的属性赋予的值符合所需的属性语法。
注意
确保为静态和映射的属性赋予的值符合所需的属性语法。例如,如果其中一个映射的属性是 gidNumber,则映射的值应该是整数。

表 8.4. Managed Entry 模板的属性

属性 描述
mepTemplateEntry (对象类) 将条目标识为模板。
cn 提供条目的通用名称。
mepMappedAttr 包含 attribute-token 对,插件用来在受管条目中创建属性,以及从原始条目获取的值。
mepRDNAttr 指定用作受管条目中的 naming 属性的属性。用作 RDN 的属性 必须是 配置有效的映射属性。
mepStaticAttr 包含一个属性-值对,它将在受管条目中使用指定值。
创建模板条目:
使用 dsconf plugin managed-entries template add 命令添加模板条目。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin managed-entries template "cn=Posix User Template,ou=templates,dc=example,dc=com" add --rdn-attr "cn" --static-attr "objectclass: posixGroup" --mapped-attr "cn: $cn Group Entry" "gidNumber: $gidNumber" "memberUid: $uid"

8.3.3. 创建受管条目实例定义

创建模板条目后,可以创建一个指向该模板的定义条目。定义条目是 Managed Entries 插件的实例。
注意
创建定义后,服务器会检查是否存在指定的模板条目。如果模板不存在,服务器会返回一个定义配置无效的警告。
定义条目必须定义参数来标识潜在的原始条目以及创建受管条目的信息。插件实例可用的属性列在 表 8.5 “受管条目定义条目的属性” 中。

表 8.5. 受管条目定义条目的属性

属性名称 描述
originFilter 用于搜索和识别需要受管条目的子树中的条目的搜索过滤器。语法与常规搜索过滤器相同。
originScope 包含要监控的插件的潜在原始条目的基本子树。
managedTemplate 标识用于创建受管条目的模板条目。此条目可以位于目录树中的任何位置。
managedBase 要创建受管条目的子树。
注意
Managed Entries 插件默认启用。如果禁用了这个插件,请重新启用它,如 第 1.10.2 节 “启用和禁用插件” 所述。
创建实例:
  1. cn=Managed Entries,cn=plugins,cn=config 容器条目下创建新插件实例。例如:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin managed-entries config "cn=instance,cn=Managed Entries,cn=plugins,cn=config" add --scope="ou=people,dc=example,dc=com" --filter="objectclass=posixAccount" --managed-base="ou=groups,dc=example,dc=com" --managed-template="cn=Posix User-Group Template,ou=Templates,dc=example,dc=com"
    此命令设置原始条目搜索的范围和过滤器、新受管条目的位置以及要使用的模板条目。
  2. 如果目录服务器没有配置为启用动态插件,重启服务器以载入修改后的新插件实例:
    # dsctl instance_name restart

8.3.4. 将受管条目插件配置放入复制数据库中

随着 第 8.3.1 节 “关于受管条目” 突出显示,受管条目插件的不同实例创建为 cn=plugins,cn=com 中的容器插件条目下的子项。(这对允许多个实例的插件很常见。) 这样做的缺陷是 cn=plugins,cn=com 中的配置条目没有复制,因此必须在每个目录服务器实例上重新创建配置。
Managed Entries 插件条目允许 nsslapd-pluginConfigArea 属性。此属性到另一个容器条目,位于主数据库区域中,其中包含插件实例条目。此容器条目可以在复制数据库中,允许复制插件配置。
  1. 创建容器条目。例如,要创建一个指向容器条目的条目,请输入:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin managed-entries set --config-area="cn=managed entries container,ou=containers,dc=example,dc=com"

8.4. 使用视图

虚拟目录树视图 或查看,创建虚拟目录层次结构,因此可以轻松地浏览条目,而无需确保这些条目在任何特定位置都存在。视图使用有关条目的信息将其放在视图层次结构中,类似于过滤的角色的成员或动态组。查看一组条目上的 DIT 层次结构,以及客户端应用程序,视图显示为普通容器层次结构。

8.4.1. 关于视图

视图创建类似于常规层次结构的目录树,例如为子树使用机构单元条目,但查看条目有一个额外的对象类(nsview)和一个过滤器属性(nsviewfilter),用于为属于该视图中的条目设置过滤器。添加 view 容器条目后,与 view 过滤器匹配的所有条目都会立即填充视图。在视图中仅显示目标条目,目标条目的真正位置永远不会更改。例如,可以将视图创建为 ou=Location Views,并为 l=Mountain View 设置过滤器。每个条目(如 cn=Jane Smith,l=Mountain View,ou=People,dc=example,dc=com )都立即列在 ou=Location Views 条目下,但实际 cn=Jane Smith 条目保留在 ou=People,dc=example,dc=com 子树中。

图 8.4. 带有虚拟 DIT 视图层次结构的目录树

带有虚拟 DIT 视图层次结构的目录树
虚拟 DIT 视图的行为类似于使用预期结果执行子树或一次性搜索的普通 DIT。
注意
有一个示例 LDIF 文件,它带有示例视图条目 Example-views.ldif,与 Directory Server 一起安装。此文件位于 /usr/share/dirsrv/data/ 目录中。本章的章节假定 Example-views.ldif 导入到服务器。
红帽目录服务器部署指南 提供了有关 如何将视图与目录树层次结构集成的更多信息。

8.4.2. 从命令行创建视图

  1. 使用 ldapmodify 实用程序绑定到服务器,并准备好将其添加新视图条目到配置文件中。
  2. 假设 Example-views.ldif 文件中的 view container ou=Location Views,dc=example,dc=com 位于 Directory 服务器中,在本例中为 dc=example,dc=com root 后缀下添加新的视图容器条目。此条目必须具有 nsview 对象类和 nsViewFilter 属性。nsViewFilter 属性设置 attribute-value,用于标识属于视图中的条目。
    dn: ou=Mountain View,ou=Location Views,dc=example,dc=com
    changetype: add
    objectClass: top
    objectClass: organizationalUnit
    objectClass: nsview
    ou: Mountain View
    nsViewFilter: l=Mountain View
    description: views categorized by location

8.4.3. 提高视图性能

作为 第 8.4.1 节 “关于视图” 描述,根据给定的过滤器从搜索结果中派生视图。过滤器的一部分是 nsViewFilter 属性中定义的属性;过滤器的其余部分基于条目层次结构,查找视图中包含的实际条目的 entryidparentid
(|(parentid=search_base_id)(entryid=search_base_id)
如果任何 search-for 属性 - entryidparentidnsViewFilter 中设置的属性没有索引,则视图搜索将变为不索引的搜索,因为 view 操作搜索整个树以获取匹配的条目。
要提高视图性能,请为 entryidparentidnsViewFilter 中设置的属性创建相等的索引。
第 13.2 节 “创建标准索引” 中涵盖了创建相等的索引,并在 第 13.3 节 “为现有数据库创建新索引” 中涵盖更新现有索引使其包含新属性。

8.5. 管理机构单元

管理员可以使用机构单元(OU)作为目录条目的容器。例如,您可以使用 OUs 来分隔用户和组条目。要在目录服务器中管理 OU,请使用 dsidm organizationalunit 命令。
  • 要创建 OU,请输入:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" organizationalunit create --ou OU_name
  • 要列出条目中的 OUs,请输入:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" organizationalunit list
    People
    ...
  • 要重命名 OU,请输入:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" organizationalunit rename old_name new_name
  • 要删除 OU,请输入:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" organizationalunit delete OU_name

第 9 章 配置安全连接

默认情况下,客户端和服务器通过标准连接连接到 Red Hat Directory Server。标准连接不使用任何加密,因此清晰的服务器和客户端之间发送信息。
目录服务器支持 TLS 连接、STARTTLS 连接和 SASL 身份验证,它提供了加密层和安全,即使被截获了目录数据也是如此。

9.1. 需要安全连接

目录服务器提供以下使用加密连接的方法:
LDAPS
当您使用 LDAPS 协议时,连接开始使用加密,并成功或失败。但是,不会通过网络发送未加密的数据。因此,首选 LDAPS 而不是通过未加密的 LDAP 使用 STARTTLS
LDAP 的 STARTTLS
客户端通过 LDAP 协议建立未加密的连接,然后发送 STARTTLS 命令。如果命令成功,则所有进一步的通信都会被加密。
警告
如果 STARTTLS 命令失败,且客户端没有取消连接,则所有进一步的数据(包括身份验证信息)都通过网络发送未加密的数据。
SASL
简单的身份验证和安全层(SASL)可让您使用外部身份验证方法(如 Kerberos)验证用户。详情请查看 第 9.10 节 “设置 SASL 身份映射”

9.2. 设置最小的 Strength Factor

为提高安全性,目录服务器可以被配置为在允许连接前需要一定级别的加密。目录服务器可以为任何连接定义和需要特定的安全稳定性(SFF)。SSF 为任何连接或操作设置由密钥强度定义的最低加密级别。
要要求任何和所有目录操作需要 SSF,请设置 nsslapd-minssf 配置属性。当强制最小 SSF 时,Directory 服务器会查找操作的每种可用加密类型 - TLS 或 SASL - 并决定哪个 SSF 值较高,然后将更高的值与最小 SSF 进行比较。可以同时为某些服务器到服务器连接(如复制)配置 SASL 身份验证和 TLS。
注意
或者,使用 nsslapd-minssf-exclude-rootdse 配置属性。这为所有到目录服务器的连接设置 SSF 设置,但查询根 DSE 除外。在启动操作前,客户端可能需要获取有关服务器配置的信息,如其默认命名上下文。nsslapd-minssf-exclude-rootdse 属性允许客户端获取该信息,而无需首先建立安全连接。
在连接时,会评估连接的 SSF。这允许 STARTTLS 和 SASL 绑定成功,即使这两个连接最初打开常规连接。打开 TLS 或 SASL 会话后,将评估 SSF。任何不符合 SSF 要求的连接都会关闭,并带有 LDAP 未处理以执行错误。
设置最小 SSF 以禁用到目录的不安全连接。
警告
如果您使用没有 SASL 的未加密的 LDAP 协议连接到目录,则第一个 LDAP 消息可以包含绑定请求。在这种情况下,凭证会在服务器取消连接前通过网络发送,因为 SSF 未满足最小值。
使用 LDAPS 协议或 SASL 绑定来确保不会发送凭据。
默认的 nsslapd-minssf 属性值为 0,这意味着服务器连接没有最小 SSF。该值可以设置为任何合理的正整数。该值代表任何安全连接所需的密钥强度。
以下示例将 nsslapd-minssf 参数设置为 128
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-minssf=128
Successfully replaced "nsslapd-minssf"
注意
ACI 可以设置为需要 SSF 进行特定类型的操作,如 第 18.11.2.4 节 “连接中需要级别安全性” 中所示。
通过打开 nsslapd-require-secure-binds 属性,如 第 20.12.1 节 “需要安全绑定” 中所示,绑定操作可能需要安全连接。

9.3. 管理目录服务器使用的 NSS 数据库

要使用 TLS 加密或基于证书的身份验证,您必须在网络安全服务(NSS)数据库中管理证书。当您创建实例时,dscreate 实用程序会在 /etc/dirsrv/slapd-instance_name/ 目录中自动创建此数据库,并使用强大的密码保护。实用程序将密码存储在 /etc/dirsrv/slapd-instance_name/pwdfile.txt 文件中。请注意,Directory 服务器不使用此文件。dscreate 实用程序仅创建此文件来为管理员提供密码。有关更改密码的详情,请参考 第 9.3.10 节 “更改 NSS 数据库的密码”
这部分论述了管理目录服务器的 NSS 数据库的最频繁操作。

9.3.1. 创建证书签名请求

证书签名请求(CSR)是对证书颁发机构(CA)为服务器密钥签名的请求。这部分论述了如何创建包含私钥的 CSR。
注意
目录服务器只支持使用 certutil 工具直接在 NSS 数据库中创建私钥和 CSR。

9.3.1.1. 使用命令行创建证书签名请求

要创建密钥和 CSR,请使用 dsctl tls generate-server-cert-csr 命令:
# dsctl instance_name tls generate-server-cert-csr -s "certificate_subject"
dsctl tls generate-server-cert-csr 命令将 CSR 存储在 /etc/dirsrv/slapd-instance_name/Server-Cert.csr 文件中,以及目录服务器的网络安全服务(NSS)数据库中的私钥。

例 9.1. 为单一主机名创建私钥和 CSR

以下命令为 server.example.com 主机生成位私钥:
# dsctl instance_name tls generate-server-cert-csr -s "CN=server.example.com,O=example_organization,OU=IT,ST=North Carolina,C=US"
-s 参数中指定的字符串必须是根据 RFC 1485 的有效主题名称。CN 字段是必需的,您必须将其设置为服务器的完全限定域名(FQDN)。其他字段都是可选的。

例 9.2. 为多主目录主机创建私钥和 CSR

如果目录服务器主机有多个名称,请使用 CSR 的 SAN 扩展中的所有主机名创建一个 CSR。以下命令为 server.example.comserver.example.net 主机名生成位私钥和 CSR:
# dsctl instance_name tls generate-server-cert-csr -s "CN=server.example.com,O=example_organization,OU=IT,ST=North Carolina,C=US" server.example.com server.example.net
如果将主机名指定为最后一个参数,该命令会使用 DNS:server.example.com 添加 SAN 扩展,DNS:server.example.net 条目添加到 CSR。-s 参数中指定的字符串必须是根据 RFC 1485 的有效主题名称。CN 字段是必需的,您必须将其设置为服务器的 FQDN 之一。其他字段都是可选的。
生成 CSR 后,将其提交到 CA 以获取签发的证书。详情请查看您的 CA 文档。

9.3.2. 安装 CA 证书

要启用目录服务器信任证书颁发机构(CA),您必须将 CA 的证书安装到网络安全服务(NSS)数据库中。在此过程中,您必须设置 CA 发布的证书应被信任:

表 9.1. CA Trust Options

Web 控制台选项 dsconfcertutil 选项 描述
(C)受信任的 CA C,, 服务器验证用于建立与复制合作伙伴的加密连接的证书是否已由可信 CA 发布。
(T)受信任的 CA 客户端身份验证 T, 服务器信任此 CA 证书来发布适合 TLS EXTERNAL 绑定的客户端证书。
您可以为 CA 设置这两个选项。使用 certutil 时,将 -T "CT," 参数传给实用程序。

9.3.2.1. 使用命令行安装 CA 证书

安装 CA 证书:
  1. 导入 CA 证书。例如,要导入存储在 /root/ca.crt 文件中的 CA 证书,并使用 Example CA nick 名称将其存储在数据库中:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate add --file /root/ca.crt --name "Example CA"
  2. 设置信任选项。例如,要设置 CT, 信任标志:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate set-trust-flags "Example CA" --flags "CT,,"

9.3.2.2. 使用 Web 控制台安装 CA 证书

使用 Web 控制台安装 CA 证书:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings 菜单,然后选择 Security 条目。
  4. 打开 证书管理 选项卡,然后选择 受信任的证书颁发机构 子选项卡。
  5. Add CA Certificate
  6. 输入 CA 证书文件的路径以及证书的别名。

    图 9.1. 添加 CA 证书

    添加 CA 证书
    注意
    CA 证书必须存储在本地目录服务器主机上,且必须由 dirsrv 用户读取。
  7. 单击 Add Certificate
  8. 单击导入的 CA 证书旁边的 Actions,然后选择 Edit Trust Flags
  9. SSL 列中选择 (C) - Trusted CA(T) - Trusted CA Client Auth

    图 9.2. 添加 CA 证书的信任标记

    添加 CA 证书的信任标记

9.3.3. 导入私钥和服务器证书

这部分论述了如何使用外部工具在 NSS 数据库中导入私钥和证书签名请求(CSR)。
如果您在 NSS 数据库中创建了私钥和 CSR,请按照 第 9.3.4 节 “安装服务器证书” 中所述的步骤操作。
要从 /root/server.crt/root/server.key 文件中的私钥导入证书,请输入:
# dsctl instance_name tls import-server-key-cert /root/server.crt /root/server.key
请注意,dsctl tls import-server-key-cert 命令需要按照以下顺序的路径:
  1. 服务器证书的路径。
  2. 私钥文件的路径。

9.3.4. 安装服务器证书

在证书颁发机构(CA)发布请求的证书后,您必须在网络安全服务(NSS)数据库中安装它。
如果您创建了不在 NSS 数据库中的私钥和证书签名请求,请按照 中所述的步骤操作 第 9.3.3 节 “导入私钥和服务器证书”

9.3.4.1. 使用命令行安装服务器证书

要在目录服务器的 NSS 数据库中安装服务器证书,请使用 certutil 工具。例如:
  1. 安装 CA 证书。请参阅 第 9.3.2 节 “安装 CA 证书”
  2. 导入服务器证书。例如,要导入存储在 /root/instance_name.crt 文件中的证书,并将其设置为实例使用的主证书:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com security certificate add --file /root/instance_name.crt --name "Server-Cert" --primary-cert

9.3.4.2. 使用 Web 控制台安装服务器证书

使用 Web 控制台安装服务器证书:
  1. 安装 CA 证书。请参阅 第 9.3.2 节 “安装 CA 证书”
  2. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  3. 选择实例。
  4. 打开 Server Settings 菜单,然后选择 Security 条目。
  5. 打开 证书管理 选项卡,然后选择 TLS 证书 子选项卡。
  6. 单击 Add Server Certificate
  7. 输入服务器证书文件的路径以及证书的别名。

    图 9.3. 添加服务器证书

    添加服务器证书
    注意
    服务器证书必须存储在本地目录服务器主机上,且必须由 dirsrv 用户读取。
  8. 单击 Add Certificate

9.3.5. 生成并安装自签名证书

当您使用 dscreate 实用程序创建启用了 TLS 的实例时,dscreate 会自动创建并安装自签名证书。但是,如果您在实例创建过程中没有启用 TLS,您可以手动创建并安装自签名证书。
注意
您只能使用命令行执行此操作。
创建并安装自签名证书:
  1. 使用随机数据生成 noise 文件。例如,要生成大小为 4096 位的文件:
    # openssl rand -out /tmp/noise.bin 4096
  2. 创建自签名证书并将其添加到 NSS 数据库中:
    # certutil -S -x -d /etc/dirsrv/slapd-instance_name/ -z /tmp/noise.bin \
         -n "Server-Cert" -s "CN=$HOSTNAME" -t "CT,C,C" -m $RANDOM \
         --keyUsage digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment
    Red Hat Enterprise Linux 会自动将 $HOSTNAME 变量替换为完全限定域名(FQDN),将 $RANDOM 替换为随机生成的数字。有关上一命令中使用的参数的详情,请查看 certutil(1) man page。
  3. (可选)验证生成的证书是自签名的:
    # certutil -L -d /etc/dirsrv/slapd-instance_name/ -n "Server-Cert" | egrep "Issuer|Subject"
            Issuer: "CN=server.example.com"
            Subject: "CN=server.example.com"
    此命令的输出必须同时显示证书的签发者和主题的目录服务器主机的 FQDN。

9.3.6. 续订证书

如果证书将在不久的将来过期,您必须及时续订证书,以继续建立安全连接。

9.3.6.1. 使用命令行续订证书

续订服务器证书:
  • 如果不使用属性加密:
    1. 创建一个新的证书签名请求(CSR),其选项相同,如密钥大小、主机名和主题。有关创建 CSR 的详情,请参考 第 9.3.1.1 节 “使用命令行创建证书签名请求”
    2. 从 CA 收到发布的证书后,使用相同的 nickname 在数据库中安装证书。请参阅 第 9.3.2.1 节 “使用命令行安装 CA 证书”
    3. 停止实例:
      # dsctl instance_name stop
    4. 编辑 /etc/dirsrv/slapd-instance_name/dse.ldif 文件并删除以下条目,包括其属性:
      • cn=AES,cn=encrypted 属性 key,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 文件中,则目录服务器将无法启动。
    5. 启动实例:
      # dsctl instance_name start
    目录服务器将自动使用较新的发布的证书。
  • 如果使用属性加密,请参阅 第 10.5 节 “更新用于属性加密的 TLS 证书”

9.3.7. 删除证书

如果不再需要证书,例如,由于已公开了证书,请将其从数据库中删除。

9.3.7.1. 使用命令行删除证书

使用命令行删除证书:
  1. 另外,还可在数据库中显示证书:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com security certificate list
    
    Certificate Name: Server-Cert
    Subject DN: CN=server.example.com
    Issuer DN: CN=Example CA
    Expires: 2022-07-29 11:10:14
    Trust Flags: ,,
  2. 删除证书。例如,使用 Server-Cert nickname 删除证书:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com security certificate del Server-Cert

9.3.7.2. 使用 Web 控制台删除证书

使用 Web 控制台删除证书:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings 菜单,然后选择 Security 条目。
  4. 打开 证书管理 选项卡,然后选择 TLS 证书 子选项卡。
  5. 单击证书旁边的 Actions,然后选择 Delete Certificate
  6. 单击 Yes

9.3.8. 删除私钥

如果不再需要私钥,例如,因为您创建了更强大的密钥,将其从数据库中删除。
警告
如果您删除了私钥,基于此密钥的证书将无法正常工作。

9.3.8.1. 使用命令行删除私钥

删除私钥:
  1. 根据您要删除的密钥删除所有证书。请参阅 第 9.3.7 节 “删除证书”
  2. 另外,还可在数据库中显示密钥:
    # certutil -d /etc/dirsrv/slapd-instance_name/ -K
    certutil: Checking token "NSS Certificate DB" in slot "NSS User Private Key and Certificate Services"
    Enter Password or Pin for "NSS Certificate DB":
    < 0> rsa      7a2fb6c269d83c4036eac7e4edb6aaf2ed08bc4a   Server-Cert
    < 1> rsa      662b826aa3dd4ca7fd7e6883558cf3866c42f4e2   example-cert
  3. 删除私钥。例如,使用 example-cert 别名删除私钥:
    # certutil -d /etc/dirsrv/slapd-instance_name/ -F -n "example-cert"

9.3.9. 更改 CA Trust Options

在某些情况下,您需要更新证书颁发机构(CA)的 trust 选项。本节描述了这个步骤。

9.3.9.1. 使用命令行更改 CA 信任选项

要更改 CA 的信任选项,请将 --flags 参数中的新选项传给 dsconf 安全 ca-certificate set-trust-flags 命令。
例如,要设置目录服务器只信任由名为 example-CA 的 CA 发布的客户端身份验证证书:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate set-trust-flags "example-CA" --flags "T,,"
--flags trust_options 参数设置 CA 发布的证书应被信任。请参阅 表 9.1 “CA Trust Options”

9.3.9.2. 使用 Web 控制台更改 CA 信任选项

使用 Web 控制台更改 CA 的信任选项:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings 菜单,然后选择 Security 条目。
  4. 打开 证书管理 选项卡。
  5. 受信任的证书颁发机构 子选项卡上,单击导入的 CA 证书旁边的 Actions,然后选择 Edit Trust Flags
  6. 选择 trust 标记。例如:

    图 9.4. 设置 CA 证书的信任标记

    设置 CA 证书的信任标记
  7. 点击 Save

9.3.10. 更改 NSS 数据库的密码

在某些情况下,管理员想要更改网络安全服务(NSS)数据库的密码。本节描述了此过程。
重要
如果您使用密码文件启用目录服务器自动打开网络安全服务(NSS)数据库,您必须在设置密码后更新该文件。请参阅 第 9.4.1.5 节 “为目录服务器创建密码文件”

9.3.10.1. 使用命令行更改 NSS 数据库的密码

更改 NSS 数据库的密码:
# certutil -d /etc/dirsrv/slapd-instance_name -W
Enter Password or Pin for "NSS Certificate DB":
Enter a password which will be used to encrypt your keys.
The password should be at least 8 characters long,
and should contain at least one non-alphabetic character.

Enter new password: 
Re-enter password: 
Password changed successfully.

9.4. 启用 TLS

目录服务器支持客户端和服务器之间的加密连接,以及复制环境中的服务器之间的加密连接。为此,目录服务器支持:
  • LDAPS 协议:在建立连接后直接使用 TLS 加密。
  • 通过 LDAP 协议的 STARTTLS 命令:连接是未加密的,直到客户端发送 STARTTLS 命令。
重要
为了安全起见,红帽建议启用 TLS 加密。
您可以使用绑定可辨识名称(DN)和密码或使用基于证书的验证,将 TLS 与简单的身份验证一起使用。
目录服务器的加密服务由 Mozilla Network Security Services (NSS)提供,它是一个 TLS 和基本加密函数库。NSS 包括一个基于软件的加密令牌,该令牌是联邦信息处理标准(FIPS) 140-2 认证。

9.4.1. 在目录服务器中启用 TLS

本节论述了如何在目录服务器中启用 TLS。

9.4.1.1. 使用命令行在目录服务器中启用 TLS

使用命令行启用 TLS:
  1. 请求并安装证书:
  2. 启用 TLS 并设置 LDAPS 端口:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-securePort=636 nsslapd-security=on
    Successfully replaced "nsslapd-securePort"
    Successfully replaced "nsslapd-security"
  3. 在 NSS 数据库中显示服务器证书的名称:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com security certificate list
    
    Certificate Name: Server-Cert
    Subject DN: CN=server.example.com
    Issuer DN: CN=Example CA
    Expires: 2022-07-29 11:10:14
    Trust Flags: ,,
    下一步需要 nickname。
  4. 要启用 RSA 密码系列,设置 NSS 数据库安全设备以及服务器证书名称:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com security rsa set --tls-allow-rsa-certificates on --nss-token "internal (software)" --nss-cert-name Server-Cert
    注意
    默认情况下,NSS 数据库中的安全设备名称是 内部(软件)。
  5. (可选)更新目录服务器支持的密码列表。详情请查看 第 9.4.1.3.2 节 “使用命令行显示和设置目录服务器使用的加密”
  6. (可选)启用基于证书的身份验证。详情请查看 第 9.9 节 “使用基于证书的客户端身份验证”
  7. (可选)创建一个密码文件,以便目录服务器在不提示输入 NSS 数据库的密码的情况下启动。详情请查看 第 9.4.1.5 节 “为目录服务器创建密码文件”
  8. 重启 Directory 服务器实例:
    # dsctl instance_name restart
    如果您在 NSS 数据库上设置密码且没有创建密码文件,目录服务器会提示输入 NSS 数据库的密码。详情请查看 第 9.4.1.4 节 “启动目录服务器没有密码文件”

9.4.1.2. 使用 Web 控制台在目录服务器中启用 TLS

使用 Web 控制台在 Directory Server 中启用 TLS:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 导入证书颁发机构(CA)证书。请参阅 第 9.3.2.2 节 “使用 Web 控制台安装 CA 证书”
  4. 导入 CA 发布的服务器证书。请参阅 第 9.3.4.2 节 “使用 Web 控制台安装服务器证书”
  5. 打开 Server Settings 菜单,然后选择 Security 条目。
  6. Security Configuration 选项卡中:
    1. 单击 Security Enabled
    2. Server Certificate Name 字段中选择证书的 nickname。
    3. (可选)更改服务器应该支持的最小和最大 TLS 版本的设置。
    4. (可选)配置客户端身份验证,以便用户使用证书进行身份验证。详情请查看 第 9.9 节 “使用基于证书的客户端身份验证”
  7. 单击 Save Configuration
  8. (可选)创建一个密码文件,以便目录服务器在不提示输入 NSS 数据库的密码的情况下启动。详情请查看 第 9.4.1.5 节 “为目录服务器创建密码文件”
  9. 如果您在 NSS 数据库上设置密码且没有创建密码文件,目录服务器会提示输入 NSS 数据库的密码。详情请查看 第 9.4.1.4 节 “启动目录服务器没有密码文件”

9.4.1.3. 设置加密加密

目录服务器支持不同的密码,您可以启用或禁用它们。密码是加密中使用的算法。当客户端启动与服务器的 TLS 连接时,客户端会告知服务器首选加密信息的密码。如果服务器支持至少一个密码,可以使用这个算法建立加密的连接。
如果您根据 第 9.4 节 “启用 TLS” 启用加密,您可以显示和更新密码目录服务器。
9.4.1.3.1. 显示默认加密
如果在 cn=encryption,cn=config 条目中没有设置 nsSSL3Ciphers 参数,目录服务器将使用网络安全服务(NSS)的默认密码。显示默认密码:
# /usr/lib64/nss/unsupported-tools/listsuites | grep -B1 --no-group-separator "Enabled"         
TLS_AES_128_GCM_SHA256:
  0x1301 TLS 1.3 TLS 1.3 AES-GCM  128 AEAD   Enabled  FIPS Domestic            
TLS_CHACHA20_POLY1305_SHA256:
  0x1303 TLS 1.3 TLS 1.3 CHACHA20POLY1305 256 AEAD   Enabled       Domestic
...
9.4.1.3.2. 使用命令行显示和设置目录服务器使用的加密

显示所有可用的加密

显示目录服务器中所有可用密码的列表:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ciphers list --supported
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
...
这只是您可以启用或禁用的可用密码列表。该列表不显示当前使用的密码目录服务器。

显示加密目录服务器使用

要显示当前使用的密码目录服务器,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ciphers list --enabled
TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
...
另外,您还可以显示要启用和禁用的密码:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ciphers list
default
+tls_rsa_aes_128_sha
+tls_rsa_aes_256_sha
...
default 关键字引用 NSS 提供的首选默认密码。请参阅 第 9.4.1.3.1 节 “显示默认加密”
重要
目录服务器使用 nsSSL3Ciphers 属性中的设置来生成实际使用的密码列表。但是,如果您在 nsSSL3Ciphers 中启用了弱密码,但将 allowWeakCiphers 参数设置为 off,则目录服务器只使用强大的密码,并在 nsSSLSupportedCiphers read-only 属性中显示它们。

更新已启用的加密列表

更新启用的密码列表:
  1. 显示当前启用的密码列表。请参阅 “显示加密目录服务器使用”一节
  2. 要只启用特定的密码,请更新 nsSSL3Ciphers 属性。例如,只启用 TLS_RSA_WITH_AES_128_GCM_SHA256 密码:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com security ciphers set "-all,+TLS_RSA_WITH_AES_128_GCM_SHA256"
  3. 重启 Directory 服务器实例:
    # dsctl instance_name restart
  4. (可选)显示已启用的密码列表以验证结果。请参阅 “显示加密目录服务器使用”一节
9.4.1.3.3. 使用 Web 控制台显示和设置目录服务器使用的加密
使用 Web 控制台选择和更新密码:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings 菜单,然后选择 Security 条目。
  4. Cipher Preferences 选项卡中,Directory 服务器显示当前启用的密码。
  5. 如果您使用不同于默认密码,请在 Ciphers Suite 字段中选择 Default Ciphers 来自动启用默认密码。详情请查看 第 9.4.1.3.1 节 “显示默认加密”
    或者,您可以将 Ciphers Suite 设置为:
    • 所有 Ciphers 启用所有密码。另外,还可在 Deny Specific Ciphers 字段中禁用特定的密码。
    • 没有 Ciphers 禁用所有密码。另外,还可在 Allow Specific Ciphers 字段中启用特定的密码。
  6. 单击 Save Cipher Preferences
  7. 如果您更新了密码列表,请重新启动 Directory 服务器实例。请查看 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”

9.4.1.4. 启动目录服务器没有密码文件

如果您在启用了加密的情况下启动目录服务器,并在 NSS 数据库中设置密码:
  • 如果 systemctl 命令启动 ns-slapd Directory Server 进程,systemd 会提示输入密码,并自动将输入传递给 systemd-tty-ask-password-agent 工具。例如:
    # systemctl start dirsrv@instance_name
    Enter PIN for Internal (Software) Token:
  • 在个别情况下,当 ns-slapd Directory Server 进程不是由 systemctl 工具启动且从终端分离时,会使用 wall 命令向所有终端发送一条消息。例如:
    Broadcast message from root@server (Fri 2017-01-01 06:00:00 CET):
    
    Password entry required for 'Enter PIN for Internal (Software) Token:' (PID 1234).
    Please enter password with the systemd-tty-ask-password-agent tool!
    要输入密码,请运行:
    # systemd-tty-ask-password-agent
    Enter PIN for Internal (Software) Token:

9.4.1.5. 为目录服务器创建密码文件

如果启用了加密并在 NSS 数据库上设置的密码,则目录服务器会在服务启动时提示输入此密码。请参阅 第 9.4.1.4 节 “启动目录服务器没有密码文件”
要绕过此提示,您可以在 /etc/dirsrv/slapd-instance_name/pin.txt 文件中存储 NSS 数据库密码。这可让目录服务器在不提示输入这个密码的情况下,自动启动。
警告
密码以明文形式保存。如果服务器在不安全的环境中运行,则不要使用密码文件。
创建密码文件:
  1. 使用以下内容创建 /etc/dirsrv/slapd-instance_name/pin.txt 文件:
    • 如果您使用 NSS 软件加密模块,这是默认设置:
      Internal (Software) Token:password
    • 如果您使用硬件安全模块(HSM):
      name_of_the_token:password
  2. 设置权限:
    # chown dirsrv:dirsrv /etc/dirsrv/slapd-instance_name/pin.txt
    # chmod 400 /etc/dirsrv/slapd-instance_name/pin.txt

9.4.1.6. 管理目录服务器在证书过期时如何获得

默认情况下,如果启用了加密且证书已过期,Directory 服务器会记录警告并启动服务。要更改此行为,请设置 nsslapd-validate-cert 参数。您可以将其设置为以下值:
  • 警告 :目录服务器实例启动并记录有关过期证书的警告到 /var/log/dirsrv/slapd-instance_name/error 日志文件。这是默认的设置。
  • 在 上 :目录服务器验证证书,如果证书已过期,实例无法启动。
  • off :目录服务器不会验证证书过期日期。实例启动且没有记录警告。

例 9.3. 如果证书已过期,防止目录服务器启动

要防止 Directory 服务器在证书已过期时启动:
  1. nsslapd-validate-cert 参数设置为 on
    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-validate-cert=on
    Successfully replaced "nsslapd-validate-cert"
  2. 重启 Directory 服务器实例:
    # dsctl instance_name restart

9.4.2. 将目录服务器使用的 CA 证书添加到 Red Hat Enterprise Linux 的信任存储中

当您在 Directory 服务器中启用 TLS 加密时,您要将实例配置为使用 CA 发布的证书。如果客户端现在使用 LDAPS 协议或 LDAP 的 STARTTLS 命令建立连接,目录服务器使用这个证书来加密连接。客户端实用程序使用 CA 证书来验证服务器证书是否有效。默认情况下,如果这些工具不信任服务器证书,则取消连接。

例 9.4. 如果客户端工具不使用 CA 证书,则可能的连接错误

如果客户端实用程序不使用 CA 证书,则工具在使用 TLS 加密时无法验证服务器的证书。因此,到服务器的连接会失败。例如:
  • dsconf
    # dsconf -D "cn=Directory Manager" ldaps://server.example.com:636 config get
    Error: {'desc': "Can't contact LDAP server", 'info': 'error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed (self signed certificate in certificate chain)'}
  • ldapsearch
    # ldapsearch -H ldaps://server.example.com:636 -D "cn=Directory Manager" -W -b "dc=example,dc=com" -x
    Enter LDAP Password: 
    ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)
要在 Red Hat Enterprise Linux 中启用客户端工具来验证目录服务器使用的证书,请将 CA 证书添加到操作系统的信任存储中:
  1. 如果您没有目录服务器使用的 CA 证书的本地副本:
    1. 列出服务器的 NSS 数据库中的证书:
      # certutil -d /etc/dirsrv/slapd-instance_name/ -L
      
      Certificate Nickname                       Trust Attributes
                                                 SSL,S/MIME,JAR/XPI
      
      Example CA                                 C,,  
      Server-Cert                                u,u,u
    2. 使用 NSS 数据库中 CA 证书的别名导出 CA 证书:
      # certutil -d /etc/dirsrv/slapd-instance_name/ -L -n "Example CA" -a > /tmp/ds-ca.crt
  2. 将 CA 证书复制到 /etc/pki/ca-trust/source/anchors/ 目录中。例如:
    # cp /tmp/ds-ca.crt /etc/pki/ca-trust/source/anchors/
  3. 重建 CA 信任数据库:
    # update-ca-trust

9.5. 显示在目录服务器中启用的加密协议

在目录服务器中显示启用的加密协议:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security get
...
sslversionmin: TLS1.2
sslversionmax: TLS1.3
sslVersionMinsslVersionMax 参数控制哪些加密协议版本目录服务器使用。默认 sslVersionMin 取决于您使用的系统范围的加密策略。

9.6. 设置最小 TLS 加密协议版本

默认情况下,Directory 服务器根据系统范围的加密策略自动设置 sslVersionMin 参数。下表提供了 sslVersionMin 目录服务器中基于系统范围的加密策略配置集使用的 TLS 版本概述:

表 9.2. 系统范围的加密策略配置集和最小 TLS 版本概述。

profile 最低 TLS 版本
DEFAULT TLS 1.2
FUTURE TLS 1.2
FIPS TLS 1.2
LEGACY TLS 1.0
有关系统范围的加密策略、如何更改配置集以及不使用系统范围的加密策略的详情,请参阅 RHEL 8 安全强化指南 中的 使用系统范围的加密策略 部分。
或者,您可以手动将 sslVersionMin 设置为高于加密策略配置集中定义的值:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security set --tls-protocol-min="TLS1.3"

9.7. 设置最高 TLS 加密协议版本

要设置最高 TLS 协议版本目录服务器支持,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security set --tls-protocol-max="protocol_version"
如果将参数设为比 sslVersionMin 低的值,那么目录服务器会将 sslVersionMax 设置为与 sslVersionMin 相同的值。
重要
要始终在 sslVersionMax 参数中使用最强支持的加密协议版本,请不要设置此参数。

9.8. 使用硬件安全模块

安全模块充当目录服务器和 TLS 层之间的介质。模块存储用于加密和解密的密钥和证书。定义这些模块的标准是公钥加密标准 (PKCS) #11,因此这些模块是 PKCS#11 模块。
默认情况下,Directory 服务器使用内置安全数据库 key4.dbcert9.db 来存储服务器使用的密钥和证书。
也可以使用外部安全设备存储目录服务器证书和密钥。对于使用外部 PKCS#11 模块的目录服务器,必须在 Directory Server 中安装模块的驱动程序。
如需更多信息,请参阅硬件安全模块的文档。

9.9. 使用基于证书的客户端身份验证

目录服务器支持 LDAP 客户端和服务器到服务器连接(如复制)的基于证书的验证。
根据配置,如果启用了基于证书的身份验证,客户端可以使用证书进行身份验证。验证证书后,服务器会根据证书的 subject 字段中的属性搜索目录中的用户。如果搜索准确返回一个用户条目,Directory 服务器会将此用户用于所有进一步的操作。另外,您可以配置用于身份验证的证书必须与存储在用户的 userCertificate 属性中的可辨识规则(DER)格式证书匹配。
使用基于证书的身份验证的好处:
  • 提高效率。当使用提示一次证书数据库密码的应用程序,然后将该证书用于所有后续绑定或身份验证操作时,它比持续提供绑定 DN 和密码效率更高。
  • 提高了安全性。使用基于证书的身份验证比非证书绑定操作更安全,因为基于证书的身份验证使用公钥加密。绑定凭证无法在网络间截获。如果证书或设备丢失,则无用时没有 PIN,因此第三方会干扰攻击。

9.9.1. 设置基于证书的身份验证

启用基于证书的身份验证:
  1. 启用加密的连接。详情请查看 第 9.4 节 “启用 TLS”
  2. 安装 CA 证书并为客户端和服务器连接设置信任选项。请参阅 第 9.3.2 节 “安装 CA 证书”
  3. 另外,还可验证 是否为 CA 证书设置了客户端和服务器的信任选项:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate get "Example-CA"
    Certificate Name: Example-CA
    Subject DN: CN=server.example.com,ST=Queensland,C=AU
    Issuer DN: CN=server.example.com,,ST=Queensland,C=AU
    Expires: 2021-05-09 10:57:54
    Trust Flags: CT,,
  4. 创建 /etc/dirsrv/slapd-instance_name/certmap.conf 文件,将信息从证书映射到目录服务器用户。例如:
    certmap default         default
    default:DNComps         dc
    default:FilterComps     mail,cn
    default:VerifyCert      on
    
    certmap example         o=Example Inc.,c=US
    example:DNComps
    这将配置为身份验证使用具有 o=Example Inc.,c=US issuer Distinguished Name (DN)的证书的用户,目录服务器不会从证书的主题生成基本 DN,因为 DNComps 参数为此签发者设置为空。另外,FilterCompsVerifyCert 的设置从默认条目继承。
    带有与指定的不同的签发者 DN 证书将使用来自默认条目的设置,并根据证书主题中的 cn 属性生成基本 DN。这可让 Directory 服务器在特定 DN 下启动搜索,而无需搜索整个目录。
    对于所有证书,Directory 服务器使用证书主题中的 mailcn 属性生成搜索过滤器。但是,如果主题中不存在 邮件,Directory 服务器将自动使用主题中的证书的 e 属性的值。
    有关可用参数的详情和描述,请参阅 Red Hat Directory Server Configuration、命令和文件参考 中的 certmap.conf 文件的描述。
  5. 启用客户端身份验证。例如,配置客户端身份验证是可选的:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com security set --tls-client-auth="allowed"
    或者,将 --tls-client-auth 参数设置为 required 来配置该客户端必须使用证书进行身份验证。
  6. 如果您启用了,身份验证证书必须与用户的 userCertificate 属性中存储的证书匹配,在 /etc/dirsrv/slapd-instance_name/certmap.conf 文件中设置 alias_name:VerifyCert on,将证书添加到用户条目中。请参阅 第 9.9.2 节 “向用户添加证书”

9.9.2. 向用户添加证书

设置基于证书的身份验证时,您可以设置用于身份验证的证书必须与用户的 userCertificate binary 属性中存储的证书匹配。如果您启用了这个功能,在 /etc/dirsrv/slapd-instance_name/certmap.conf 文件中设置了 alias_name:VerifyCert on,您必须将受影响用户的证书添加到其目录条目中。
重要
您必须将证书以 Distinguished Encoding Rules (DER)格式存储在 userCertificate 属性中。
将证书存储在用户的 userCertificate 属性中:
  1. 如果证书不是 DER 格式,请将其转换。例如:
    # openssl x509 -in /root/certificate.pem -out /root/certificate.der -outform DER
  2. 将证书添加到用户的 userCertificate 属性中。例如:
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    
    dn: uid=user_name,ou=People,dc=example,dc=com
    changetype: modify
    add: userCertificate
    userCertificate:< file:///root/example.der
有关使用二进制属性的详情,请参考 第 3.1.8 节 “使用 Binary 属性”

9.9.3. 强制 EXTERNAL SASL 机制进行绑定请求

在 TLS 会话开始时,客户端将其证书发送到服务器。然后,它会发送其绑定请求。大多数客户端使用 EXTERNAL SASL 机制发出绑定请求,该机制表示目录服务器需要为绑定使用证书中的身份,而不是绑定请求中的凭据。
但是,如果客户端使用简单的身份验证或匿名凭证,则缺少此信息。在这种情况下,TLS 会话失败并显示无效凭证,即使证书中的证书和客户端身份有效。
要将目录服务器强制客户端使用 EXTERNAL SASL 机制,并忽略请求中的任何其他绑定方法:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-force-sasl-external=on
Successfully replaced "nsslapd-force-sasl-external"

9.9.4. 使用证书进行身份验证

要使用 OpenLDAP 客户端工具,对支持使用证书进行身份验证的目录服务器实例进行身份验证:
  1. 将以下环境变量设置为 CA 证书、用户密钥和用户证书的对应路径。例如:
    LDAPTLS_CACERT=/home/user_name/CA.crt
    LDAPTLS_KEY=/home/user_name/user.key
    LDAPTLS_CERT=/home/user_name/user.crt
    或者,在 ~/.ldaprc 文件中设置 TLS_CACERTTLS_KEYTLS_CERT 参数。详情请查看 ldap.conf(5) man page 中的 TLS OPTIONS 部分。
  2. 连接到服务器。例如:
    # ldapwhoami -H ldaps://server.example.com:636
如果您使用不同的客户端,请参阅相关客户端应用程序的文档了解如何使用基于证书的身份验证进行连接。

9.10. 设置 SASL 身份映射

简单身份验证和安全层 (SASL)是 LDAP 和身份验证方法(如 GSS-API)之间的抽象层,它允许任何与 SASL 交互的协议利用任何可以使用 SASL 的验证机制。简单地说,SASL 是一个中间的,它可让您更轻松地使用不同机制对应用程序进行身份验证。SASL 还可以用于在客户端和服务器之间建立加密的会话。
SASL 框架允许不同的机制向服务器验证用户,具体取决于客户端和服务器应用程序中启用了哪些机制。SASL 也为加密(安全)会话创建一个层。使用 GSS-API,Directory 服务器使用 Kerberos 票据来验证会话和加密数据。

9.10.1. 关于 SASL 身份映射

在处理 SASL 绑定请求时,服务器匹配或映射,用于使用存储在服务器中的 LDAP 条目向目录服务器进行身份验证的 SASL 身份验证 ID。使用 Kerberos 时,SASL 用户 ID 通常格式为 userid@REALM,如 scarter@EXAMPLE.COM。此 ID 必须转换为用户的目录服务器条目的 DN,如 uid=scarter,ou=body,dc=example,dc=com
如果身份验证 ID 与个人的 LDAP 条目明确对应,则可以配置目录服务器,以自动将身份验证 ID 自动映射到条目 DN。目录服务器具有一些预配置的默认映射,它们处理大多数常见配置,并可创建自定义映射。默认情况下,在绑定尝试期间,如果没有启用 SASL 映射回退,则只应用第一个匹配的映射规则。有关 SASL 映射回退的详情,请参阅 第 9.10.4 节 “启用 SASL 映射 Fallback”
务必配置 SASL 映射,以便只有一个映射规则与身份验证字符串匹配。
SASL 映射由容器条目下的条目配置:
dn: cn=sasl,cn=config
objectClass: top
objectClass: nsContainer
cn: sasl
SASL 身份映射条目是此条目的子项:
dn: cn=mapping,cn=sasl,cn=config
objectClass: top
objectClass: nsContainer
cn: mapping
映射条目由以下属性定义:
  • nsSaslMapRegexString :用于映射提供的 authid 元素的正则表达式。
  • nsSaslMapFilterTemplate :应用 nsSaslMapRegexString 元素的模板来创建 DN。
  • nsSaslMapBaseDNTemplate :提供搜索基础或特定条目 DN,以匹配构建的 DN。
  • 可选: nsSaslMapPriority: 设置此 SASL 映射的优先级。如果使用优先级值,如果 cn=config 中启用了 nsslapd-sasl-mapping-fallback。详情请查看 第 9.10.4.1 节 “设置 SASL 映射优先级”
例如:
dn: cn=mymap,cn=mapping,cn=sasl,cn=config
objectclass:top
objectclass:nsSaslMapping
cn: mymap
nsSaslMapRegexString: \(.*\)@\(.*\)\.\(.*\)
nsSaslMapFilterTemplate: (objectclass=inetOrgPerson)
nsSaslMapBaseDNTemplate: uid=\1,ou=people,dc=\2,dc=\3
nsSaslMapRegexString 属性设置形式 \1\2\3 用于绑定 ID 的变量,用于在搜索过程中填充到模板属性的绑定 ID。本例为 ou=People,dc=example,dc=com 子树中的任何用户设置 SASL 身份映射,它们属于 inetOrgPerson 对象类。
当目录服务器收到一个 SASL 绑定请求,mconnors@EXAMPLE.COM 为用户 ID (authid),正则表达式会填充基本 DN 模板,带有 uid=mconnors,ou=people,dc=EXAMPLE,dc=COM 作为用户 ID,并从此进行身份验证。
注意
dc 值不区分大小写,因此 dc=EXAMPLEdc=example 相同。
目录服务器也可以使用更包含的映射方案,例如:
dn: cn=example map,cn=mapping,cn=sasl,cn=config
objectclass: top
objectclass: nsSaslMapping
cn: example map
nsSaslMapRegexString: \(.*\)
nsSaslMapBaseDNTemplate: ou=People,dc=example,dc=com
nsSaslMapFilterTemplate: (cn=\1)
这与任何用户 ID 匹配,并将其映射到 ou=People,dc=example,dc=com 子树下的条目,该子树满足过滤器 cn=userId
通过在 nsSaslMapRegexString 属性中指定域,可以将映射限制为单个域。例如:
dn: cn=example map,cn=mapping,cn=sasl,cn=config
objectclass: top
objectclass: nsSaslMapping
cn: example map
nsSaslMapRegexString: \(.*\)@US.EXAMPLE.COM   
nsSaslMapBaseDNTemplate: ou=People,dc=example,dc=com
nsSaslMapFilterTemplate: (cn=\1)
此映射与之前的映射相同,但它只适用于从 US.EXAMPLE.COM 域验证的用户。(在 第 9.11.2.1 节 “关于主体和 Realms” 中描述了域)。
当服务器连接到另一个服务器时,如在复制或链过程中,的默认映射不会正确映射身份。这是因为,一个服务器的主体(SASL 身份)与进行身份验证的服务器上的主体(SASL 身份)不匹配,因此它与映射条目不匹配。
要允许服务器使用 SASL 进行服务器身份验证,为特定服务器主体创建映射到特定用户条目的映射。例如,此映射将 ldap1.example.com 服务器与 cn=replication 管理器cn=config 条目匹配。映射条目本身是在第二个服务器上创建的,如 ldap2.example.com
dn: cn=z,cn=mapping,cn=sasl,cn=config
objectclass: top
objectclass: nsSaslMapping
cn: z
nsSaslMapRegexString: ldap/ldap1.example.com@EXAMPLE.COM
nsSaslMapBaseDNTemplate: cn=replication manager,cn=config
nsSaslMapFilterTemplate: (objectclass=*)
有时,域名称不包含在 SASL GSS-API 配置中的主体名称中。可以创建与第一个映射相同的第二个映射,只需在主体名称中指定域。例如:
dn: cn=y,cn=mapping,cn=sasl,cn=config
objectclass: top
objectclass: nsSaslMapping
cn: y
nsSaslMapRegexString: ldap/ldap1.example.com
nsSaslMapBaseDNTemplate: cn=replication manager,cn=config
nsSaslMapFilterTemplate: (objectclass=*)
由于未指定 realm,因此第二个映射更为通用(表示,它可能与第一个条目匹配更多条目)。最佳实践是首先通过更常规映射处理更具体的映射和逐步进度。
如果没有使用 nsSaslMapPriority 参数为 SASL 映射设置优先级,则无法指定处理映射的顺序。但是,可以控制如何处理 SASL 映射:名称。目录服务器以反向 ASCII 顺序处理 SASL 映射。在过去两个示例中,首先处理 cn=z 映射(第一个示例)。如果没有匹配项,服务器会处理 cn=y 映射(第二个示例)。
注意
在静默安装过程中创建实例时,可以添加 SASL 映射,方法是在 LDIF 文件中指定映射并使用 ConfigFile 指令添加 LDIF 文件。安装指南 中描述了使用静默安装。

9.10.2. 目录服务器的默认 SASL 映射

目录服务器具有预定义的 SASL 映射规则,用于处理一些最常见的用法。

Kerberos UID 映射

这匹配使用两个部分域的 Kerberos 主体,如用户@example.com。然后 realm 用于定义搜索基础,并且用户 ID (authid)定义过滤器。搜索基础为 dc=example,dc=com,以及 (uid=user) 的过滤器。

dn: cn=Kerberos uid mapping,cn=mapping,cn=sasl,cn=config
objectClass: top
objectClass: nsSaslMapping
cn: Kerberos uid mapping
nsSaslMapRegexString: \(.*\)@\(.*\)\.\(.*\)
nsSaslMapBaseDNTemplate: dc=\2,dc=\3
nsSaslMapFilterTemplate: (uid=\1)

RFC 2829 DN Syntax

此映射与作为有效 DN (在 RFC 2829 中定义)的 authid 匹配,前缀为 dn:authid 直接映射到指定的 DN。

dn: cn=rfc 2829 dn syntax,cn=mapping,cn=sasl,cn=config
objectClass: top
objectClass: nsSaslMapping
cn: rfc 2829 dn syntax
nsSaslMapRegexString: ^dn:\(.*\)
nsSaslMapBaseDNTemplate: \1
nsSaslMapFilterTemplate: (objectclass=*)

RFC 2829 U Syntax

映射会匹配 UID 前缀为 u:authid 。前缀后指定的值定义了 (uid=value) 的过滤器。搜索基础被硬编码为 默认用户Root 数据库的后缀。

dn: cn=rfc 2829 u syntax,cn=mapping,cn=sasl,cn=config
objectClass: top
objectClass: nsSaslMapping
cn: rfc 2829 u syntax
nsSaslMapRegexString: ^u:\(.*\)
nsSaslMapBaseDNTemplate: dc=example,dc=com
nsSaslMapFilterTemplate: (uid=\1)

UID 映射

此映射与 authid 匹配,这是不匹配其他默认映射规则的普通字符串。它使用这个值来定义 (uid=value) 的过滤器。搜索基础被硬编码为 默认用户Root 数据库的后缀。

dn: cn=uid mapping,cn=mapping,cn=sasl,cn=config
objectClass: top
objectClass: nsSaslMapping
cn: uid mapping
nsSaslMapRegexString: ^[^:@]+$
nsSaslMapBaseDNTemplate: dc=example,dc=com
nsSaslMapFilterTemplate: (uid=&)

9.10.3. 配置 SASL 身份映射

(简单身份验证和安全层)SASL 身份映射可以从 Directory 服务器或命令行进行配置。要使 SASL 身份映射可用于 SASL 身份验证,映射必须返回一个,且只能返回匹配的条目,并且必须在主机上配置 Kerberos 条目。

9.10.3.1. 使用命令行配置 SASL 身份映射

要从命令行配置 SASL 身份映射,请使用 dsconf 工具来添加身份映射方案。
  1. 添加身份映射方案。例如:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com sasl create --cn "example_map" --nsSaslMapRegexString "\(.*\)" --nsSaslMapBaseDNTemplate "ou=People,dc=example,dc=com" --nsSaslMapFilterTemplate "(cn=\1)" --nsSaslMapPriority 50
    Successfully created example_map
    这与任何用户的通用名称匹配,并根据过滤器 cn=userId 将其映射到带有 base ou=People,dc=example,dc=com 的子树搜索结果。
  2. 重启实例:
    # dsctl instance_name restart
注意
使用 dsconf 添加 SASL 映射会添加到列表末尾的映射,而不考虑其 ASCII 顺序。

9.10.3.2. 使用 Web 控制台配置 SASL 身份映射

添加 SASL 身份映射方案:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings 菜单,然后选择 SASL Settings & Mappings
  4. 单击 Create New Mapping
  5. 填写表单。例如:
  6. 点击 Save

9.10.4. 启用 SASL 映射 Fallback

使用默认设置,Directory 服务器只验证第一个匹配的 SASL 映射。如果这个第一个匹配映射失败,绑定操作会失败,且不会验证进一步匹配的映射。
但是,您可以通过启用 nsslapd-sasl-mapping-fallback 参数,将目录服务器配置为验证所有匹配的映射:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-sasl-mapping-fallback=on
Successfully replaced "nsslapd-sasl-mapping-fallback"
如果启用了回退,且只返回一个用户身份,绑定会成功。如果没有用户,或者返回多个用户,绑定会失败。

9.10.4.1. 设置 SASL 映射优先级

如果您使用 nsslapd-sasl-mapping-fallback 属性启用了 SASL 映射回退,您可以选择在映射配置中设置 nsSaslMapPriority 属性来优先排序它们。nsSaslMapPriority 属性支持从 1 (最高优先级) 到 100 (最低优先级) 的值。默认值为 100
例如,要为 cn=Kerberos uid mapping,cn=mapping,cn=sasl,cn=config 映射设置最高优先级:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: cn=Kerberos uid mapping,cn=mapping,cn=sasl,cn=config
changetype: modify
replace: nsSaslMapPriority
nsSaslMapPriority: 1

9.11. 使用带有 SASL 的 Kerberos GSS-API

必须在主机上部署 Kerberos v5,以便目录服务器使用 GSS-API 机制进行 SASL 身份验证。必须安装在目录服务器主机上安装 GSS-API 和 Kerberos 客户端库,才能利用 Kerberos 服务。

9.11.1. 目录服务器中 SASL 的身份验证机制

目录服务器支持以下 SASL 加密机制:
  • PLAIN。PLAIN 为简单基于密码的身份验证发送明文密码。
  • EXTERNAL。与 TLS 一样,EXTERNAL 会执行基于证书的身份验证。此方法使用公钥进行强大的身份验证。
  • CRAM-MD5.CRAM-MD5 是一种弱的、简单的质询响应身份验证方法。它不会建立任何安全层。
    警告
    红帽建议不要使用不安全的 CRAM-MD5 机制。
  • DIGEST-MD5。DIGEST-MD5 是 LDAPv3 服务器的弱身份验证方法。
    警告
    红帽建议不要使用不安全的 DIGGEST-MD5 机制。
  • 通用安全服务(GSS-API)。通用安全服务(GSS)是一种安全 API,这是基于 UNIX 的操作系统访问和验证 Kerberos 服务的本地方法。GSS-API 还支持会话加密,类似于 TLS。这允许 LDAP 客户端使用 Kerberos 版本 5 凭证(ticket)并使用网络会话加密与服务器进行身份验证。
    要使目录服务器使用 GSS-API,必须在主机上配置 Kerberos。请参阅 第 9.11 节 “使用带有 SASL 的 Kerberos GSS-API”
    注意
    因此,只有具有 GSS-API 支持的平台上支持 Kerberos-API。要使用 GSS-API,可能需要安装 Kerberos 客户端库;任何所需的 Kerberos 库都通过操作系统厂商提供。

9.11.2. 关于目录服务器中的 Kerberos

在 Red Hat Enterprise Linux 上,支持的 Kerberos 库是 MIT Kerberos 版本 5。
Kerberos 的概念以及使用和配置 Kerberos 的信息包括在 MIT Kerberos 网站 http://web.mit.edu/Kerberos/ 中。

9.11.2.1. 关于主体和 Realms

主体 是 Kerberos 环境中的用户或服务。 定义了 Kerberos 在谁可以访问什么情况下管理什么。您要访问的客户端、KDC 以及您要访问的主机或服务必须使用相同的域。
注意
Kerberos 域仅支持 GSS-API 身份验证和加密,不支持 DIGEST-MD5。
服务器使用域以以下格式关联客户端的 DN,类似于 LDAP DN:
uid=user_name/[server_instance],cn=realm,cn=mechanism,cn=auth
例如,example.com 的工程 领域中的 Mike Connors 使用以下关联来访问美国域中的服务器:
uid=mconnors/cn=Europe.example.com,cn=engineering,cn=gssapi,cn=auth
Babara Jensen 从 US.example.com计数 域中,不必在访问本地服务器时指定域:
uid=bjensen,cn=accounting,cn=gssapi,cn=auth
如果机制支持 realm,并且默认域不用于向服务器进行身份验证,则必须在 Kerberos 主体中指定 。否则,可以省略 realm。
注意
Kerberos 系统将 Kerberos 域视为默认域;其他系统默认为服务器。

9.11.2.2. 关于 KDC 服务器和密钥选项卡

密钥分发中心(KDC)验证用户和签发 Ticket Granting Tickets (TGT)。这可让用户使用 GSS-API 向目录服务器进行身份验证。为了响应 Kerberos 操作,目录服务器需要访问其 keytab 文件。keytab 包含目录服务器用来向其他服务器进行身份验证的加密密钥。
目录服务器使用 Kerberos 主体中的 ldap 服务名称。例如:
ldap/server.example.com@EXAMPLE.COM
有关创建 keytab 的详情,请查看您的 Kerberos 文档。
注意
您必须为目录服务器 Kerberos 主体创建一个简单验证和安全层(SASL)映射,该主体映射到现有条目可辨识名称(DN)。

9.11.3. 在目录服务器启动中配置 SASL 身份验证

必须在目录服务器中激活 SASL GSS-API 身份验证,以便 Kerberos 票据可用于身份验证。这可以通过为初始化脚本提供系统配置文件,以标识变量来设置 keytab 文件位置。当初始化脚本在 Directory 服务器启动时运行时,SASL 身份验证将立即激活。
默认 SASL 配置存储在 /etc/sysconfig/dirsrv 文件中。
如果有多个目录服务器实例,且并非所有目录服务器都使用 SASL 身份验证,那么可以在名为 dirsrv-instance/etc/sysconfig/ 目录中创建特定于实例的配置文件。例如,dirsrv-example。如果主机上只有一个实例,则可以使用默认 dirsrv 文件。
要启用 SASL 身份验证,请取消注释 /etc/sysconfig/dirsrv (或特定于实例)文件中的 KRB5_KTNAME 行,并为 KRB5_KTNAME 变量设置 keytab 位置。例如:
# In order to use SASL/GSSAPI the directory
# server needs to know where to find its keytab
# file - uncomment the following line and set
# the path and filename appropriately
KRB5_KTNAME=/etc/dirsrv/krb5.keytab

9.12. 设置 SASL 机制

默认情况下,Directory 服务器启用了简单身份验证和安全层(SASL)库支持的所有机制。它们列在 root dse supportedSASLMechanisms 参数中。要启用特定的 SASL 机制,请在 cn=config 条目中设置 nsslapd-allowed-sasl-mechanisms 属性。例如,要只启用 GSSAPIDIGEST-MD5 机制,请运行:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-allowed-sasl-mechanisms="GSSAPI, DIGEST-MD5"
Successfully replaced "nsslapd-allowed-sasl-mechanisms"
注意
即使 EXTERNAL 没有列在 nsslapd-allowed-sasl-mechanisms 参数中,也始终启用此机制。

9.13. 使用带有 LDAP 客户端的 SASL

要将 SASL 与 LDAP 客户端(如 ldapsearch )搭配使用,请将 -Y SASL_mechanism 传给命令。例如:
  • 通过 LDAP 协议使用 GSSAPI SASL 机制:
    # ldapsearch -Y GSSAPI -U "dn:uid=user_name,ou=people,dc=example,dc=com" -R EXAMPLE.COM -H ldap://server.example.com -b "dc=example,dc=com"
  • 通过 LDAPS 协议使用 PLAIN SASL 机制:
    # ldapsearch -Y PLAIN -D "uid=user_name,ou=people,dc=example,dc=com" -W -H ldaps://server.example.com -b "dc=example,dc=com"
注意
目录服务器不支持 SASL 代理授权。因此,Directory 服务器会忽略客户端提供的任何 SASL authzid 值。

第 10 章 配置属性加密

目录服务器提供多种机制来保护对敏感数据的访问,如访问控制规则,以防止未授权用户读取条目或 TLS 中的某些条目或属性,以防止数据对不可信网络造成破坏和篡改。但是,如果服务器的数据库文件的副本应属于未经授权的人员的实践,则它们可能会从这些文件中提取敏感信息。由于数据库中的信息以纯文本形式存储,因此某些敏感信息(如政府标识号或密码)可能无法受到标准访问控制措施的保护。
对于高敏感信息,由于信息丢失的可能性可能会带来显著的安全风险。为了删除该安全风险,目录服务器允许加密其部分数据库。加密后,即使攻击者有服务器数据库文件的副本,数据也会安全。
数据库加密允许在数据库中加密属性。加密和加密密码都可以为每个后端配置每个属性。配置后,特定属性的每个实例(甚至索引数据)都会加密存储在该数据库中的每个条目。
属性加密的额外优点是,加密值只能发送到大于 1 的安全统计信息(SSF)的客户端。
注意
加密数据有一个例外:用作条目的 RDN 的任何值都不会在条目 DN 中加密。例如,如果 uid 属性是加密的,则该值会在条目中加密,但显示在 DN 中:
dn: uid=jsmith1234,ou=People,dc=example,dc=com
...
uid:: Sf04P9nJWGU1qiW9JJCGRg==
这将允许某人发现加密值。
条目 DN 中使用的任何属性无法有效地加密,因为它将始终显示在 DN 中。请注意,哪些属性用于构建 DN,并相应地设计属性加密模型。
索引的属性可能会被加密,属性加密与 eqpres 索引完全兼容。通常从属性值派生的索引文件的内容也会加密,以防止攻击者恢复部分或所有加密数据来分析索引。
由于服务器在查找加密属性的索引前重新加密所有索引密钥,因此对于使用加密索引的搜索,对服务器性能有一些影响,但其效果不足,它不再需要使用索引。

10.1. 加密密钥

要使用属性加密,必须为 TLS 配置服务器并启用 TLS,因为属性加密使用服务器的 TLS 加密密钥以及与 TLS 相同的 PIN 输入法。PIN 必须在服务器启动时手动输入,或者必须使用 PIN 文件。
随机生成的对称密钥用于加密和解密属性数据。每个配置的密码都使用单独的密钥。这些密钥使用服务器的 TLS 证书的公钥 嵌套,生成的嵌套密钥存储在服务器的配置文件中。属性加密的有效强度不超过用于嵌套的服务器 TLS 密钥的强度。如果没有访问服务器的私钥,无法从嵌套的副本恢复对称密钥。
警告
没有机制来恢复丢失的密钥。因此,安全地备份服务器的证书数据库非常重要。如果服务器证书丢失,则无法解密存储在其数据库中的任何加密数据。
警告
如果 TLS 证书即将过期且需要续订,请在续订前导出加密的后端实例。更新证书,然后重新导入导出的 LDIF 文件。

10.2. 加密加密

加密密码可根据每个属性进行配置,且必须在为属性启用加密时选择。
支持以下密码:
  • 高级加密标准(AES)
  • 三数据加密标准(3DES)
注意
为了进行强大的加密,红帽建议只使用 AES 密码。
所有密码都以 Cipher Block Chaining 模式使用。
设定加密密码后,不应在不导出和重新导入数据的情况下更改它。

10.3. 配置属性加密

使用命令行或 Web 控制台为特定属性启用和禁用属性加密。

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

要配置目录服务器,例如,在 userRoot 数据库 AES 加密中的 telephoneNumber 属性:
  1. 另外,要加密现有的 telephoneNumber 属性,请导出数据库。请参阅 第 10.4.1 节 “导出加密的数据库”
  2. userRoot 数据库中的 telephoneNumber 属性启用 AES 加密:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend attr-encrypt --add-attr telephoneNumber userRoot
  3. 如果您导出数据库来加密现有属性,请重新导入数据库。请参阅 第 10.4.2 节 “将 LDIF 文件导入到加密的数据库中”

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

要配置目录服务器在数据库 AES 加密中存储 telephoneNumber 属性:
  1. 另外,要加密现有的 telephoneNumber 属性,请导出数据库。请参阅 第 10.4.1 节 “导出加密的数据库”
  2. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  3. 选择实例。
  4. 打开 Database 菜单。
  5. 选择后缀条目。
  6. 打开 Encrypted Attributes 选项卡。
  7. 输入要加密的属性的名称。
  8. 单击 Add Attribute
  9. 如果您导出数据库来加密现有属性,请重新导入数据库。请参阅 第 10.4.2 节 “将 LDIF 文件导入到加密的数据库中”

10.3.3. 使用命令行为属性禁用加密

要配置目录服务器不再存储,例如,在 userRoot 数据库中加密的 telephoneNumber 属性:
  1. (可选)要解密现有的 telephoneNumber 属性,请导出数据库。请参阅 第 10.4.1 节 “导出加密的数据库”
  2. userRoot 数据库中的 telephoneNumber 属性禁用加密:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend attr-encrypt --del-attr telephoneNumber userRoot
  3. 如果您导出数据库来解密现有属性,请重新导入数据库。请参阅 第 10.4.2 节 “将 LDIF 文件导入到加密的数据库中”

10.3.4. 使用 Web 控制台禁用属性加密

要配置目录服务器在数据库 AES 加密中存储 telephoneNumber 属性:
  1. 另外,要加密现有的 telephoneNumber 属性,请导出数据库。请参阅 第 10.4.1 节 “导出加密的数据库”
  2. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  3. 选择实例。
  4. 打开 Database 菜单。
  5. 选择后缀条目。
  6. 打开 Encrypted Attributes 选项卡。
  7. 单击 telephoneNumber 属性右侧的 Delete Attribute 按钮。
  8. 单击 Yes 以确认。
  9. 如果您导出数据库来解密现有属性,请重新导入数据库。请参阅 第 10.4.2 节 “将 LDIF 文件导入到加密的数据库中”

10.3.5. 启用属性加密后的常规注意事项

当您为已在数据库中的数据启用加密:
  • 未加密的数据可以保留在服务器的数据库页面池后备文件中。删除这个数据:
    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)中的数据是未加密的,可以临时存储在交换分区中。要保护这些数据,请设置加密的交换空间。
重要
即使删除了包含未加密的数据的文件,在某些情况下也可以恢复这些数据。

10.4. 导出和导入加密的数据库

导出和导入加密数据库与导出和导入常规数据库类似。但是,当您导出数据并在将数据重新导入到数据库时,必须解密加密的信息。

10.4.1. 导出加密的数据库

要从加密数据库导出数据,请将 -E 参数传给 dsconf 命令。
例如,使用解密的属性导出完整的 用户Root 数据库:
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend export -E userRoot
或者,您只能导出特定的子树。例如,要导出 ou=People,dc=example,dc=com 条目中的所有数据:
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend export -E -s "ou=People,dc=example,dc=com" userRoot
有关使用 dsconf 导出数据的详情,请参考 第 6.2.1.1.1 节 “使用 dsconf backend export 命令导出数据库”

10.4.2. 将 LDIF 文件导入到加密的数据库中

在启用属性加密时将数据导入到数据库:
  1. 停止 Directory 服务器实例:
    # dsctl instance_name stop
  2. 如果您在上次导出和此导入之间替换了证书数据库,请编辑 /etc/dirsrv/slapd-instance_name/dse.ldif 文件,并删除以下条目,包括其属性:
    • cn=AES,cn=encrypted 属性 key,cn=database_name,cn=ldbm database,cn=plugins,cn=config
    • cn=3DES,cn=encrypted attribute keys,cn=database_name,cn=ldbm database,cn=plugins,cn=config
    重要
    删除所有数据库的条目。如果包含 nsSymmetricKey 属性的任何条目保留在 /etc/dirsrv/slapd-instance_name/dse.ldif 文件中,则目录服务器将无法启动。
  3. 导入 LDIF 文件。例如,要将 /tmp/example.ldif 导入到 用户Root 数据库中:
    # dsctl instance_name ldif2db --encrypted userRoot /tmp/example.ldif
    --encrypted 参数可让脚本加密在导入过程中为加密配置的属性。
  4. 启动实例:
    # dsctl instance_name start

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

属性加密基于 TLS 证书。要防止在续订或替换 TLS 证书后防止该属性加密失败:
  1. 使用解密的属性导出数据库。请参阅 第 10.4.1 节 “导出加密的数据库”
  2. 创建新的证书签名请求(CSR)。请参阅 第 9.3.1 节 “创建证书签名请求”
  3. 安装新证书。请参阅 第 9.3.4 节 “安装服务器证书”
  4. 停止 Directory 服务器实例:
    # dsctl instance_name stop
  5. 编辑 /etc/dirsrv/slapd-instance_name/dse.ldif 文件并删除以下条目,包括其属性:
    • cn=AES,cn=encrypted 属性 key,cn=database_name,cn=ldbm database,cn=plugins,cn=config
    • cn=3DES,cn=encrypted attribute keys,cn=database_name,cn=ldbm database,cn=plugins,cn=config
    重要
    删除所有数据库的条目。如果包含 nsSymmetricKey 属性的任何条目保留在 /etc/dirsrv/slapd-instance_name/dse.ldif 文件中,则目录服务器将无法启动。
  6. 启动实例:
    # dsctl instance_name start

第 11 章 管理 FIPS 模式支持

Red Hat Directory Server 完全支持联邦信息处理标准(FIPS) 140-2。当目录服务器以 FIPS 模式运行时,与安全性相关的设置会改变。例如,SSL 会自动禁用,仅使用 TLS 1.2 和 1.3 加密。
有关 FIPS 的常规详情,请参阅 Red Hat Enterprise Linux 8 安全强化文档中的联邦信息处理标准(FIPS)

启用 FIPS 模式支持

为目录服务器启用 FIPS 模式支持:
  1. 另外,还可在 Red Hat Enterprise Linux 中启用 FIPS 模式。详情请查看 Red Hat Enterprise Linux 8 安全强化文档中的相应部分
  2. 为网络安全服务(NSS)数据库启用 FIPS 模式:
    # modutil -dbdir /etc/dirsrv/slapd-instance_name/ -fips true
  3. 重启 Directory 服务器实例:
    # dsctl instance_name restart

禁用 FIPS 模式支持

为目录服务器禁用 FIPS 模式支持:
  1. 为网络安全服务(NSS)数据库禁用 FIPS 模式:
    # modutil -dbdir /etc/dirsrv/slapd-instance_name/ -fips false
  2. 重启 Directory 服务器实例:
    # dsctl instance_name restart

第 12 章 管理目录架构

Red Hat Directory Server 附带了一个标准的模式,其中包括数百个对象类和属性。虽然标准对象类和属性应当满足大多数部署的要求,但可能需要扩展特定目录数据的模式。通过创建新对象类和属性来扩展架构。
Red Hat Directory Server 11 Configuration, Command, and File Reference 是大多数标准目录服务器属性和对象类的引用,包含允许和所需属性的信息,对象类采用哪个属性,以及 OID 和值信息。这是识别目录的有用模式元素的良好资源,并确定需要创建哪些自定义架构。

12.1. 架构概述

目录架构是一组规则,用于定义如何将数据存储在目录中。目录信息存储分散条目,每个条目由一组属性及其值组成。条目中描述的身份种类在条目的对象类中定义。对象类指定条目通过对象类定义的属性集合描述的对象类型。
在 LDAP 中,对象类定义可用于定义条目的属性集合。LDAP 标准为许多常用条目提供对象类,包括人员、组、位置、机构以及设备。身份在包含属性及其值的目录条目中描述,对名为 attribute-value assertions 或 AVAs。目录中的任何信息都与描述性属性关联。目录服务器配置的其他方面(包括匹配的规则和 LDAP 控制)也在架构中定义。所有这些组合在以前成为 schema 元素
每个 schema 元素都由一个唯一、以点分开的数字来标识。这称为 对象标识符OID

12.1.1. 默认架构文件

目录服务器的 schema 在几个不同的架构文件中定义(LDIF 文件,它们定义 schema 元素。目录服务器模式文件位于 /usr/share/dirsrv/schema/ 目录中。此目录中的文件用作新目录服务器实例的模板。在此目录中添加新架构,使其可供任何新实例使用。
目录服务器用于执行操作和管理条目的属性介绍了红帽目录服务器 11 配置、命令和文件参考 中的其他配置设置。

12.1.2. 对象类

在 LDAP 中,对象类定义可用于定义条目的属性集合。LDAP 标准为许多常用条目提供对象类,例如人员 (personinetOrgPerson),组 (groupOfNames), 位置 (locality), 机构和部门 (organizationorganizationalUnit), 以及设备 (device)。
在 schema 文件中,对象类由 对象类 行标识,后跟其 OID、名称、描述、其直接高级对象类(需要与对象类一起使用的对象类),并在此对象类共享其属性,以及允许(MUST)属性以及允许(MAY)属性。

例 12.1. 人员对象类条目

objectClasses: ( 2.5.6.6 NAME 'person' DESC 'Standard LDAP objectclass' SUP top MUST ( sn $ cn ) MAY ( description $ seeAlso $ telephoneNumber $ userPassword ) X-ORIGIN 'RFC 4519' )
每个对象类定义了多个所需的属性(schema 中的MUST 关键字),以及允许的属性(schema 中的MAY 关键字)。使用指定对象类的条目中必须存在所需的属性,而允许的属性可以感知且可供使用,但不需要该条目有效。
例 12.1 “人员对象类条目” 一样,person 对象类需要 cnsnobjectClass 属性,并允许 description,seeAlso,telephoneNumber, 和 userPassword 属性。
除了自己的必需和允许的属性外,对象类也可以继承另一类的属性。第二个对象类是第一个 对象类 的首选或 对象类。
例如,用户的条目必须具有 inetOrgPerson 对象类。在这种情况下,该条目还必须包括用于 inetOrgPerson, organizationalPerson 的超级对象类,以及用于 organizationalPerson 的超级对象类 person
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
对象类定义是 cn=schema 条目的 对象类 属性。objectclasses 属性的格式如下:
objectclasses: ( definition )
对象类定义包含多个组件:
  • OID,通常是以点分开的数字
  • 唯一名称,格式为 NAME name
  • 描述,格式为 DESC 描述
  • 此对象类的正式或父对象类,格式为 SUP object_class; 如果没有相关的父项,请使用 SUP top
  • AUXILIARY 一词,它提供了对象类应用到的条目的类型; UXILILIARY 表示它可以应用到任何条目
  • MUST; 之前包括所需属性的列表,若要包含多个属性,用括号括起组,并使用带有符号($)的属性分隔。
  • 允许的属性列表,前面带有 MAY; 以包含多个属性,用括号括起组,并使用符号($)分隔属性。
在使用命令行或 Web 控制台修改 cn=schema 条目时,客户对象类定义存储在 /etc/dirsrv/slapd-instance_name/schema/99user.ldif 中。

12.1.3. 属性

目录条目由属性及其值组成。这些对称为 attribute-value assertions 或 AVAs。目录中的任何信息都与描述性属性关联。例如,cn 属性用于存储个人的完整名称,如 cn: John Smith
其它属性可以提供有关 John Smith 的更多信息:
givenname: John
surname: Smith
mail: jsmith@example.com
在 schema 文件中,会通过以下方法描述属性:
  • OID
  • name
  • 语法匹配规则(可选)
  • 子字符串匹配规则(可选)
  • 排序规则(可选)
  • 描述(可选)
  • 语法
  • 单值或多值属性
  • 有关定义属性的位置的详情

例 12.2. uid 属性架构条目

( 0.9.2342.19200300.100.1.1 NAME ( 'uid' 'userid' ) EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )

12.1.3.1. 目录服务器属性语法

属性的语法定义属性允许的值的格式;与其他架构元素一样,语法会使用架构文件条目中的语法为属性定义。
目录服务器使用属性的语法对条目执行排序和模式匹配。
有关 LDAP 属性语法的更多信息,请参阅 RFC 4517
支持的 LDAP 属性语法包括在 Red Hat Directory Server 10 Configuration, Command, and File Reference 中的 Directory Server Attribute Syntaxes 部分。

12.1.4. 扩展架构

可将新的自定义属性和对象类添加到目录服务器实例中来扩展架构,并可以通过多种方式添加 schema 元素。使用 LDAP 工具向实例的默认自定义模式文件添加 schema 元素 99user.ldif。也可以创建新的独立架构文件,并将其包含在默认架构文件中。
添加新架构元素需要三项:
  1. 为新架构规划和定义 OID。服务器 OID 可以识别架构元素,因此 OID 是唯一的和组织非常重要。目录服务器本身不管理 OID,但 第 12.2 节 “管理对象标识符” 中描述了一些最佳实践。
  2. 创建新属性。属性定义需要名称、语法(允许的值格式)、OID 以及每个条目是否可以使用属性的描述。
  3. 创建一个对象类以包含新属性。对象类列出了该条目 type 和允许(可能)属性所需的属性。由于默认架构不应更改,如果创建了任何新属性,则应将它们添加到自定义对象类中。
应提前规划 schema 元素;请勿将多个属性用于相同的信息。尽可能使用标准目录服务器模式。目录服务器在默认架构文件中定义了数百个属性和对象类。红帽目录服务器 11 配置、命令和文件参考 列表并描述了标准属性和对象类;所有架构都可以在 /usr/share/dirsrv/schema/ 中的 schema 文件中查看。熟悉可用的模式;然后规划缺少哪些信息属性,以及如何用自定义属性填充这些差距。部署指南 中涵盖了规划架构。
警告
目录服务器中的默认对象类和属性基于 LDAP 和 X.500 标准和 RFC。使用标准架构使目录服务器更容易与其他应用程序和服务器集成,并允许与 LDAP 客户端、旧目录服务器实例和将来的发行版本互操作性。您无法编辑标准属性或更改对象类。
在自定义目录服务器模式时请记住以下规则:
  • 使架构尽可能简单。
  • 尽可能重复使用现有架构元素。
  • 尽可能减少为每个对象类定义的必要属性数量。
  • 不要为相同的目的定义多个对象类或属性。
  • 不要修改属性或对象类的任何现有定义。
注意
永不 删除或替换标准模式。这样做可能会导致与其他目录或其他 LDAP 客户端应用程序兼容性。
实例启动时,模式会加载到目录服务器实例中;任何新的架构文件都不会加载,直到 Directory 服务器重启或启动重新加载任务为止。实例的默认自定义模式文件 99user.ldif 作为最后一个模式文件加载。如果它包含标准架构文件中已存在的定义,则自定义定义将覆盖标准。

12.1.5. 模式复制

当目录架构在 cn=schema 子树中更新时,Directory 服务器会将更改存储在本地 /etc/dirsrv/slapd-instance_name/schema/99user.ldif 文件中,包括更改状态号(CSN)。更新的模式不会自动复制到其他副本。在复制树中更新目录的内容时,模式复制将开始。例如,如果您在修改 schema 后更新用户或组条目,供应商会将存储在 nsSchemaCSN 属性中的 CSN 与消费者上的 CSN 进行比较。如果远程 CSN 低于供应商中的一个,则 schema 将复制到消费者中。要成功复制,供应商上的所有对象类和属性类型都必须是消费者定义的超集。

例 12.3. 模式子集和超集

  • server1 上,demo 对象类允许 a1、 a2a3 属性。
  • server2 上,demo 对象类允许 a1a3 属性。
例 12.3 “模式子集和超集” 中,server1demo 对象类的 schema 定义是 server2 上对象类的超集。在验证阶段,当复制或接受架构时,Directory 服务器会检索超级用户定义。例如,如果消费者检测到本地模式中的对象类允许比供应商模式中的对象类少属性,则更新本地架构。
如果成功复制架构定义,nsSchemaCSN 属性在两个服务器上都相同,且在复制会话开始时不再比较。
在以下情况下,schema 没有复制:
  • 一个主机上的 schema 是另一主机的 schema 的子集。
    例如,在 例 12.3 “模式子集和超集” 中,server2 上的 demo 对象类的架构定义是 server1 上对象类的子集。属性也可以发生子集(单值属性是多值属性的子集),属性语法(IA5Octet_string的子集)。
  • 当供应商模式和消费者模式中的定义需要合并时。
    目录服务器不支持合并模式。例如,如果在一个服务器上的一个对象类允许 a1, a2, 和 a3 属性,在其他服务器上允许 a1, a3, 和 a4,schemas 不是子集且不能合并。
  • /etc/dirsrv/slapd-instance_name/schema/99user.ldif 以外的 Schema 文件被使用。
    目录服务器允许您在 /etc/dirsrv/slapd-instance_name/schema/ 目录中添加额外的模式文件。但是,只有 99user.ldif 文件中的 CSN 被更新。因此,其他架构文件仅在本地使用,不会自动传送到复制合作伙伴。手动将更新的模式文件复制到消费者并重新载入 schema。详情请查看 第 12.10 节 “动态重新加载架构”
    为了避免重复的架构定义并启用自动复制,请将所有自定义模式存储在 /etc/dirsrv/slapd-instance_name/schema/99user.ldif 文件中。有关创建自定义模式文件的详情,请参考 第 12.9 节 “创建自定义架构文件”

12.2. 管理对象标识符

每个 LDAP 对象类或属性都必须分配一个唯一的名称和 对象标识符 (OID)。OID 是一个以点分开的数字,用于标识服务器的 schema 元素。OID 可以分层,使用可扩展的基本 OID 来容纳不同的分支。例如,基本 OID 可以是 1,并且对于 1.1 的属性和 1.2 的对象类可以有分支。
注意
不需要有一个数字 OID 来创建自定义模式,但红帽强烈建议您它以更好地转发兼容性和性能。
OID 通过互联网编号授权机构(IANA)分配给机构,目录服务器不提供获取 OID 的机制。若要获取有关获取 OID 的信息,请访问 IANA 网站 http://www.iana.org/cgi-bin/enterprise.pl
从 IANA 获取基本 OID 后,规划如何将 OID 分配给自定义 schema 元素。为属性和对象类定义分支;还可对匹配规则和 LDAP 控制进行分支。
定义 OID 分支后,创建一个 OID registry 来跟踪 OID 分配。OID registry 是一个列表,提供目录 schema 中使用的 OID 和描述。这样可确保没有 OID 用于多个目的。使用自定义 schema 发布 OID registry。

12.3. 创建对象类

本节论述了如何使用命令行和 Web 控制台创建对象类。

12.3.1. 使用命令行创建对象类

使用 ldapmodify 工具来创建新的对象类条目。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com schema objectclasses add examplePerson --oid="2.16.840.1133730.2.123" --desc="Example Person Object Class" --sup="inetOrgPerson" --kind="AUXILIARY" --must="cn" --may exampleDateOfBirth examplePreferredOS
有关对象类定义的详情,请参考 第 12.1.2 节 “对象类”

12.3.2. 使用 Web 控制台创建对象类

使用 Web 控制台创建对象类:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 选择 SchemaObjectclasses
  4. Add ObjectClass
  5. 选择父对象类。
  6. 输入对象类名称,并选择性地设置对象标识符(OID)。
  7. 选择对象类类型。
  8. 在对应字段中输入所需的和允许的属性:
  9. 点击 Add

12.4. 更新对象类

本节论述了如何使用命令行和 Web 控制台更新对象类。

12.4.1. 使用命令行更新对象类

使用 dsconf 实用程序更新对象类条目。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com schema objectclasses replace examplePerson --oid="2.16.840.1133730.2.123" --desc="Example Person Object Class" --sup="inetOrgPerson" --kind="AUXILIARY" --must="cn" --may exampleDisplayName exampleAlias
有关对象类定义的详情,请参考 第 12.1.2 节 “对象类”

12.4.2. 使用 Web 控制台更新对象类

使用 Web 控制台更新对象类:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 选择 SchemaObjectclasses
  4. 单击您要编辑的对象类条目右侧的 Choose Action 按钮。
  5. 选择 Edit Object Class
  6. 更新参数。
  7. 点击 Save

12.5. 删除对象类

本节描述了如何使用命令行和 Web 控制台删除对象类。
警告
不要删除默认的 schema 元素。目录服务器需要它们。

12.5.1. 使用命令行删除对象类

使用 ldapmodify 实用程序删除对象类条目。例如,要删除 examplePerson 对象类:
  1. 从使用它们的任何条目中删除不需要的属性。详情请查看 第 12.8 节 “删除属性”
  2. 删除对象类条目:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com schema objectclasses delete examplePerson
有关对象类定义的详情,请参考 第 12.1.2 节 “对象类”

12.5.2. 使用 Web 控制台删除对象类

使用 Web 控制台删除对象类:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 选择 SchemaObjectclasses
  4. 单击您要删除的对象类条目旁边的 Choose Action 按钮。
  5. 选择 Delete Objectclass
  6. 单击 Yes 以确认。

12.6. 创建属性

本节描述了如何使用命令行和 Web 控制台创建属性。

12.6.1. 使用命令行创建属性

使用 ldapmodify 工具来创建新属性。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com schema attributetypes add dateofbirth --desc="For employee birthdays" --syntax="1.3.6.1.4.1.1466.115.121.1.15" --single-value --x-origin="Example defined"
有关属性定义的详情,请参考 第 12.1.3 节 “属性”

12.6.2. 使用 Web 控制台创建属性

使用 Web 控制台创建属性:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 选择 SchemaAttributes
  4. 单击 Add Attribute
  5. 填写参数。
  6. 点击 Add

12.7. 更新属性

本节描述了如何使用命令行和 Web 控制台更新属性。

12.7.1. 使用命令行更新属性

使用 dsconf 实用程序更新属性条目。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com schema attributetypes replace dateofbirth --desc="Employee birthday" --syntax="1.3.6.1.4.1.1466.115.121.1.15" --single-value --x-origin="Example defined"
有关对象类定义的详情,请参考 第 12.1.2 节 “对象类”

12.7.2. 使用 Web 控制台更新属性

使用 Web 控制台更新属性:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 选择 SchemaAttributes
  4. 点您要编辑的属性旁边的 Choose Action 按钮。
  5. 选择 Edit Attribute
  6. 更新参数。
  7. 点击 Save

12.8. 删除属性

本节描述了如何使用命令行和 Web 控制台删除属性。

12.8.1. 使用命令行删除属性

使用 ldapmodify 实用程序删除属性。例如:
  1. 从任何使用它们的条目中删除不需要的属性。
  2. 删除属性:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com schema attributetypes remove dateofbirth
有关对象类定义的详情,请参考 第 12.1.2 节 “对象类”

12.8.2. 使用 Web 控制台删除属性

使用 Web 控制台删除属性:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 选择 SchemaObjectclasses
  4. 点您要删除的属性旁边的 Choose Action 按钮。
  5. 选择 Delete Attribute
  6. 单击 Yes 以确认。

12.9. 创建自定义架构文件

模式文件是简单的 LDIF 文件,用于定义 cn=schema 条目。每个属性和对象类都作为属性添加到该条目。以下是创建模式文件的要求:
  • 第一行必须是 dn: cn=schema
  • 模式文件可以同时包含属性和对象类,但它只能包括一个或多个属性。
  • 如果属性和对象类都以样式定义,则必须首先列出所有属性,然后对象类。
  • 对象类可以使用其他架构文件中定义的属性。
  • 该文件的格式必须命名为 [1-9][0-9]text.ldif
    该文件必须以两个数字开头。数字上,核心配置模式之前无法加载架构文件(以 0001开头)。
    另外,Directory 服务器始终将其自定义模式写入 schema 目录中的数字和字母顺序,并按字母顺序排列。它要求此文件是 99user.ldif。如果此文件不是 99user.ldif,则服务器可能会遇到问题。因此,请始终确保自定义架构文件至少小于 99user.ldif。名称 99alpha.ldif 是 okay,名称 99zzz.ldif 不是。
部署指南 中详细介绍了创建架构文件的实践。
属性在 schema 文件中定义为 schema 的 attributetypes 属性,其中五个组件:
例如:
attributetypes: ( 1.2.3.4.5.6.1 NAME 'dateofbirth' DESC 'For employee birthdays' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUED X-ORIGIN 'Example defined')
同样,对象类被定义为 对象类 属性的值,虽然定义对象类的方式略有更大的灵活性。唯一需要的配置是对象类的名称和 OID;所有其他配置都取决于对象类的需求:
  • OID,通常是以点分开的数字
  • 唯一名称,格式为 NAME name
  • 描述,格式为 DESC 描述
  • 此对象类的正式或父对象类,格式为 SUP object_class; 如果没有相关的父项,请使用 SUP top
  • AUXILIARY 一词,它提供了对象类应用到的条目的类型; UXILILIARY 表示它可以应用到任何条目
  • MUST; 之前包括所需属性的列表,若要包含多个属性,用括号括起组,并使用带有符号($)的属性分隔。
  • 允许的属性列表,前面带有 MAY; 以包含多个属性,用括号括起组,并使用符号($)分隔属性。
例如:
objectclasses: ( 2.16.840.1133730.2.123 NAME 'examplePerson' DESC 'Example Person Object Class' SUP inetOrgPerson AUXILIARY  MUST cn MAY (exampleDateOfBirth $ examplePreferredOS) )
例 12.4 “Schema 文件示例” 显示简化的模式文件。

例 12.4. Schema 文件示例

dn: cn=schema
attributetypes: ( 2.16.840.1133730.1.123 NAME 'dateofbirth' DESC 'For employee birthdays' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Example defined')
objectclasses: ( 2.16.840.1133730.2.123 NAME 'examplePerson' DESC 'Example Person Object Class' SUP inetOrgPerson AUXILIARY MAY (dateofbirth) )
自定义架构文件应添加到目录服务器实例的 schema 目录中,即 /etc/dirsrv/slapd-instance/schema。除非服务器重启或运行动态重新加载任务,否则这些文件中的 schema 不会加载并可供服务器使用。
重要
如果要使用 /usr/share/data/ 目录中的标准模式,请将 schema 文件复制到 /usr/share/dirsrv/schema/ 目录中。如果您要求标准模式仅对特定实例使用,请将架构文件复制到 /etc/dirsrv/slapd-instance_name/schema/ 目录中,但使用目标目录中的不同文件名。否则,Directory 服务器在升级过程中重命名文件,并附加 .bak 后缀。

12.10. 动态重新加载架构

默认情况下,目录服务器实例使用的模式文件会在目录中加载到目录中。这意味着,添加到 schema 目录中的任何新架构文件都不可用,除非服务器重启。目录服务器有一个任务,可手动重新载入目录服务器实例的完整模式,包括自定义文件,无需服务器重启。
您可以使用以下方法之一重新载入模式:
注意
目录服务器也始终重新加载存储在 /usr/share/dirsrv/schema/ 目录中的所有模式文件。

12.10.1. 使用 dsconf 模式重新加载命令动态重新加载架构

使用 dsconf schema reload 命令重新载入架构:
# dsconf -D "cn=Directory Manager" ldap://server.example.com schema reload
Attempting to add task entry... This will fail if Schema Reload plug-in is not enabled.
Successfully added task entry cn=schema_reload_2018-08-28T09:45:48.027962,cn=schema reload task,cn=tasks,cn=config
To verify that the schema reload operation was successful, please check the error logs
默认情况下,Directory 服务器重新加载存储在 nsslapd-schemadir 参数中设置的架构文件。(可选)将 -d 目录 选项传给命令,以重新加载存储在不同目录中的模式。

12.10.2. 使用 cn=tasks Entry 动态重新加载 Schema

Directory 服务器配置中的 cn=tasks,cn=config 条目是服务器用来管理任务的临时条目的容器条目。要启动模式重新加载操作,请在 cn=schema 重新加载任务cn=tasks,cn=config 条目中创建任务。
默认情况下,Directory 服务器重新加载存储在 nsslapd-schemadir 参数中设置的架构文件。例如,要重新载入存储在此参数中设置的目录中的模式文件:
# ldapadd -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: cn=example_schema_reload,cn=schema reload task,cn=tasks,cn=config
objectclass: extensibleObject
cn: cn=example_schema_reload
(可选)指定 schemadir 参数,以重新加载存储在不同目录中的模式。例如:
# ldapadd -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: cn=example_schema_reload,cn=schema reload task,cn=tasks,cn=config
objectclass: extensibleObject
cn: cn=example_schema_reload
schemadir: /example/schema/
任务完成后,该条目将从目录配置中删除。
有关 cn=schema 重新加载任务,cn=tasks,cn=config 条目的详情,请查看 Red Hat Directory Server Configuration, Command, and File Reference 中的 cn=schema reload task 部分。

12.10.3. 重新加载复制拓扑中的 Schema

模式重新加载任务是一个本地操作,因此如果模式被添加到一个供应商,则不会在多层次环境中复制架构更改。在所有供应商服务器上载入新的模式文件:
  1. 复制新的架构文件,并为每个供应商和副本服务器运行 schema 重新加载任务。请参阅:

12.10.4. 模式重新加载错误

当 schema 重新加载任务运行时,服务器不会返回它是否成功完成。要验证模式重新加载操作是否成功,请检查错误日志。模式重新加载有两个任务,首先验证 schema 文件,然后载入它。
成功消息显示验证通过和任务完成。
[06/Jan/2009:17:52:04.001214874 -0500] schemareload - Schema reload task starts (schema dir: default) ...
[06/Jan/2009:17:52:04.754335904 -0500] schemareload - Schema validation passed.
[06/Jan/2009:17:52:04.894255328 -0500] schemareload - Schema reload task finished.
如果存在故障,日志会显示哪个步骤失败以及原因。
[..] schemareload - Schema reload task starts (schema dir: /bogus) ...
[..] schema - No schema files were found in the directory /bogus
[..] schema_reload - schema file validation failed
[..] schemareload - Schema validation failed.

12.11. 打开 Schema 检查和关闭

当架构检查为 on 时,Directory 服务器可确保三项:
  • 使用 的对象类和属性在目录 schema 中定义。
  • 对象类所需的属性包含在条目中。
  • 只有对象类允许的属性才会包含在条目中。
重要
红帽建议不要禁用 schema 检查。
在 Directory 服务器中默认启用架构检查,目录服务器应始终在打开架构检查的情况下运行。关闭模式的唯一情况是加快 LDAP 导入操作。但是,导入不符合 schema 的条目存在风险。因此,无法更新这些条目。

12.11.1. 使用命令行打开 Schema 检查和关闭

要打开和关闭架构检查,请设置 nsslapd-schemacheck 参数的值。例如,禁用架构检查:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-schemacheck=off
Successfully replaced "nsslapd-schemacheck"
有关 nsslapd-schemacheck 参数的详情,请查看 红帽目录服务器配置、命令和文件参考中的参数描述

12.11.2. 使用 Web 控制台打开 Schema 检查和关闭

使用 Web 控制台启用或禁用架构检查:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings,然后选择 Server Settings 条目。
  4. 打开 Advanced Settings 选项卡。
  5. 要启用架构检查,请选中 Enable Schema Checking 复选框。要禁用该功能,请清除复选框。
  6. 点击 Save

12.12. 使用语法验证

通过语法验证,Directory 服务器会检查属性值是否遵循该属性的定义中给出的语法规则。例如,语法验证将确认新的 telephoneNumber 属性实际上具有其值的有效电话号码。
重要
红帽建议不要禁用语法验证。

12.12.1. 关于语法验证

与架构检查一样,验证会检查任何目录修改并拒绝违反语法的更改。可以选择性地配置其他设置,使语法验证可以记录关于语法违规消息,然后拒绝修改或允许修改过程成功。
这个功能会验证所有属性语法,但二进制语法(无法验证)和非标准语法(没有定义所需的格式)和非标准语法除外。语法会根据 RFC 4514 进行验证。

12.12.2. 语法验证和其他目录服务器操作

语法验证与标准 LDAP 操作主要相关,如创建条目(添加)或编辑属性(modify)。但是,验证属性语法可能会影响其他目录服务器操作。

数据库加密

对于普通 LDAP 操作,属性仅在将值写入数据库之前加密。这意味着,加密会在验证属性语法进行。

加密的数据库(如 第 10 章 配置属性加密所述)可以被导出和导入。通常,强烈建议使用带有 db2ldifldif2db-E 标志进行这些导出和导入操作,这样就能对导入操作进行正常验证。但是,如果加密数据库在没有使用 -E 标志(不支持)的情况下导出,那么会创建一个带有加密值的 LDIF。当导入此 LDIF 后,无法验证加密的属性,则会记录警告,并在导入的条目中跳过属性验证。

同步

对于 Windows Active Directory 条目和 Red Hat Directory Server 条目中的属性,允许或强制的语法可能会有区别。在这种情况下,Active Directory 值无法正确同步,因为语法验证在 Directory Server 条目中强制实施 RFC 标准。

复制

如果 Directory Server 11 实例是将其更改复制到消费者的供应商,则无法使用语法验证没有问题。但是,如果复制中的供应商是旧版本的目录服务器或禁用语法验证,则不应在消费者上使用语法验证,因为 Directory Server 11 使用者可能会拒绝供应商允许的属性值。

12.12.2.1. 使用命令行打开语法验证和关闭

要打开和关闭语法验证,请设置 nsslapd-Syntaxcheck 参数的值。例如,禁用语法验证:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-syntaxcheck=off
Successfully replaced "nsslapd-syntaxcheck"
有关 nsslapd-Syntaxcheck 参数的详情,请查看 红帽目录服务器配置、命令和文件参考中的参数描述

12.12.2.2. 使用 Web 控制台打开语法验证开启和关闭

使用 Web 控制台启用或禁用语法验证:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings,然后选择 Server Settings 条目。
  4. 打开 Advanced Settings 选项卡。
  5. 要启用属性语法检查,请选中 Enable Attribute Syntax Checking 复选框。要禁用该功能,请清除复选框。
  6. 点击 Save

12.12.3. 为 DN 启用或禁用严格语法验证

启用语法验证后,会验证区分名称(DN),如 RFC 4514 的第 3 节中所述。DN 语法验证会单独启用,因为后续标准的严格性可能会导致具有不同语法的旧 DN 无效,因此目录树。
注意
如果启用了严格的 DN 验证,并且 DN 值不符合所需语法,则操作会失败,并带有 LDAP 结果代码 34INVALID_DN_SYNTAX

12.12.3.1. 使用命令行为 DN 启用或禁用严格语法验证

要为 DN on 和 off 打开严格的语法验证,请设置 nsslapd-dn-validate-strict 参数的值。例如,为 DN 禁用严格的语法验证:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-dn-validate-strict=off
Successfully replaced "nsslapd-dn-validate-strict"
有关 nsslapd-Syntaxcheck 参数的详情,请查看 红帽目录服务器配置、命令和文件参考中的参数描述

12.12.3.2. 使用 Web 控制台为 DN 启用或禁用严格语法验证

使用 Web 控制台为 DN 启用或禁用严格的语法验证:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings,然后选择 Server Settings 条目。
  4. 打开 Advanced Settings 选项卡。
  5. 根据您要启用或禁用该功能,选择或取消选择 Strict DN 语法验证 选项。
  6. 点击 Save

12.12.4. 启用语法验证日志记录

默认情况下,语法验证会拒绝任何添加或修改操作,其中属性值违反了所需的语法。但是,违反本身默认不会记录到错误日志中。nsslapd-Syntaxlogging 属性为任何语法违反启用错误日志记录。
注意
语法验证脚本发现的语法违反情况,任务会在 Directory Server 错误日志中记录。
如果同时启用了 nsslapd-Syntaxloggingnsslapd-Syntaxcheck 参数,则任何无效的属性修改都会被拒绝,并将消息写入日志。如果启用了 nsslapd-Syntaxlogging,但禁用了 nsslapd-Syntaxcheck,则允许操作成功,但警告消息仍然被写入错误日志中。

12.12.4.1. 使用命令行启用语法验证日志记录

要启用语法验证日志记录,请将 nsslapd-Syntaxlogging 参数的值设置为 on
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-syntaxlogging=on
Successfully replaced "nsslapd-syntaxlogging"
有关 nsslapd-Syntaxlogging 参数的详情,请查看 红帽目录服务器配置、命令和文件参考中的参数描述

12.12.4.2. 使用 Web 控制台启用语法验证日志记录

使用 Web 控制台启用验证日志:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings,然后选择 Server Settings 条目。
  4. 打开 Advanced Settings 选项卡。
  5. 选择 Enable Attribute Syntax Logging 选项。
  6. 点击 Save

12.12.5. 验证现有属性值的语法

在某些情况下,您可能需要手动验证现有值的语法。例如:
目录服务器将语法验证任务的结果记录到 /var/log/dirsrv/slapd-instance_name/errors 文件中。例如:
  • 如果所有验证的值都有效:
    [28/Jun/2017:12:52:43.669867966 +0200] - ERR - syntax-plugin - syntax_validate_task_thread - Starting (base: "dc=example,dc=com", filter: "(objectclass=*)") ...
    [28/Jun/2017:12:52:43.696850129 +0200] - ERR - syntax-plugin - syntax_validate_task_thread - Complete.  Found 0 invalid entries.
  • 如果找到无效的条目:
    [28/Jun/2017:12:54:05.736087520 +0200] - ERR - syntax-plugin - syntax_validate_task_thread - Starting (base: "dc=example,dc=com", filter: "(objectclass=*)") ...
    [28/Jun/2017:12:54:05.754195607 +0200] - ERR - syntax-plugin - syntax_validate_task_callback - Entry "cn=user,ou=People,dc=example,dc=com" violates syntax.
    description: value #0 invalid per syntax
    [28/Jun/2017:12:54:05.759905671 +0200] - ERR - syntax-plugin - syntax_validate_task_thread - Complete.  Found 1 invalid entries.
    注意
    语法验证任务仅识别语法违反情况。您必须手动修复不正确的值。

12.12.5.1. 使用 dsconf schema validate-Syntax 命令创建语法验证任务

使用 dsconf schema validate-Syntax 命令创建语法验证 任务。例如,要创建一个任务来验证 ou=People,dc=example,dc=com 子树中与 (objectclass=inetorgperson) 过滤器匹配的所有值的语法,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com schema validate-syntax -f '(objectclass=inetorgperson)' ou=People,dc=example,dc=com

12.12.5.2. 使用 cn=tasks Entry 创建语法验证任务

Directory 服务器配置中的 cn=tasks,cn=config 条目是服务器用来管理任务的临时条目的容器条目。要启动语法验证操作,请在 cn=Syntax validate,cn=tasks,cn=config 条目中创建任务。
例如,要创建一个任务来验证 ou=People,dc=example,dc=com 子树中所有值的语法,其与 (objectclass=inetorgperson) 过滤器匹配:
# ldapadd -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: cn=example_syntax_validate,cn=syntax validate,cn=tasks,cn=config
objectclass: extensibleObject
cn: cn=example_syntax_validate
basedn: ou=People,dc=example,dc=com
filter: (objectclass=inetorgperson)
任务完成后,该条目将从目录配置中删除。
有关 cn=syntax validate,cn=tasks,cn=config 条目的详细信息,请参阅 Red Hat Directory Server 配置、命令和文件参考中的 cn=schema 重新加载任务部分。

第 13 章 管理索引

索引通过分类和整理属性或值来更轻松地搜索和检索信息。本章论述了搜索算法本身,将索引机制放在上下文中,然后描述了如何创建、删除和管理索引。

13.1. 关于索引

本节概述目录服务器中的索引。它包含以下主题:

13.1.1. 关于索引类型

索引存储在目录数据库中的文件中。文件的名称基于 indexed 属性,而不是文件中包含的索引类型。如果为特定属性维护多个索引,则每个索引文件可能会包含多个索引类型。例如,为通用 name 属性维护的所有索引都包含在 cn.db 文件中。
目录服务器支持以下类型的索引:
  • 存在索引(pres) 包含包含特定属性的条目列表,这对于搜索非常有用。例如,它可以轻松地检查包含访问控制信息的任何条目。生成包含存在索引的 aci.db 文件会有效地执行 ACI = the 搜索,以便为服务器生成访问控制列表。
  • 平等索引(eq) 改进了对包含特定属性值的条目的搜索。例如,cn 属性上的相等索引允许用户更有效地执行 cn=Babs Jensen 的搜索。
  • 大约索引(approx) 用于 高效的类似声音或声音 的搜索。例如,条目可能包含属性值 cn=Firstname M Lastname。大约搜索将返回针对 cn~=Firstname Lastname, cn~=Firstname, or cn~=Lastname 进行搜索的值。同样,对 l~=San Fransisco 的搜索会返回包括 l=San the 的条目。
  • 子字符串 索引(sub) 是维护的成本索引,但它可以有效地搜索条目中的子字符串。子字符串索引仅限于每个条目至少有三个字符。
    例如,搜索 cn=*derson ,它会匹配包括如 Bill Anderson, Jill Henderson, 或 Steve Sanderson 字符串的常规名称。同样,搜索 telephoneNumber= *555* 会返回目录中包含 555 的电话号码的所有条目。
  • 国际索引 加快了搜索国际目录中的信息。创建国际索引的过程与创建常规索引的过程类似,不同之处是它会应用一个匹配规则,它将一个 对象标识符 (OID) 与要索引的属性关联。
    附录 D, 国际化 中列出了支持的区域设置及其关联的 OID。如果需要配置目录服务器以接受其他匹配规则,请联系红帽咨询。

13.1.2. 关于默认和数据库索引

目录服务器包含一组默认索引。创建新数据库时,Directory 服务器会将这些默认索引从 cn=default index,cn=config,cn=ldbm database,cn=plugins,cn=config 复制到新数据库。然后,数据库只使用这些索引的副本,它们存储在 cn=index,cn=database_name,cn=ldbm database,cn=plugins,cn=config 中。
注意
目录服务器不会复制 cn=config 条目中的设置。因此,您可以在作为复制拓扑一部分的服务器上配置索引。例如,在使用级联复制的环境中,如果客户端不需要从 hub 读取数据,则不需要在 hub 上创建自定义索引。
显示目录服务器默认索引:
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com \
     -b "cn=default indexes,cn=config,cn=ldbm database,cn=plugins,cn=config" \
     '(objectClass=nsindex)'
注意
如果您更新存储在 cn=default index ,cn=config,cn=ldbm database,cn=plugins,cn=config 里的默认索引 设置,则更改不会应用到 cn=index,cn=database_name,cn=ldbm database,cn=plugins,cn=config
显示单个数据库的索引:
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend index list database_name

13.1.3. 搜索算法概述

索引用于加快搜索速度。要了解目录如何使用索引,它有助于理解搜索算法。每个索引包含一个属性列表(如 cn、通用名称、属性)以及包含索引属性值的条目的 ID 列表:
  1. LDAP 客户端应用程序向目录发送搜索请求。
  2. 目录检查传入请求,以确保指定的基本 DN 与一个或多个数据库或数据库链接中包含的后缀匹配。
    • 如果匹配,目录会处理请求。
    • 如果不匹配,目录会向客户端返回错误,表示后缀不匹配。如果在 cn=config 下的 nsslapd-referral 属性中指定引用,则目录也会返回 LDAP URL,客户端可以尝试识别请求。
    • 目录服务器检查搜索过滤器,以查看要应用的索引,它会尝试从满足过滤器的每个索引中加载条目 ID 列表。ID 列表会根据使用的 AND 或 OR joins 的组合。
      每个过滤器组件都可以独立处理并返回 ID 列表。
    • 如果条目 ID 列表大于配置的 ID 列表扫描限制,或者没有为属性定义索引,那么目录服务器会将 此过滤器组件 的结果设置为 所有辅助。如果将逻辑操作应用到单个搜索组件的结果后,列表仍然为 ALLIDs,它会搜索数据库中的每个条目。这是一个 未索引的 搜索。
  3. 目录服务器从 id2entry.db 数据库或 ID 列表中每个条目 ID (或整个数据库进行未索引搜索)读取每个条目。然后,服务器会检查条目以查看它们是否与搜索过滤器匹配。每个匹配项都会在找到时返回。
    服务器将继续通过 ID 列表,直到它搜索所有候选条目,或直至达到其中一个配置的资源限值。(资源限值在 第 14.5.3 节 “使用命令行设置用户和全局资源限值” 中列出。)
    注意
    可以使用简单的页面结果控制为搜索设置单独的资源限值。例如,管理员可以通过页面搜索设置高或无限的大小,但对非页面搜索使用较低默认限制。

13.1.4. 大约搜索

此外,该目录使用元手机电话号码算法的变体来对大约索引执行搜索。每个值都被视为一个单词序列,每个单词都会生成一个电话号码代码。
注意
目录服务器中的元电话号码算法仅支持 US-ASCII 字母。因此,仅使用带有英语值的大约索引。
在辅助搜索中输入的值类似,被转换为一系列电话号码代码。如果这两个条目都为 true,则条目被视为与查询匹配:
  • 所有查询字符串代码都与条目字符串中生成的代码匹配。
  • 所有查询字符串代码都与条目字符串代码相同。
目录中的名称(图形代码) 查询字符串(复合代码) 匹配注释
alice B Sarette (ALS B SRT) alice Sarette (ALS SRT) 匹配。代码以正确顺序指定。
alice Sarrette (ALS SRT) 匹配。代码以正确顺序指定,尽管出现拼写错误。
Surette (SRT) 匹配。生成的代码存在于原始名称中,尽管出现拼写错误。
Bertha Sarette (BR0 SRT) 无匹配项。原始名称中不存在代码 BR0。
Sarette、SRT (SRT ALS) 无匹配项。代码不会以正确顺序指定。

13.1.5. 平衡索引性

在创建新索引前,平衡维护索引的好处。
  • 大约索引对于通常包含数字的属性(如电话号码)效率不有效。
  • 子字符串索引不适用于二进制属性。
  • 如果值较大(如旨在包含黄金数据或密码包含加密数据的属性),则应该避免平等索引。
  • 为搜索中常用的属性维护索引会增加开销,而不会提高全局搜索性能。
  • 未索引的属性仍可在搜索请求中指定,但搜索性能可能会显著降级,具体取决于搜索的类型。
  • 您维护的更多索引,需要更多磁盘空间。
索引可能会变得非常耗时。例如:
  1. 目录服务器收到添加或修改操作。
  2. 目录服务器检查索引属性,以确定是否为属性值维护索引。
  3. 如果索引了创建的属性值,则 Directory 服务器会从索引中添加或删除新属性值。
  4. 实际的属性值在条目中创建。
例如,Directory 服务器添加了条目:
dn: cn=John Doe,ou=People,dc=example,dc=com
objectclass: top
objectClass: person
objectClass: orgperson
objectClass: inetorgperson
cn: John Doe
cn: John
sn: Doe
ou: Manufacturing
ou: people
telephoneNumber: 408 555 8834
description: Manufacturing lead for the Z238 line of widgets.
目录服务器维护以下索引:
  • cn (通用名称)和 sn (surname)属性的等同性、大约和子字符串索引。
  • 电话号码属性的相等和子字符串索引。
  • description 属性的子字符串索引。
在目录中添加该条目时,Directory 服务器必须执行以下步骤:
  1. JohnJohn Doe 创建 cn 相等索引条目。
  2. JohnJohn Doe 创建适当的 cn 大约索引条目。
  3. JohnJohn Doe 创建适当的 cn 子字符串索引条目。
  4. Doe 创建 sn 相等索引条目。
  5. Doe 创建适当的 sn 大约索引条目。
  6. Doe 创建适当的 sn 子字符串索引条目。
  7. 408 555 8834 创建电话号码相等的索引条目。
  8. 408 555 8834 创建适当的电话号码子字符串索引条目。
  9. 为 Manufacturing 创建适当的描述子字符串索引条目,导致小部件的 Z238 行。为此字符串生成了大量子字符串条目。
如本例所示,为大型目录创建和维护数据库所需的操作数量可能是资源密集型。

13.1.6. 索引限制

您无法索引虚拟属性,如 nsrolecos_attribute。虚拟属性包含计算的值。如果您索引这些属性,Directory 服务器可以返回一组无效的条目来直接和内部搜索。

13.2. 创建标准索引

这部分论述了如何使用命令行和 Web 控制台为特定属性创建存在、相等性、大约、子字符串和国际索引。
注意
当您创建新索引类型时,Directory 服务器使用此默认索引作为以后创建的每个新数据库的模板。如果您更新默认索引,则更新的设置不会应用到现有的数据库。要将新索引应用到现有数据库,请使用 dsctl db2index 命令或 cn=index,cn=tasks 任务,如 第 13.3 节 “为现有数据库创建新索引” 所述。

13.2.1. 使用命令行创建索引

注意
您无法创建新系统索引,因为系统索引在 Directory 服务器中硬编码。
使用 ldapmodify 在您的目录中添加新的索引属性。
  • 要创建新索引,其将成为默认索引之一,请将新的索引属性添加到 cn=default index,cn=config,cn=ldbm database,cn=plugins,cn=config 条目。
  • 要为特定数据库创建新索引,将其添加到 cn=index,cn=database_name,cn=ldbm database,cn=plugins,cn=config 条目,其中 cn=database_name 对应于数据库的名称。
注意
避免在 dse.ldif 文件中创建 cn=config 下的条目。dse.ldif 配置文件中的 cn=config 条目不存储在与常规条目相同的高度可扩展数据库中。因此,如果很多条目,特别是可能经常更新的条目存储在 cn=config 下,性能将会受到影响。虽然因为性能的原因,我们建议不要存储 cn=config 下的简单用户条目,但在 cn=config 下存储特殊用户条目(如 Directory Manager 条目或复制管理器 (supplier bind DN)条目)条目会很有用,。
有关添加条目所需的 LDIF 更新声明的详情,请参考 第 3.1.4 节 “更新目录条目”
例如,要为 Example1 数据库中的 sn (surname)属性创建存在、相等和子字符串索引:
  1. 运行 ldapmodify 并为新索引添加 LDIF 条目:
    # ldapmodify -a -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    
    dn: cn=sn,cn=index,cn=Example1,cn=ldbm database,cn=plugins,cn=config
    changetype: add
    objectClass:top
    objectClass:nsIndex
    cn:sn
    nsSystemIndex:false
    nsIndexType:pres
    nsIndexType:eq
    nsIndexType:sub
    nsMatchingRule:2.16.840.1.113730.3.3.2.3.1
    cn 属性包含要索引的属性的名称,在本例中为 sn 属性。条目是 nsIndex 对象类的成员。nsSystemIndex 属性为 false,表示索引对目录服务器操作并不重要。多值的 nsIndexType 属性指定 presence (pres), equality (eq) 和 substring (sub) 索引。每个关键字都必须在单独的行中输入。示例中的 nsMatchingRule 属性指定 Bulgarian 协调顺序的 OID;匹配规则可以指示任何可能的值匹配,如语言或其他格式,如日期或整数。
    您可以使用 nsIndexType 属性中的关键字 none 指定没有为属性维护索引。这个示例通过将 nsIndexType 更改为 none 来禁用 Example1 数据库上的 sn 索引:
    dn: cn=sn,cn=index,cn=Example1,cn=ldbm database,cn=plugins,cn=config
    objectClass:top
    objectClass:nsIndex
    cn:sn
    nsSystemIndex:false
    nsIndexType:none
有关匹配规则及其 OID 的完整列表,请参阅 第 14.3.4 节 “使用匹配规则” 以及索引配置属性,请参阅 Red Hat Directory Server 配置、命令和文件参考
注意
在创建索引时,始终使用属性的主名称(而非属性的别名)。属性的主要名称为架构中属性列出的名字;例如,用户 ID 属性的 uid

13.2.2. 使用 Web 控制台创建索引

创建存在、相等、大约、子字符串或国际索引:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Database 菜单。
  4. 选择后缀条目。
  5. 打开 Indexes 选项卡。
  6. Add Index 按钮。
  7. 选择要索引的属性、索引类型以及可选匹配的规则。
  8. Create Index

13.3. 为现有数据库创建新索引

了解如何在 Directory 服务器上启动索引操作。您必须手动创建索引,因为目录服务器不会自动索引数据库。
重要
在重新生成索引前,搜索将继续,但可能会返回不正确的或不一致的结果。

13.3.1. 创建一个索引实例正在运行

13.3.1.1. 使用 dsconf backend index reindex 命令创建索引

在实例运行时重新创建数据库的索引:
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend index reindex database_name

13.3.1.2. 使用 cn=tasks 条目创建索引

Directory 服务器配置中的 cn=tasks,cn=config 条目是服务器用来管理任务的临时条目的容器条目。要启动索引操作,请在 cn=index,cn=tasks,cn=config 条目中创建任务。
使用 ldapadd 工具添加新的索引任务。例如,要添加一个任务,为 userRoot 数据库中 cn 属性创建存在索引:
# ldapadd -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: cn=example_presence_index,cn=index,cn=tasks,cn=config
objectclass: top
objectclass: extensibleObject
cn: example presence index
nsInstance: userRoot
nsIndexAttribute: "cn:pres"
任务完成后,该条目将从目录配置中删除。
有关 cn=index,cn=tasks,cn=config 条目的详情,请查看 Red Hat Directory Server Configuration, Command, and File Reference 中的 cn=index 部分。

13.3.2. 创建一个索引,即实例离线

创建索引条目或在现有索引条目中添加其他索引类型后,请使用 dsconf db2index 命令:
  1. 关闭实例:
    # dsctl instance_name stop
  2. 重新创建索引:
    # dsctl instance_name db2index userRoot
    [13/Aug/2019:15:25:37.277426483 +0200] - INFO - ldbm_instance_config_cachememsize_set - force a minimal value 512000
    [13/Aug/2019:15:25:37.289257996 +0200] - INFO - check_and_set_import_cache - pagesize: 4096, available bytes 1704378368, process usage 22212608 
    [13/Aug/2019:15:25:37.291738104 +0200] - INFO - check_and_set_import_cache - Import allocates 665772KB import cache.
    ...
    db2index successful
  3. 启动实例:
    # dsctl instance_name start

13.4. 使用虚拟列表视图控制来请求大型搜索结果的连续子集

目录服务器支持 LDAP 虚拟列表视图控制。这个控制可让 LDAP 客户端请求大型搜索结果的连续子集。
例如,您已在目录服务器中保存了一个地址书,其中有 100.000 条目。默认情况下,所有条目的查询一次性返回所有条目。这是一个资源和耗时的操作,客户端通常不需要整个数据集,因为如果用户滚动结果,则只能看到部分集。
但是,如果客户端使用 VLV 控制,服务器只返回子集,例如,如果用户在客户端应用程序中滚动,服务器会返回更多条目。这可减少服务器上的负载,客户端不需要一次性存储和处理所有数据。
在修复所有搜索参数时,VLV 也提高了服务器排序搜索的性能。目录服务器在 VLV 索引中预计算搜索结果。因此,VLV 索引比检索结果更高效,并在之后排序它们。
在目录服务器中,VLV 控制始终可用。但是,如果您在大型目录中使用它,则 VLV 索引(也称为 浏览索引)可能会显著提高速度。
目录服务器不为属性维护 VLV 索引,如用于标准索引。服务器根据条目中设置的属性动态生成 VLV 索引,并在目录树中这些条目的位置。与标准条目不同,VLV 条目是数据库中的特殊条目。

13.4.1. VLV 控制如何在 ldapsearch 命令中工作

通常,您在 LDAP 客户端应用程序中使用虚拟列表视图(VLV)功能。但是,对于测试目的,您可以使用 ldapsearch 工具来请求部分结果。
要在 ldapsearch命令中使用 VLV 功能,请为 sss (服务器端排序)和 vlv 搜索扩展指定 -E 选项:
# ldapsearch ... -E 'sss=attribute_list' -E 'vlv=query_options'
sss 搜索扩展使用以下语法:
[!]sss=[-]<attr[:OID]>[/[-]<attr[:OID]>...]
vlv 搜索扩展使用以下语法:
[!]vlv=<before>/<after>(/<offset>/<count>|:<value>)
  • before 设置在目标前返回的条目数。
  • 设置目标后返回的条目数。
  • 索引计数 和值 有助于确定目标条目。如果设置 value,则目标条目是第一个带有第一个排序属性从值开头的属性。否则,您将 count 设置为 0, 目标条目由 索引 值决定(从 1 开始)。如果 计数 值大于 0, 则目标条目由 条目/计数的比例索引站号 决定。

例 13.1. 带有 VLV 搜索扩展的 ldapsearch 命令的输出

以下命令在 ou=People,dc=example,dc=com 中搜索。然后,服务器会根据 cn 属性对结果进行排序,并返回 70 条目的 uid 属性,并在偏移前一个条目和两个条目。
# ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com -b "ou=People,dc=example,dc=com" -s one -x -E 'sss=cn' -E 'vlv=1/2/70/0' uid
# user069, People, example.com
dn: uid=user069,ou=People,dc=example,dc=com
uid: user069

# user070, People, example.com
dn: uid=user070,ou=People,dc=example,dc=com
uid: user070

# user071, People, example.com
dn: uid=user071,ou=People,dc=example,dc=com
uid: user071

# user072, People, example.com
dn: uid=user072,ou=People,dc=example,dc=com
uid: user072

# search result
search: 2
result: 0 Success
control: 1.2.840.113556.1.4.474 false MIQAAAADCgEA
sortResult: (0) Success
control: 2.16.840.1.113730.3.4.10 false MIQAAAALAgFGAgMAnaQKAQA=
vlvResult: pos=70 count=40356 context= (0) Success

# numResponses: 5
# numEntries: 4
Press [before/after(/offset/count|:value)] Enter for the next window.
详情请查看 ldapsearch(1) man page 中的 -E 参数描述。

13.4.2. 启用未经身份验证的用户使用 VLV 控制

默认情况下,oid=2.16.840.1.113730.3.4.9,cn=features,cn=config 条目的访问控制指令(ACI)仅允许经过身份验证的用户使用 VLV 控制。要启用非验证的用户使用 VLV 控制,请将 userdn = "ldap:///all" 更改为 userdn = "ldap:///anyone "。

流程

  • 更新 oid=2.16.840.1.113730.3.4.9,cn=features,cn=config 中的 ACI:
    # ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x
    
    dn: oid=2.16.840.1.113730.3.4.9,cn=features,cn=config
    changetype: modify
    replace: aci
    aci: (targetattr != "aci")(version 3.0; acl "VLV Request Control"; allow( read, search, compare, proxy ) userdn = "ldap:///anyone";)

验证

  • 使用 VLV 控制执行查询,而不指定绑定用户:
    # ldapsearch -H ldap://server.example.com -b "ou=People,dc=example,dc=com" -s one -x -E 'sss=cn' -E 'vlv=1/2/70/0' uid
    此命令要求服务器允许匿名绑定。
    如果命令成功,但没有返回条目,则使用绑定用户再次运行查询,以确保在使用身份验证时查询可以正常工作。

13.4.3. 使用命令行创建 VLV 索引,以提高 VLV 查询的速度

按照以下步骤,创建一个虚拟列表视图 (VLV) 索引,也称为浏览索引。它用于包括了一个 mail 属性,且 objectClass 属性被设置为 personou=People,dc=example,dc=com 中的条目。

先决条件

  • 您的客户端应用程序使用 VLV 控制。
  • 客户端应用程序需要查询大型搜索结果的连续子集。
  • 目录包含大量条目。

流程

  1. 创建 VLV 搜索条目:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend vlv-index add-search --name "VLV People" --search-base "ou=People,dc=example,dc=com" --search-filter "(&(objectClass=person)(mail=*))" --search-scope 2 userRoot
    这个命令使用以下选项:
    • --name 设置搜索条目的名称。这可以是任何名称。
    • --search-base 为 VLV 索引设置基本 DN。目录服务器在此条目上创建 VLV 索引。
    • --search-scope 设置为 VLV 索引中的条目运行的搜索范围。您可以将这个选项设置为 0 ( 基础搜索)、1 ( 单向搜索)或 2 ( 子树搜索)。
    • --search-filter 在创建 VLV 索引时设置过滤器目录服务器应用。只有与此过滤器匹配的条目成为索引的一部分。
    • userroot 是数据库的名称,在其中创建该条目。
  2. 创建索引条目:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend vlv-index add-index --index-name "VLV People - cn sn" --parent-name "VLV People" --sort "cn sn" --index-it dc=example,dc=com
    这个命令使用以下选项:
    • --index-name 设置索引条目的名称。这可以是任何名称。
    • --parent-name 设置 VLV 搜索条目的名称,且必须与您在上一步中设置的名称匹配。
    • --sort 设置属性名称及其排序顺序。按空格分隔属性。
    • --index-it 会导致 Directory 服务器在创建条目后自动启动索引任务。
    • dc=example,dc=com 是数据库的后缀,用于创建该条目。

验证

  1. 验证 /var/log/dirsrv/slapd-instance_name/errors 文件中是否成功创建了 VLV 索引:
    [26/Nov/2021:11:32:59.001988040 +0100] - INFO - bdb_db2index - userroot: Indexing VLV: VLV People - cn sn
    [26/Nov/2021:11:32:59.507092414 +0100] - INFO - bdb_db2index - userroot: Indexed 1000 entries (2%).
    ...
    [26/Nov/2021:11:33:21.450916820 +0100] - INFO - bdb_db2index - userroot: Indexed 40000 entries (98%).
    [26/Nov/2021:11:33:21.671564324 +0100] - INFO - bdb_db2index - userroot: Finished indexing.
  2. ldapsearch 命令中使用 VLV 控制只查询目录中的特定记录:
    # ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com -b "ou=People,dc=example,dc=com" -s one -x -E 'sss=cn' -E 'vlv=1/2/70/0' uid
    # user069, People, example.com
    dn: uid=user069,ou=People,dc=example,dc=com
    cn: user069
    
    # user070, People, example.com
    dn: uid=user070,ou=People,dc=example,dc=com
    cn: user070
    
    # user071, People, example.com
    dn: uid=user071,ou=People,dc=example,dc=com
    cn: user071
    
    # user072, People, example.com
    dn: uid=user072,ou=People,dc=example,dc=com
    cn: user072
    本例假设您在 ou=People,dc=example,dc=com 中至少将 uid=user001 命名为 uid=user072
详情请查看 ldapsearch(1) man page 中的 -E 参数描述。

13.4.4. 使用 Web 控制台创建 VLV 索引以提高 VLV 查询的速度

按照以下步骤,创建一个虚拟列表视图 (VLV) 索引,也称为浏览索引。它用于包括了一个 mail 属性,且 objectClass 属性被设置为 personou=People,dc=example,dc=com 中的条目。

先决条件

  • 您的客户端应用程序使用 VLV 控制。
  • 客户端应用程序需要查询大型搜索结果的连续子集。
  • 目录包含大量条目。

流程

  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 导航到 DatabaseSuffixesdc=example,dc=comVLV Indexes
  3. Create VLV Index 并填写字段:

    图 13.1. 使用 Web 控制台创建 VLV 索引

    使用 Web 控制台创建 VLV 索引
  4. 输入属性名称,然后点 Add Sort Index
  5. 选择 Index VLV on Save
  6. Save VLV Index

验证

  1. 进入 MonitoringLoggingErrors Log
    [26/Nov/2021:11:32:59.001988040 +0100] - INFO - bdb_db2index - userroot: Indexing VLV: VLV People - cn sn
    [26/Nov/2021:11:32:59.507092414 +0100] - INFO - bdb_db2index - userroot: Indexed 1000 entries (2%).
    ...
    [26/Nov/2021:11:33:21.450916820 +0100] - INFO - bdb_db2index - userroot: Indexed 40000 entries (98%).
    [26/Nov/2021:11:33:21.671564324 +0100] - INFO - bdb_db2index - userroot: Finished indexing.
  2. ldapsearch 命令中使用 VLV 控制只查询目录中的特定记录:
    # ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com -b "ou=People,dc=example,dc=com" -s one -x -E 'sss=cn' -E 'vlv=1/2/70/0' uid
    # user069, People, example.com
    dn: uid=user069,ou=People,dc=example,dc=com
    cn: user069
    
    # user070, People, example.com
    dn: uid=user070,ou=People,dc=example,dc=com
    cn: user070
    
    # user071, People, example.com
    dn: uid=user071,ou=People,dc=example,dc=com
    cn: user071
    
    # user072, People, example.com
    dn: uid=user072,ou=People,dc=example,dc=com
    cn: user072
    本例假设您在 ou=People,dc=example,dc=com 中至少将 uid=user001 命名为 uid=user072
详情请查看 ldapsearch(1) man page 中的 -E 参数描述。

13.5. 更改索引排序顺序

默认情况下,索引按字母顺序排列,按 ASCII 顺序排列。每个属性都适用,即使属性可能具有数字属性值,如 Integer 或 slirpphoneNumber。可以通过更改属性的匹配规则集来更改 sort 方法。

13.5.1. 使用命令行更改 Sort 顺序

要使用命令行更改排序顺序,请更改属性 index 的 nsMatchingRule。例如:
# ldapmodify -D "cn=Directory Manager" -W -x

dn: cn=sn,cn=index,cn=Example1,cn=ldbm database,cn=plugins,cn=config
changetype:modify
replace:nsMatchingRule
nsMatchingRule: integerOrderingMatch

13.7. 删除索引

本节论述了如何从索引中删除属性和索引类型。

13.7.1. 从默认索引条目中删除属性

使用 Directory 服务器的默认设置时,默认索引条目中列出的多个属性(如 sn )会被索引。以下属性是默认索引的一部分:

表 13.1. 默认索引属性

aci
cn
entryusn
givenName
mail
mailAlternateAddress
mailHost
成员
memberOf
nsUniqueId
ntUniqueId
ntUserDomainId
numsubordinates
objectClass
owner
parentid
seeAlso
sn
telephoneNumber
uid
uniqueMember
警告
删除系统索引可能会显著影响目录服务器的性能。
例如,要从默认索引中删除 sn 属性:
  1. cn=default index,cn=config,cn=ldbm database,cn=plugins,cn=config 条目中删除属性:
    # ldapdelete -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    cn=sn,cn=default indexes,cn=config,cn=ldbm database,cn=plugins,cn=config
    如果您没有从此条目中删除属性,则 sn 属性的索引会在服务器重启后自动重新创建并损坏。
  2. 删除 cn=attribute_name,cn=index,cn=userRoot,cn=ldbm database,cn=plugins,cn=config 条目。详情请查看 第 13.7.2 节 “从索引中删除属性”

13.7.2. 从索引中删除属性

在某些情况下,您希望从索引中删除一个属性。本节介绍了使用命令行并使用 Web 控制台的步骤。

13.7.2.1. 使用命令行从索引中删除属性

从索引中删除属性:
  1. 如果要删除的属性列在 cn=default index,cn=config,cn=ldbm database,cn=plugins,cn=config 默认索引条目中,请先将其从此条目中删除。详情请查看 第 13.7.1 节 “从默认索引条目中删除属性”
  2. 从索引中删除属性。例如:
    # ldapdelete -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    cn=sn,cn=index,cn=database_name,cn=ldbm database,cn=plugins,cn=config
    删除条目后,Directory 服务器不再为属性维护索引。
  3. 重新创建属性索引。请参阅 第 13.3 节 “为现有数据库创建新索引”

13.7.2.2. 使用 Web 控制台从索引中删除属性

从索引中删除属性:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Database 菜单。
  4. 选择后缀条目。
  5. 打开 Indexes 选项卡。
  6. 单击您要删除索引的属性旁边的 Actions 按钮,然后选择 Delete Index
  7. 单击 Yes 以确认。

13.7.3. 使用命令行删除索引类型

例如,要从索引中删除 sn 属性 的子 索引类型:
  1. 删除索引类型:
    # ldapmodify -D "cn=Directory Manager" -W -x
    
    dn: cn=sn,cn=index,cn=database_name,cn=ldbm database,cn=plugins,cn=config
    changetype: modify
    delete: nsIndexType
    nsIndexType: sub
    删除索引条目后,Directory 服务器不再为属性维护子字符串索引。
  2. 重新创建属性索引。请参阅 第 13.3 节 “为现有数据库创建新索引”

13.7.4. 删除浏览器索引

本节论述了如何从数据库中删除浏览条目。

13.7.4.1. 使用命令行删除浏览器索引

字母浏览索引和虚拟列表视图(VLV)的条目相同。本节介绍了删除浏览索引涉及的步骤。
使用命令行删除浏览索引或虚拟列表视图索引:
  1. 从 cn=index ,cn=database_name,cn=ldbm database,cn=plugins,cn=config 条目中删除浏览索引条目。例如:
    # ldapdelete -D "cn=Directory Manager" -W -p 389 -h server.example.com -x "cn=MCC ou=People dc=example dc=com,cn=userRoot,cn=ldbm database,cn=plugins,cn=config" "cn=by MCC ou=People dc=example dc=com,cn=MCC ou=People dc=example dc=com,cn=userRoot,cn=ldbm database,cn=plugins,cn=config"
    删除两个浏览索引条目后,Directory 服务器不再维护这些索引。
  2. 重新创建属性索引。请参阅 第 13.3 节 “为现有数据库创建新索引”

第 14 章 查找目录条目

目录中的条目可以通过命令行或 Web 控制台搜索和找到。

14.1. 使用命令行查找目录条目

您可以使用 ldapsearch 命令行工具搜索目录条目。此工具使用指定的身份和凭证打开到指定服务器的连接,并根据指定的搜索过滤器查找条目。搜索范围可以包括:
  • 单个条目(-s base)
  • 条目即时子条目(-s one)
  • 整个树或子树(-s 子)
注意
常见错误是假定根据可分辨名称中使用的属性搜索目录。区分名称只是目录条目的唯一标识符,不能用作搜索键。相反,请根据条目本身中存储的属性对搜索条目。因此,如果条目的可分辨名称为 uid=bjensen,ou=People,dc=example,dc=com,则搜索 dc=example 不匹配该条目,除非将 dc:example 明确添加为该条目中的属性。
搜索结果以 LDIF 格式返回。LDIF 在 RFC 2849 中定义,在 附录 B, LDAP 数据交换格式 中详细介绍。
本节包含有关以下主题的信息:

14.1.1. ldapsearch 命令行格式

ldapsearch 命令必须使用以下格式:
# ldapsearch [-x | -Y mechanism] [options] [search_filter] [list_of_attributes]
  • -x (使用简单绑定)或 -Y (用于设置 SASL 机制)都必须用于配置连接类型。
  • 选项 是一系列命令行选项。如果使用任何操作,则必须在搜索过滤器前指定它们。
  • search_filter 是一个 LDAP 搜索过滤器,如 第 14.3 节 “LDAP 搜索过滤器” 所述。如果使用 -f 选项指定搜索过滤器,则不要指定单独的搜索过滤器。
  • list_of_attributes 是用空格分开的属性列表。指定属性列表可减少搜索结果中返回的属性数量。此属性列表必须在搜索过滤器后显示。例如,请参阅 第 14.4.6 节 “显示属性的子组”。如果没有指定属性列表,搜索会返回目录中访问控制集允许的所有属性的值,但操作属性除外。
    要使操作属性因为搜索操作而返回,必须在 search 命令中明确指定它们。要返回对象的所有操作属性,请指定 +。要检索除明确指定的操作属性外的常规属性,请在 ldapsearch 命令中的属性列表中使用星号。
    要仅检索匹配的 DN 列表,请使用特殊属性 1.1。例如:
    # ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com \
         -b "dc=example,dc=com" -x "(objectclass=inetorgperson)" 1.1

14.1.2. 常用的 ldapsearch 选项

下表列出了最常用的 ldapsearch 命令行选项。如果指定值包含一个空格(),则该值应用单引号或双引号括起,如 -b "cn=My Special Group,ou=groups,dc=example,dc=com "。
重要
OpenLDAP 的 ldapsearch 工具默认使用 SASL 连接。要执行一个简单的绑定或使用 TLS,请使用 -x 参数来禁用 SASL 并允许其他连接方法。
选项 描述
-b 指定搜索的起点。此处指定的值必须是当前存在于数据库中的可分辨名称。如果 LDAP_BASEDN 环境变量已设置为基本 DN,则这是可选的。此选项中指定的值应该以单引号或双引号形式提供。例如:
-b "cn=user,ou=Product Development,dc=example,dc=com"
要搜索根 DSE 条目,请在此处指定一个空字符串,如 -b ""
-D 指定要向服务器进行身份验证的可分辨名称。如果服务器支持匿名访问,则这是可选的。如果指定,这个值必须是目录服务器可识别的 DN,还必须有相应的授权才能搜索条目。例如,-D "uid=user_name,dc=example,dc=com"
-H
指定用于连接服务器的 LDAP URL。对于传统的 LDAP URL,其格式如下:
ldap[s]://hostname[:port]
端口 是可选的;如果未指定端口,它将使用默认的 389 或 LDAPS 端口 636。
这也可以使用 LDAPI URL,每个元素都由 HTML 十六进制代码 %2F 分隔,而不是正斜杠(/):
ldapi://%2Ffull%2Fpath%2Fto%2Fslapd-example.socket
对于 LDAPI,请指定服务器正在侦听的 LDAPI 套接字的完整路径和文件名。由于这个值解释为 LDAP URL,因此路径中的正斜杠字符(/)必须转义为 URL 转义值 %2F
使用 -H 选项而不是 -h-p
-h 指定安装目录服务器的机器的主机名或 IP 地址。例如,-h server.example.com。如果没有指定主机,则 ldapsearch 将使用 localhost。
注意
目录服务器支持 IPv4 和 IPv6 地址。
-l 指定等待搜索请求完成的最大秒数。例如,-l 300nsslapd-timelimit 属性的默认值为 3600 秒。无论指定的值如何,volume sync 都不会等待的时间超过服务器的 nsslapd-timelimit 属性所允许的时间。
-p 指定 Directory 服务器使用的 TCP 端口号。例如,-p 1049。默认值为 389
如果指定了 -h,还必须指定 -p,即使它给出了默认值。
-s scope 指定搜索的范围。范围可以是以下范围之一:
base 仅搜索 -b 选项中指定的条目,或者由 LDAP_BASEDN 环境变量定义。
一个 仅搜索 -b 选项指定的条目的直接子项。仅搜索子项,不会搜索 -b 选项指定的实际条目。
sub 搜索 -b 选项中指定的条目及其所有后级;即,从 -b 选项中标识的点执行子树搜索。这是默认值。
-W
提示输入密码。如果没有设置这个选项,则使用匿名访问。
或者,使用 -w 选项将密码传递给实用程序。请注意,可以在用户的进程列表中看到密码,并保存在 shell 的历史记录中。
-x 禁用默认 SASL 连接以允许简单的绑定。
-Y SASL_mechanism
设置用于身份验证的 SASL 机制。如果没有设置机制,则 ldapsearch 会选择服务器支持的最佳机制。
如果没有使用 -x,则必须使用 -Y 选项。
-z number 设置在响应搜索请求时返回的最大条目数。在使用 root DN 绑定时,这个值会覆盖 server-side nsslapd-sizelimit 参数。

14.1.3. 使用特殊 Characters

使用 ldapsearch 命令行工具时,可能需要指定包含对命令行解释器有特殊含义的字符的值,如空格()、星号或反斜杠(\)。在引号("")中包含特殊字符的值。例如:
-D "cn=user_name,ou=Product Development,dc=example,dc=com"
根据命令行解释器,使用单引号或双引号。通常,使用单引号(')括起值。使用双引号(")),在有 shell 变量时允许变量插入。如需更多信息,请参阅操作系统文档。

14.2. 使用 Web 控制台查找条目

您可以使用 Web 控制台中的 LDAP 浏览器搜索目录服务器数据库中的条目。
目录服务器根据条目中存储的属性值对搜索条目,而不是根据这些条目的可分辨名称(DN)中使用的属性。例如,如果条目带有一个 uid=user_name,ou=People,dc=example,dc=com DN,则在搜索 dc=example 时仅会在 dc:example 属性存在于这个条目中时才匹配条目。

先决条件

  • 已登陆到 Directory Server web 控制台。
  • 您有 root 权限。

流程

  1. 在 Web 控制台中,导航到 LDAP 浏览器搜索
  2. 展开并选择过滤条目的搜索条件:

    表 14.1. 默认索引属性

    搜索参数 描述
    搜索基础
    指定搜索的起点。它是当前存在于数据库中的可分辨名称(DN)。
    注意
    当您在 Tree ViewTable View 中打开条目详细信息时,会打开带有预定义的搜索基础的 Search 标签页,点 Options 菜单(IANA) 并选择 Search
    搜索范围
    选择 Subtree来搜索整个子树中的条目,从搜索基础开始,并包含所有子条目。
    从搜索基础开始选择一个 级别 来搜索条目,仅包含第一个子条目级别。
    选择 Base 来仅在指定为搜索基础的条目中搜索属性值。
    大小限制
    设置一个搜索操作可以返回的最大条目数。
    时间限制
    设置搜索引擎可以查找条目的时间(以秒为单位)。
    显示锁定
    切换到 on 以查看找到条目的锁定状态。
    搜索属性
    选择搜索中部分的属性。您可以从预定义的属性中选择并添加自定义属性。
  3. 在搜索文本字段中输入属性值,然后按 Enter 键。
    注意
    目录服务器将所有搜索请求记录到访问日志文件,您可以在 MonitoringLoggingAccess Log 中查看。
  4. 可选: 要进一步重新定义搜索,请使用 Filter 选项卡中的搜索过滤器来搜索条目。

14.3. LDAP 搜索过滤器

搜索过滤器选择要为搜索操作返回的条目。它们最常与 ldapsearch 命令行工具一起使用。使用 ldapsearch 时,文件中可以有多个搜索过滤器,每个过滤器在文件中的单独行中,或者直接在命令行中指定搜索过滤器。
搜索过滤器的基本语法为:
attribute operator value 
例如:
buildingname>=alpha
在本例中,build name 是属性,& gt;= 是 operator,alpha 是值。也可以定义过滤器,将不同的属性与布尔值运算符结合使用。
注意
使用匹配的规则过滤器执行子字符串搜索时,请使用星号 nologin 字符作为通配符来表示零个或更多字符。
例如,若要搜索以字母 l 开头,并以字母 n 结尾的属性值,请在搜索过滤器的值部分输入 lbangn。类似地,若要搜索以字母 u 开头的所有属性值,请在搜索过滤器的值部分输入值 u the。
要搜索包含星号字符的值,必须使用指定的转义序列 \5c2a 转义星号。例如,要搜索所有 businessCategory 属性值为 Example*Net product line 的员工,在搜索过滤器中输入以下值:
Example\5c2a*Net product line
注意
常见错误是假定根据可分辨名称中使用的属性搜索目录。区分名称只是目录条目的唯一标识符,不能用作搜索键。相反,请根据条目本身中存储的属性对搜索条目。因此,如果条目的可分辨名称为 uid=user_name,ou=People,dc=example,dc=com,则搜索 dc=example 不匹配该条目,除非该条目中存在 dc 属性,并将其设置为 example

14.3.1. 使用搜索过滤器中的属性

最基本的搜索类型查找条目中是否存在属性或特定值。如何查找 条目中的属性有很多变化。可以根据需要检查属性是否存在、匹配准确值,或者列出与部分值匹配的属性。
存在 搜索使用通配符(星号)返回具有该属性设置的每个条目,而不考虑值。例如,这会返回具有 manager 属性的每个条目:
"(manager=*)"
也可以搜索具有特定值的属性;这称为 相等的 搜索。例如:
"(cn=example)"
此搜索过滤器返回包含设置为 example 的所有条目。大多数时间,相等搜索都不区分大小写。
当属性具有与语言标签关联的值时,会返回所有值。因此,以下两个属性值都与 " (cn=example) " 过滤器匹配:
cn: example
cn;lang-fr: example
也可以在属性值上搜索部分匹配项,即 子字符串 索引。例如:
"(description=*X.500*)"
"(sn=*nderson)"
"(givenname=car*)"
子字符串搜索的长度在子字符串索引本身中配置,如 第 13.6 节 “更改索引子字符串搜索的 Width” 所述。

14.3.2. 在搜索过滤器中使用 Operator

搜索过滤器中的 operator 会设置属性和给定搜索值之间的关系。对于人搜索,操作员可用于设置范围,以在位于特定数字后的字母数或员工号码的字母子集中返回姓氏。
"(employeeNumber>=500)"
"(sn~=suret)"
"(salary<=150000)"
Operator 还支持电话号码和大约搜索,允许更有效的搜索信息,并在国际化中特别有用。
可用于搜索过滤器的 Operator 在 表 14.2 “搜索过滤器 Operator” 中列出。除了这些搜索过滤器外,还可指定特殊的过滤器来使用首选语言合并顺序。有关如何使用国际字符集搜索目录的详情,请参考 第 D.4 节 “搜索国际目录”

表 14.2. 搜索过滤器 Operator

搜索类型 Operator 描述
相等 = 返回包含与指定的值完全匹配的条目。例如,cn=example
子字符串 =string* string 返回包含包含指定子字符串的属性的条目。例如,cn=exa*l。星号 (*) 表示零 (0) 或多个字符。
大于或等于 >= 返回包含大于或等于指定的值的属性的条目。例如,uidNumber >= 5000
小于或等于 <= 返回包含小于或等于指定的值的属性的条目。例如,uidNumber <= 5000
存在 =* 返回包含指定属性的一个或多个值的条目。例如: cn= the
大约 ~= 返回包含指定属性的条目,其值大约等于搜索过滤器中指定的值。例如,l~=san fransico 可以返回 l=san francisco

14.3.3. 使用复合搜索过滤器

可以使用布尔值运算符组合多个搜索过滤器组件,如下所示:
(Boolean-operator(filter)(filter)(filter)...)
boolean-operator表 14.3 “搜索过滤器布尔值 Operator” 中列出的任何布尔值运算符。
例如,此过滤器返回不包含指定的值的所有条目:
(!(objectClass=person))
最好,当将复合搜索过滤器嵌套到已完成的表达式中时,复合搜索过滤器最有用:
(Boolean-operator(filter)((Boolean-operator(filter)(filter)))
这些复合过滤器可以与其他类型的搜索(大约、子字符串、其他运算符)相结合,以获得非常详细的结果。例如,这个过滤器返回其机构单元为过期 且其 description 属性不包含子字符串 X.500 的所有条目:
(&(ou=Marketing)(!(description=*X.500*)))
可以展开该过滤器,以返回其机构单元为 Marketing,没有子字符串 X.500,并且 exampledemo 设置为 manager 的条目:
(&(ou=Marketing)(!(description=*X.500*))(|(manager=cn=example,ou=Marketing,dc=example,dc=com)(manager=cn=demo,ou=Marketing,dc=example,dc=com)))
此过滤器返回没有代表个人且其通用名称与 printer3b 类似的所有条目:
(&(!(objectClass=person))(cn~=printer3b))

表 14.3. 搜索过滤器布尔值 Operator

Operator 符号 描述
& 所有指定的过滤器都必须为 true,才能为 true。例如,(& (filter) (filter) (filter)...)
或者 | 至少一个指定的过滤器必须为 true,声明必须为 true。例如,(|(filter) (filter) (filter)...)
! 对于该语句,指定语句不能为 true。只有一个过滤器会受到 not 运算符 的影响。例如,(!(filter)).
布尔值表达式会按照以下顺序评估:
  • 首先,Innerest to outerest 父项表达式。
  • 从左到右的所有表达式。

14.3.4. 使用匹配规则

匹配的规则 告知 Directory 服务器如何比较两个值(存储在属性中的值和搜索过滤器中的值)。匹配的规则还定义了如何生成索引密钥。匹配规则与属性语法稍有相关。语法定义 属性值 的格式;匹配规则定义如何比较和索引格式。
有三种不同类型的匹配规则:
  • EQUALITY 指定如何比较相等匹配项的两个值。例如,如何处理 "Fred" 和 "FRED" 等字符串。测试相等性(例如 attribute=value)的搜索过滤器使用 EQUALITY 规则。相等(eq)索引使用 EQUALITY 规则来生成索引密钥。更新操作使用 EQUALITY 规则将要更新的值与条目中已存在的值进行比较。
  • ORDERING 指定如何比较两个值来查看一个值是否大于另一个值。搜索过滤器,使用 ORDERING 规则设置一个范围(例如 attribute<=valueattribute>=value)。具有 ORDERING 规则顺序的属性的索引对相等的值进行排序。
  • SUBSTR 指定如何进行子字符串匹配。子字符串搜索过滤器(例如,attribute=rhcspartial_string )或 attribute= theend_string)使用 SUBSTR 规则。子字符串(sub)索引使用 SUBSTR 规则来生成索引密钥。
重要
需要匹配的规则来支持搜索或索引对应的搜索过滤器或索引类型。例如,属性必须具有 EQUALITY 匹配规则,才能支持该属性的相等搜索过滤器和 eq 索引。属性必须具有 ORDERING 匹配规则和一个 EQUALITY 匹配规则,以支持范围搜索过滤器和索引范围搜索。
如果尝试对没有对应匹配规则的属性使用搜索过滤器,搜索操作将被拒绝,并带有 PROTOCOL_ERROR 或 UNWILLING_TO_PERFORM。

例 14.1. 匹配规则和自定义属性

示例 company. 管理员使用 IA5 String (7-bit ASCII)语法创建一个名为 MyFirstName 的自定义属性类型,以及 caseExactIA5Match 的 EQUALITY 匹配规则。带有 Fred 的值为 MyFirstName 的条目会在带有 (MyFirstName=Fred) 过滤器的搜索中返回,但在如 (MyFirstName=FRED)(MyFirstName=fred) Fred, FRED 过滤器的搜索中不会返回,fred 时所有有效的 IA5 字符串值,但它们不匹配使用 caseExactIA5Match 规则。
对于搜索中要返回的所有三个变体,应定义 MyFirstName 以使用 caseIgnoreIA5Match 匹配规则。
可以使用可扩展匹配规则搜索过滤器搜索属性值,其匹配规则与为属性定义的匹配规则不同。匹配的规则必须与正在搜索的属性的语法兼容。例如,若要对定义了区分大小写的匹配规则的属性运行不区分大小写的搜索,请在搜索过滤器中指定区分大小写的匹配规则。
(MyFirstName:caseIgnoreIA5Match:=fred)
注意
匹配规则用于在国际化中搜索,以指定结果要使用的语言类型。这在 第 D.4 节 “搜索国际目录” 中阐述。
注意
属性的索引使用为其 schema 定义中为该属性定义的任何匹配规则。可以使用 nsMatchingRule 属性配置用于索引的其他匹配规则,如 第 13.2.1 节 “使用命令行创建索引” 中所示。
匹配规则过滤器的语法将匹配的规则名称或 OID 插入到搜索过滤器中:
attr:matchingRule:=value
  • attr 是属于正在搜索的条目的属性,如 cnmail
  • matchingRule 是一个字符串,其中包含规则的名称或 OID,用于根据所需语法匹配属性值。
  • value 是要搜索的属性值,也可以是要搜索的属性值。过滤器值的语法取决于使用的匹配规则格式。
匹配的规则实际上是一个 schema 元素,因为其他架构元素由对象标识符(OID)唯一标识。
为红帽目录服务器定义的许多匹配规则与语言代码相关,并设置目录服务器支持的国际化。例如,OID 2.16.840.1.113730.3.3.2.17.1 标识 Finnish collation order。
注意
与其他架构元素不同,无法将其他匹配规则添加到目录服务器配置中。
以下列表中的大多数匹配规则列表都用于相等索引。使用名称中的 排序 匹配规则用于排序索引,且名称中带有 子字符串的子字符串 用于子字符串(SUBSTR)索引。(用于国际匹配和合并顺序的匹配规则使用不同的命名方案。)
位 AND 匹配
执行位 AND 匹配。
OID: 1.2.840.113556.1.4.803
兼容语法:与整数和数字字符串一起使用。目录服务器自动将数字字符串转换为整数。
位 OR 匹配
执行位 OR 匹配。
OID: 1.2.840.113556.1.4.804
兼容语法:与整数和数字字符串一起使用。目录服务器自动将数字字符串转换为整数。
booleanMatch
评估要匹配的值是 TRUE 还是 FALSE
OID: 2.5.13.13
兼容语法:布尔值
caseExactIA5Match
对值进行区分大小写的比较。
OID: 1.3.6.1.4.1.1466.109.114.1
兼容语法: IA5 语法、URI
caseExactMatch
对值进行区分大小写的比较。
OID: 2.5.13.5
兼容语法:目录字符串、可打印字符串、OID
caseExactOrderingMatch
允许区分大小写的搜索(小于和大于)。
OID: 2.5.13.6
兼容语法:目录字符串、可打印字符串、OID
caseExactSubstringsMatch
执行区分大小写的子字符串和索引搜索。
OID: 2.5.13.7
兼容语法:目录字符串、可打印字符串、OID
caseIgnoreIA5Match
执行不区分大小写的值比较。
OID: 1.3.6.1.4.1.1466.109.114.2
兼容语法: IA5 语法、URI
caseIgnoreIA5SubstringsMatch
对子字符串和索引执行不区分大小写的搜索。
OID: 1.3.6.1.4.1.1466.109.114.3
兼容语法: IA5 语法、URI
caseIgnoreListMatch
执行不区分大小写的值比较。
OID: 2.5.13.11
兼容语法:后地址
caseIgnoreListSubstringsMatch
对子字符串和索引执行不区分大小写的搜索。
OID: 2.5.13.12
兼容语法:后地址
caseIgnoreMatch
执行不区分大小写的值比较。
OID: 2.5.13.2
兼容语法:目录字符串、可打印字符串、OID
caseIgnoreOrderingMatch
允许区分大小写的搜索(小于和大于)。
OID: 2.5.13.3
兼容语法:目录字符串、可打印字符串、OID
caseIgnoreSubstringsMatch
对子字符串和索引执行不区分大小写的搜索。
OID: 2.5.13.4
兼容语法:目录字符串、可打印字符串、OID
distinguishedNameMatch
比较可分辨名称值。
OID: 2.5.13.1
兼容语法:区分名称(DN)
generalizedTimeMatch
以 Generalized Time 格式的比较值。
OID: 2.5.13.27
兼容语法:常规化时间
generalizedTimeOrderingMatch
对于处于 Generalized Time 格式的值,允许范围搜索(无或大于)。
OID: 2.5.13.28
兼容语法:常规化时间
integerMatch
评估整数值。
OID: 2.5.13.14
兼容语法:整数
integerOrderingMatch
在整数值上允许范围搜索(无和大于)的搜索。
OID: 2.5.13.15
兼容语法:整数
keywordMatch
将给定的搜索值与属性值中的字符串进行比较。
OID: 2.5.13.33
兼容语法:目录字符串
numericStringMatch
比较更多常规数字值。
OID: 2.5.13.8
兼容语法:Numeric String
numericStringOrderingMatch
在更常规的数字值上允许范围搜索(无或大于)
OID: 2.5.13.9
兼容语法:Numeric String
numericStringSubstringMatch
比较更多常规数字值。
OID: 2.5.13.10
兼容语法:Numeric String
objectIdentifierMatch
比较对象标识符(OID)值。
OID: 2.5.13.0
兼容语法:OID
octetStringMatch
评估 octet 字符串值。
OID: 2.5.13.17
兼容语法:Octet 字符串
octetStringOrderingMatch
在一系列 octet 字符串值上支持范围搜索(无或大于)。
OID: 2.5.13.18
兼容语法:Octet 字符串
telephoneNumberMatch
评估电话号码值。
OID: 2.5.13.20
兼容语法:全球电话号码
telephoneNumberSubstringsMatch
对电话号码值执行子字符串和索引搜索。
OID: 2.5.13.21
兼容语法:全球电话号码
uniqueMemberMatch
比较 name 和 UID 值。
OID: 2.5.13.23
兼容语法:名称和可选 UID
wordMatch
将给定的搜索值与属性值中的字符串进行比较。这个匹配规则不区分大小写。
OID: 2.5.13.32
兼容语法:目录字符串

表 14.4. 语言排序匹配规则

匹配规则 对象标识符(OID)
英语(Case Exact Ordering Match) 2.16.840.1.113730.3.3.2.11.3
Albanian (Case Insensitiveing Match) 2.16.840.1.113730.3.3.2.44.1
Arabic (Case Insensitiveing Match) 2.16.840.1.113730.3.3.2.1.1
Belorussian (Case Insensitive Ordering Match) 2.16.840.1.113730.3.3.2.2.1
Bulgarian (覆盖顺序匹配) 2.16.840.1.113730.3.3.2.3.1
Catalan (Case Insensitive Ordering Match) 2.16.840.1.113730.3.3.2.4.1
中文 - 简体(敏感顺序匹配) 2.16.840.1.113730.3.3.2.49.1
中文 - 繁体(覆盖顺序匹配) 2.16.840.1.113730.3.3.2.50.1
Croatian (覆盖顺序匹配) 2.16.840.1.113730.3.3.2.22.1
Czech (覆盖顺序匹配) 2.16.840.1.113730.3.3.2.5.1
Danish (覆盖顺序匹配) 2.16.840.1.113730.3.3.2.6.1
Dutch (Case Insensitiveing Match) 2.16.840.1.113730.3.3.2.33.1
Dutch - Belgian (Case Insensitive Ordering Match) 2.16.840.1.113730.3.3.2.34.1
英语 - 美国(敏感顺序匹配) 2.16.840.1.113730.3.3.2.11.1
English - Canadian (Case Insensitiveing Match) 2.16.840.1.113730.3.3.2.12.1
英语 - Irish (覆盖顺序匹配) 2.16.840.1.113730.3.3.2.14.1
Estonian (Case Insensitiveing Match) 2.16.840.1.113730.3.3.2.16.1
Finnish (Case Insensitiveing Match) 2.16.840.1.113730.3.3.2.17.1
法语(覆盖顺序匹配) 2.16.840.1.113730.3.3.2.18.1
法语 - Belgian (Case Insensitive Ordering Match) 2.16.840.1.113730.3.3.2.19.1
法语 - Canadian (覆盖顺序匹配) 2.16.840.1.113730.3.3.2.20.1
法语 - Swiss (Case Insensitive Ordering Match) 2.16.840.1.113730.3.3.2.21.1
法国(覆盖顺序匹配) 2.16.840.1.113730.3.3.2.7.1
俄罗斯 - Austrian (Case Insensitive Ordering Match) 2.16.840.1.113730.3.3.2.8.1
德语 - Swiss (覆盖顺序匹配) 2.16.840.1.113730.3.3.2.9.1
Greek (敏感顺序匹配) 2.16.840.1.113730.3.3.2.10.1
Hebrew (Case Insensitiveing Match) 2.16.840.1.113730.3.3.2.27.1
Hungarian (Case Insensitiveing Match) 2.16.840.1.113730.3.3.2.23.1
Icelandic (Case Insensitive Ordering Match) 2.16.840.1.113730.3.3.2.24.1
意大利语(覆盖顺序匹配) 2.16.840.1.113730.3.3.2.25.1
意大利语 - Swiss (敏感顺序匹配) 2.16.840.1.113730.3.3.2.26.1
日语(覆盖顺序匹配) 2.16.840.1.113730.3.3.2.28.1
韩语(覆盖顺序匹配) 2.16.840.1.113730.3.3.2.29.1
Latvian, Lettish (Case Insensitive Ordering Match) 2.16.840.1.113730.3.3.2.31.1
Lithuanian (覆盖顺序匹配) 2.16.840.1.113730.3.3.2.30.1
Macedonian (Case Insensitiveing Match) 2.16.840.1.113730.3.3.2.32.1
Norwegian (Case Insensitiveing Match) 2.16.840.1.113730.3.3.2.35.1
Norwegian - Bokmul (Case Insensitive Ordering Match) 2.16.840.1.113730.3.3.2.36.1
Norwegian - Nynorsk (Case Insensitive Ordering Match) 2.16.840.1.113730.3.3.2.37.1
polish (覆盖顺序匹配) 2.16.840.1.113730.3.3.2.38.1
Romanian (Case Insensitiveing Match) 2.16.840.1.113730.3.3.2.39.1
俄罗斯(覆盖顺序匹配) 2.16.840.1.113730.3.3.2.40.1
Serbian - Cyrillic (Case Insensitive Ordering Match) 2.16.840.1.113730.3.3.2.45.1
Serbian - 英语(覆盖顺序匹配) 2.16.840.1.113730.3.3.2.41.1
Slovak (覆盖顺序匹配) 2.16.840.1.113730.3.3.2.42.1
Slovenian (覆盖顺序匹配) 2.16.840.1.113730.3.3.2.43.1
西班牙语(覆盖顺序匹配) 2.16.840.1.113730.3.3.2.15.1
Swedish (Case Insensitiveing Match) 2.16.840.1.113730.3.3.2.46.1
Turkish (覆盖顺序匹配) 2.16.840.1.113730.3.3.2.47.1
Ukrainian (Case Insensitiveing Match) 2.16.840.1.113730.3.3.2.48.1

表 14.5. 语言子字符串匹配规则

匹配规则 对象标识符(OID)
英语(Case Exact Substring 匹配) 2.16.840.1.113730.3.3.2.11.3.6
Albanian (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.44.1.6
Arabic (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.1.1.6
Belorussian (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.2.1.6
Bulgarian (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.3.1.6
Catalan (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.4.1.6
中文 - 简体(敏感子字符串匹配) 2.16.840.1.113730.3.3.2.49.1.6
中文 - 繁体(覆盖子字符串匹配) 2.16.840.1.113730.3.3.2.50.1.6
Croatian (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.22.1.6
Czech (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.5.1.6
Danish (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.6.1.6
Dutch (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.33.1.6
Dutch - Belgian (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.34.1.6
英语 - 美国(敏感子字符串匹配) 2.16.840.1.113730.3.3.2.11.1.6
English - Canadian (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.12.1.6
英语 - Irish (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.14.1.6
Estonian (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.16.1.6
Finnish (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.17.1.6
法语(敏感子字符串匹配) 2.16.840.1.113730.3.3.2.18.1.6
法语 - Belgian (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.19.1.6
法语 - Canadian (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.20.1.6
法语 - Swiss (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.21.1.6
德语(敏感子字符串匹配) 2.16.840.1.113730.3.3.2.7.1.6
俄罗斯 - Austrian (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.8.1.6
Swis - Swiss (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.9.1.6
Greek (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.10.1.6
Hebrew (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.27.1.6
Hungarian (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.23.1.6
Icelandic (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.24.1.6
意大利语(Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.25.1.6
意大利语 - Swiss (敏感子字符串匹配) 2.16.840.1.113730.3.3.2.26.1.6
日语(覆盖子字符串匹配) 2.16.840.1.113730.3.3.2.28.1.6
韩语(敏感子字符串匹配) 2.16.840.1.113730.3.3.2.29.1.6
Latvian, Lettish (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.31.1.6
Lithuanian (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.30.1.6
Macedonian (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.32.1.6
Norwegian (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.35.1.6
Norwegian - Bokmul (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.36.1.6
Norwegian - Nynorsk (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.37.1.6
polish (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.38.1.6
Romanian (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.39.1.6
俄罗斯(敏感子字符串匹配) 2.16.840.1.113730.3.3.2.40.1.6
Serbian - Cyrillic (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.45.1.6
Serbian - 英语(覆盖子字符串匹配) 2.16.840.1.113730.3.3.2.41.1.6
Slovak (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.42.1.6
Slovenian (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.43.1.6
西班牙语(敏感子字符串匹配) 2.16.840.1.113730.3.3.2.15.1.6
Swedish (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.46.1.6
Turkish (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.47.1.6
Ukrainian (Case Insensitive Substring Match) 2.16.840.1.113730.3.3.2.48.1.6

14.4. Common ldapsearches 示例

下一个示例假设如下:
  • 搜索是目录中所有条目的搜索。
  • 目录被配置为支持匿名搜索和读取。这意味着,不需要提供绑定信息才能执行搜索。有关匿名访问的详情,请参考 第 18.11.1.1.3 节 “授予匿名访问权限”
  • 服务器位于名为 server.example.com 的主机上。
  • 服务器使用端口号 389。由于这是默认端口,因此不必在搜索请求中发送端口号。
  • 为端口 636 上的服务器启用 TLS (默认的 LDAPS 端口号)。
  • 存储所有数据的后缀都是 dc=example,dc=com

14.4.1. 返回所有条目

根据前面的信息,以下调用将返回目录中的所有条目(可能到配置的大小和时间资源限值):
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -b "dc=example,dc=com" -s sub -x "(objectclass=*)"
"objectClass= the"是与目录中任何条目的搜索过滤器。由于每个条目都必须具有对象类,并且 objectclass 属性始终被索引,因此这是一个有用的搜索过滤器,用于返回每个条目。

14.4.2. 在命令行中指定搜索过滤器

只要过滤器用引号("filter")括起,就可以在命令行中直接指定搜索过滤器。如果过滤器通过命令提供,请不要指定 -f 选项。例如:
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -b "dc=example,dc=com" -s sub -x "cn=babs jensen"

14.4.3. 搜索根 DSE 条目

root DSE 是一个特殊的条目,其中包含目录服务器实例的信息,包括本地目录服务器支持的所有后缀。可通过提供搜索基础 ""、基础范围 base, 和过滤器 "objectclass=*"。例如:
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -x -b "" -s base "objectclass=*"

14.4.4. 搜索 Schema 条目

cn=schema 条目是一个特殊的条目,其中包含有关目录模式的信息,如对象类和属性类型。
以下命令列出 cn=schema 条目的内容:
# ldapsearch -o ldif-wrap=no -D "cn=Directory Manager" -W -b "cn=schema" \
    '(objectClass=subSchema)' -s sub objectClasses attributeTypes matchingRules \
    matchingRuleUse  dITStructureRules nameForms ITContentRules ldapSyntaxes

14.4.5. 使用 LDAP_BASEDN

要更轻松地搜索搜索,可以使用 LDAP_BASEDN 环境变量设置搜索基础。这样做意味着,无需使用 -b 选项设置搜索基础。有关如何设置环境变量的详情,请参考操作系统的文档。
通常,将 LDAP_BASEDN 设置为目录的后缀值。由于目录后缀等于根目录或最顶层的条目,因此会导致所有搜索都从目录的 root 条目开始。
例如,将 LDAP_BASEDN 设置为 dc=example,dc=com,并在目录中搜索 cn=babs jensen,使用以下命令行调用:
# export LDAP_BASEDN="dc=example,dc=com"

# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -x "cn=babs jensen"
在本例中,使用了 sub 的默认范围,因为 -s 选项没有指定范围。

14.4.6. 显示属性的子组

ldapsearch 命令以 LDIF 格式返回所有搜索结果。默认情况下,ldapsearch 返回条目的可分辨名称和允许用户读取的所有属性。可以设置目录访问控制,以便用户只能读取任何给定目录条目的属性子集。仅返回操作属性。对于作为搜索操作返回的操作属性,请在 search 命令中明确指定它们,或使用 + 返回所有操作属性。
对于搜索结果返回的条目的所有属性,可能不需要这样做。通过在搜索过滤器后马上在命令行中指定所需的属性,可以将返回的属性限制为只有几个特定的属性。例如,要显示目录中每个条目的 cnsn 属性,请使用以下命令行调用:
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -b "dc=example,dc=com" -s sub -x "(objectclass=*)" sn cn

14.4.7. 搜索过期属性

操作属性是由目录服务器本身设置的特殊属性,供服务器用于执行维护任务,如处理访问控制指令。它们还显示有关条目的特定信息,如最初创建的时间以及创建它的用户的名称。操作属性可用于目录中的每个条目,无论是否为条目的对象类特别定义属性。
常规 ldapsearch 不会返回操作属性。根据 RFC3673,使用 + 返回搜索请求中的所有操作属性:
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -b "dc=example,dc=com" -s sub -x "(objectclass=*)" '+'
要只返回一些定义的操作属性,请在 ldapsearch 请求中明确指定它们:
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -b "dc=example,dc=com" -s sub -x "(objectclass=*)" creatorsName createTimestamp modifiersName modifyTimestamp
操作属性的完整列表请参见 红帽目录服务器 11 配置、命令和文件参考 中的"操作属性和对象类"一章。
注意
要返回所有常规条目属性以及指定的操作属性,除了列出的操作属性外,还使用特殊的搜索属性 "*"
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -b "dc=example,dc=com" -s sub -x "(objectclass=*)" "*" aci
星号必须用引号括起来,以防止 shell 解释它。

14.4.8. 使用文件指定搜索过滤器

可以在文件中输入搜索过滤器,而不是在命令行中输入它们。在这种情况下,在文件中的单独行中指定每个搜索过滤器。ldapsearch 命令以文件中显示的顺序运行每个搜索。
例如:
sn=example
givenname=user
ldapsearch 首先找到将 surname 设置为 example 的所有条目,然后将 givenname 设置为 user 的所有条目。如果找到与两个搜索条件匹配的条目,则返回两次。
例如,在这个搜索中,过滤器在名为 searchdb 的文件中指定:
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -x -f searchdb
这里返回的属性集合可以通过指定搜索行末尾的属性名称来限制。例如,以下 ldapsearch 命令同时执行搜索,但只返回每个条目的 DN 和 givennamesn 属性:
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -x -f searchdb sn givenname

14.4.9. 指定在搜索过滤器中包含 Commas 的 DN

当搜索过滤器中的 DN 包含逗号作为其值的一部分时,必须使用反斜杠(\)转义逗号。例如,要查找 example.com Bolivia、S.A. 子树中的任何人,请使用以下命令:
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -x -s base -b "l=Bolivia\,S.A.,dc=example,dc=com" "objectclass=*"

14.4.10. 使用客户端证书绑定到目录服务器

14.4.11. 使用语言匹配规则搜索

要在搜索过滤器中显式提交匹配的规则,请在属性后插入匹配的规则:
attr:matchingRule:=value
匹配规则通常用于搜索国际化目录。例如,这会在 Swedish (2.16.840.1.113730.3.3.2.46.1)匹配规则中的 N4709 后搜索部门号。
departmentNumber:2.16.840.1.113730.3.3.2.46.1:=>= N4709
第 D.4 节 “搜索国际目录” 中提供了有关执行国际化搜索的更多示例。

14.4.12. 使用 Bit 字段值搜索属性

位搜索使用位 AND 或位 OR 匹配规则对属性执行位搜索操作,并带有位字段的值。
注意
在 LDAP 中,带有位字段值的属性不常见。(没有默认的 Directory Server 模式使用位字段作为属性语法。) 但是,几个 LDAP 语法支持以整数样式的值。可以定义使用位字段值的自定义属性,应用程序可以使用这些自定义属性对位字段值执行位操作。
位 AND 匹配规则(1.2.840.113556.1.4.803)检查断言值中是否设置了位。(这与相等的搜索类似。) 在本例中,userAccountControl 值必须设置为代表 2 的位。
"(UserAccountControl:1.2.840.113556.1.4.803:=2)"
在本例中,userAccountControl 值必须具有值 6 设置的所有位(位 2 和 4)。
"(UserAccountControl:1.2.840.113556.1.4.803:=6)”
位 OR 匹配规则(1.2.840.113556.1.4.804)检查断言字符串 中的任何 位是否在属性值中表示。(这与子字符串搜索类似。) 在本例中,userAccountControl 值必须具有在 6 位字段中设置的任何位,表示属性值可以是 2、4 或 6。
"(UserAccountControl:1.2.840.113556.1.4.804:=6)"
位搜索可与 Windows-Red Hat Enterprise Linux 集成(如使用 Samba 文件服务器)一起使用。

14.5. 通过资源限制提高搜索性能

使用大型目录时,搜索数据库中的每个条目可能会对服务器性能造成负面影响。有效索引在某些情况下可提高性能。但是,在大型数据库中,这不一定减少了足够减少搜索范围,以提高性能。
可以在用户和客户端帐户上设置合理的限制,以减少条目总数或单独搜索中花费的总时间,它们都可以使搜索更多响应并改进整体服务器性能。
搜索操作的服务器限制通过客户端应用程序绑定到目录的特殊操作属性值来控制。您可以设置以下搜索操作限制:
  • 查看限制。指定可以为搜索操作检查多少条目。
  • 大小限制。指定服务器返回到客户端应用程序的最大条目数,以响应搜索操作。
  • 时间限制。指定服务器处理搜索操作的最大时间。
  • 闲置超时。指定在连接被丢弃前与服务器的连接闲置的时间。
  • 范围超时。指定一个单独的查找限制,专门用于使用范围进行搜索。
为客户端应用程序设置的资源限值优先于全局服务器配置中设置的默认资源限值。
注意
Directory Manager 默认接收无限资源,但范围搜索除外。

14.5.1. 搜索性能和资源限制

详情请查看 红帽目录服务器性能调优指南 中的相应部分。

14.5.2. 精细 ID 列表大小

详情请查看 红帽目录服务器性能调优指南 中的相应部分。

14.5.3. 使用命令行设置用户和全局资源限值

通过命令行,管理员可以为特定类型的搜索设置用户级别资源限值、全局资源限值和限值,如简单页面和范围搜索。第 13.1.3 节 “搜索算法概述” 包含有关这些资源限值对目录服务器搜索性能的影响的更多信息。
第 14.5.3 节 “使用命令行设置用户和全局资源限值” 列出可通过命令行为每个条目设置的操作属性。使用 ldapmodify 将属性添加到条目。
用户级属性在单独的条目上设置,而全局配置属性则在适当的服务器配置区中设置。
备用限制
指定搜索操作检查多少条目。为此属性指定 -1 表示没有限制。
  • 用户级属性: nsLookThroughLimit
  • 全局配置:
    • attribute: nsslapd-certificationthroughlimit
    • entry: cn=config,cn=ldbm database,cn=plugins,cn=config
页面查找限制
与查找限制一样,指定要检查多少条目,但专门用于简单的页面搜索操作。为此属性指定 -1 表示没有限制。
  • User-level 属性: nsPagedLookThroughLimit
  • 全局配置:
    • attribute: nsslapd-pagedCONTROLLERthroughlimit
    • entry: cn=config,cn=ldbm database,cn=plugins,cn=config
大小限制
指定服务器返回到客户端应用程序的最大条目数,以响应搜索操作。为此属性指定 -1 表示没有限制。
  • user-level attribute: nsSizeLimit
  • 全局配置:
    • attribute: nsslapd-sizelimit
    • entry: cn=config
页面大小限制
与大小限制一样,指定服务器返回到客户端应用程序但仅适用于简单页面搜索操作的最大条目数。为此属性指定 -1 表示没有限制。
  • user-level 属性: nsPagedSizeLimit
  • 全局配置:
    • attribute: nsslapd-pagedsizelimit
    • entry: cn=config
时间限制
指定服务器处理搜索操作的最大时间。为此属性指定 -1 表示没有时间限制。
  • user-level 属性: nsTimeLimit
  • 全局配置:
    • attribute: nsslapd-timelimit
    • entry: cn=config
闲置超时
指定在连接被丢弃前与服务器的连接闲置的时间。该值以秒为单位。为此属性指定 -1 表示没有限制。
  • user-level 属性: nsidletimeout
  • 全局配置:
    • attribute: nsslapd-idletimeout
    • entry: cn=config
ID 列表扫描限制
指定从索引文件中载入的最大条目 ID 数,用于搜索结果。如果 ID 列表大小大于这个值,搜索将不会使用索引列表,而是将搜索视为未索引的搜索并查找整个数据库。
  • 用户级属性: nsIDListScanLimit
  • 全局配置:
    • attribute: nsslapd-idlistscanlimit
    • entry: cn=config,cn=ldbm database,cn=plugins,cn=config
页面 ID 列表扫描限制
与 ID 列表扫描限制一样,指定从索引文件中载入的最大条目 ID 数,但特别是针对页面搜索操作。
  • user-level 属性: nsPagedIDListScanLimit
  • 全局配置:
    • attribute: nsslapd-pagedidlistscanlimit
    • entry: cn=config,cn=ldbm database,cn=plugins,cn=config
范围查找限制
指定为范围搜索操作检查多少条目(使用 greater-than, equal-to-or-greater-than, less-than, 或 equal-to-less-than 运算符)。为此属性指定 -1 表示没有限制。
  • 用户级别属性:不可用
  • 全局配置:
    • attribute: nsslapd-rangelocatedthroughlimit
    • entry: cn=config,cn=ldbm database,cn=plugins,cn=config
有关以上列出的参数的详情,请查看 Red Hat Directory Server Configuration、命令和文件参考 中的描述。
例如,这会为用户设置大小限制:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user_name,ou=People,dc=example,dc=com
changetype: modify
add: nsSizeLimit
nsSizeLimit: 500
ldapmodify 语句将 nsSizeLimit 属性添加到用户条目中,并为它指定搜索返回大小限制 500 条目。
注意
设置访问控制列表(ACL)以防止用户更改设置。有关 ACL 的详情,请参考 第 18 章 管理访问控制

14.5.4. 在匿名绑定上设置资源限值

资源限值是在用户条目上设置的。匿名绑定,其中没有与之关联的用户条目。这意味着全局资源限值通常适用于匿名操作。但是,可以通过创建具有资源限值的模板用户条目来为匿名绑定配置资源限值,然后将该模板应用到匿名绑定。
  1. 创建模板条目并设置您要应用到匿名绑定的任何资源限值。
    注意
    出于性能原因,模板应位于普通后端,而不是在 cn=config 后缀中,该后缀不使用条目缓存。
    例如:
    # ldapadd -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    
    dn: cn=anonymous_template,ou=people,dc=example,dc=com
    objectclass: nsContainer
    objectclass: top
    cn: anonymous_template
    nsSizeLimit: 250
    nsLookThroughLimit: 1000
    nsTimeLimit: 60
  2. 在复制拓扑中的所有供应商上,将 nsslapd-anonlimitsdn 参数添加到服务器配置,指向模板条目的 DN。可以设置 第 14.5.3 节 “使用命令行设置用户和全局资源限值” 中的任何资源限值。例如:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-anonlimitsdn="cn=anonymous_template,ou=people,dc=example,dc=com"

14.5.5. 提高范围搜索的性能

范围搜索使用运算符(第 14.3.2 节 “在搜索过滤器中使用 Operator”)设置括号来搜索并返回目录中整个条目子集。例如,这会搜索在 1 月 1 日午夜之后修改的每个条目:
(modifyTimestamp>=20210101010101Z)
范围搜索的性质是,它必须评估目录中的每个条目,以查看它是否在给定的范围内。基本上,范围搜索始终是所有 ID 搜索。
对于大多数用户,查找限制 kicks 并防止范围搜索转换为所有 ID 搜索。这提高了整体性能和加快范围搜索结果。但是,一些客户端或管理用户(如目录管理器)可能没有设置 look-through 限制。在这种情况下,范围搜索可能需要几分钟才能完成甚至无限期继续。
可以设置单独的范围查找限制。这允许客户端和管理用户具有高的查找限制,同时仍然允许在潜在的性能对范围搜索上设置合理的限制。
这在 nsslapd-rangelocatedthroughlimit 属性中配置。默认值为 5000,与默认的 nsslapd-CONTROLLERthroughlimit 属性值 相同。
例如:
# ldapmodify -a -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: cn=config,cn=ldbm database,cn=plugins,cn=config
changetype: add
add: nsslapd-rangelookthroughlimit
nsslapd-rangelookthroughlimit: 7500

14.7. 使用指定控制进行搜索

目录服务器在其 DSE 的 supportedControls 属性中定义了控制。其中一些定义了复制等服务器操作;其他允许扩展操作,如获得有效权限或解引用控制哪些客户端可以通过 LDAP 操作传递给服务器。
这些控件可以通过 -E 选项指定,方法是提供控制 OID、其 ldapsearch 的关键程度以及控制操作所需的信息。
-E '[!]control_OID:control_information'
有些控制(如服务器端和简单页面的结果)有一个别名,可用于将控制权传递给搜索操作。使用控制别名时,结果将被格式化,因为客户端可识别控制。

14.7.1. 检索受影响的用户右边

使用控制 OID 传递 get valid-rights 搜索控制。例如:
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -b "dc=example,dc=com" -s sub -x -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=jsmith,ou=people,dc=example,dc=com' "(objectclass=*)"
重要
当使用 OID 传递控制时,搜索的结果不会被格式化。
访问控制一章中更详细地介绍了有效的权利搜索 第 18.12 节 “检查条目上的访问权限(受影响的右边)”

14.7.2. 使用服务器端排序

服务器端排序是作为其他控制操作执行的,使用 -E 标志和 sss 控制别名。操作的结构设置属性,用于对结果进行排序,以及可选的排序顺序和排序规则。
-E sss=[-]attribute_name:[ordering_rule_OID]
短划线(-)是一个可选标志,用于反向运行排序顺序,以自然方式运行。第 14.3.4 节 “使用匹配规则” 中的匹配规则表包含目录服务器支持的排序规则。
例如:
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -b "dc=example,dc=com" -s sub -x -E sss=-uidNumber:2.5.13.15 "(objectclass=*)"

14.7.3. 执行引用搜索

解引用 搜索是一种快速跟踪条目中的跨引用,并返回有关引用条目的信息。例如,组条目包含对其成员用户条目的引用。常规搜索首先搜索组,然后列出其成员,然后为每个成员单独搜索。解引用搜索组条目返回关于成员的信息,如其位置、电子邮件地址或管理器 - 以及 组的信息,它们都在单个搜索请求中。
解引用简化了许多客户端操作,并减少所执行的搜索操作数量。跨链接显示条目之间的关系。有些操作可能需要从一个条目中获取跨链接的列表,然后执行一系列后续搜索以从列表中的每个条目中获取信息。解引用允许将这些搜索序列合并到单个搜索中。
重要
取消引用的操作需要使用 OpenLDAP 命令行工具版本 2.4.18 或更高版本,或其他支持取消引用搜索的其他客户端。
dereference 参数的格式是:
-E 'deref=deref_attribute:list_of_attributes'
deref_attribute 是包含引用的搜索目标中的属性。这可以是具有值 DN 的任何属性,如 membermanager
注意
不仅必须是 deref_attribute 的值,但属性的实际定义语法必须是 DN 语法(1.3.6.1.4.1.1466.115.121.1.12)。
list_of_attributes 是引用条目中的一个或多个属性,它将与主搜索结果一起返回。可以使用逗号分隔多个属性,如 l、mail、cn

图 14.1. 简单引用搜索命令

简单引用搜索命令
在搜索参数中请求的已请求的取消引用信息会被返回,它带有其余的搜索结果。例如,这会解引用搜索,告知服务器使用搜索目标条目(工程师组)中的 member 属性作为 deref_attribute。然后,它会返回每个成员的 locality 属性。
# ldapsearch -x -D "cn=Directory Manager" -W -b "cn=Example,ou=Groups,dc=example,dc=com" -E 'deref=member:mail,cn' "(objectclass=*)"

# Engineers, Groups, example.com
dn: cn=Engineers,ou=Groups,dc=example,dc=com
control: 1.3.6.1.4.1.4203.666.5.16 false MIQAAADNMIQAAAA1BAZtZW1iZXIEK2NuPURld
 mVsb3BlcnMsIG91PUdyb3VwcywgZGM9ZXhhbXBsZSxkYz1jb20whAAAADIEBm1lbWJlcgQoY249VG
 VzdGVycywgb3U9R3JvdXBzLCBkYz1leGFtcGxlLGRjPWNvbTCEAAAAVAQGbWVtYmVyBCp1aWQ9ZW5
 nLCBvdT1lbmdpbmVlcmluZywgZGM9ZXhhbXBsZSxkYz1jb22ghAAAABowhAAAABQEAWwxhAAAAAsE
 CUNhbWJyaWRnZQ==
# member: <mail=jsmith@example.com><cn=John Smith>;uid=jsmith,ou=people,dc=example,dc=com
 objectClass: top
objectClass: inetuser
objectClass: groupofnames
cn: Engineers
member: uid=jsmith,ou=people,dc=example,dc=com

14.7.4. 使用简单页面结果

搜索结果可能非常大,处理结果的一部分正在组织结果。执行此操作的一种方法是 使用简单的页面结果,其控制会将结果分成特定长度的页面。
简单的页面结果控制一次要显示的条目数。一次可以通过一个页面滚动结果,从而使结果更易于摘要。RFC 2696 中描述了控制的完整行为。
简单的页面结果是作为目录服务器的 LDAP 控制扩展实施的。其 OID 是 1.2.840.113556.1.4.319

简单页面结果的工作方式

当您启动一个简单的页面结果搜索时:

  1. 客户端将搜索发送到服务器,以及页面结果控制以及第一个页面中要返回多少记录。
  2. 在目录服务器开始返回数据前,服务器会生成估算总可返回多少条记录。
    记录的估计不是确切的数字。返回的记录总数可以小于估计的值。此类情况的原因包括
    • 搜索过滤器中使用的属性在索引中不存在。因此,必须索引所有查询的属性。
    • 在向客户端发送条目前,验证访问控制列表(ACL)。权限不足可能会阻止条目返回。
    生成估算后,服务器会发送第一个结果集合、cookies 和估计记录数。
  3. 返回的记录显示在客户端中。用户现在可以输入下一次请求中应返回多少记录。现在,请求的数量会和 Cookie 发送到服务器。
  4. 服务器从数据库检索请求的记录数量,并将它们与 Cookie 一起发送到客户端。
  5. 前两个步骤会重复,直到发送所有记录或取消搜索。

简单页面结果和 OpenLDAP 工具

带有 ldapsearch 的简单页面结果搜索选项的格式是:

-E pg=size
size 值是页面大小,或每个页面包含的条目数。例如:
ldapsearch -x -D "cn=Directory Manager" -W -b "ou=Engineers,ou=People,dc=example,dc=com" -E pg=3 "(objectclass=*)" cn

dn: uid=jsmith,ou=Engineers,ou=People,dc=example,dc=com
   cn: John Smith

dn: uid=bjensen,ou=Engineers,ou=People,dc=example,dc=com
   cn: Barbara Jensen

dn: uid=hmartin,ou=Engineers,ou=People,dc=example,dc=com
   cn: Henry Martin

Results are sorted.
next page size (3): 5
末尾的标签显示搜索中已配置的页面大小(括号中的数字)。冒号后,输入下一页的页面大小,因此输入 5,如所示,将打开包含五个条目的下一页。
重要
简单的页面结果操作必须使用 OpenLDAP 命令行工具版本 2.4.18 或其他支持简单页面结果(如 Perl Net::LDAP)的客户端完成。

简单页面结果和服务器端排序

简单的页面结果可与服务器端使用。服务器端排序是一个控制,它在服务器上执行排序过程,而不是在客户端上执行;这通常是针对使用特定匹配规则的搜索完成。(此行为在 RFC 2891 中定义。) OpenLDAP 客户端工具不支持使用简单页面结果控制的服务器端排序,但其他 LDAP 工具(如 Perl Net::LDAP )支持两者。

单一连接上的多个简单页面结果请求

有些客户端可能会打开与 Directory 服务器的单一连接,但发送多个操作请求,包括使用简单页面结果扩展的多个搜索请求。

目录服务器可以管理和解释多个简单的搜索。每个搜索都作为数组中的条目添加。首次发送页面搜索结果时,会创建一个 Cookie 并与搜索结果关联。每个结果页面都会使用该 Cookie 返回,并且 Cookie 用于请求下一个结果页面。在最后页中,cookies 为空,表示结果的末尾。这会为每个集合保留一组搜索结果。
当在单个连接上有多个简单的页面结果时,仍然会观察超时限制,但 所有打开的 搜索请求 在任何页面搜索断开连接前会达到 它们的配置时间限制。

简单页面结果,与 VLV 索引进行比较

VLV 索引与简单的页面类似,结果也会返回可用的浏览结果列表。主要区别在于如何生成该列表。每个搜索都会计算简单的页面结果,而 VLV 索引是永久列表。总体而言,VLV 索引对于搜索速度更快,但需要一些服务器端配置和开销才能使服务器维护。

注意
简单的页面结果和 VLV 索引 不能 在同一搜索中使用。简单的页面结果会尝试操作 VLV 索引,该索引已经是浏览索引。如果使用 VLV 索引传递了搜索控制,则服务器会返回 UNWILLING_TO_PERFORM 错误。

14.7.5. 预读取条目响应控制

红帽目录服务器支持根据 RFC 4527 的预读取条目响应控制。如果客户端请求一个或多个响应控制,则返回 LDAP 搜索条目,其中包含更新前和之后属性的值。
使用预读取控制时,会在修改前返回包含指定属性值的 LDAP 搜索查询。使用后读取控制时,查询会在修改后包含属性的值。这两个控制可以同时使用。例如,要更新 description 属性,并在修改前和之后显示值:
# ldapmodify -D "cn=Directory Manager" -W -x \
    -e \!preread=description -e \!postread=description 
dn: uid=user,ou=People,dc=example,dc=com
changetype: modify
replace: description
description: new description

modifying entry "uid=user,ou=People,dc=example,dc=com"
control: 1.3.6.1.1.13.1 false ZCkEJXVpZD1qdXNlcixvdT1QZW9wbGUsZGM9ZXhhbXBsZSxk
 Yz1jb20wAA==
# ==> preread
dn: uid=user,ou=People,dc=example,dc=com
description: old description
# <== preread
control: 1.3.6.1.1.13.2 false ZEsEJXVpZD1qdXNlcixvdT1QZW9wbGUsZGM9ZXhhbXBsZSxk
Yz1jb20wIjAgBAtkZXNjcmlwdGlvbjERBA9uZXcgZGVzY3JpcHRpb24=
# ==> postread
dn: uid=user,ou=People,dc=example,dc=com
description: new description
# <== postread

第 15 章 管理复制

复制 是将目录数据自动从一个 Red Hat Directory Server 实例同步到另一个机制的机制;这是在单一服务器配置外扩展目录服务的一个重要机制。本章论述了要在供应商和消费者服务器上执行的任务,以设置单层次复制、多层次复制和级联复制。

15.1. 复制概述

复制是目录数据自动从一个目录服务器同步到另一个目录服务器的机制。任何类型的更新 - 条目添加、修改、删除或重命名条目 - 使用复制自动镜像到其他目录服务器。

15.1.1. 复制的目录单元

可以复制的目录的最小单元是数据库。这意味着,一个可以复制整个数据库,但不能复制数据库中的子树。因此,在创建目录树时,请考虑任何复制计划,作为确定如何分发信息的一部分。
复制还需要一个数据库对应于一个后缀。这意味着,无法使用自定义分发逻辑在两个或多个数据库分发的后缀(或命名空间)。有关此主题的详情请参考 第 2.2 节 “创建和维护数据库”

15.1.2. 读写和只读副本

参与复制的数据库称为 副本。有两种副本:读写或只读。读写副本包含目录信息 的供应商副本,并可更新。只读副本 服务读取、搜索和比较请求,但引用所有更新操作到读写副本。服务器可以保存任意数量的只读或读写副本。

15.1.3. Vendor 和 Consumers

包含发送到不同服务器上的副本的服务器被称为该副本 的供应商。包含从不同服务器接收的副本的服务器称为该副本的consumer(消费者)。通常,供应商服务器上的副本是一个读写副本,消费者服务器上的副本是一个只读副本,但有两个例外:
复制始终由供应商服务器启动,永远不会由消费者(供应商发起的复制)启动。通过供应商发起的复制,可以将供应商服务器配置为将数据发送到多个消费者服务器。

15.1.4. 变更日志

每个供应商服务器都会维护一个 更改日志,这是供应商或中心需要发送到其消费者的所有更改记录。changelog 是一个特殊的数据库,可保留副本上发生的修改。然后,供应商服务器会在多层次复制时对消费者服务器或其他供应商的副本重新执行这些修改。
修改条目时,描述所执行 LDAP 操作的更改记录将在 changelog 中记录。
changelog 使用与主数据库相同的数据库环境。作为主数据库的一部分实施更改日志可确保始终同步数据库和更改日志,从而减少所需的数据库缓存大小,并简化备份和恢复操作。
重要
更改日志仅在服务器关闭时将 changelog RUV 条目写入数据库,否则 RUV 会在内存中管理。当您备份供应商的数据库时,请使用 dsctl db2bak 命令或 Web 控制台。在备份开始前,RUV 都会写入数据库。
在目录服务器中,更改日志仅用于服务器内部使用。

15.1.5. 复制身份

当在两个服务器之间进行复制时,复制过程使用特殊条目(称为 复制管理器 条目)来识别复制协议交换并控制对目录数据的访问。复制管理器条目或复制过程中使用的任何条目都必须满足以下条件:
  • 它在 cn=config 条目中的消费者服务器上创建。
  • 在每个 从另一个服务器接收更新的服务器上创建此条目,这意味着每个 hub 或专用消费者。
  • 当副本配置为消费者或 hub 时,必须将此条目指定为执行复制更新的授权。
  • 复制协议是在供应商服务器上创建的,此条目的 DN 必须在复制协议中指定。
  • 在复制上下文中,此条目具有其特殊用户配置文件,绕过消费者服务器上针对参与该复制协议的数据库定义的访问控制规则。请注意,在复制上下文之外,复制管理器在执行常规操作时可能会受到 ACI 的影响。

15.1.6. 复制协议

目录服务器使用复制协议定义其复制配置。复制协议仅描述了一个提供者和一个消费者之间的复制。协议是在供应商服务器上配置的,必须指定所有必需的复制信息:
  • 要复制的数据库。
  • 将数据推送到的消费者服务器。
  • 复制可能发生的天数和时间。
  • 供应商服务器必须用来绑定的 DN 和凭证(复制管理器条目或供应商绑定 DN)。
  • 连接是如何保护的(TLS、客户端身份验证)。
  • 任何不复制的属性(强制复制)。

15.1.7. 使用 DNATactional Replication 复制子属性集

部分复制设置不会从供应商传输到消费者(或其他供应商)的特定属性子集。因此,管理员可以在不复制包含的所有信息或每个条目中的所有信息的情况下复制数据库。
部分复制由每个复制协议启用和配置,而不是每个条目配置。从复制中排除属性将同样应用到复制协议范围内的所有条目。
对于在架构中定义为可选(MAY 关键字)的属性,可以为增量更新和总更新设置不同的属性。增量更新列表(nsDS5ReplicatedAttributeList)必须始终设置为启用部分复制;如果这是唯一属性集,则它将应用到增量和总体更新。可选的 nsDS5ReplicatedAttributeListTotal 属性为总更新设置额外的部分复制列表。这在 第 15.11.1 节 “为总和增量更新设置不同的复制属性” 中进行了描述。
注意
对 exclude 属性的更新仍然会触发修改事件,并生成空的复制更新。nsds5ReplicaStripAttrs 属性添加一个无法在空复制事件中发送的属性列表,并从更新序列中分离。这个逻辑上包括操作特定点,如 修饰符名称
如果复制事件 不为空则会 复制剥离的属性。只有在事件是 emtpy 时,这些属性才会从更新中删除。

15.1.8. 通过 TLS 复制

出于安全考虑,将涉及复制的目录服务器实例配置为仅通过 TLS 连接复制数据。请注意,如果启用了属性加密,则总需要安全连接才能进行复制。

先决条件

在通过 TLS 配置复制前,需要以下先决条件:
  • 将供应商和消费者服务器配置为使用 TLS。请参阅 第 9.4.1 节 “在目录服务器中启用 TLS”
  • 配置消费者服务器,将供应商服务器的证书识别为供应商 DN。仅执行此操作来使用 TLS 客户端身份验证,而不是简单的身份验证。请参阅 第 9.9 节 “使用基于证书的客户端身份验证”
    重要
    如果供应商的证书只能作为服务器证书,而不是作为 TLS 握手期间的客户端,则通过 TLS 身份验证配置的复制会失败。使用基于证书的身份验证复制使用目录服务器的服务器证书向远程服务器进行身份验证。
    如果您使用 certutil 生成证书签名请求(CSR),请将 --nsCertType=sslClientType=sslServer 选项传给命令,以设置所需的证书类型。

通过 TLS 配置复制

有关配置复制的详情:

15.2. 单层次复制

在单层次复制场景中,目录数据的供应商副本保存在一个名为 供应商服务器 的单个读写副本中。供应商还维护此副本的 changelog。在另一个服务器上,称为 消费者服务器,将存储目录的只读副本。在单层次复制环境中,您可以运行多个消费者。
使用单层次复制拓扑,例如,如果后缀收到大量搜索请求,但有一些写入请求。要分发负载,客户端可以在拓扑中的所有服务器上运行搜索后缀,并将写入请求发送到供应商。
下图显示了带有两个消费者的单层次复制环境:

图 15.1. 单层次复制

单层次复制
使用命令行或 Web 控制台来设置单层次复制拓扑。请参阅:

15.2.1. 使用命令行设置单层次复制

以下示例假定您在名为 provider. example.com 的主机上运行了一个现有的 Directory 服务器实例,它将充当复制拓扑中的供应商来设置。以下流程描述了如何将名为 consumer.example.com 的只读消费者添加到拓扑中,以及如何为 dc=example,dc=com 后缀配置单层次复制。

在 Consumer 上执行的步骤

consumer.example.com 主机上:
  1. 安装目录服务器并创建实例。详情请查看 红帽目录服务器 安装指南
  2. 如果您在没有数据库的情况下创建实例,请为后缀创建数据库。例如,要为 dc=example,dc=com 后缀创建一个名为 userRoot 的数据库:
    # dsconf -D "cn=Directory Manager" ldap://consumer.example.com backend \
        create --suffix="dc=example,dc=com" --be-name="userRoot"
    有关为后缀创建数据库的详情,请参考 第 2.1.1 节 “创建后缀”
  3. 为后缀启用复制,并创建复制管理器帐户:
    # dsconf -D "cn=Directory Manager" ldap://consumer.example.com replication \
        enable --suffix="dc=example,dc=com" --role="consumer" \
        --bind-dn="cn=replication manager,cn=config" --bind-passwd="password"
    此命令将 consumer.example.com 主机配置为 dc=example,dc=com 后缀的消费者。另外,服务器使用指定密码创建 cn=replication manager,cn=config 用户,并允许此帐户将后缀的更改复制到此主机上。
要为拓扑添加多个后缀的用户,请在每个消费者上重复这些步骤。

在独立上执行的步骤

在 provider .example.com 主机上:
  1. dc=example,dc=com 后缀启用复制:
    # dsconf -D "cn=Directory Manager" ldap://supplier.example.com replication \
        enable --suffix="dc=example,dc=com" --role="supplier" --replica-id=1
    此命令将 provider. example.com 主机配置为 dc=example,dc=com 后缀的供应商,并将此条目的副本 ID 设置为 1
    重要
    对于拓扑中的所有供应商,副本 ID 必须是 165534 之间的唯一整数。
  2. 添加复制协议,并初始化消费者。例如:
    # dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt \
         create --suffix="dc=example,dc=com" --host="consumer.example.com" --port=636 \
         --conn-protocol=LDAPS --bind-dn="cn=replication manager,cn=config" \
         --bind-passwd="password" --bind-method=SIMPLE --init \
         example-agreement
    此命令创建一个名为 example-agreement 的复制协议。复制协议定义了设置,如消费者的主机名、协议和身份验证信息,这些设置供应商将数据连接到消费者时使用。
    创建协议后,目录服务器会初始化消费者。要稍后初始化使用者,请省略 --init 选项。请注意,在初始化消费者前复制不会启动。有关初始化消费者的详情,请参考 第 15.8.3 节 “初始化消费者”
    有关命令中使用的选项的详情,请输入:
    # dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt --help
  3. 验证初始化是否成功:
    # dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt \
         init-status --suffix="dc=example,dc=com" example-agreement
    Agreement successfully initialized.
    根据要复制的数据量,初始化可能会非常耗时。
如果您在拓扑中添加多个后缀的用户,请为每个消费者对供应商重复步骤。但是,您必须仅在供应商上为后缀启用复制。

15.2.2. 使用 Web 控制台设置单层次复制

以下示例假定您在名为 provider. example.com 的主机上运行了一个现有的 Directory 服务器实例,它将充当复制拓扑中的供应商来设置。以下流程描述了如何将名为 consumer.example.com 的只读消费者添加到拓扑中,以及如何为 dc=example,dc=com 后缀配置单层次复制。

在 Consumer 上执行的步骤

consumer.example.com 主机上:
  1. 安装目录服务器并创建实例。详情请查看 红帽目录服务器 安装指南
  2. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  3. 选择实例。
  4. 如果您在没有数据库的情况下创建实例,请为后缀创建数据库。有关为后缀创建数据库的详情,请参考 第 2.1.1 节 “创建后缀”
  5. 为后缀启用复制:
    1. 打开 Replication 菜单。
    2. 选择 dc=example,dc=com 后缀,然后单击 Enable Replication
    3. Replication Role 字段中选择 Consumer,并输入要创建的复制管理器帐户的 DN 和密码。例如:
      这些设置将主机配置为 dc=example,dc=com 后缀的消费者。另外,服务器使用指定密码创建 cn=replication manager,cn=config 用户,并允许此帐户将后缀的更改复制到此主机上。
    4. Enable Replication
要为拓扑添加多个后缀的用户,请在每个消费者上重复这些步骤。

在独立上执行的步骤

在 provider .example.com 主机上:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. dc=example,dc=com 后缀启用复制:
    1. 打开 Replication 菜单。
    2. 选择 dc=example,dc=com 后缀,然后单击 Enable Replication
    3. Replication Role 字段中选择 Supplier,输入副本 ID,并将 Replication Authentication 区域中的字段留空。例如:
      这会将主机配置为 dc=example,dc=com 后缀的供应商,并将此条目的副本 ID 设置为 1
      重要
      对于拓扑中的所有供应商,副本 ID 必须是 165534 之间的唯一整数。
    4. Enable Replication
  4. 添加复制协议,并初始化消费者:
    1. 打开 Replication 菜单,然后选择 dc=example,dc=com 后缀。
    2. 复制协议 选项卡中,点 Create Agreement,并填写字段。例如:
      这些设置会创建一个名为 example-agreement 的复制协议。复制协议定义了设置,如消费者的主机名、协议和身份验证信息,这些设置供应商将数据连接到消费者时使用。
    3. Consumer Initialization 字段中选择 Do Online Initialization,以在保存协议后自动初始化消费者。
      要稍后初始化消费者,请选择 Do Not Initialize。请注意,在初始化消费者前复制不会启动。有关初始化消费者的详情,请参考 第 15.8.3 节 “初始化消费者”
    4. Save Agreement
  5. 验证初始化是否成功:
    1. 打开 Replication 菜单。
    2. 选择 Agreements 条目。
      对于成功完成的初始化,Web 控制台会在 Last Update Status 列中显示 Error (0) Replica obtained: Incremental update successful 信息。
      根据要复制的数据量,初始化可能会非常耗时。
如果您在拓扑中添加多个后缀的用户,请为每个消费者对供应商重复步骤。但是,您必须仅在供应商上为后缀启用复制。

15.3. 多层复制

在多层次复制场景中,目录数据的供应商副本存储在多个读写副本中。每个服务器都会为读写副本维护一个更改日志。目录服务器支持复制拓扑中最多 20 个供应商。
注意
多层次复制环境中的每个供应商也是一个消费者。
下图显示了带有两个供应商的多层次复制环境:

图 15.2. 带有两层线的多层次复制

带有两层线的多层次复制
在复杂的环境中,复制拓扑通常包含多个读写供应商以及只读用户。下图显示了一个拓扑,每个供应商都配置有十个复制协议,将数据复制到两个其他提供者和八个消费者:

图 15.3. 带有 Four Suppliers 和 Eight Consumers 的复杂复制场景

带有 Four Suppliers 和 Eight Consumers 的复杂复制场景
注意
复制速度取决于:
  • 网络的速度。
  • 传出和传入复制协议的数量。
使用命令行或 Web 控制台来设置多层次复制拓扑。请参阅:

15.3.1. 使用命令行设置多层次复制

以下示例假定您已在名为 provider 1.example.com 的主机上运行现有的 Directory 服务器实例。以下流程描述了如何将名为 provider 2.example.com 的另一个读写副本添加到拓扑中,以及如何为 dc=example,dc=com 后缀配置多层次复制。

准备要加入的远程服务器

在 provider 2.example.com 主机上:
  1. 安装目录服务器并创建实例。详情请查看 红帽目录服务器 安装指南
  2. 如果您在没有数据库的情况下创建实例,请为后缀创建数据库。例如,要为 dc=example,dc=com 后缀创建一个名为 userRoot 的数据库:
    # dsconf -D "cn=Directory Manager" ldap://supplier2.example.com backend \
        create --suffix="dc=example,dc=com" --be-name="userRoot"
    有关为后缀创建数据库的详情,请参考 第 2.1.1 节 “创建后缀”
  3. 为后缀启用复制,并创建复制管理器帐户:
    # dsconf -D "cn=Directory Manager" ldap://supplier2.example.com replication \
        enable --suffix="dc=example,dc=com" --role="supplier" --replica-id=1 \
        --bind-dn="cn=replication manager,cn=config" --bind-passwd="password"
    此命令将 provider 2.example.com 主机配置为 dc=example,dc=com 后缀的供应商,并将此条目的副本 ID 设置为 1。另外,服务器使用指定密码创建 cn=replication manager,cn=config 用户,并允许此帐户将后缀的更改复制到此主机上。
    重要
    对于拓扑中的所有供应商,副本 ID 必须是 165534 之间的唯一整数。

将现有服务器配置为独立服务器

在 provider 1.example.com 主机上:
  1. 与您在新服务器上运行的命令类似,为 dc=example,dc=com 后缀启用复制,并创建复制管理器帐户:
    # dsconf -D "cn=Directory Manager" ldap://supplier1.example.com replication \
        enable --suffix="dc=example,dc=com" --role="supplier" --replica-id=2 \
        --bind-dn="cn=replication manager,cn=config" --bind-passwd="password"
    副本 ID 必须与 “准备要加入的远程服务器”一节 中创建的副本 ID 不同,但复制管理器帐户可以使用相同的 DN。
  2. 添加复制协议,并初始化新的服务器。例如:
    # dsconf -D "cn=Directory Manager" ldap://supplier1.example.com repl-agmt \
         create --suffix="dc=example,dc=com" --host="supplier2.example.com" --port=636 \
         --conn-protocol=LDAPS --bind-dn="cn=replication manager,cn=config" \
         --bind-passwd="password" --bind-method=SIMPLE --init \
         example-agreement-supplier1-to-supplier2
    此命令创建一个名为 example-agreement-supplier1-to-supplier2 的复制协议。复制协议定义了设置,如消费者的主机名、协议和身份验证信息,这些设置供应商将数据连接到消费者时使用。
    创建协议后,目录服务器会初始化消费者。要稍后初始化使用者,请省略 --init 选项。请注意,在初始化消费者前复制不会启动。有关初始化消费者的详情,请参考 第 15.8.3 节 “初始化消费者”
    有关命令中使用的选项的详情,请输入:
    # dsconf -D "cn=Directory Manager" ldap://supplier1.example.com repl-agmt --help
  3. 验证初始化是否成功:
    # dsconf -D "cn=Directory Manager" ldap://supplier1.example.com repl-agmt \
         init-status --suffix="dc=example,dc=com" example-agreement-supplier1-to-supplier2
    Agreement successfully initialized.
    根据要复制的数据量,初始化可能需要非常耗时。

将新服务器配置为叶

在 provider 2.example.com 主机上:
警告
如果您还没有在现有服务器上初始化后缀 'dc=example,dc=com',如 “将现有服务器配置为独立服务器”一节 所述,则不要继续。否则,新的服务器上的空数据库会覆盖现有供应商上的数据库。
  • 添加复制协议,以将信息从供应商 2 复制到 供应商 1。例如:
    # dsconf -D "cn=Directory Manager" ldap://supplier2.example.com repl-agmt \
         create --suffix="dc=example,dc=com" --host="supplier1.example.com" --port=636 \
         --conn-protocol=LDAPS --bind-dn="cn=replication manager,cn=config" \
         --bind-passwd="password" --bind-method=SIMPLE \
         example-agreement-supplier2-to-supplier1
    此命令创建一个名为 example-agreement-supplier2-to-supplier1 的复制协议。复制协议定义了设置,如消费者的主机名、协议和身份验证信息,这些设置供应商将数据连接到消费者时使用。

15.3.2. 使用 Web 控制台设置多层次复制

以下示例假定您已在名为 provider 1.example.com 的主机上运行现有的 Directory 服务器实例。以下流程描述了如何将名为 provider 2.example.com 的另一个读写副本添加到拓扑中,以及如何为 dc=example,dc=com 后缀配置多层次复制。

准备要加入的远程服务器

在 provider 2.example.com 主机上:
  1. 安装目录服务器并创建实例。详情请查看 红帽目录服务器 安装指南
  2. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  3. 选择实例。
  4. 如果您在没有数据库的情况下创建实例,请从后缀创建数据库。有关为后缀创建数据库的详情,请参考 第 2.1.1 节 “创建后缀”
  5. 为后缀启用复制:
    1. 打开 Replication 菜单。
    2. 选择 dc=example,dc=com 后缀,然后单击 Enable Replication
    3. Replication Role 字段中选择 Supplier,输入副本 ID,以及要创建的复制管理器帐户的 DN 和密码。例如:
      这些设置将 provider 2.example.com 主机配置为 dc=example,dc=com 后缀的供应商,并将此条目的副本 ID 设置为 1。另外,服务器使用指定密码创建 cn=replication manager,cn=config 用户,并允许此帐户将后缀的更改复制到此主机上。
      重要
      对于拓扑中的所有供应商,副本 ID 必须是 165534 之间的唯一整数。
    4. Enable Replication

将现有服务器配置为独立服务器

在 provider 1.example.com 主机上:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 与新服务器上的设置类似,为 dc=example,dc=com 后缀启用复制,并创建一个复制管理器帐户:
    1. 打开 Replication 菜单。
    2. 选择 dc=example,dc=com 后缀,然后单击 Enable Replication
    3. Replication Role 字段中选择 Supplier,输入副本 ID,以及要创建的复制管理器帐户的 DN 和密码。例如:
      副本 ID 必须与 “准备要加入的远程服务器”一节 中创建的副本 ID 不同,但复制管理器帐户可以使用相同的 DN。
    4. Enable Replication
  4. 添加复制协议并初始化消费者:
    1. 打开 Replication 菜单,然后选择 Agreements 条目
    2. Create Replication Agreement,并填写字段。例如:
      这些设置会创建一个名为 example-agreement-supplier1-to-supplier2 的复制协议。复制协议定义了设置,如消费者的主机名、协议和身份验证信息,这些设置供应商将数据连接到消费者时使用。
    3. Consumer Initialization 字段中选择 Do Online Initialization,以在保存协议后自动初始化消费者。
      要稍后初始化消费者,请选择 Do Not Initialize。请注意,在初始化消费者前复制不会启动。有关初始化消费者的详情,请参考 第 15.8.3 节 “初始化消费者”
    4. Save Agreement
  5. 验证初始化是否成功:
    1. 打开 Replication 菜单。
    2. 选择 Agreements 条目。
      对于成功完成的初始化,Web 控制台会在 Last Update Status 列中显示 Error (0) Replica obtained: Incremental update successful 信息。
      根据要复制的数据量,初始化可能会非常耗时。

将新服务器配置为叶

在 provider 2.example.com 主机上:
警告
如果您还没有在现有服务器上初始化复制协议,如 “将现有服务器配置为独立服务器”一节 所述,请不要继续。否则,新的服务器上的空数据库会覆盖现有供应商上的数据库。
  1. 添加复制协议,并初始化消费者:
    1. 打开 Replication 菜单,然后选择 Agreements 条目
    2. Create Replication Agreement,并填写字段。例如:
      这些设置会创建一个名为 example-agreement-supplier2-to-supplier1 的复制协议。
    3. Consumer Initialization 字段中选择 Do Online Initialization,以在保存协议后自动初始化消费者。
      要稍后初始化消费者,请选择 Do Not Initialize。请注意,在初始化消费者前复制不会启动。有关初始化消费者的详情,请参考 第 15.8.3 节 “初始化消费者”
    4. Save Agreement
  2. 验证初始化是否成功:
    1. 打开 Replication 菜单。
    2. 选择 Agreements 条目。
      如果初始化成功完成,Web 控制台会在 Last Update Status 列中显示 Error (0) Replica obtained: Incremental update successful 信息。
      根据要复制的数据量,初始化非常耗时。

15.3.3. 防止在多层复制中移动消费者

multi-supplier 复制的一个特性是供应商获得对复制区域的消费者独占访问权限。在此期间,其他供应商不会与消费者直接联系。如果供应商尝试在锁定时获得访问权限,使用者会返回忙碌的响应,并在进行另一个尝试前,供应商会休眠几秒钟。在更新负载较低期间,供应商将其更新发送到另一个消费者,而第一个消费者被锁定,然后在第一个消费者再次释放时发送更新。
如果锁定供应商处于重数更新负载,或者更改日志中有很多待处理的更新,则可能会出现问题。如果锁定供应商完成发送更新并有多个要发送的待处理的更改,它会立即尝试重新清空消费者。在大多数情况下,这种尝试都会成功,因为其他供应商通常会处于睡眠状态。这可能会导致单个供应商在几小时或更长时间内对消费者进行货币化。
以下属性解决了这个问题:
nsds5ReplicaBusyWaitTime
设置供应商在消费者发回忙碌响应后等待的时间(以秒为单位),然后再尝试获取访问权限。
例如,要配置供应商在进行另一个获取尝试前等待 5 秒:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt \
     set --suffix="suffix" --busy-wait-time=5 agreement_name
nsds5ReplicaSessionPauseTime
设置供应商在两个更新会话之间等待的时间(以秒为单位)。如果您设置的值低于 nsds5ReplicaBusyWaitTime 指定的值,则目录服务器会自动使用 nsds5ReplicaSessionPauseTime 参数的值,它比 nsds5ReplicaBusyWaitTime 中设置的值高。
例如,配置供应商在两个更新会话之间等待 10 秒:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt \
     set --suffix="suffix" --session-pause-time=10 agreement_name
nsds5ReplicaReleaseTimeout
设置供应商发布副本的超时时间,无论是完成发送其更新。这可防止单个供应商货币化副本。
例如,在大量复制环境中将供应商配置为在 90 秒后发布副本:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com replication \
     set --suffix="suffix" --repl-release-timeout=90
要记录副本忙碌的错误,请启用 Replication error logging (log level 8192)。请参阅 第 21.3.7 节 “配置日志级别”

15.4. 级联复制

在级联复制方案中 一个服务器同时充当消费者和供应商。它包含一个只读副本和维护更改日志,因此它会从包含数据的供应商副本的供应商服务器接收更新,并为消费者提供这些更新。使用级联复制来平衡重重流量负载,或者在地理分布式环境中将供应商服务器保持在本地。
下图显示了一个简单的级联复制场景:

图 15.4. 级联复制

级联复制
注意
可以组合使用 multi-supplier 和 cascading 复制。
使用命令行或 Web 控制台来设置级联复制拓扑。请参阅:

15.4.1. 使用命令行设置 Cascading 复制

以下示例假定您已在名为 vendor. example.com 的主机上运行现有的 Directory 服务器实例。以下流程描述了如何将名为 hub. example.com 的 hub 添加到从 dc=example,dc=com 后缀的供应商接收更新的拓扑中。因此,该流程描述了添加名为 consumer.example.com 的消费者,该消费者从 hub 服务器接收后缀的更新。

准备新的 Hub 服务器以加入

hub.example.com 主机上:
  1. 安装目录服务器并创建实例。详情请查看 红帽目录服务器 安装指南
  2. 如果您在没有数据库的情况下创建实例,请为后缀创建数据库。例如,要为 dc=example,dc=com 后缀创建一个名为 userRoot 的数据库:
    # dsconf -D "cn=Directory Manager" ldap://hub.example.com backend \
        create --suffix="dc=example,dc=com" --be-name="userRoot"
    有关为后缀创建数据库的详情,请参考 第 2.1.1 节 “创建后缀”
  3. 为后缀启用复制并创建复制管理器帐户:
    # dsconf -D "cn=Directory Manager" ldap://hub.example.com replication \
        enable --suffix="dc=example,dc=com" --role="hub" \
        --bind-dn="cn=replication manager,cn=config" --bind-passwd="password"
    此命令将 hub.example.com 主机配置为 dc=example,dc=com 后缀的中心。另外,服务器使用指定密码创建 cn=replication managercn=config 用户,并允许此帐户将后缀的更改复制到此主机上。

将现有服务器配置为独立服务器

在 provider .example.com 主机上:
  1. 与您在新 hub 服务器中运行的命令类似,加入 “准备新的 Hub 服务器以加入”一节,为 dc=example,dc=com 后缀启用复制,并创建复制管理器帐户:
    # dsconf -D "cn=Directory Manager" ldap://supplier1.example.com replication \
        enable --suffix="dc=example,dc=com" --role="supplier" --replica-id=1 \
        --bind-dn="cn=replication manager,cn=config" --bind-passwd="password"
    重要
    对于拓扑中的所有供应商,副本 ID 必须是 165534 之间的唯一整数。
    复制管理器帐户可以使用与 hub 上创建相同的 DN。
  2. 添加复制协议并初始化 hub。例如:
    # dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt \
         create --suffix="dc=example,dc=com" --host="hub.example.com" --port=636 \
         --conn-protocol=LDAPS --bind-dn="cn=replication manager,cn=config" \
         --bind-passwd="password" --bind-method=SIMPLE --init \
         example-agreement-supplier-to-hub
    此命令创建一个名为 example-agreement-supplier-to-hub 的复制协议。复制协议定义了设置,如 hub 的主机名、协议和身份验证信息,这些设置在将数据连接到 hub 时使用的供应商。
    创建协议后,Directory 服务器会初始化 hub。要稍后初始化 hub,请省略 --init 选项。请注意,在初始化消费者前复制不会启动。有关初始化消费者的详情,请参考 第 15.8.3 节 “初始化消费者”
    有关命令中使用的选项的详情,请输入:
    # dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt --help
  3. 验证初始化是否成功:
    # dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt \
         init-status --suffix="dc=example,dc=com" example-agreement-supplier-to-hub
    Agreement successfully initialized.
    根据要复制的数据量,初始化可能会非常耗时。

准备新的消费者以加入

consumer.example.com 主机上:
  1. 安装目录服务器并创建实例。详情请查看 红帽目录服务器 安装指南
  2. 如果您在没有数据库的情况下创建实例,请为后缀创建数据库。例如,要为 dc=example,dc=com 后缀创建一个名为 userRoot 的数据库:
    # dsconf -D "cn=Directory Manager" ldap://hub.example.com backend \
        create --suffix="dc=example,dc=com" --be-name="userRoot"
    有关为后缀创建数据库的详情,请参考 第 2.1.1 节 “创建后缀”
  3. 为后缀启用复制并创建复制管理器帐户:
    # dsconf -D "cn=Directory Manager" ldap://consumer.example.com replication \
        enable --suffix="dc=example,dc=com" --role="consumer" \
        --bind-dn="cn=replication manager,cn=config" --bind-passwd="password"
    此命令将 consumer.example.com 主机配置为 dc=example,dc=com 后缀的消费者。另外,服务器使用指定密码创建 cn=replication managercn=config 用户,并允许此帐户将后缀的更改复制到此主机上。

将 Hub 配置为 Consumer 的叶

hub.example.com 主机上:
  1. 添加复制协议并初始化服务器。例如:
    # dsconf -D "cn=Directory Manager" ldap://hub.example.com repl-agmt \
         create --suffix="dc=example,dc=com" --host="consumer.example.com" --port=636 \
         --conn-protocol=LDAPS --bind-dn="cn=replication manager,cn=config" \
         --bind-passwd="password" --bind-method=SIMPLE --init \
         example-agreement-hub-to-consumer
    创建协议后,目录服务器会初始化消费者。要稍后初始化使用者,请省略 --init 选项。
  2. 验证初始化是否成功:
    # dsconf -D "cn=Directory Manager" ldap://hub.example.com repl-agmt \
         init-status --suffix="dc=example,dc=com" example-agreement-hub-to-consumer
    Agreement successfully initialized.
    根据要复制的数据量,初始化可能会非常耗时。

15.4.2. 使用 Web 控制台设置 Cascading 复制

以下示例假定您已在名为 vendor. example.com 的主机上运行现有的 Directory 服务器实例。以下流程描述了如何将名为 hub. example.com 的 hub 添加到从 dc=example,dc=com 后缀的供应商接收更新的拓扑中。因此,该流程描述了添加名为 consumer.example.com 的消费者,该消费者从 hub 服务器接收后缀的更新。

准备新的 Hub 服务器以加入

hub.example.com 主机上:
  1. 安装目录服务器并创建实例。详情请查看 红帽目录服务器 安装指南
  2. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  3. 选择实例。
  4. 如果您在没有数据库的情况下创建实例,请为后缀创建数据库。有关为后缀创建数据库的详情,请参考 第 2.1.1 节 “创建后缀”
  5. 为后缀启用复制:
    1. 打开 Replication 菜单。
    2. 选择 dc=example,dc=com 后缀,再点 Enable Replication
    3. Replication Role 字段中选择 Hub,并输入要创建的复制管理器帐户的 DN 和密码。例如:
      这些设置将 hub.example.com 主机配置为 dc=example,dc=com 后缀的中心。另外,服务器使用指定密码创建 cn=replication managercn=config 用户,并允许此帐户将后缀的更改复制到此主机上。
    4. Enable Replication

将现有服务器配置为独立服务器

在 provider .example.com 主机上:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 与新 hub 服务器上的设置加入 “准备新的 Hub 服务器以加入”一节 类似,为 dc=example,dc=com 后缀启用复制,并创建一个复制管理器帐户:
    1. 打开 Replication 菜单。
    2. 选择 dc=example,dc=com 后缀,再点 Enable Replication
    3. Replication Role 字段中选择 Supplier,输入副本 ID,以及要创建的复制管理器帐户的 DN 和密码。例如:
      重要
      对于拓扑中的所有供应商,副本 ID 必须是 165534 之间的唯一整数。
      复制管理器帐户可以使用与 hub 上创建相同的 DN。
    4. Enable Replication
  4. 添加复制协议并初始化 hub:
    1. 打开 Replication 菜单,然后选择后缀。
    2. 复制协议 选项卡中,点 Create Agreement,并填写字段。例如:
      这些设置会创建一个名为 example-agreement-supplier-to-hub 的复制协议。复制协议定义了设置,如 hub 的主机名、协议和身份验证信息,供应商在将数据连接到 hub 时使用。
    3. Consumer Initialization 字段中选择 Do Online Initialization,以在保存协议后自动初始化消费者。
      要稍后初始化 hub,请选择 Do Not Initialize。请注意,在初始化消费者前复制不会启动。有关初始化消费者的详情,请参考 第 15.8.3 节 “初始化消费者”
    4. Save Agreement
  5. 验证初始化是否成功:
    1. 打开 Replication 菜单。
    2. 选择 Agreements 条目。
      如果初始化成功完成,Web 控制台会在 Last Update Status 列中显示 Error (0) Replica obtained: Incremental update successful 信息。
      根据要复制的数据量,初始化可能会非常耗时。

将新消费者配置为加入

consumer.example.com 主机上:
  1. 安装目录服务器并创建实例。详情请查看 红帽目录服务器 安装指南
  2. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  3. 选择实例。
  4. 如果您在没有数据库的情况下创建实例,请为后缀创建数据库。有关为后缀创建数据库的详情,请参考 第 2.1.1 节 “创建后缀”
  5. 为后缀启用复制:
    1. 打开 Replication 菜单。
    2. 选择 dc=example,dc=com 后缀,再点 Enable Replication
    3. Replication Role 字段中选择 Consumer,并输入要创建的复制管理器帐户的 DN 和密码。例如:
      这些设置将 consumer.example.com 主机配置为 dc=example,dc=com 后缀的消费者。另外,服务器使用指定密码创建 cn=replication managercn=config 用户,并允许此帐户将后缀的更改复制到此主机上。
    4. Enable Replication

将 Hub 配置为 Consumer 的叶

consumer.example.com 主机上:
  1. 添加复制协议并初始化消费者:
    1. 打开 Replication 菜单,然后选择后缀。
    2. 复制协议 选项卡中,点 Create Agreement,并填写字段。例如:
      这些设置会创建一个名为 example-agreement-hub-to-consumer 的复制协议。
    3. Consumer Initialization 字段中选择 Do Online Initialization,以在保存协议后自动初始化消费者。
      要稍后初始化消费者,请选择 Do Not Initialize。请注意,在初始化消费者前复制不会启动。有关初始化消费者的详情,请参考 第 15.8.3 节 “初始化消费者”
    4. Save Agreement
  2. 验证初始化是否成功:
    1. 打开 Replication 菜单。
    2. 选择 Agreements 条目。
      如果初始化成功完成,Web 控制台会在 Last Update Status 列中显示 Error (0) Replica obtained: Incremental update successful 信息。
      根据要复制的数据量,初始化可能会非常耗时。

15.5. 配置 Bootstrap 凭证

当您在复制协议中使用绑定可分辨名称(DN)组时,可能会出现组不存在或过时的情况:
  • 在在线初始化过程中,您必须在数据库初始化前对副本进行身份验证
  • 当您使用 GSSAPI 作为身份验证方法并更改 Kerberos 凭证时
如果您在复制协议中配置了 bootstrap 凭证,Directory 服务器会在连接失败时使用这些凭证,因为以下错误之一:
  • LDAP_INVALID_CREDENTIALS (err=49)
  • LDAP_INAPPROPRIATE_AUTH (err=48)
  • LDAP_NO_SUCH_OBJECT (err=32)
如果绑定使用 bootstrap 凭证成功,服务器建立复制连接并开始新的复制会话。这允许更新对绑定 DN 组成员的任何更新。默认情况下,在下一个复制会话中,Directory 服务器使用协议中的默认凭证,现在可以成功。
bootstrap 凭证也会失败,Directory 服务器会停止尝试连接。

流程

在创建复制协议时设置 bootstrap 凭证:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt create ... --bootstrap-bind-dn "bind_DN" --bootstrap-bind-passwd "password" --bootstrap-bind-method bind_method --bootstrap-conn-protocol connection protocol ...
在现有复制协议中设置 bootstrap 凭证:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt set --suffix="suffix" --bootstrap-bind-dn "bind_DN" --bootstrap-bind-passwd "password" --bootstrap-bind-method bind_method --bootstrap-conn-protocol connection protocol agreement_name

15.6. 配置复制合作伙伴以使用基于证书的身份验证

您可以使用基于证书的身份验证,而不是使用绑定 DN 和密码向复制合作伙伴进行身份验证。
以下流程描述了如何将名为 server2.example.com 的新服务器添加到复制协议中,以及如何使用基于证书的身份验证在新主机和现有 server1.example.com 之间设置复制协议:
  1. 在两个主机上,设置基于证书的身份验证。详情请查看 第 9.9.1 节 “设置基于证书的身份验证”
  2. server1.example.com 主机上:
    1. 为两个服务器(如 cn=server1、example、dc=comcn=server2、dc=example、dc=com )创建帐户,并将客户端证书添加到对应的帐户。详情请查看:
      稍后两个服务器都使用这些帐户和证书在建立复制连接时进行身份验证。
    2. 创建组,如 cn=repl_server,ou=Groups,dc=example,dc=com,并添加两个服务器帐户。请参阅 第 8.1 节 “使用组”
    3. 创建副本条目,并将 nsds5ReplicaBindDNGroup 属性设置为上一步中创建的组的 DN:
      # dsconf -D "cn=Directory Manager" ldap://server1.example.com replication \
          enable --suffix="dc=example,dc=com" --role="supplier" --replica-id="7" \
          --bind-group-dn="cn=repl_server,ou=Groups,dc=example,dc=com"
    4. 设置副本条目的间隔,Directory 服务器在其中检查组是否已更改为 0
      # dsconf -D "cn=Directory Manager" ldap://server1.example.com replication \
           set --suffix="dc=example,dc=com" --repl-bind-group-interval=0
  3. 初始化新的服务器:
    1. server2.example.com 上创建临时复制管理器帐户,如 cn=Replication Manager,cn=config
    2. server1.example.com 上,创建一个临时复制协议,它使用上一步中的帐户进行身份验证:
      # dsconf -D "cn=Directory Manager" ldap://server2.example.com repl-agmt \
           create --suffix="dc=example,dc=com" --host="server1.example.com" --port=636 \
           --conn-protocol=LDAPS --bind-dn="cn=Replication Manager,cn=config" \
           --bind-passwd="password" --bind-method=SIMPLE --init \
           temporary_agreement
      此协议使用之前创建的复制管理器帐户来初始化数据库。在此初始化前,server2.example.com 上的数据库为空,具有相关证书的帐户不存在。因此,在初始化数据库前无法使用证书复制。
  4. 初始化新的服务器后:
    1. server1.example.com 中删除临时复制协议:
      # dsconf -D "cn=Directory Manager" ldap://server1.example.com repl-agmt \
           delete --suffix="dc=example,dc=com" temporary_agreement
    2. server2.example.com 中删除临时复制管理器帐户:
      # dsconf -D "cn=Directory Manager" ldap://server2.example.com replication \
           delete-manager --suffix="dc=example,dc=com" --name="Replication Manager"
  5. 在使用基于证书的身份验证的两个服务器上创建复制协议:
    1. server1.example.com 上:
      # dsconf -D "cn=Directory Manager" ldap://server1.example.com repl-agmt \
           create --suffix="dc=example,dc=com" --host="server2.example.com" --port=636 \
           --conn-protocol=LDAPS --bind-method="SSLCLIENTAUTH" \
           --init example_agreement
    2. server2.example.com 上:
      # dsconf -D "cn=Directory Manager" ldap://server2.example.com repl-agmt \
           create --suffix="dc=example,dc=com" --host="server1.example.com" --port=636 \
           --conn-protocol=LDAPS --bind-method="SSLCLIENTAUTH" \
           --init example_agreement
  6. 要验证复制是否正常工作,请在复制协议中显示 nsds5replicaLastUpdateStatus 属性:
    # dsconf -D "cn=Directory Manager" ldap://server1.example.com repl-agmt status --suffix="dc=example,dc=com" example_agreement
    有关可能的状态的详情,请查看 红帽目录服务器配置、命令和文件参考 中的 复制协议状态 附录。

15.7. 将 Consumer 或 Hub 提升到一个厂商

在某些情况下,比如复制拓扑中的供应商因为硬件中断而不可用,管理员希望将只读消费者或 hub 提升到可写供应商。

15.7.1. 使用命令行将 Consumer 或 Hub 提升到孤立

例如,要将 server.example.com 主机提升到 dc=example,dc=com 后缀的供应商:
# dsconf -D "cn=Directory Manager" ldap://server.example.com replication \
     promote --suffix="dc=example,dc=com" --newrole="supplier" --replica-id=2
重要
对于拓扑中的所有供应商,副本 ID 必须是 165534 之间的唯一整数。
现在,您还可以配置新供应商,将后缀的更改复制到拓扑中的其他服务器。有关配置复制的详情,请参考:

15.7.2. 使用 Web 控制台将 Consumer 或 Hub 提升到单例

例如,要将消费者或 hub 提升到 dc=example,dc=com 后缀的供应商:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Replication 菜单,再选择 Configuration 条目。
  4. 选择 dc=example,dc=com 后缀。
  5. 单击 Promote
  6. Replication Role 字段中选择 Supplier,并输入副本 ID。
    重要
    对于拓扑中的所有供应商,副本 ID 必须是 165534 之间的唯一整数。
  7. 选择 Yes, I am sure
  8. 单击 Change Role 以确认新角色。
现在,您还可以配置新供应商,将后缀的更改复制到拓扑中的其他服务器。有关配置复制的详情,请参考:

15.8. 关于初始化消费者

创建复制协议后,初始化消费者。在此操作过程中,供应商将现有数据复制到消费者中。
重要
在初始化消费者之前,复制才会开始。

15.8.1. 何时初始化消费者

消费者初始化涉及将数据从供应商服务器复制到消费者服务器。一旦子树被物理放在消费者上,供应商服务器就可以开始向消费者服务器重新执行更新操作。
在正常操作下,不应重新初始化消费者。但是,任何时候,供应商数据和消费者的数据之间有很大的差异,重新初始化消费者。例如,如果供应商服务器上的数据从备份中恢复,则该服务器提供的所有消费者都应重新初始化。另一个例子,如果供应商无法与消费者联系很长时间,如一周,供应商可能会确定消费者已超出更新的日期,必须重新初始化。
可以使用 Web 控制台在线初始化消费者,也可以使用命令行手动初始化。使用 Web 控制台在线消费者初始化是初始化少量消费者的有效方法。但是,由于每个副本按顺序初始化,所以此方法不适用于初始化大量副本。在线消费者初始化是作为在供应商服务器上配置复制协议的一部分初始化时使用的方法。
使用命令行手动进行使用者初始化是从单个 LDIF 文件中初始化大量消费者的有效方法。

15.8.2. 设置初始化超时

如果因为超时而初始化大型数据库失败,请将以下之一设置为足够大的时间或无限期限,以便目录服务器在操作超时前初始化整个数据库:
  • cn=config 条目中的 nsslapd-idletimeout 配置参数为服务器上所有复制协议设置超时。例如,要全局禁用超时:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-idletimeout=0
  • 复制管理器 DN 中的 nsIdleTimeout 参数为使用此复制管理器条目的所有协议设置超时。例如,禁用 cn=replication manager,cn=config 条目的超时:
    # ldapmodify -D "cn=Directory Manager" -w -h server.example.com -p 389 -x
    dn: cn=replication manager,cn=config
    changetype: modify
    add: nsIdleTimeout
    nsIdleTimeout: 0

15.8.3. 初始化消费者

本节论述了使用命令行和 Web 控制台中初始化消费者。

15.8.3.1. 使用命令行初始化消费者

您可以使用命令行在线和离线对消费者进行初始化。本节解释了这两个流程。
15.8.3.1.1. 初始化消费者在线
创建复制协议后,使用 dsconf repl-agmt init 命令来在线初始化消费者:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt \
     init --suffix="suffix" agreement_name
15.8.3.1.2. 初始化 Consumer Offline
离线初始化消费者:
  1. 在供应商中:
    1. 关闭供应商中的实例:
      # dsctl instance_name stop
    2. 使用复制信息将包含要复制到 /tmp/example.ldif 文件中的后缀 的用户Root 数据库导出:
      # dsctl instance_name db2ldif --replication userRoot /tmp/example.ldif
    3. 在供应商上启动实例:
      # dsctl instance_name start
  2. 将导出的文件复制到消费者。
  3. 导入消费者上的数据。详情请查看 第 6.1.2.2 节 “导入服务器为 Offline 的数据”

15.8.4. 使用 Web 控制台初始化消费者

使用 Web 控制台在线初始化消费者:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Replication 菜单,然后选择后缀。
  4. 复制协议 选项卡上,打开后缀复制协议旁边的 Choose Action 菜单,然后选择 Initialize Agreement
    如果初始化成功完成,Web 控制台会在 Last Update Status 列中显示 Error (0) Replica obtained: Incremental update successful 信息。
    根据要复制的数据量,初始化可能会非常耗时。

15.9. 禁用和重新启用复制

默认情况下,在创建复制协议时启用复制。在某些情况下,例如,当关闭服务器进行维护时,管理员希望临时禁用复制。
重要
如果您使用 dsconf replication disable 命令禁用复制条目,目录服务器也会自动删除复制协议。在这种情况下,要重新启用复制,您必须重新创建复制协议。
临时禁用复制协议:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt disable --suffix="dc=example,dc=com" agreement_name
重新启用复制协议:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt enable --suffix="dc=example,dc=com" agreement_name

15.10. 从复制拓扑中删除目录服务器实例

在某些情况下,如硬件中断或结构更改,管理员希望从复制拓扑中删除目录服务器实例。本节介绍有关删除实例的详细信息。

15.10.1. 从 Replication Topology 中删除 Consumer 或 Hub

从复制拓扑中删除消费者或 hub:
  1. 如果要删除的主机是 hub,以及拓扑中其他服务器的供应商,请配置其他供应商或 hubs 以将数据复制到这些服务器。如果这些服务器没有配置其他供应商,并且删除了 hub,则这些服务器会与复制拓扑隔离。有关配置复制的详情,请参考:
  2. 在要删除的主机上,将数据库设置为只读模式以防止任何更新:
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h host-to-remove.example.com -x
    
    dn: cn=userRoot,cn=ldbm database,cn=plugins,cn=config
    changetype: modify
    replace: nsslapd-readonly
    nsslapd-readonly: on
  3. 在所有与主机有复制协议的供应商上,删除复制协议。例如:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt \
         delete --suffix="dc=example,dc=com" agreement_name
  4. 在消费者或 hub 上,删除所有后缀的复制。例如:
    # dsconf -D "cn=Directory Manager" ldap://host-to-remove.example.com replication \
         disable --suffix="dc=example,dc=com"
    禁用复制可自动删除此服务器上此后缀的所有复制协议。

15.10.2. 从复制拓扑中删除叶

从复制拓扑中删除供应商比删除消费者或 hub 更为复杂。这是因为拓扑中的每个供应商都会存储有关其他供应商的信息,即使供应商变得不可用,它们也会保留这些信息。
目录服务器在一组称为副本更新向量(RUV)的元数据中维护复制拓扑的信息。RUV 包含有关供应商的信息,如其 ID、URL、本地更改状态号(CSN),以及第一个更改的 CSN。供应商和消费者存储 RUV 信息,它们使用它来控制复制更新。
要完全删除供应商,您必须删除其元数据以及配置条目。
  1. 如果要删除的副本也是拓扑中其他服务器的供应商,请配置其他供应商或 hubs 以将数据复制到这些服务器。如果这些服务器没有配置其他供应商,并且删除了供应商,则这些服务器会与复制拓扑隔离。有关配置复制的详情,请参考:
  2. 在要删除的供应商中:
    1. 将数据库设置为只读模式,以防止任何更新。详情请查看 第 2.2.2.1 节 “在只读模式下设置数据库”
    2. 等待拓扑中的所有其他服务器收到此供应商中的所有数据。要验证,请确保其他服务器上的 CSN 等于或大于要删除供应商的 CSN。例如:
      # ds-replcheck online -D "cn=Directory Manager" -w password -m ldap://replica-to-remove.example.com:389 -r ldap://server.example.com:389 -b dc=example,dc=com
      ================================================================================
               Replication Synchronization Report  (Tue Mar  5 09:46:20 2019)
      ================================================================================
       
       
      Database RUV's
      =====================================================
       
      Supplier RUV:
        {replica 1 ldap://replica-to-remove.example.com:389} 5c7e8927000100010000 5c7e89a0000100010000
        {replicageneration} 5c7e8927000000010000
       
      Replica RUV:
        {replica 1 ldap://replica-to-remove.example.com:389} 5c7e8927000100010000 5c7e8927000400010000
        {replica 2 ldap://server.example.com:389}
        {replicageneration} 5c7e8927000000010000
    3. 显示副本 ID:
      # dsconf -D "cn=Directory Manager" ldap://replica-to-remove.example.com replication get --suffix="dc=example,dc=com" | grep -i "nsds5replicaid"
      nsDS5ReplicaId: 1
      在本例中,副本 ID 是 1。请记住此步骤的最后一步的副本 ID。
  3. 在所有具有与副本的复制协议的供应商上,删除复制协议。例如:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt \
         delete --suffix="dc=example,dc=com" agreement_name
  4. 在要删除的副本上,禁用所有后缀的复制。例如:
    # dsconf -D "cn=Directory Manager" ldap://replica-to-remove.example.com replication \
         disable --suffix="dc=example,dc=com"
    禁用复制可自动删除此服务器上此后缀的所有复制协议。
  5. 在拓扑中剩余的供应商中,清理副本 ID 的 RUV。例如:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com repl-tasks \
         cleanallruv --suffix="dc=example,dc=com" --replica-id=1
    该命令需要指定此流程前面步骤中显示的副本 ID。

15.11. 管理带有过期复制的属性

作为 第 15.1.7 节 “使用 DNATactional Replication 复制子属性集” 描述,部分复制允许管理员设置从复制更新 中排除 的属性。管理员可以出于各种性能的原因进行此操作 - 限制通过网络发送的大属性数量,或者减少运行任务(如 memberOf 计算)的次数。
从复制中排除的属性列表在 nsDS5ReplicatedAttributeList 属性中定义。此属性是复制协议的一部分,可以在 web 控制台的复制协议向导中配置,也可以在创建复制协议时通过命令行进行配置。
nsDS5ReplicatedAttributeList: (objectclass=*) $ EXCLUDE memberof authorityRevocationList accountUnlockTime
重要
目录服务器要求 nsDS5ReplicatedAttributeList 属性的值中的 EXCLUDE 部分。如果直接编辑属性,例如使用 ldapmodify 工具,您必须将此部分与属性列表一起指定,如上例中所示。但是,dsconf 和 Web 控制台会自动添加 (objectclass= the)$ EXCLUDE 部分,您必须只指定属性。

15.11.1. 为总和增量更新设置不同的复制属性

首次配置部分复制时,排除的属性列表会应用到每个更新操作。这意味着,这个属性列表会排除整个更新以及常规增量更新。但是,在有些情况下,属性应该不包括在增量更新中,但应包含在整个更新中,以确保目录数据集已完成。在这种情况下,可以添加一个第二个属性,它定义了单独的属性,以排除总更新 nsDS5ReplicatedAttributeListTotal
注意
nsDS5ReplicatedAttributeList 是主要部分复制属性。如果只设置了 nsDS5ReplicatedAttributeList,则它将适用于增量更新和总更新。如果设置了 nsDS5ReplicatedAttributeListnsDS5ReplicatedAttributeListTotal,则 nsDS5ReplicatedAttributeList 仅适用于增量更新。
例如,每次将 memberOf 属性添加到条目时,都会运行 memberOf 修复任务来解决组成员资格。如果每次进行复制时都运行该任务,这可能会导致服务器开销。由于数据库的总更新仅针对被新添加到复制或长时间离线的数据库发生,因此在整个更新是一个可接受的选项后运行 memberOf 修复任务。在这种情况下,nsDS5ReplicatedAttributeList 属性列出了 memberOf,因此它不包括在增量更新中,但 nsDS5ReplicatedAttributeListTotal 不会列出 memberOf,使其包含在总更新中。
增量更新的排除列表在复制协议的 nsDS5ReplicatedAttributeList 属性中设置。例如:
nsds5replicatedattributelist: (objectclass=*) $ EXCLUDE authorityRevocationList accountUnlockTime memberof
要设置 nsDS5ReplicatedAttributeList 属性,请使用 dsconf repl-agmt set 命令。例如:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt set \
     --suffix="suffix" --frac-list="authorityRevocationList accountUnlockTime memberof" \
     agreement_name
如果 nsDS5ReplicatedAttributeList 是唯一属性集,则该列表适用于增量和总更新。要为总更新设置单独的列表,请将 nsDS5ReplicatedAttributeListTotal 属性添加到复制协议中:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt set \
     --suffix="suffix" --frac-list-total="accountUnlockTime" \
     agreement_name
注意
必须为增量更新设置 nsDS5ReplicatedAttributeList 属性,然后才能为总更新设置 nsDS5ReplicatedAttributeListTotal

15.11.2. Replication Keep-alive Entry

当您更新供应商上的属性时,供应商会增加更改序列号(CSN)。在复制拓扑中,这个服务器现在连接到第一个消费者,并将本地 CSN 与消费者上的 CSN 进行比较。如果它较低,则从本地更改日志中检索更新,并复制到消费者。在启用了部分复制的复制拓扑中,这可能会导致问题:例如,如果在从复制中排除的供应商中只更新属性,则不会找到任何更新来复制,因此 CSN 不会在消费者上更新。在某些情况下,比如只在复制中排除的供应商中只更新属性时,对供应商上的更新不必要的搜索可能会导致其他服务器接收数据。要临时解决这个问题,Directory 服务器使用 keep-alive 条目。
如果供应商中的所有更新属性都不包括在复制中,且跳过的更新数量超过 100,则 keepalivetimestamp 属性会在供应商上更新并复制到消费者。因为 keepalivetimestamp 属性没有包括在复制中,所以会复制 keep-alive 条目的更新,所以消费者上的 CSN 会被更新,然后等于供应商上的 CSN。下次供应商连接到消费者时,只会搜索比消费者上的 CSN 更新。这可减少供应商搜索要发送的新更新所需的时间。
目录服务器会根据供应商的需求自动创建复制保留条目。它在可分辨名称(DN)中包含供应商的副本 ID。每个 keep-alive 条目都特定于一个给定的提供者。例如,显示隐藏的 keep-alive 条目:
# ldapsearch -D "cn=Directory Manager" -b "dc=example,dc=com" -W -p 389 -h server.example.com -x 'objectClass=ldapsubentry'

dn: cn=repl keep alive 1,dc=example,dc=com
objectclass: top
objectclass: ldapsubentry
objectclass: extensibleObject
cn: repl keep alive 1
keepalivetimestamp: 20181112150654Z
在以下情况下更新 keep-alive 条目(如果在更新前不存在,则首先创建它):
  • 当部分复制协议跳过超过 100 个更新时,在结束复制会话前不会发送任何更新。
  • 当供应商初始化消费者时,最初它会创建自己的 keep-alive 条目。也是供应商的消费者不会创建自己的 keep-alive 条目,除非它也初始化另一个消费者。

15.11.3. 防止 "Empty" 更新进行复制

部分复制允许从复制更新中删除的属性列表(nsDS5ReplicatedAttributeList)。但是,对 exclude 属性的更改仍然会触发修改事件并生成空的复制更新。
nsds5ReplicaStripAttrs 属性添加一个无法在空复制事件中发送的属性列表,并从更新序列中分离。这个逻辑上包括操作特定点,如 修饰符名称
例如,假设 accountUnlockTime 属性被排除。John Smith 的用户帐户被锁定,然后过期时间,并自动解锁。只有 accountUnlockTime 属性已更改,且该属性不包括在复制中。但是,操作属性 internalmodifytimestamp 改变。触发复制事件,因为 John Smith 的用户帐户被修改 - 但是唯一要发送的数据是新的修改时间戳,否则更新是 emtpy。如果有大量与登录时间或密码过期时间相关的属性(例如,这可能会造成大量空复制更新,这会影响服务器性能或对关联的应用程序有影响。
要防止这种情况,请在复制协议中添加 nsds5ReplicaStripAttrs 属性,以帮助调整部分复制行为:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt set \
     --suffix="suffix" \
     --strip-list="modifiersname modifytimestamp internalmodifiersname" \
     agreement_name
如果复制事件 不为空 剥离的属性仍然与其他更改一起复制。只有在事件是 emtpy 时,这些属性才会从更新中删除。

15.12. 使用复制管理已删除条目

删除条目时,它不会立即从数据库中删除。相反,它将转换为 tombstone 条目,即复制中服务器使用的一系列备份条目来解决特定的冲突(孤立条目)。tombstone 条目是带有修改后的 DN 的原始条目,添加了一个 nsTombstone 对象类,但属性会从索引中删除。
tombstones 不会无限期保留。清除作业会定期运行,间隔为 nsDS5ReplicaTombstonePurgeInterval 属性;清除会删除旧的 tombstone 条目。在给定时间内保存 tombstone 条目(在 nsDS5ReplicaPurgeDelay 属性中设置);当 tombstone 条目早于延迟周期后,它会在下一次清除作业处获取。
清除延迟和清除间隔都在 cn=replica,cn=复制后缀,cn= mapping 树,cn=config 配置条目的 replica 条目上设置。为复制定义清除设置时有两个注意事项:
  • 清除操作非常耗时,特别是当服务器处理大量删除操作时。不要设置清除间隔太低,或者可能会消耗太多的服务器资源并影响性能。
  • 供应商使用更改信息(包括 tombstone 条目)在初始化后进行主复制。应有足够的更改来有效地重新初始化消费者,并解决复制冲突。不要设置清除延迟(tombstone 条目的年龄)太低,或者可能会丢失解决复制冲突所需的信息。
    设置清除延迟,使其比复制拓扑中复制的最大调度稍长。例如,如果复制间隔最多为 24 小时,则大约 25 小时保留 tombstone 条目。这样可确保有足够的更改历史记录来初始化消费者,并防止不同供应商中存储的数据分离。
当您使用 dsconf replication set 命令时,--repl-tombstone-purge-interval=seconds选项会 设置 nsDS5ReplicaTombstonePurgeInterval 属性和 --repl-purge-delay= 选项,s nsDS5ReplicaPurgeDelay 属性。
例如,要将 tombstone 清除间隔设置为 43200 (12 小时),副本清除延迟为 90000 (25 小时):
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com replication set \
     --repl-tombstone-purge-interval=43200 --repl-purge-delay=90000
注意
要立即清理 tombstone 条目和状态信息,请为 nsDS5ReplicaTombstonePurgeIntervalnsDS5ReplicaPurgeDelay 属性设置一个非常小的值。两个属性都有设置的值(以秒为单位),因此几乎可以立即启动清除操作。
警告
始终使用清除间隔从数据库清理 tombstone 条目。永不手动删除 tombstone 条目。

15.13. 配置更改日志加密

为提高安全性,目录服务器支持加密更改日志。本节介绍如何启用此功能。

先决条件

服务器必须有存储在网络安全服务(NSS)数据库中的证书和密钥。例如,在服务器上启用 TLS 加密,如 第 9.4.1 节 “在目录服务器中启用 TLS” 所述。

流程

启用 changelog 加密:
  1. 除了您要启用 changelog 加密的服务器外,请输入以下命令停止复制拓扑中的所有实例:
    # dsctl instance_name stop
  2. 在您要启用 changelog 加密的服务器中:
    1. 将更改日志(如 /tmp/changelog.ldif 文件)导出到 /tmp/changelog.ldif 文件中:
      # dsconf -D "cn=Directory Manager" ldap://server.example.com replication dump-changelog -o /tmp/changelog.ldif
    2. 停止实例:
      # dsctl instance_name stop
    3. /etc/dirsrv/slapd-instance_name/dse.ldif 文件中的 dn: cn=changelog5,cn=config 条目中添加以下设置:
      nsslapd-encryptionalgorithm: AES
    4. 启动实例:
      # dsctl instance_name start
    5. /tmp/changelog.ldif 文件中导入更改日志:
      # dsconf -D "cn=Directory Manager" ldap://server.example.com replication restore-changelog from-ldif /tmp/changelog.ldif
  3. 使用以下命令,启动复制拓扑中的其他服务器中的所有实例:
    # dsctl instance_name start

验证

要验证 changelog 是否已加密,请在带有加密更改日志的服务器上执行以下步骤:
  1. 在 LDAP 目录中进行更改,如更新条目。
  2. 停止实例:
    # dsctl stop instance_name
  3. 输入以下命令显示 changelog 的部分内容:
    # dbscan -f /var/lib/dirsrv/slapd-instance_name/changelogdb/replica_name_replGen.db | tail -50
    如果更改日志加密,您只会看到加密的数据。
  4. 启动实例:
    # dsctl start instance_name

其它资源

15.14. 删除更改日志

changelog 是给定副本的所有修改记录,供应商用来将这些修改重新到消费者服务器上的副本(或在多层次复制的情况下供应商)。
如果供应商服务器离线,则务必要删除更改日志,因为它不再包含所有修改的真正记录,因此不应该用作复制的基础。可以通过删除日志文件来有效地删除更改日志。

15.14.1. 使用命令行删除更改日志

从供应商服务器中删除更改日志:
  1. 验证是否为所有后缀禁用复制:
    # dsconf -D "cn=Directory Manager" ldap://supplier.example.com replication list
    There are no replicated suffixes
  2. 删除更改日志:
    # dsconf -D "cn=Directory Manager" ldap://supplier.example.com replication delete-changelog

15.14.2. 使用 Web 控制台删除更改日志

从供应商服务器中删除更改日志:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Replication 菜单,然后选择 Replication Changelog 条目。
  4. 单击 Delete Changelog

15.15. 导出复制更改日志

在某些情况下,如要加密复制更改日志时,您必须导出更改日志作为过程的一部分。完成此流程以导出更改日志。

先决条件

  • 在 Directory 服务器实例上启用复制。

流程

要将更改日志导出到 /tmp/changelog.ldif 文件,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com replication dump-changelog -o /tmp/changelog.ldif
请注意,dirsrv 用户需要适当的文件系统权限来创建指定的文件。

15.16. 从 LDIF 格式的 Changelog 转储导入复制更改日志

完成此流程,将 LDIF 格式的复制更改日志转储导入到目录服务器中。

先决条件

流程

要从 /tmp/changelog.ldif 文件中导入 changelog 转储,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com replication restore-changelog from-ldif /tmp/changelog.ldif
请注意,dirsrv 用户需要读取指定的文件的权限。

15.17. 移动复制更改日志目录

在某些情况下,您可能想要更改目录服务器复制更改目录。例如,要将目录改为 /var/lib/dirsrv/slapd-instance_name/new_changelogdb/
  1. 显示到更改日志的当前路径并设置新路径:
    • 使用命令行:
      1. 显示当前目录:
        # ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -x \
             -b "cn=changelog5,cn=config" nsslapd-changelogdir
        ...
        nsslapd-changelogdir: /var/lib/dirsrv/slapd-instance_name/changelogdb/
        稍后的步骤中需要显示的路径来移动目录。
      2. 设置新路径:
        # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
        
        dn: cn=changelog5,cn=config
        changetype: modify
        replace: nsslapd-changelogdir
        nsslapd-changelogdir: /var/lib/dirsrv/slapd-instance_name/new_changelogdb/
    • 使用 Web 控制台:
      1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
      2. 选择实例。
      3. 打开 Replication 菜单,然后选择 Replication Changelog 条目。
      4. 单击 Show Advanced Settings
      5. Changelog Location 字段中识别当前路径。稍后的步骤中需要显示的路径来移动目录。
      6. Changelog Location 字段中设置新路径。
      7. 点击 Save
  2. 停止 Directory 服务器实例:
    # dsctl instance_name stop
  3. 将之前目录的内容移到 /var/lib/dirsrv/slapd-instance_name/new_changelogdb/ 中:
    # mv /var/lib/dirsrv/slapd-instance_name/changelogdb/ \
         /var/lib/dirsrv/slapd-instance_name/new_changelogdb/
  4. 删除上一个目录:
    # rm /var/lib/dirsrv/slapd-instance_name/changelogdb/
  5. 启动 Directory 服务器实例:
    # dsctl instance_name start

15.18. 修剪 Replication Changelog

Directory Server changelog 维护一个接收和处理的更改列表。它包括从复制合作伙伴收到的客户端更改和更改。
默认情况下,Directory 服务器会修剪 7 天以上的 changelog 条目。但是,您可以修改它并配置:
  • nsslapd-changelogmaxage 参数中更改日志中的最大年龄。
  • nsslapd-changelogmaxentries 参数中更改日志中的记录总数。
如果您至少启用了这些设置之一,Directory 服务器默认每 5 分钟修剪更改日志(nsslapd-changelogtrim-interval)。
之后创建的所有记录和记录都会保留在更改日志中,直到拓扑中的所有服务器上成功复制为止。如果您必须从拓扑中删除供应商,如 第 15.10.2 节 “从复制拓扑中删除叶” 所述,那么目录服务器会从其它服务器上的 changelogs 中修剪此供应商的所有更新。

15.18.1. 配置复制更改

默认情况下,Directory 服务器会修剪 7 天以上的 changelog 条目。但是,您可以配置目录服务器可以删除条目的时间。您还可以将 Directory 服务器配置为在条目数量超过配置的值时自动删除条目。
注意
红帽建议设置最长期限而不是最大条目数。最长期限应与 cn=replica,cn=suffixDN,cn=mapping tree,cn=config 条目中的 nsDS5ReplicaPurgeDelay 参数中设置的复制清除延迟匹配。
在供应商中执行此步骤:
  1. 配置更改日志修剪:
    • 要设置 changelog 条目的最大年龄,请输入:
      # dsconf -D "cn=Directory Manager" ldap://server.example.com replication set-changelog --max-age "4w"
      此命令将最长期限设置为 4 周。参数支持以下单元:
      • s (S)
      • M (S) 分钟
      • H (H) (小时)
      • d (D) 表示天
      • W (W)
    • 要设置最大条目数,请输入:
      # dsconf -D "cn=Directory Manager" ldap://server.example.com replication set-changelog --max-entries "100000"
      此命令将 changelog 中条目的最大数量设置为 100,000。
  2. 默认情况下,Directory 服务器每 5 分钟(300 秒)修剪更改日志。要设置不同的间隔,请输入:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com replication set-changelog --trim-interval 600
    此命令将间隔设置为 10 分钟(600 秒)。

15.18.2. 手动缩小大型更改日志的大小

在某些情况下,比如没有启用复制更改日志修剪,更改日志可能会增长到较大的大小。要解决这个问题,您可以手动减少 changelog 大小。
在供应商上执行此流程。

先决条件

已启用复制。

流程

  1. 可选:显示 changelog 的大小:
    # ls -lh /var/lib/dirsrv/slapd-instance_name/changelogdb/
    total 159M
    rw------. 1 dirsrv dirsrv 159M  Nov 21 04:01 a1cf5703-697a11ed-896ed7a0-04f329b5_637b3daf000000010000.db
    rw------. 1 dirsrv dirsrv 30 Nov 21 03:58 DBVERSION
    
    本例显示 /var/lib/dirsrv/slapd-instance_name/changelogdb/ 目录仅包含 159M 的 changelog 文件。
  2. 要在缩小 changelog 大小后重置参数,请显示并记录对应参数的当前值:
    # dsconf instance_name replication get-changelog
    dn: cn=changelog5,cn=config
    cn: changelog5
    nsslapd-changelogdir: /var/lib/dirsrv/slapd-instance_name/changelogdb/
    nsslapd-changelogmaxage: 7d
    nsslapd-changelogtrim-interval: 300
    objectClass: top
    objectClass: nsChangelogConfig
    
    如果在输出中没有看到任何特定属性,Directory 服务器将使用它们的默认值。
  3. 临时减少与修剪相关的参数:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com replication set-changelog --max-age "300s" --max-entries 500 --trim-interval 60
    重要
    出于性能原因,请不要永久使用较短的间隔设置。
  4. 等待 --trim-interval 参数中设置的时间过期。
  5. 紧凑更改日志以重新拥有磁盘空间:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com backend compact-db --only-changelog
  6. 在临时减少它们前,将 changelog 参数重置为它们的值:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com replication set-changelog --max-age "7d" --max-entries 0 --trim-interval 300

验证

  • 显示 changelog 的大小:
    # ls -lh /var/lib/dirsrv/slapd-instance_name/changelogdb/
    
    total 14M
    rw------. 1 dirsrv dirsrv 14M Nov 21 05:08 a1cf5703-697a11ed-896ed7a0-04f329b5_637b3daf000000010000.db
    rw------. 1 dirsrv dirsrv 30 Nov 21 05:01 DBVERSION
    

15.19. 强制复制更新

如果您停止了在复制进行常规维护相关的目录服务器实例,您必须在重新上线后立即更新复制。对于多层次环境中的供应商,目录信息需要由设置中的其他供应商更新。在其他情况下,例如,如果您关闭 hub 或专用消费者进行维护,然后在以后上线,供应商服务器需要更新状态。

先决条件

  • 复制被设置。
  • 消费者已初始化。

流程

  1. 检查复制协议是否配置了更新计划:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt get --suffix="dc=example,dc=com" agreement_name
    如果命令的输出包含 nsDS5ReplicaUpdateSchedule: *nsDS5ReplicaUpdateSchedule 参数不存在,则不会配置更新计划。
    如果 nsDS5ReplicaUpdateSchedule 包含计划,如下所示,请注意值:
    nsDS5ReplicaUpdateSchedule: 0800-2200 0246
  2. 如果配置了更新调度,请输入以下命令临时禁用它:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt set --schedule \* --suffix="dc=example,dc=com" agreement_name
  3. 临时禁用复制协议:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt disable --suffix="dc=example,dc=com" agreement_name
  4. 重新启用复制协议来强制进行复制更新:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt enable --suffix="dc=example,dc=com" agreement_name
  5. 如果在此流程开始时配置了复制调度,请将调度设置为先前的值:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt set --schedule "0800-2200 0246" --suffix="dc=example,dc=com" agreement_name

15.20. 设置复制超时周期

供应商必须具有与消费者的独占连接,才能向该目录发送更新。如 第 15.3.3 节 “防止在多层复制中移动消费者” 所述,可以为试图连接到消费者的供应商配置等待时间,以便在消费者与其他供应商关联时不会挂起。
也可以为供应商设置超时周期,因此它不会保持在缓慢或损坏的连接间发送更新。
有两个属性可设置超时周期:
  • nsDS5ReplicaTimeout 设置复制操作在超时和失败前等待消费者的响应的秒数。要设置最佳数量,请检查访问日志来查看复制过程的平均时间,并相应地设置超时时间。
  • nsDS5DebugReplicaTimeout 在启用调试日志时设置复制操作的超时时间。此设置可能比 nsDS5ReplicaTimeout 设置更小,因为调试日志可能会减慢目录操作的速度。此属性可以选择设置应用此参数的错误日志级别;默认值为复制调试(8192)。
这两个属性都在复制后缀的复制协议中设置:
# ldapmodify -D "cn=Directory Manager" -W -x

dn: cn=example-agreement,cn=replica,cn=dc\3Dexample\2Cdc\3Dcom,cn=mapping tree,cn=config
changetype: modify
add: nsDS5ReplicaTimeout
nsDS5ReplicaTimeout: 600
-
add: nsDS5DebugReplicaTimeout
nsDS5DebugReplicaTimeout: 6000

15.21. 使用 Retro Changelog 插件

Retro Changelog 插件将目录服务器配置为维护与 Directory Server 4.x 中实施的 changelog 兼容的更改日志。
注意
如果您需要为依赖于 Directory Server 4.x 风格的目录客户端维护更改日志,则仅启用 Retro Changelog 插件。
要使用 Retro Changelog 插件,Directory 服务器实例必须配置为单层次副本。
当目录服务器配置为维护重新引入日志时,此更改日志存储在特殊后缀 cn=changelog 下的独立数据库中。
retro changelog 由单个条目级别组成。changelog 中的每个条目都有对象类 changeLogEntry。有关 changelog 条目中可能的属性列表,请参阅 Red Hat Directory Server 配置、命令行和文件参考中的 Changelog 属性部分。

15.21.1. 启用 Retro Changelog 插件

这部分论述了如何启用 Retro Changelog 插件。
警告
不要在 retro changelog 后端中启用复制。在重新更改日志中启用复制可能会导致:
  • 生成大量复制流量,一半是重复的更新。
  • 使用与 retro changelog 修剪相关的删除操作创建错误。
  • 复制性能不佳,在供应商上没有协调更新。

15.21.1.1. 使用命令行启用 Retro Changelog 插件

使用命令行启用 Retro Changelog 插件:
  1. 使用 dsconf 工具启用插件:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin retro-changelog enable
  2. 重启实例:
    # dsctl instance_name restart

15.21.1.2. 使用 Web 控制台启用 Retro Changelog 插件

使用 Web 控制台启用 Retro Changelog 插件:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 选择 Plugins 菜单。
  4. 在左侧的列表中选择 Retro Changelog 插件。
  5. 将状态更改为 On
  6. 单击 Save Config

15.21.2. 修剪 Retro Changelog

如果您降低 nsslapd-changelogmaxage 参数和下一次修剪间隔中设置的记录最长期限,则会在 nsslapd-changelog-trim -interval 中设置,则会自动缩小重新更改日志 的大小。
例如,要将 retro changelog 中记录的最大年龄设置为 2 天:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin retro-changelog set --max-age="2d"

15.21.3. 搜索和修改 Retro Changelog

changelog 支持搜索操作,并针对包含表单过滤器(&amp ; (changeNumber>=X) (changeNumber<=Y))的搜索 进行了优化。
作为常规规则,请不要对 retro changelog 条目执行添加或修改操作,但可以删除条目来修剪 changelog 的大小。仅修改 retro changelog 条目,以修改默认的访问控制策略。

15.21.4. 重新引入更改日志和访问控制策略

当目录服务器创建重新引入日志时,不会创建访问控制指令(ACI),并且只有 Directory Manager 应用访问控制规则(读取、搜索、比较、写和删除)。
要更改应用到 retro changelog 的默认访问控制策略,请修改 cn=changelog 条目的 aci 属性。例如,如果要向所有授权用户 授予读取搜索 和比较 权限,请将以下 ACI 添加到 cn=changelog
dn: cn=changelog
aci: (targetattr="changeNumber || objectClass")(targetfilter="(objectClass=changelogentry)")
 (version 3.0; acl "Enable authenticated users to read the retro changelog"; allow (read, search, compare)
 (userdn="ldap:///all");)
警告
修改 ci 属性时,请不要向匿名用户(userdn=anyone)授予读取权限,因为更改日志条目可以包含敏感信息,如密码。您必须只允许经过身份验证的用户和用户(userdn=all)访问此信息。

15.22. 显示特定复制协议的状态

您可以使用命令行和 Web 控制台显示特定复制协议的状态。

15.22.1. 使用命令行显示特定复制协议的状态

使用命令行显示复制协议的状态:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt status --suffix="dc=example,dc=com" agreement_name
agreement_name Status for agreement_name agmt consumer.example.com:636
Replica Enabled: on
Update In Progress: FALSE
Last Update Start: 19700101000000Z
Last Update End: 19700101000000Z
Number Of Changes Sent: 0
Number Of Changes Skipped: None
Last Update Status: Error (-1) Problem connecting to replica - LDAP error: Can't contact LDAP server (connection error)
Init In Progress: 
Last Init Start: 19700101000000Z
Last Init End: 19700101000000Z
Last Init Status: unavailable
Reap Active: 0
Replication Status: Not in Synchronization: supplier (5bed8467000100010000) consumer (Unavailable)  Reason(Unknown)
Replication Lag Time: Unavailable
本例显示当前复制失败,因为 consumer.example.com 主机不可用。

15.22.2. 使用 Web 控制台显示特定复制协议的状态

在 web 控制台中显示复制协议的状态:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Monitoring 菜单,然后选择 Replication
  4. 从左侧窗格中的列表中选择 Replication 条目。
  5. 根据您要显示目录服务器实例或 Winsync 协议之间的复制协议状态,请选择适当的选项卡。
    Update Status 列显示复制协议的状态。

15.23. 监控复制拓扑

使用 dsconf 复制监控 命令显示复制状态,以及供应商、消费者和 hub 上的副本 ID 和更改状态号(CSN):
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com replication monitor
Enter password for cn=Directory Manager on ldap://supplier.example.com: password

Enter a bind DN for consumer.example.com:389: cn=Directory Manager
Enter a password for cn=Directory Manager on consumer.example.com:389: password
Supplier: server.example.com:389
--------------------------------
Replica Root: dc=example,dc=com
Replica ID: 1
Replica Status: Available
Max CSN: 5e3acb77001d00010000

Status For Agreement: "example-agreement" (consumer.example.com:389)
Replica Enabled: on
Update In Progress: FALSE
Last Update Start: 20200205140439Z
Last Update End: 20200205140440Z
Number Of Changes Sent: 1:166/0
Number Of Changes Skipped: None
Last Update Status: Error (0) Replica acquired successfully: Incremental update succeeded
Last Init Start: 20200205133709Z
Last Init End: 20200205133711Z
Last Init Status: Error (0) Total update succeeded
Reap Active: 0
Replication Status: In Synchronization
Replication Lag Time: 00:00:00

Supplier: consumer.example.com:389
-----------------------------------
Replica Root: dc=example,dc=com
Replica ID: 65535
Replica Status: Available
Max CSN: 00000000000000000000

15.23.1. 在 .dsrc 文件中为 Replication Monitoring 设置凭证

默认情况下,dsconf 复制监控 命令会在向远程实例进行身份验证时提示输入绑定 DN 和密码。或者,您可以为用户 ~/.dsrc 文件中的拓扑中的每个服务器设置绑定 DN 和可选密码。

例 15.1. 带有不同字段解释的 .dsrc 文件示例

以下是 ~/.dsrc 文件示例:
[repl-monitor-connections]
connection1 = server1.example.com:389:cn=Directory Manager:*
connection2 = server2.example.com:389:cn=Directory Manager:[~/pwd.txt]
connection3 = hub1.example.com:389:cn=Directory Manager:S3cret
本例使用 connection1 连接 connection3 作为每个条目的密钥。但是,只要它是唯一的,就可以使用任何密钥。
如果您运行 dsconf replication monitor 命令,dsconf 实用程序会连接到实例复制协议中配置的所有服务器。如果实用程序在 ~/.dsrc 中找到主机名,它将使用定义的凭证向远程服务器进行身份验证。在上例中,dsconf 在连接到服务器时使用以下凭证:
主机名 绑定 DN 密码
server1.example.com cn=Directory Manager 密码
server2.example.com cn=Directory Manager ~/pwd.txt读取密码
hub1.example.com cn=Directory Manager S3cret

15.23.2. 在 Replication Topology 监控输出中使用 Aliases

默认情况下,dsconf 复制监控器 命令显示监控报告中服务器的主机名。另外,您可以使用以下方法之一显示别名:
  • ~/.dsrc 文件中定义别名:
    [repl-monitor-aliases]
    M1 = server1.example.com:389
    M2 = server2.example.com:389
  • 通过将 -a alias=host_name:port 参数传给 dsconf 复制监控器命令来定义 别名:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com replication monitor -a M1=server1.example.com:389 M2=server2.example.com:389
在这两种情况下,命令都会在命令的输出中显示别名:
...
Supplier: M1 (server1.example.com:389)
...
Supplier: M2 (server2.example.com:389)
...

15.24. 比较两个目录服务器实例

在某些情况下,管理员希望在两个目录服务器同步时进行比较。ds-replcheck 工具允许您比较两个在线服务器。或者,ds-replcheck 可以在离线模式下比较两个 LDIF 格式的文件,并在在线模式下比较两个服务器。
注意
若要脱机比较两个数据库,请使用 db2ldif -r 命令导出它们,使其包含复制状态信息。
如果您比较两个在线服务器,则数据库的内容通常会有所不同,如果它们负载过重。要临时解决这个问题,该脚本使用滞后时间值,方法是将 -l time_in_seconds 参数传给 ds-replcheck。默认情况下,这个值被设置为 300 秒(5 分钟)。如果实用程序检测到在滞后时间内不一致,则不会报告它。这有助于减少假的正状态。
默认情况下,如果您在复制协议中排除了某些属性,ds-replcheck 会报告这些属性的不同。要忽略这些属性,请将 -i attribute_list 参数传给实用程序。
例如,要比较两个目录服务器的 dc=example,dc=com 后缀:
# ds-replcheck -D "cn=Directory Manager" -W \
     -m ldap://server1.example.com:389 \
     -r ldap://server2.example.com:389 \
     -b "dc=example,dc=com"
工具的输出包含以下部分:
数据库 RUV
列出数据库的复制更新向量(RUV),包括最小和最大更改序列号(CSN)。例如:
Supplier RUV:
  {replica 1 ldap://server1.example.com:389} 58e53b92000200010000 58e6ab46000000010000
  {replica 2 ldap://server2.example.com:389} 58e53baa000000020000 58e69d7e000000020000
  {replicageneration} 58e53b7a000000010000

Replica RUV:
  {replica 1 ldap://server1.example.com:389} 58e53ba1000000010000 58e6ab46000000010000
  {replica 2 ldap://server2.example.com:389} 58e53baa000000020000 58e7e8a3000000020000
  {replicageneration} 58e53b7a000000010000
条目数
显示两个服务器上的条目总数,包括 tombstone 条目。例如:
Supplier:  12
Replica: 10
tombstones
显示每个副本上的 tombstone 条目数。这些条目添加到总条目数中。例如:
Supplier:  4
Replica: 2
冲突条目
列出每个冲突条目的可辨识名称(DN)、冲突类型及其创建日期。例如:
Supplier Conflict Entries: 1

 - nsuniqueid=48177227-2ab611e7-afcb801a-ecef6d49+uid=user1,dc=example,dc=com
    - Conflict:   namingConflict (add) uid=user1,dc=example,dc=com
    - Glue entry: no
    - Created:    Wed Apr 26 20:27:40 2017


Replica Conflict Entries: 1

 - nsuniqueid=48177227-2ab611e7-afcb801a-ecef6d49+uid=user1,dc=example,dc=com
    - Conflict:   namingConflict (add) uid=user1,dc=example,dc=com
    - Glue entry: no
    - Created:    Wed Apr 26 20:27:40 2017
缺少条目
列出每个缺少的条目的 DN,以及条目所在的其他服务器的创建日期。例如:
  Entries missing on Supplier:
   - uid=user2,dc=example,dc=com (Created on Replica at: Wed Apr 12 14:43:24 2017)
   - uid=user3,dc=example,dc=com (Created on Replica at: Wed Apr 12 14:43:24 2017)

  Entries missing on Replica:
   - uid=user4,dc=example,dc=com (Created on Supplier at: Wed Apr 12 14:43:24 2017)
条目事件
列出包含与其他服务器上不同的属性的条目的 DN。如果状态信息可用,则也会显示它。如果没有属性的状态信息可用,它将列为原始值。这意味着值没有更新,因为第一次初始化了复制。例如:
cn=group1,dc=example,dc=com
---------------------------
Replica missing attribute "objectclass":

 - Supplier's State Info: objectClass;vucsn-58e53baa000000020000: top
 - Date: Wed Apr  5 14:47:06 2017

 - Supplier's State Info: objectClass;vucsn-58e53baa000000020000: groupofuniquenames
 - Date: Wed Apr  5 14:47:06 2017

15.25. 常见复制冲突

多层次复制使用最终一致性复制模型。这意味着在不同服务器上可以更改相同的条目。当在两个服务器之间进行复制时,需要解决冲突的更改。大部分情况下,根据与每台服务器上更改相关的时间戳自动进行解析。最新的更改具有优先权。
然而,在有些情况下,冲突需要人工干预才能到达分辨率。复制过程无法自动解析的更改冲突的条目。
要列出冲突条目,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-conflict list dc=example,dc=com

15.25.1. 命名冲突

当在不同的服务器上使用相同的 DN 创建两个条目时,复制过程中自动冲突解析过程会重命名创建的最后一个条目,包括 DN 中条目的唯一标识符。每个目录条目都包含存储在 nsuniqueid 操作属性中的唯一标识符。当发生命名冲突时,这个唯一 ID 会附加到非唯一的 DN 中。
例如,如果在两个不同的服务器上创建了 uid=user_name,ou=People,dc=example,dc=com 条目,复制会将唯一 ID 添加到创建的最后一个条目的 DN 中。这意味着存在以下条目:
  • uid=user_name,ou=People,dc=example,dc=com
  • nsuniqueid=66446001-1dd211b2+uid=user_name,ou=People,dc=example,dc=com
要解决复制冲突,您必须手动决定如何继续:
  • 要只保留有效的条目(uid=user_name,ou=People,dc=example,dc=com)并删除冲突条目,请输入:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com repl-conflict delete nsuniqueid=66446001-1dd211b2+uid=user_name,ou=People,dc=example,dc=com
  • 要只保留冲突条目(nsuniqueid=66446001-1dd211b2+uid=user_name,ou=People,dc=example,dc=com),请输入:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com repl-conflict swap nsuniqueid=66446001-1dd211b2+uid=user_name,ou=People,dc=example,dc=com
  • 要保留这两个条目,请输入:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com repl-conflict convert --new-rdn=uid=user_name_NEW nsuniqueid=66446001-1dd211b2+uid=user_name,ou=People,dc=example,dc=com
    要保留冲突条目,您必须在 --new-rdn 选项指定一个新的 Relative Distinguished Name (RDN)来重命名冲突条目。上一命令将冲突条目重命名为 uid=user_name_NEW,ou=People,dc=example,dc=com

15.25.2. Orphan Entry Conflicts

当复制删除操作并且消费者服务器发现要删除的条目具有子条目时,冲突解析过程会创建一个 粘滞 条目以避免目录中有孤立的条目。
同样,当复制 add 操作且消费者服务器无法找到父条目时,冲突解析过程会创建一个代表父条目的 glue 条目,以便新条目不是孤立条目。
glue 条目是 包括对象类 glue 和 Scalable Object 的临时条目。可使用几种方式创建 glue 条目:
  • 如果冲突解析流程发现带有匹配唯一标识符的已删除条目,glue 条目是该条目的重新发送,添加了 glue 对象类和 nsds5ReplConflict 属性。
    在这种情况下,修改 glue 条目以删除 glue 对象类和 nsds5ReplConflict 属性,以将条目保留为正常条目或删除 glue 条目及其子条目。
  • 服务器使用 glue 和 Scalable Object 对象类创建一个最小的条目。
在这种情况下,修改条目使其转换为有意义的条目,或者将其删除及其所有子条目。
列出所有 glue 条目:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-conflict list-glue suffix
删除 glue 条目及其子条目:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-conflict delete-glue DN_of_glue_entry
将 glue 条目转换为常规条目:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-conflict convert-glue DN_of_glue_entry

15.25.3. 解决 Obsolete 或 Missing Suppliers 的错误

有关复制拓扑的信息,这是所有供应商为同一复制组中的相互更新和其他副本都包含在一组称为 副本更新向量(RUV)的元数据中。RUV 包含有关供应商的信息,如其 ID 和 URL、本地服务器上最新的更改状态号(CSN),以及第一个更改的 CSN。供应商和消费者存储 RUV 信息,它们使用它来控制复制更新。
当从复制拓扑中删除一个供应商时,它可能会保留在另一个副本的 RUV 中。当其他副本重启时,它可以记录日志中的错误,警告复制插件无法识别删除的供应商。这个错误类似以下示例:
[22/Jan/2021:17:16:01 -0500] NSMMReplicationPlugin - ruv_compare_ruv: RUV [changelog max RUV] does not contain element [{replica 8 ldap://m2.example.com:389} 4aac3e59000000080000 4c6f2a02000000080000] which is present in RUV [database RUV]

<...several more samples...>

[22/Jan/2021:17:16:01 -0500] NSMMReplicationPlugin - replica_check_for_data_reload: Warning: for replica dc=example,dc=com there were some differences between the changelog max RUV and the database RUV. If there are obsolete elements in the database RUV, you should remove them using the CLEANALLRUV task. If they are not obsolete, you should check their status to see why there are no changes from those servers in the changelog.
请注意,哪些副本及其 ID;本例中,副本 8
当供应商从拓扑中永久删除时,应从其他供应商的 RUV 条目中清除有关该供应商的任何闲置元数据。使用 cleanallruv 目录任务从拓扑中的所有供应商中删除 RUV 条目。
注意
cleanallruv 任务被复制。因此,您只需要在一个供应商上运行它。

过程 15.1. 使用 cleanallruv 任务操作删除 Obsolete 或 Missing Supplier

  1. 列出所有 RUV 记录和副本 ID (有效且无效),因为删除的供应商可能在其他供应商上具有保留的元数据:
    # ldapsearch -o ldif-wrap=no -xLLL -H m1.example.com -D "cn=Directory Manager" -W -b dc=example,dc=com '(&(nsuniqueid=ffffffff-ffffffff-ffffffff-ffffffff)(objectclass=nstombstone))' nsDS5ReplicaId nsDS5ReplicaType nsds50ruv
    dn: cn=replica,cn=dc\3Dexample\2Cdc\3Dcom,cn=mapping tree,cn=config
    nsDS5ReplicaId: 1
    nsDS5ReplicaType: 3
    nsds50ruv: {replicageneration} 55d5093a000000010000
    nsds50ruv: {replica 1 ldap://m1.example.com:389} 55d57026000000010000 55d57275000000010000
    nsds50ruv: {replica 20 ldap://m2.example.com:389} 55e74b8c000000140000 55e74bf7000000140000
    nsds50ruv: {replica 9 ldap://m2.example.com:389}
    nsds50ruv: {replica 8 ldap://m2.example.com:389} 506f921f000000080000 50774211000500080000
    
    请注意返回的副本 ID: 1、 2098
  2. 通过在 cn=config 后缀下搜索副本配置条目 DN cn=replica,列出所有供应商的当前定义和有效的副本 ID。
    注意
    消费者和只读节点始终将副本 ID 设置为 65535nsDS5ReplicaType: 3 表示供应商。
    # ldapsearch -o ldif-wrap=no -xLLL -H m1.example.com m2.example.com -D "cn=Directory Manager" -W -b cn=config cn=replica nsDS5ReplicaId nsDS5ReplicaType
    dn: cn=replica,cn=dc\3Dexample\2Cdc\3Dcom,cn=mapping tree,cn=config
    nsDS5ReplicaId: 1
    nsDS5ReplicaType: 3
    
    dn: cn=replica,cn=dc\3Dexample\2Cdc\3Dcom,cn=mapping tree,cn=config
    nsDS5ReplicaId: 20
    nsDS5ReplicaType: 3
    
    在搜索第一步中返回的所有 URI 后(在此流程中,m1.example.comm2.example.com),比较返回的供应商列表(具有 nsDS5ReplicaType: 3)与上一步中的 RUV 列表。在上例中,此搜索仅返回 ID 120,但前面的搜索也会在 URI m2.example.com 上返回 98。这意味着,后者的两个被删除,需要清理其 RUV。
  3. 确定哪个 RUV 需要清理后,创建一个新的 cn=cleanallruv,cn=tasks,cn=config 条目,并提供有关复制配置的以下信息:
    • 复制数据库的基本 DN (replica-base-dn)
    • 副本 ID (副本 ID)
    • 是否要从缺少的供应商捕获到最大更改状态号(CSN),还是只删除所有 RUV 条目,并丢失任何更新(replica-force-cleaning);将此属性设置为 no 意味着任务将等待所有配置的副本,以首先从删除的副本中获得所有更改,然后删除 RUV。
    # dsconf -D "cn=Directory Manager" ldap://m2.example.com repl-tasks \
         cleanallruv --suffix="dc=example,dc=com" --replica-id=8
    注意
    cleanallruv 任务被复制。因此,您只需要在一个供应商上运行它。
    对您要清理的每个 RUV 重复相同的操作(此流程中的 ID 9 )。
  4. 清理之前发现的所有副本的 RUV 后,您可以使用第一步中的搜索来验证是否删除了所有额外的 RUV:
    # ldapsearch -o ldif-wrap=no -xLLL -H m1.example.com -D "cn=Directory Manager" -W -b dc=example,dc=com '(&(nsuniqueid=ffffffff-ffffffff-ffffffff-ffffffff)(objectclass=nstombstone))' nsDS5ReplicaId nsDS5ReplicaType nsds50ruv
    dn: cn=replica,cn=dc\3Dexample\2Cdc\3Dcom,cn=mapping tree,cn=config
    nsDS5ReplicaId: 1
    nsDS5ReplicaType: 3
    nsds50ruv: {replicageneration} 55d5093a000000010000
    nsds50ruv: {replica 1 ldap://m1.example.com:389} 55d57026000000010000 55d57275000000010000
    nsds50ruv: {replica 20 ldap://m2.example.com:389} 55e74b8c000000140000 55e74bf7000000140000
    
    如以上输出中显示的那样,副本 ID 89 不再存在,这表示其 RUV 已被成功清理。

第 16 章 将红帽目录服务器与 Microsoft Active Directory 同步

Windows 同步操作目录中的更改 - 在 Red Hat Directory Server 和 Microsoft Active Directory 之间对组、用户和密码添加、删除和更改。这使得在目录中保持一致的信息效率更高且效率更高。

16.1. 关于 Windows 同步

同步允许 Active Directory 中的用户和组条目与 Red Hat Directory Server 中的条目匹配。在创建、修改或删除条目时,对同步对等服务器进行相应的更改,允许对用户、密码和组进行双向同步。
同步过程与复制过程类似:插件启用同步,通过同步协议配置和启动,并且目录更改的记录会被维护,并根据该更改的日志发送更新。这会在 Directory 服务器和 Windows 服务器之间同步用户和组。
Windows 同步有两个部分,一个用于用户和组条目,另一个用于密码:
  • 目录服务器 Windows 同步.用户和组条目的同步在同步协议中配置,就像复制协议中配置复制一样。同步协议定义了同步哪些条目类型(用户、组或两者),以及哪些方向更改会被同步(从 Directory Server 到 Active Directory,从 Active Directory 到 Directory Server 或两者)。
    目录服务器依赖于多层复制插件来同步用户和组条目。用于多层次复制的更改也用于将更新从目录服务器发送到 Active Directory,作为 LDAP 操作。服务器还针对其 Windows 服务器执行 LDAP 搜索操作,将 Windows 条目所做的更改同步到对应的目录服务器条目。
  • 密码同步服务。如果您在 cn=config 条目中将 nsslapd-unhashed-pw-switch 参数设置为 on,则目录服务器上的密码更改将自动同步到 Active Directory。但是,必须有一个特殊的 hook,才能识别并传输 Active Directory 上的密码更改。这由密码同步服务完成。此应用程序捕获 Active Directory 域控制器的密码更改,并通过 LDAPS 将它们发送到目录服务器。
    密码同步服务必须安装在每个 Active Directory 域控制器上。

图 16.1. Active Directory - 目录服务器同步过程

Active Directory - 目录服务器同步过程
同步由一个或多个 同步协议 配置和控制,该协议在同步的 同步 服务器之间建立同步。它们与复制协议类似,包含类似的信息,包括 Active Directory 的主机名(或 IPv4 或 IPv6 地址)和端口号。目录服务器使用 LDAP/LDAPS 连接到其对等 Windows 服务器,以发送和接收更新。
LDAP (标准连接)可用于只同步用户和组条目,但为了同步密码,需要使用某种类型的安全连接。如果没有使用安全连接,Windows 域将不会接受来自 Directory 服务器的密码更改,并且密码同步服务将不会将密码从 Active Directory 域发送到 Directory 服务器。Windows 同步允许使用 TLS 和 STARTTLS 的 LDAPS。
可将多个子树对配置为相互同步。与连接数据库的复制不同,同步是在 后缀、部分目录树结构间进行。同步 Active Directory 和 Directory Server 后缀均在同步协议中指定。对应子树中的所有条目都是用于同步的候选者,包括不是指定后缀 DN 直接子项的条目。
注意
任何子容器条目都需要由管理员在 Active Directory 中单独创建;Windows 同步不会创建容器条目。
目录服务器维护一个 更改日志,这是记录所发生的修改的数据库。Windows 同步使用更改来协调和发送对 Active Directory peer 所做的更改。使用 Active Directory 的 Dirsync 搜索功能可找到对 Active Directory 中的条目的更改。目录服务器默认每五分钟定期运行 Dirsync 搜索,以检查 Active Directory 服务器上的更改。您可以通过在 cn=syncAgreement_Name,cn=WindowsReplica,cn=suffix_Name,cn=mapping tree,cn=config 条目中设置 winSyncInterval 参数来更改此默认设置。使用 Dirsync 可确保仅检索自上次搜索以来更改的条目。
在某些情况下,如配置了同步,或者目录数据有主要更改、整个更新或 重新同步,可以运行。这会检查同步对等点中的每个条目,并发送任何修改或缺失的条目。每当运行整个更新时,都会启动完整的 Dirsync 搜索。请参阅 第 16.11 节 “发送同步更新” 了解更多信息。
Windows 同步提供一些控制,可以控制要同步哪些条目,以便对同步的条目进行精细控制,并有足够的灵活性来支持不同的部署场景。通过 Directory Server 中设置的不同配置属性来设置这个控制:
  • 在创建同步协议时,您可以选择同步新的 Windows 条目(nsDS7NewWinUserSyncEnablednsDS7NewWinGroupSyncEnabled),因为它们被创建。如果这些属性设置为 on,则现有的 Windows 用户/组会同步到目录服务器,并且创建它们时创建的用户/组会同步到目录服务器。
    在 Windows 子树中,只有具有用户或组对象类的条目才能同步到目录服务器。
  • 在 Directory 服务器上,只能同步具有 ntUserntGroup 对象类和属性的条目。
同步协议的放置取决于同步的后缀;对于单个后缀,只为该后缀进行同步协议;对于多个后缀,同步协议由目录树的最多分支进行。要传播 Windows 条目和更新整个目录服务器部署,请在多层次复制环境中在供应商之间建立协议,并使用该供应商在目录服务器部署间复制更改,如 图 16.2 “多层目录服务器 - Windows 域同步” 所示。
重要
虽然可以在 hub 服务器上配置同步协议,但这仅允许从 Red Hat Directory Server 到 Active Directory 的单向同步。Active Directory 服务器无法将任何更改同步到 hub。
强烈建议您只使用多层次复制中的供应商来配置同步协议。
警告
目录服务器环境和 Active Directory 环境之间只能有一个同步协议。同一活动目录域的多个同步协议可能会造成条目冲突。

图 16.2. 多层目录服务器 - Windows 域同步

多层目录服务器 - Windows 域同步
目录服务器密码与其他条目属性同步,因为纯文本密码保留在 Directory Server changelog 中。需要密码同步服务来捕获 Active Directory 上进行的密码更改。如果没有密码同步服务,就无法同步 Windows 密码,因为密码在 Active Directory 中被哈希化,而且 Windows 哈希功能与 Directory 服务器使用的功能不兼容。

16.2. 支持的 Active Directory 版本

请参阅 Red Hat Directory Server 发行注记 中的最新目录服务器版本的相关部分。

16.3. 同步密码

目录服务器条目中的密码更改可以使用 Password Sync 工具同步到 Active Directory 条目中的密码属性。
同步密码时,会在本地同步对等点上强制使用密码策略。当目录服务器中更改密码时,Directory 服务器上应用的语法或最小长度要求。当更改的密码与 Windows 服务器同步时,会强制执行 Windows 密码策略。
重要
密码策略本身没有同步。
配置信息保存在本地的且无法同步,包括密码更改历史记录和帐户锁定计数器。
在为同步配置密码策略时,请考虑以下点:
  • Password Sync 工具必须在 Windows 计算机上与目录服务器同步的本地安装。
  • 密码同步 只能将 Windows 机器链接到单个目录服务器;若要与多个目录服务器实例同步更改,请为多层次复制配置目录服务器。
  • 密码过期警告和时间、失败的绑定尝试和其他与密码相关的信息会按服务器在本地强制执行,且不会在同步对等服务器间同步。
  • 在配置了与 Windows 服务器的复制协议的目录服务器实例中,将 cn=config 条目中的 nsslapd-unhashed-pw-switch 参数设置为 on
  • 所有服务器上都应该执行相同的绑定行为。确保在 Directory 服务器和 Active Directory 服务器上创建相同的或类似的密码策略。
  • 为同步创建的条目(例如,服务器身份)需要有永不过期的密码。为确保这些特殊用户有没有过期的密码,请将 passwordExpirationTime 属性添加到 Directory Server 条目,并为它赋予 20380119031407Z (有效范围的顶部)。

16.4. 在 Active Directory 和 Directory 服务器之间设置同步

配置同步与配置复制非常相似。它需要将数据库配置为带有更改日志的供应商,并创建协议来定义同步。一个常见的用户身份(一个同步用户)连接到 Active Directory (AD)域控制器(DC),将更新从 Directory Server 发送到 AD,并检查 AD 将它们同步到目录服务器。
注意
要让用户在 Directory 服务器和 AD 上使用其帐户,请同步密码。密码同步需要使用加密的连接。
用户和组条目的同步是从 AD 端被动的。目录服务器向 AD 发送更新并轮询 AD 域中的更新。对于密码,AD 服务器需要单独的密码服务。此服务主动将密码更改从 AD 域发送到目录服务器。

16.4.1. 第 1 步:在目录服务器主机上启用 TLS

Password Sync 服务需要通过加密的连接同步密码。如果您的目录服务器实例中还没有启用 TLS,请启用它。详情请查看 第 9.4.1 节 “在目录服务器中启用 TLS”

16.4.2. 第 2 步:在 AD 域中启用密码复杂度

使用组策略在 AD 域中启用密码复杂性。例如:
  1. 打开 组策略管理 控制台,并在域中创建新的组策略对象(GPO)。
    有关使用 组策略管理 控制台的详情,请查看 Windows 文档。
  2. 右键点击 GPO,然后选择 Edit 以打开 组策略管理编辑器
  3. 导航到 Computer ConfigurationWindows SettingsSecurity SettingsAccount PoliciesPolicy,然后双击名为 Password 的策略必须满足复杂性要求
  4. 启用策略并点击 OK
  5. 关闭 组策略管理编辑器组策略管理 控制台。

16.4.3. 第 3 步:从 AD 中提取 CA 证书

提取 root 证书颁发机构(CA)证书并将其复制到目录服务器主机上:
  • 如果您的 AD CA 证书是自签名的:
    1. 在安装了 认证机构 应用程序的 AD DC 上,按 Super key+R 组合打开 Run 对话框。
    2. 输入 certsrv.msc 命令,然后单击 OK 以打开 认证机构 应用程序。
    3. 右键点击本地证书颁发机构的名称,然后选择 Properties
    4. General 选项卡中,选择要在 CA 证书字段中导出的证书,然后点 View Certificate
    5. Details 选项卡中,点 Copy to File 以启动 证书导出向导
    6. 单击 Next,然后选择 Base-64 编码 X.509 (.CER)
    7. 为导出的文件指定合适的目录和文件名称。单击 Next 以导出证书,然后单击 Finish
    8. 将 root CA 证书复制到目录服务器主机。
  • 如果您的 AD CA 证书由外部 CA 签名:
    1. 确定 root CA。例如:
      # openssl s_client -connect adserver.example.com:636
      CONNECTED(00000003)
      depth=1 C = US, O = Demo Company, OU = IT, CN = Demo CA-28
      verify error:num=20:unable to get local issuer certificate
      verify return:0
      ---
      Certificate chain
       0 s:/C=US/O=Demo Company/OU=IT/CN=adserver.example.com
         i:/C=US/O=Demo Company/OU=IT/CN=Demo CA-1
       1 s:/C=US/O=Demo Company/OU=IT/CN=Demo CA-1
         i:/C=US/O=Demo Company/OU=IT/CN=Demo Root CA 2
      前面的例子显示 AD 服务器的 CA 证书由 CN=Demo CA-1 签名,它由 CN=Demo Root CA 2 签名。这意味着 CN=Demo Root CA 2 是 root CA。
    2. 如何检索 CA 证书,联系 root CA 的 operator。
    3. 将 root CA 证书复制到目录服务器主机。

16.4.4. 第 4 步:从目录服务器的 NSS 数据库中提取 CA 证书

从目录服务器的 NSS 数据库中提取 CA 证书:
  1. 列出数据库中的证书:
    # certutil -d /etc/dirsrv/slapd-instance_name/ -L
    
    Certificate Nickname                Trust Attributes
                                        SSL,S/MIME,JAR/XPI
    
    Server-Cert                         u,u,u
    Example CA                          C,,
  2. 从数据库中提取 CA 证书。例如,使用 Example CA nickname 提取 CA 证书,并将其存储在 /root/ds-ca.crt 文件中:
    # certutil -d /etc/dirsrv/slapd-instance_name/ -L -n "Example CA" -a > /root/ds-ca.crt
  3. 将 CA 证书复制到 AD DC。

16.4.5. 第 5 步:创建同步帐户

要在 AD 和 Directory 服务器间同步,您需要 AD 中的一个帐户,并在 Directory 服务器中有一个帐户。本节介绍创建这些帐户的详情。

在目录服务器中创建帐户

AD DC 使用 Password Sync 服务中的 Directory Server 帐户将密码同步到目录服务器。例如,要在目录服务器中创建 cn=pw_sync_user,dc=config 用户:
  1. 创建用户帐户:
    # ldapadd -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    
    dn: cn=pw_sync_user,cn=config
    objectClass: inetorgperson
    objectClass: person
    objectClass: top
    cn: pw_sync_user
    sn: pw_sync_user
    userPassword: password
    passwordExpirationTime: 20380101000000Z
    这会创建 cn=pw_sync_user,dc=config 帐户,并将其过期时间设置为 2038 年 1 月 1 日。
    重要
    为安全起见,请不要在同步子树中创建帐户。
  2. 在子树之上设置一个 ACI,它将同步并为 cn=pw_sync_user,dc=config 用户授予 writecompare 权限。例如,要将此类 ACI 添加到 ou=People,dc=example,dc=com 条目:
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    
    dn: ou=People,dc=example,dc=com
    changetype: modify
    add: aci
    aci: (targetattr="userPassword")(version 3.0;acl "Password synchronization";
     allow (write,compare) userdn="ldap:///cn=pw_sync_user,dc=config";)
  3. 配置目录服务器可以在更改日志中以明文形式存储密码:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-unhashed-pw-switch=on
    由于 Directory 服务器使用与 Active Directory 不同的密码加密,目录服务器必须以明文形式向 Windows 服务器发送密码。但是,明文密码通过 TLS 加密连接发送,这是密码同步所需的,因此不会向网络公开。

在 AD 中创建帐户

要发送和接收更新,Directory 服务器在连接到 AD 时使用 AD 帐户。此帐户必须是 Domain Admins 组的成员,或者在 AD 中具有等同的权限。有关创建 AD 帐户的详情,请查看您的 AD 文档。

16.4.6. 第 6 步:安装 密码同步 服务

在您的 AD 中的每个可写 DC 上安装 密码 同步。有关安装密码同步 服务的详情,请参考 红帽目录服务器安装指南中的安装密码同步服务部分。
有关运行红帽支持的 Password Sync 服务的操作系统列表,请查看 Red Hat Directory Server 发行注记

16.4.7. 第 7 步:将 CA 证书目录服务器添加到 密码 同步服务的证书数据库中

在安装 Password Sync 服务的每个 DC 上,将 CA 证书目录服务器添加到 Password Sync 服务的证书数据库中:
  1. 进入 C:\Program Files\Red Hat Directory Password synchronization\ 目录:
    > cd "C:\Program Files\Red Hat Directory Password Synchronization\"
  2. 在当前目录中创建证书数据库:
    > certutil.exe -d . -N
    certutil.exe 工具提示为它创建的新数据库设置密码。
  3. 导入目录服务器实例使用的 CA 证书。您将此证书在 第 16.4.4 节 “第 4 步:从目录服务器的 NSS 数据库中提取 CA 证书” 中复制到 Windows DC。例如,要从 C:\ds-ca.crt 文件中导入证书,并使用 Example CA nickname 将其存储在数据库中:
    > certutil.exe -d . -A -n "Example CA" -t CT,, -a -i "C:\ds-ca.crt"
  4. (可选)验证 CA 证书是否已正确存储在数据库中:
    > certutil.exe -d . -L
    
    Certificate Nickname                Trust Attributes
                                        SSL,S/MIME,JAR/XPI
    
    Example CA                          CT,,
  5. 重启 Windows DC。重启系统前,密码同步 服务不可用。
注意
如果您安装 Password Sync 时存在任何 AD 用户帐户,则服务无法同步这些帐户的密码,直到更改密码为止。这是因为当 密码同步 存储在 Active Directory 中后无法解密密码。有关为 AD 用户强制重置密码的详情,请查看 Active Directory 文档。

16.4.8. 第 8 步:将 CA 证书 AD 用于目录服务器的证书数据库

在 Directory Server 主机上,将 CA 证书 AD 使用添加到证书数据库中:
  1. 导入 CA 证书 AD 使用。您将此证书在 第 16.4.3 节 “第 3 步:从 AD 中提取 CA 证书” 中复制到目录服务器主机。例如,要从 /root/ad-ca.crt 文件中导入证书,并使用 Example CA nickname 将其存储在数据库中:
    > certutil -d /etc/dirsrv/slapd-instance_name/ -A -n "Example CA" -t CT,, -a -i /root/ad-ca.crt
  2. (可选)验证 CA 证书是否已正确存储在数据库中:
    > certutil -d /etc/dirsrv/slapd-instance_name/ -L
    
    Certificate Nickname                Trust Attributes
                                        SSL,S/MIME,JAR/XPI
    ...
    Example CA                          CT,,

16.4.9. 第 9 步:配置数据库以进行同步和创建同步协议

本节论述了如何为同步配置数据库并创建同步协议。

16.4.9.1. 使用命令行配置数据库以进行同步和创建同步协议

以下示例假定您在名为 ds.example.com 的主机上运行 Directory 服务器,并在名为 win-server.ad.example.com 的主机上运行 AD DC。以下流程描述了如何在这些主机之间配置同步:
  1. 为后缀启用复制:
    # dsconf -D "cn=Directory Manager" ldap://ds.example.com replication \
        enable --suffix="dc=example,dc=com" --role="supplier" --replica-id=1
    此命令将 ds.example.com 主机配置为 dc=example,dc=com 后缀的供应商,并将此条目的副本 ID 设置为 1
    重要
    对于拓扑中的所有供应商,副本 ID 必须是 165534 之间的唯一整数。
  2. 添加同步协议并初始化协议。例如:
    # dsconf -D "cn=Directory Manager" ldap://ds.example.com repl-winsync-agmt \
         create --suffix="dc=example,dc=com" --host="win-server.ad.example.com" --port=636 \
         --conn-protocol="LDAPS" --bind-dn="cn=user_name,cn=Users,dc=ad,dc=example,dc=com" \
         --bind-passwd="password" --win-subtree="cn=Users,dc=example,dc=com" \
         --ds-subtree="ou=People,dc=example,dc=com" --win-domain="AD" \
         --init example-agreement
    此命令创建一个名为 example-agreement 的复制协议。复制协议定义了设置,如 AD DC 的主机名、协议和身份验证信息,目录服务器在将数据连接到 DC 时使用。
    创建协议后,目录服务器会初始化协议。要稍后初始化协议,请省略 --init 选项。请注意,在初始化协议前同步不会启动。有关初始化同步协议的详情,请参考 第 16.11.2.1 节 “使用命令行执行完全同步”
    (可选)将 --sync-users="on"--sync-groups="on" 选项传给命令,以自动将新的 Windows 用户和组同步到目录服务器。
    有关命令中使用的选项的详情,请输入:
    # dsconf -D "cn=Directory Manager" ldap://ds.example.com repl-agmt --help
  3. 验证初始化是否成功:
    # dsconf -D "cn=Directory Manager" ldap://ds.example.com repl-winsync-agmt \
         init-status --suffix="dc=example,dc=com" example-agreement
    Agreement successfully initialized.

16.4.9.2. 配置数据库以使用 Web 控制台进行同步和创建同步协议

以下示例假定您在名为 ds.example.com 的主机上运行 Directory 服务器,并在名为 win-server.ad.example.com 的主机上运行 AD DC。以下流程描述了如何在这些主机之间配置同步:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 为后缀启用复制:
    1. 打开 Replication 菜单。
    2. 选择 dc=example,dc=com 后缀,然后单击 Enable Replication
    3. Replication Role 字段中选择 Supplier,并输入副本 ID。例如:
      这些设置将 ds.example.com 主机配置为 dc=example,dc=com 后缀的供应商,并将此条目的副本 ID 设置为 1
      重要
      对于拓扑中的所有供应商,副本 ID 必须是 165534 之间的唯一整数。
    4. Enable Replication
  4. 添加同步协议并初始化协议:
    1. 打开 Replication 菜单并选择 Winsync Agreements 条目。
    2. Create Agreement 并填写字段。例如:
      这些设置将创建一个名为 example-agreement 的同步协议。同步协议定义了设置,如 DC 的主机名、协议和身份验证信息,目录服务器在连接和同步数据时使用。
      (可选)选择 Sync New Windows UsersSync New Windows Groups,以将新的 Windows 用户和组自动同步到 Directory Server。
      创建协议后,目录服务器会初始化协议。要稍后初始化协议,请不要选择 Do Online Initialization。请注意,在初始化协议前同步不会启动。有关初始化同步协议的详情,请参考 第 16.11.2.2 节 “使用 Web 控制台执行完全同步”
    3. Save Agreement
  5. 验证初始化是否成功:
    1. 打开 Replication 菜单。
    2. 选择 Agreements 条目。
      如果初始化成功完成,Web 控制台会在 Last Update Status 列中显示 Error (0) Replica obtained: Incremental update successful 信息。
      根据要同步的数据量,初始化最多可能需要几小时。

16.5. 同步用户

用户不会在 Directory 服务器和 Active Directory 之间自动同步。必须配置同步这两个指令:
  • 如果在同步协议中通过选择 Sync New Windows Users 选项,则 Active Directory 域中的用户会被同步。同步时,所有 Windows 用户都会复制到目录服务器中,然后在创建时同步新用户。
  • 目录服务器用户帐户通过 Directory Server 条目中存在的特定属性与 Active Directory 同步。任何目录服务器条目都必须具有 ntUser 对象类和 ntUserCreateNewAccount 属性;ntUserCreateNewAccount 属性(即使在现有条目上)会向 Directory Server Windows 同步插件发送信号,将条目写入到 Active Directory 服务器。
    在下次常规更新时,会创建和修改的带有 ntUser 对象类的用户条目,并在下一次常规更新时与 Windows 机器同步,这是条目的标准轮询。
注意
用户在 Active Directory 域中未激活,直到它有密码。当将现有用户修改为具有所需的 Windows 属性时,该用户条目将同步到 Active Directory 域,但将无法登录,直到密码在 Directory Server 端或管理员在 Active Directory 上设置密码。这是因为目录服务器中存储的密码已加密,密码同步无法同步 已加密的密码。
要使用户在 Active Directory 域中激活,请重置用户的密码。
Directory 服务器中的所有 同步条目(无论是来自目录服务器还是 Active Directory)都有特殊的同步属性:
  • ntUserDomainId.这与 Active Directory 条目的 sAMAccountName 属性对应。
  • ntUniqueId.它包含对应 Windows 条目的 objectGUID 属性的值。此属性由同步进程设置,不应手动设置或修改。
  • ntUserDeleteAccount.当 Windows 条目同步时,会自动设置此属性,但必须为 Directory Server 条目手动设置。如果 ntUserDeleteAccount 的值为 true,则当 Directory Server 条目被删除时,会删除对应的 Windows 条目。否则,该条目保留在 Active Directory 中,但如果在 Directory Server 中删除,则条目会从 Directory Server 数据库中删除。
在 Directory Server 条目上设置 ntUserCreateNewAccountntUserDeleteAccount 允许目录管理器精确控制同步子树中的哪些用户在 Active Directory 上同步。

16.5.1. 在 Directory 服务器和 Active Directory 之间同步的用户属性

只有 Directory 服务器和 Active Directory 的部分属性会同步。这些属性是硬编码的,无论条目同步的方式是什么。条目中存在的任何其他属性(在 Directory Server 或 Active Directory 中)均不受同步的影响。
Directory 服务器和 Active Directory 中使用的一些属性是相同的。它们通常是在 LDAP 标准中定义的属性,在所有 LDAP 服务间都很常见。这些属性会完全同步到另一个属性。表 16.2 “用户架构,其在 Directory 服务器和 Windows 服务器中是相同的” 显示 Directory 服务器和 Windows 服务器之间是相同的属性。
有些属性会定义相同的信息,但属性的名称或其架构定义有所不同。这些属性在 Active Directory 和 Directory Server 之间映射,因此一个服务器上的属性 A 被视为另一个服务器中的属性 B。对于同步,许多与 Windows 特定信息相关的属性。表 16.1 “在 Directory 服务器和 Active Directory 之间映射的用户架构” 显示目录服务器和 Windows 服务器之间映射的属性。
有关 Directory 服务器和 Active Directory 处理某些架构元素的方式差异的更多信息,请参阅 第 16.5.2 节 “Red Hat Directory Server 和 Active Directory 之间的用户架构差异”

表 16.1. 在 Directory 服务器和 Active Directory 之间映射的用户架构

目录服务器 Active Directory
cn[a] name
ntUserDomainId sAMAccountName
ntUserHomeDir homeDirectory
ntUserScriptPath scriptPath
ntUserLastLogon lastLogon
ntUserLastLogoff lastLogoff
ntUserAcctExpires accountExpires
ntUserCodePage codePage
ntUserLogonHours logonHours
ntUserMaxStorage maxStorage
ntUserProfile profilePath
ntUserParms userParameters
ntUserWorkstations userWorkstations
[a] cn 和其它同步属性不同。当从 Directory Server 同步到 Active Directory 时,它会被直接映射 (cncn)。从 Active Directory 同步到 Directory 服务器时,cn 从 Windows 上的 name 属性映射到 Directory Server 中的 cn 属性。

表 16.2. 用户架构,其在 Directory 服务器和 Windows 服务器中是相同的

cn[a] physicalDeliveryOfficeName
description postOfficeBox
destinationIndicator postalAddress
facsimileTelephoneNumber postalCode
givenName registeredAddress
homePhone sn
homePostalAddress st
Initials 法国
l telephoneNumber
mail teletexTerminalIdentifier
手机 telexNumber
o title
ou usercertificate
pager x121Address
[a] cn 和其它同步属性不同。当从 Directory Server 同步到 Active Directory 时,它会被直接映射 (cncn)。从 Active Directory 同步到 Directory 服务器时,cn 从 Windows 上的 name 属性映射到 Directory Server 中的 cn 属性。

16.5.2. Red Hat Directory Server 和 Active Directory 之间的用户架构差异

虽然 Active Directory 支持与目录服务器相同的基本 X.500 对象类,但管理员应该了解哪些不兼容性。

16.5.2.1. cn 属性的值

在 Directory 服务器中,cn 属性可以是多值,而在 Active Directory 中,此属性必须只有一个值。当 Directory Server cn 属性同步时,只有一个值发送到 Active Directory peer。
这对于同步意味着,如果将 cn 值添加到 Active Directory 条目,且该值不是 Directory Server 中 cn 的值之一,则所有 Directory Server cn 值都会用单个 Active Directory 值覆盖。
另一个重要的区别是 Active Directory 使用 cn 属性作为其命名属性,其中 Directory 服务器使用 uid。这意味着,如果目录服务器中编辑 cn 属性,则可能完全重命名条目(并意外)。如果 cn 更改被写入 Active Directory 条目,则会重命名该条目,新的命名条目将写回目录服务器。

16.5.2.2. 密码策略

Active Directory 和 Directory 服务器都可以强制执行密码策略,如密码最小长度或最长期限。Windows 同步不会尝试确保策略一致、强制或同步。如果 Directory 服务器和 Active Directory 中密码策略不一致,那么当同步到其他系统时,在一个系统上进行的密码更改可能会失败。目录服务器上的默认密码语法设置模拟 Active Directory 强制的默认密码复杂性规则。

16.5.2.3. street 和 streetAddress 的值

Active Directory 将属性 streetAddress 用于用户或组的 postal 地址;这是目录服务器使用 street 属性的方式。Active Directory 和 Directory 服务器分别使用 streetAddressstreet 属性的方式有两个重要的区别:
  • 在目录服务器中,streetAddressstreet 的别名。Active Directory 也具有 street 属性,但它是一个单独的属性,可以存放独立的值,而不是 streetAddress 的别名。
  • Active Directory 将 streetAddressstreet 定义为单值属性,而目录服务器将 street 定义为多值属性,如 RFC 4519 中指定的。
由于 Directory 服务器和 Active Directory 处理 streetAddressstreet 属性的不同方法,在活动目录和目录服务器中设置地址属性时有两个规则:
  • Windows 同步将 Windows 条目中的 streetAddress 映射到目录服务器中的 street。为避免冲突,不应在 Active Directory 中使用 street 属性。
  • 只有一个目录服务器 street 属性值被同步到 Active Directory。如果在 Active Directory 中更改了 streetAddress 属性,且 Directory 服务器中不存在新值,则目录服务器中的所有 street 属性值都会被替换为新的单个 Active Directory 值。

16.5.2.4. 初始属性的限制

对于 initials 属性,Active Directory 会实施最大长度约束为六个字符,但目录服务器没有长度限制。如果在 Directory Server 中添加大于六个字符的 initials 属性,则该值会在与 Active Directory 条目同步时进行修剪。

16.5.3. 为目录服务器用户配置用户会话

要使目录服务器用户与 Active Directory 同步,用户条目必须设置适当的同步属性。
要通过命令行启用同步,请将所需的同步属性添加到条目中,或使用这些属性创建条目。
同步需要三个模式元素:
  • ntUser 对象类
  • ntUserDomainId 属性,用于提供 Windows ID
  • ntUserCreateNewAccount 属性向同步插件发出信号,以便将目录服务器条目同步到 Active Directory
例如,使用 ldapmodify 工具:
dn: uid=scarter,ou=People,dc=example,dc=com
changetype: modify
add: objectClass
objectClass:ntUser
-
add: ntUserDomainId
ntUserDomainId: Sam Carter
-
add: ntUserCreateNewAccount
ntUserCreateNewAccount: true
-
add: ntUserDeleteAccount
ntUserDeleteAccount: true
很多额外的 Windows 和用户属性可以添加到该条目中。同步的所有模式都在 第 16.5.1 节 “在 Directory 服务器和 Active Directory 之间同步的用户属性” 中列出。属于 ntUser 对象类的特定于 Windows 的属性在 Red Hat Directory Server 11 配置、命令和文件参考 中进行了更详细的描述。
注意
重置用户的密码。
用户在 Active Directory 域中未激活,直到它有密码。当将现有用户修改为具有所需的 Windows 属性时,该用户条目将同步到 Active Directory 域,但将无法登录,直到密码在 Directory Server 端或管理员在 Active Directory 上设置密码。密码同步 无法同步加密密码。
因此,若要使用户在 Active Directory 域中激活,请重置用户的密码。

16.5.4. 为活动目录用户配置用户会话

Windows 用户的同步(源自 Active Directory 域的用户)是在同步协议中配置。
启用用户同步:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-winsync-agmt set --sync-users="on" --suffix="dc=example,dc=com" example-agreement
要禁用用户同步,可将 --sync-users 选项设置为 off

16.6. 同步组

与用户条目一样,组不会在 Directory 服务器和 Active Directory 之间自动同步。必须配置同步这两个指令:
  • 如果在同步协议中通过选择 Sync New Windows Groups 选项,则 Active Directory 域中的组会被同步。在同步启动时,所有 Windows 组都会复制到目录服务器中,然后在创建时同步新组。
  • Directory Server 组帐户通过 Directory Server 条目中存在的特定属性与 Active Directory 同步。任何目录服务器条目都必须具有 ntGroup 对象类和 ntGroupCreateNewGroup 属性;ntGroupCreateNewGroup 属性(即使在一个现有的条目中)会向目录服务器 Windows 同步发送信息,将条目写入 Active Directory 服务器。
    在下次常规更新时,创建并同步了 ntGroup 对象类的新或修改的组。
重要
同步组时,也会同步其所有成员的列表。但是,除非启用了用户同步并应用到这些条目,否则成员条目本身不会被同步。
如果某些用户不存在,当应用程序或服务试图对 Active Directory 服务器上的所有成员都执行操作时,可能会造成问题。
另外,组还有几个其他通用属性:
  • 两个属性控制是否在 Active Directory、ntGroupCreateNewGroupntGroupDeleteGroup 上创建和删除 Directory Server 组。
    需要 ntGroupCreateNewGroup 将目录服务器组同步到 Active Directory。
  • ntUserDomainId 包含 Active Directory 域中条目的唯一 ID。这是 ntGroup 对象类的唯一必需属性。
  • ntGroupType 是 Windows 组的类型。Windows 组类型是 global/security、domain local/security、builtin、generic/security、global/distribution、domain local/distribution 或 Universal/distribution。这为同步的 Windows 组自动设置,但必须在 Directory Server 条目上手动设置这些属性,然后才能同步。

16.6.1. 关于 Windows 组类型

在 Active Directory 中,有两个主要的组类型:安全性和分发。安全组与目录服务器中的组最相似,因为安全组可以针对访问控制、资源限制和其他权限配置策略。分发组用于邮件分发。它们进一步分为全局和本地组。Directory Server ntGroupType 支持所有四个组类型:
  • -2147483646 用于全局/安全(默认)
  • -2147483644 用于域本地/安全
  • -2147483643 用于内置
  • -2147483640 用于 universal/security
  • 2 代表全局/发布
  • 4 用于域本地/发布
  • 8 用于通用/发布

16.6.2. 目录服务器和 Active Directory 之间的组属性

只有 Directory 服务器和 Active Directory 的部分属性会同步。这些属性是硬编码的,无论条目同步的方式是什么。条目中存在的任何其他属性(在 Directory Server 或 Active Directory 中)均不受同步的影响。
Directory 服务器和 Active Directory 组条目中使用的一些属性是相同的。它们通常是在 LDAP 标准中定义的属性,在所有 LDAP 服务间都很常见。这些属性会完全同步到另一个属性。表 16.4 “组条目属性,其在 Directory 服务器和 Active Directory 之间是相同的” 显示 Directory 服务器和 Windows 服务器之间是相同的属性。
有些属性会定义相同的信息,但属性的名称或其架构定义有所不同。这些属性在 Active Directory 和 Directory Server 之间映射,因此一个服务器上的属性 A 被视为另一个服务器中的属性 B。对于同步,许多与 Windows 特定信息相关的属性。表 16.3 “目录服务器和 Active Directory 之间的组条目属性映射” 显示目录服务器和 Windows 服务器之间映射的属性。
有关 Directory 服务器和 Active Directory 处理某些架构元素的方式差异的更多信息,请参阅 第 16.6.3 节 “Red Hat Directory Server 和 Active Directory 之间的组架构差异”

表 16.3. 目录服务器和 Active Directory 之间的组条目属性映射

目录服务器 Active Directory
cn name
ntUserDomainID name
ntGroupType groupType
uniqueMember
成员
成员[a]
[a] Active Directory 中的 Member 属性与 Directory 服务器中的 uniqueMember 属性同步。

表 16.4. 组条目属性,其在 Directory 服务器和 Active Directory 之间是相同的

cn o
description ou
l seeAlso
mail

16.6.3. Red Hat Directory Server 和 Active Directory 之间的组架构差异

虽然 Active Directory 支持与目录服务器相同的基本 X.500 对象类,但管理员应该了解哪些不兼容性。
支持嵌套组(其中组包含另一个组作为成员),并且同步 Windows 同步。但是,Active Directory 将某些约束设置为嵌套组组成。例如,不允许全局组包含域本地组作为成员。目录服务器没有本地和全局组的概念,因此可以在目录服务器侧创建条目,在同步时违反 Active Directory 的限制。

16.6.4. 为目录服务器组配置组同步

要使 Directory 服务器组与 Active Directory 同步,组条目必须设置适当的同步属性。
要通过命令行启用同步,请将所需的同步属性添加到条目中,或使用这些属性创建条目。
同步需要三个模式元素:
  • ntGroup 对象类。
  • ntUserDomainId 属性,为该条目提供 Windows ID。
  • ntGroupCreateNewGroup 属性向同步插件发出信号,以将目录服务器条目同步到 Active Directory。
    ntGroupDeleteGroup 属性是可选的,但如果在 Directory Server 中删除,这会设置是否从 Active Directory 域自动删除该条目。
另外,还建议添加 ntGroupType 属性。如果没有指定此属性,则组会自动添加为全局安全组(ntGroupType:-2147483646)。
例如,使用 ldapmodify
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: cn=Example Group,ou=Groups,dc=example,dc=com
changetype: modify
add: objectClass
objectClass:ntGroup
-
add: ntUserDomainId
ntUserDomainId: example-group
-
add: ntGroupCreateNewGroup
ntGroupCreateNewGroup: true
-
add: ntGroupDeleteGroup
ntGroupDeleteGroup: true
-
add: ntGroupType
ntGroupType: 2
很多额外的 Windows 和组属性可以添加到条目中。同步的所有模式都在 第 16.6.2 节 “目录服务器和 Active Directory 之间的组属性” 中列出。属于 ntGroup 对象类的特定于 Windows 的属性在 Red Hat Directory Server 11 配置、命令和文件参考 中进行了更详细的描述。

16.6.5. 为活动目录组配置组同步

Windows 用户的同步(源自 Active Directory 域的用户)是在同步协议中配置。
启用组同步:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-winsync-agmt set --sync-groups="on" --suffix="dc=example,dc=com" example-agreement
要禁用组同步,可将 --sync-groups 选项设置为 off

16.7. 配置 Uni-Directional 同步

作为 图 16.1 “Active Directory - 目录服务器同步过程” 演示了,同步默认为 双向。这意味着 Active Directory 中的更改发送到目录服务器,目录服务器的更改会发送到 Active Directory。
可以创建 单向同步, 其中更改仅发送单向。这与供应商消费者关系类似[1] 与 multi-supplier 相反。
同步协议的额外属性 oneWaySync,启用单向同步并指定发送更改的方向。可能的值有 fromWindows (用于 Active Directory 到目录服务器同步)和 toWindows (目录服务器到 Active Directory 同步)。如果此属性不存在,则同步是双向的。

图 16.3. uni-Directional 同步

uni-Directional 同步
同步过程本身对于双向和单向同步基本相同。它使用相同的同步间隔和配置。唯一的区别是如何请求同步信息。
对于 Windows Active Directory 到目录服务器同步,在常规同步更新间隔期间,目录服务器联系 Active Directory 服务器,并发送 DirSync 控制来请求更新。但是,Directory 服务器不会从其侧发送任何更改或条目。因此,同步更新包含要发送到和更新目录服务器条目的 Active Directory 更改。
对于 Directory Server 到 Active Directory 同步,Directory 服务器会在正常更新中向 Active Directory 服务器发送条目修改,但它不包括 DirSync 控制,以便它不会从 Active Directory 端请求任何更新。
在以下情况下使用 --one-way-sync="方向" 选项来启用单向同步:
  1. 如果您在 第 16.4.9 节 “第 9 步:配置数据库以进行同步和创建同步协议” 中创建新的同步协议,请将选项传递给 dsconf repl-winsync-agmt create 命令。
  2. 如果同步协议已存在,请更新协议。例如,将同步从 AD 设置为 Directory 服务器:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com repl-winsync-agmt set --one-way-sync="fromWindows" --suffix="dc=example,dc=com" example-agreement
注意
启用双向同步不会自动防止非同步服务器上的更改,这会导致同步更新之间的同步间不一致。例如,单向同步配置为从 Active Directory 转至目录服务器,因此 Active Directory 是数据供应商。如果在 Directory 服务器上修改甚至删除了条目,则目录服务器信息与信息不同,且这些更改永远不会传输到 Active Directory。在下一次同步更新过程中,Directory 服务器上会覆盖编辑,删除的条目会被重新添加。
要防止数据不一致,请使用访问控制规则来防止在同步的服务器中编辑或删除同步子树中的条目。第 18 章 管理访问控制 中涵盖了目录服务器的访问控制。对于 Active Directory,请查看适当的 Windows 文档。
单向同步不会影响密码同步。即使将同步方向 设置为 Windows,在更新 Active Directory 服务器上的密码后,密码也会发送到目录服务器。


[1] 与消费者不同,仍可在未同步的服务器上进行更改。使用 ACL 来防止编辑或删除未同步服务器上的条目,以维护数据完整性。

16.8. 在 Windows 同步中配置多个子树和过滤器

Windows 同步旨在在目录服务器(DS)和 Active Directory (AD)上的多个子树对之间同步。通过使用过滤器,仅同步子树下的指定条目。

Windows 同步中的多个子树

要在多个子树对之间同步,请在 Windows 同步协议中的 winSyncSubtreePair 参数中配置 Directory 服务器和 Active Directory 子树。例如,要设置多个 ou=OU1、dc=DSexample、dc=comou=OU1,DC=ADexample,DC=com 子树:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-winsync-agmt set --subtree-pair="ou=OU1,dc=DSexample,dc=com:ou=OU1,DC=ADexample,DC=com" --suffix="dc=example,dc=com" example-agreement
如果没有设置 winSyncSubtreePairnsds7WindowsReplicaSubtree AD 子树参数和 nsds7DirectoryReplicaSubtree DS 子树参数用于同步目标检查。否则,这两个参数将被忽略。

Windows 同步中的过滤器

您可以设置在以下参数中选择同步数据的过滤器:
  • --win-filter 在 Active Directory 服务器上设置额外的过滤器,
  • --ds-filter 参数在 Directory Server 上设置额外的过滤器。
以下示例配置,example_agreement 同步条目,它包含 usergroup 属性:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-winsync-agmt \
     set --win-filter="(|(cn=*user*)(cn=*group*))" --ds-filter="(|(uid=*user*)(cn=*group*))" \
     example_agreement

16.9. 为用户和组同步 POSIX 属性

所有可能的用户和属性的子集都会在 Active Directory 和 Red Hat Directory Server 之间同步。有些属性被映射,其中 Active Directory 和 Directory Server 模式之间存在区别,有些属性则直接匹配。同步的属性(匹配和映射)列在 第 16.5.1 节 “在 Directory 服务器和 Active Directory 之间同步的用户属性”第 16.6.2 节 “目录服务器和 Active Directory 之间的组属性”
默认情况下,仅同步这些属性。
该同步列表中缺少的一个属性是任何与 POSIX 相关的属性。在 Linux 系统中,系统用户和组被识别为 POSIX 条目,LDAP POSIX 属性包含所需信息。但是,当 Windows 用户同步时,它们会自动添加 ntUserntGroup 属性,以将其识别为 Windows 帐户,但没有同步 POSIX 属性(即使它们存在于 Active Directory 条目中),并且没有在 Directory Server 端添加 POSIX 属性。
Posix Winsync API 插件在 Active Directory 和 Directory Server 条目之间同步 POSIX 属性。
注意
所有 POSIX 属性(如 uidNumbergidNumberhomeDirectory)都会在 Active Directory 和 Directory Server 条目之间同步。但是,如果将新的 POSIX 条目或 POSIX 属性添加到目录服务器中的现有条目,则只有 POSIX 属性与 Active Directory 对应的条目同步。POSIX 对象类(posixAccount 用于用户,posixGroup 用于组)不会添加到 Active Directory 条目中。

16.9.1. 启用 POSIX 属性同步

Posix Winsync API 插件默认禁用,且必须启用 POSIX 属性才能从 Active Directory 用户和组条目同步到对应的目录服务器条目。
启用 Posix Winsync API 插件:
  1. 启用插件:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin "cn=Posix Winsync API,cn=plugins,cn=config" enable
  2. 重启实例:
    # dsctl instance_name restart

16.9.2. 更改 Posix 组属性同步设置

可以设置多个插件属性,来控制 POSIX 组属性和组成员如何从 Active Directory 条目同步到对应的目录服务器组和用户条目。详情请查看 红帽目录服务器配置、命令和文件参考 中的对应部分
默认值可用于大多数部署,但可以根据 Active Directory 环境更改设置。例如,启用嵌套组映射:
  1. 使用以下命令启用嵌套组映射:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin posix-winsync set --map-nested-grouping="true"
  2. 重新启动目录服务器以加载新配置。
    # dsctl instance_name restart

16.9.3. 修复 posixGroup 条目中的 Mismatched member 和 uniqueMember Attribute 值

如果 Directory 服务器和 Active Directory (AD)上的 posixGroup 条目中的 memberuniqueMember 属性值不匹配,请使用 dsconf plugin posix-winsync fixup 命令来解决这个问题:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin posix-winsync fixup DN
此命令在 Directory 服务器上重新创建 memberUid 值,并自动修改 memberuniqueMember 属性值,以匹配 AD 中定义的值。
(可选)将 -f filter 参数传给命令,以指定命令应该修复 memberUid 属性中的条目。如果没有过滤器,命令对包含 inetuserinetadminnsmemberof 对象类的所有条目进行操作。

16.10. 删除和重新创建条目

这部分论述了如何启用同步会影响同步对等点上删除的条目以及如何处理重新接收的条目。

16.10.1. 删除条目

Active Directory 对等点上的所有更改始终同步到 Directory 服务器。这意味着,当在 Active Directory 域中删除 Active Directory 组或用户帐户时,删除会自动同步到目录服务器同步服务器。
另一方面,当删除 Directory Server 帐户时,只有在 Directory Server 条目将 ntUserDeleteAccountntGroupDeleteGroup 属性设置为 true 时,才会删除 Active Directory 上的对应条目。
注意
首次将目录服务器条目同步到 Active Directory 时,Active Directory 会自动为其分配唯一 ID。在下一次同步间隔中,唯一 ID 会同步到目录服务器条目,并存储为 ntUniqueId 属性。如果在将唯一 ID 同步回目录服务器 在 Active Directory 上删除了 Directory Server 条目,则不会 在 Directory Server 上删除该条目。目录服务器使用 ntUniqueId 属性来识别并将 Active Directory 上所做的更改同步到对应的目录服务器条目;如果没有该属性,Directory 服务器将不会识别删除。
要删除 Active Directory 上的条目,然后将删除删除同步到 Directory 服务器,请在创建条目前等待 winSyncInterval 的长度(默认为五分钟),然后再删除它,以便同步 ntUniqueId 属性。

16.10.2. 重新创建条目

可在 Directory Server 中添加已删除的条目 ; 删除的条目称为 tombstone 条目。当将 Directory 服务器和 Active Directory 之间的删除条目重新添加到目录服务器时,接收的目录服务器条目具有所有原始属性和值。这称为 tombstone reanimation。resurrected 条目包括用于同步条目的原始 ntUniqueId 属性,该属性向 Active Directory 服务器发送信号,此新条目是一个 tombstone 条目。
Active Directory 重新接收旧条目,并保留该条目的原始唯一 ID。
对于 Active Directory 条目,当 tombstone 条目在 Directory 服务器上被重新创建时,原始目录服务器的所有属性都会保留,并仍然包含在恢复的 Active Directory 条目中。

16.11. 发送同步更新

同步像 winSyncInterval 设置(用于从 Active Directory 域检索更改)或 nsds5replicaupdateschedule 设置(用于从 Directory 服务器推送更改)中一样频繁进行。默认情况下,更改每五分钟从 Active Directory 检索,并且会立即发送目录服务器的更改。
同步更新可以手动触发。也可以执行完整的重新同步,其发送和拉取目录服务器和 Active Directory 中的每个条目,就像是新的一样。完整的重新同步包括之前尚未同步的现有目录服务器条目。

16.11.1. 执行手动增量同步

在正常操作过程中,对目录服务器中的条目进行的所有更新都会收集到更改日志,然后在增量更新期间重新执行。
手动同步更改:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-winsync-agmt poke --suffix="dc=example,dc=com" example-agreement

16.11.2. 执行完全同步

如果数据有重大更改,或者将同步属性添加到预先存在的目录服务器条目中,则需要启动 重新同步。重新同步是一个更新总量;检查同步子树的整个内容,如有必要,更新。在不使用更改日志的情况下,进行重新同步。这与在复制中初始化或重新初始化消费者类似。

16.11.2.1. 使用命令行执行完全同步

使用命令行启动完全同步:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-winsync-agmt init --suffix="suffix" agreement_name
显示同步状态:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-winsync-agmt init-status --suffix="suffix" agreement_name

16.11.2.2. 使用 Web 控制台执行完全同步

启动完全同步:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Replication 菜单并选择 Winsync Agreements 条目。
  4. 打开您要同步的同步协议旁边的 Choose Action 菜单,然后选择 Full Re-Synchronization
    重新同步不会删除同步对等点上的数据。进程发送和接收所有更新,并添加任何新的或修改的目录服务器条目。例如,该过程添加了一个已存在的目录服务器用户,该用户添加了 ntUser 对象类。
在 web 控制台中显示同步状态:
  1. 打开 Replication 菜单。
  2. 选择 Winsync Agreements 条目。
    如果同步成功完成,Web 控制台会在 Last Update Status 列中显示 Error (0) Replica obtained: Incremental update successful 信息。

16.11.3. 设置同步计划

同步可以通过两种方式工作。Directory 服务器使用 nsds5replicaupdateschedule 属性,按可配置的调度(类似于复制)向 Active Directory 发送更新。目录服务器轮询 Active Directory 以检查更改; 它检查 Active Directory 服务器的频率在 winSyncInterval 属性中设置。
默认情况下,Directory 服务器更新计划始终处于同步状态。Active Directory 间隔是每五分钟轮询 Active Directory。
要更改 Directory 服务器用来向 Active Directory 发送更新的调度,请编辑 nsds5replicaupdateschedule 属性。使用 24 小时时钟,调度使用 start (SSSS)和结束(EEEE)时间设置 HHMM。调度同步更新的天数从 0 (Sunday)到 6 (Saturday)。
nsds5replicaupdateschedule: SSSS EEEE DDDDDDD
例如,这会在 Sunday、周五、周四、周四和周日上从 noon 到 2:00pm 同步:
nsds5replicaupdateschedule: 1200 1400 0246
注意
同步时间不能每夜换行,因此设置 2300 0100 无效。
要更改 Directory 服务器检查 Active Directory 是否有对 Active Directory 条目的更改的频率,请重置 winSyncInterval 属性。此属性以秒为单位,因此默认 300 表示目录服务器每 300 秒或五分钟轮询 Active Directory 服务器。如果目录搜索用时过长并影响性能,则将其设置为更高的值会很有用。
winSyncInterval: 1000

16.11.4. 更改同步连接

可以更改同步协议连接的两个方面:
  • 绑定用户名和密码(nsDS5ReplicaBindDNnsDS5ReplicaCredentials)。
  • 连接方法(nsDS5ReplicaTransportInfo)。
    只能将 nsDS5ReplicaTransportInfoLDAP 改为 StartTLS,反之亦然。无法更改为或从 LDAPS 更改,因为无法更改端口号,并在 LDAP 和 LDAPS 间切换需要更改端口号。
例如:
nsDS5ReplicaBindDN: cn=sync user,cn=Users,dc=ad1
nsDS5ReplicaCredentials: {DES}ffGad646dT0nnsT8nJOaMA==
nsDS5ReplicaTransportInfo: StartTLS
警告
无法更改 Active Directory 同步对等点的端口号。因此,还无法在标准/STARTTLS 连接和 TLS 连接间切换,因为这需要在标准端口和不安全的端口之间进行改变。
要更改为或从 TLS 更改,请删除同步协议,并使用更新的端口号和新的传输信息再次添加它。

16.11.5. 处理从同步的子树中移出的条目

同步协议定义了 Active Directory 和 Directory 服务器中同步哪些子树。在范围(子树)的条目会被同步;其他条目将被忽略。
但是,同步过程实际上从 root DN 开始,以开始评估条目以进行同步。条目基于 Active Directory 中的 samAccount 和 Directory 服务器中的 uid 属性关联。如果条目(基于 samAccount/uid 关系)从同步子树中删除,则同步插件备注,因为它已被删除或移动。这是条目不再同步的同步插件的信号。
该问题是同步过程需要一些配置来确定如何处理该移动条目。有三个选项:删除对应的条目,忽略条目(默认),或者取消同步该条目。
注意
这些同步操作仅当条目移出 Active Directory 端的范围时,在 Directory Server 端处理。如果某个条目从 Directory Server 端的同步子树中移出,这不会影响任何 Active Directory 条目。
Directory Server 9.0 中的默认行为是删除对应的目录服务器条目。即使 Active Directory 端的条目没有与 Directory Server 端同步,也是如此。从 Directory Server 9.1 开始,默认行为是忽略该条目,且不执行任何操作。
例如,sam Account ID 为 jsmith 的用户在 Active Directory 上的 ou=Employees 子树中创建。同步子树为 ou=Users,因此 jsmith 用户永远不会与目录服务器同步。

图 16.4. Active Directory Tree

Active Directory Tree
对于 7.x 和 8.x 版本,同步只忽略该用户,因为它不在同步子树之外。
从 Directory Server 9.0 开始,目录服务器开始支持子树重命名 - 这意味着现有条目可以在目录树的分支之间移动。同步插件会假定,在 Active Directory 树中但在同步的子树外的条目,它对应与一个 Directory Server 用户(samAccount/uid关系),是主动移到同步的子树外,本质上是一个重命名操作。然后假设应删除"corresponding"目录服务器条目。

图 16.5. Active Directory 和 Directory Server Trees 比较

Active Directory 和 Directory Server Trees 比较
此假设不一定是一个准确的,特别是对于始终存在于同步子树之外的用户条目。
同步协议的 winSyncMoveAction 属性设置如何处理这些移动条目的说明:
  • none 不执行任何操作,因此如果同步的目录服务器条目存在,则可以将其同步到或创建 范围内的 Active Directory 条目。如果没有同步的目录服务器条目,则不会发生任何情况(这是 Directory Server 版本 9.1 及之后的版本中的默认行为)。
  • Un sync 从 Directory Server 条目中删除任何与同步相关的属性(ntUserntGroup),否则保留 Directory Server 条目。
    重要
    当取消同步 Active Directory 条目可能被删除的条目时,存在风险,并且 Directory Server 条目保持不变。这可能会造成数据不一致的问题,特别是当 Directory Server 条目用于稍后在 Active Directory 一侧重新创建条目时。
  • Delete 删除 Directory 服务器端的对应条目,无论它是否与 Active Directory 同步(这是 9.0 中的默认行为)。
    重要
    您几乎不需要删除目录服务器条目,而无需删除对应的 Active Directory 条目。这个选项仅适用于与 Directory Server 9.0 系统兼容。
如果需要更改默认值:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-winsync-agmt --move-action="action" --suffix="suffix" agreement_name

16.12. 故障排除

如果同步似乎无法正常工作,请参阅 Windows 事件日志或目录服务器错误日志以了解有关任何潜在问题的信息。

启用复制日志记录以记录同步错误

启用复制日志记录,以了解更多有关同步的详细信息,以便在错误日志中记录。复制日志级别从同步代码生成更详细的日志。与同步流量(与复制流量相同)的消息可帮助诊断问题。
有关配置日志级别的详情,请参考 第 21.3.7 节 “配置日志级别”

错误 #1: 在同步后,状态返回错误 81。

对于 TLS 通信,其中一个同步对等服务器还没有正确配置。检查目录服务器访问日志文件,以查看目录服务器是否收到连接尝试。目录服务器的错误日志文件中也有有用的消息。
要缩小错误配置的来源,请尝试建立与目录服务器的 LDAPS 连接。如果此连接尝试失败,请检查所有值(包括端口号、主机名或 IPv4/IPv6 地址、搜索基本和用户凭证)以查看是否有问题。如果所有其他失败,请使用新证书重新配置目录服务器。
如果 LDAPS 与 Directory 服务器连接成功,则错误配置可能位于 Active Directory 上。检查 Windows 事件日志文件以获取错误消息。
注意
常见问题是,当配置 Windows 同步服务证书数据库时,证书颁发机构没有被配置为可信。

错误 #2:条目从 Active Directory 上的一个子树移到另一个子树中,但不会移到 Directory Server 上的对应子树中。

这是一个将 Active Directory 上的 modrdn 操作与 Directory Server 中的条目进行同步的一个已知问题。要临时解决这个问题,请删除 Active Directory 上的条目,然后将它添加到新子树中。删除和添加将正确同步到目录服务器对等点。

第 17 章 使用 SyncRepl 协议设置内容同步

使用 内容同步 插件,目录服务器会根据 RFC 4533 支持 SyncRepl 协议。此协议可让 LDAP 服务器和客户端使用 Red Hat Directory Server 作为源,将其本地数据库与目录服务器的更改内容同步。
使用 SyncRepl 协议:
  • 在目录服务器中启用 内容同步 插件,并选择性地创建新用户,客户端将用于绑定到目录服务器。帐户必须具有读取目录中内容的权限。
  • 配置客户端。例如,将子树的搜索基础设置为 sync。详情请查看您的客户端文档。

17.1. 使用命令行配置内容同步 插件

使用命令行配置 内容同步 插件:
  1. 内容同步 插件需要 Retro Changelog 插件来记录 nsuniqueid 属性:
    1. 要验证 retro changelog 是否已启用,请输入:
      # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin retro-changelog show
      ...
      nsslapd-pluginEnabled: off
      如果 nsslapd-pluginEnabled 参数设置为 off,则会禁用重新引入更改日志。要启用,请参阅 第 15.21.1 节 “启用 Retro Changelog 插件”
    2. 添加 nsuniqueid 属性来重新引入 changelog 插件配置:
      # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin retro-changelog set --attribute nsuniqueid:targetUniqueId
    3. 另外,还可应用以下建议来提高性能:
      1. 为 retro 更改日志中的条目设置最大有效期。例如,要设置 2 天(2d):
        # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
        
        dn: cn=changelog5,cn=config
        changetype: modify
        replace: nsslapd-changelogmaxage
        nsslapd-changelogmaxage: 2d
      2. 如果您知道哪个后端或子树客户端访问来同步数据,请限制 Retro Changelog 插件的范围。例如,要排除 cn=demo,dc=example,dc=com 子树,请输入:
        # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin retro-changelog set --exclude-suffix "cn=demo,dc=example,dc=com"
  2. 启用 内容同步 插件:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin set --enabled on "Content Synchronization"
  3. 使用默认值,Directory 服务器会在 oid=1.3.6.1.4.1.4203.1.9.1.1,cn=features,cn=config 条目中创建访问控制指令(ACI),使所有用户能够使用 SyncRepl 协议:
    aci: (targetattr != "aci")(version 3.0; acl "Sync Request Control";
       allow( read, search ) userdn = "ldap:///all";)
    (可选)更新 ACI 以使用 SyncRepl 控制来限制。有关 ACI 的详情,请参考 第 18.11 节 “定义绑定规则”
  4. 重启 Directory 服务器:
    # dsctl instance_name restart
客户端现在可以使用 SyncRepl 协议将数据与目录服务器同步。

第 18 章 管理访问控制

本章论述了如何在 Red Hat Directory Server 中使用访问控制指令(ACI)来管理对条目的访问。

18.1. Access Control Principles

当目录服务器收到请求时,它使用绑定操作中提供的身份验证信息和目录中定义的 ACI 来允许或拒绝对请求条目或属性的访问。服务器可以允许或拒绝对操作的权限,如 读取写入搜索 和比较。授予用户的权限级别取决于提供的身份验证信息。
目录服务器中的访问控制可让您在 ACI 适用时设置精确的规则:
  • 对于整个目录、子树或特定条目
  • 对于特定用户,属于特定组或角色的所有用户或目录中的所有用户
  • 对于特定位置,如 IP 地址、IP 范围或 DNS 名称。
    请注意,负载均衡器可能会影响特定于位置的规则。
重要
复杂的 ACI 很难读和理解。您可以编写多个简单规则来达到同样的效果,而不是一个复杂的 ACI。但是,有大量 ACI 也会增加 ACI 处理的成本。

18.2. ACI 放置

目录服务器将 ACI 存储在目录条目的多值 aci 操作属性中。要设置 ACI,请将 aci 属性添加到对应的目录条目中。目录服务器应用 ACI:
  • 只有包含 ACI 的条目,如果它没有任何子条目。例如,如果客户端需要访问 uid=user_name,ou=People,dc=example,dc=com 对象,并且仅在 dc=example,dc=com 上设置 ACI,而不应用于任何子条目,则只应用此 ACI。
    注意
    具有 添加权限 的 ACI 也适用于以后创建的子条目。
  • 对于包含 ACI 以及下面的所有条目的条目(如果其具有子条目)。因此,当服务器评估对任何给定条目的访问权限时,它会验证请求和目录后缀之间的每个条目的 ACI,以及条目本身的 ACI。
    例如,在 dc=example,dc=comou=People,dc=example,dc=com 条目上设置 ACI:如果客户端想要访问 uid=user_name,ou=People,dc=example,dc=com 对象,它没有 ACI,目录服务器首先使用 dc=example,dc=comou=People,dc=example,dc=com 创建集合。目录服务器从目标条目构建适用的 ACI 底部的列表,最高到顶级后缀。但是,将此列表视为集合,客户端应用程序不应该预计 ACI 评估的任何顺序。
    服务器选择与资源条目匹配的 ACI,从此初始集合中创建最终适用的 ACI 集合。然后,首先评估拒绝权限的 ACI。如果成功评估了 DENY ACI,则操作会失败。如果没有找到 DENY ACI,Directory 服务器会检查是否存在授予 ALLOW 权限的 ACI。如果至少一个 ACI 允许访问,目录服务器会授予访问权限。如果没有 ACI 授予 ALLOW 权限,Directory 服务器会拒绝访问,操作会失败。
注意
rootDSE 条目中设置的 ACI 仅适用于此条目。
在条目中创建的 ACI 可以被设置为不直接应用到该条目,而是应用于以下子树中的一些或全部条目。这种方法的优点是,一般 ACI 可以被放在目录树中,以便对树中较低条目的影响。例如,目标条目为包括 inetOrgPerson 对象类的 ACI,可以在 organizationalUnit 条目或 locality 条目一级创建。
注意
通过将常规规则放在高级别分支点来最小化目录树中的 ACI 数量。要限制更具体的规则的范围,请尽可能将它们放在叶条目中。

18.3. ACI 结构

aci 属性使用以下语法:
(target_rule) (version 3.0; acl "ACL_name"; permission_rule bind_rules;)
注意
权限和绑定规则对称为访问控制规则。
要有效地为给定目标设置多个访问控制,您可以为每个目标设置多个访问控制规则:
(target_rule)(version 3.0; acl "ACL_name"; permission_rule bind_rules; permission_rule bind_rules; ... ;)

18.4. ACI 评估

要评估对特定条目的访问权限,服务器会创建条目本身上存在的 ACI 列表,并在父条目上备份到目录服务器中的顶级条目。ACI 是针对特定实例的所有数据库进行评估,但不能在不同实例间评估。
目录服务器根据 ACI 的语义而不是目录树中的放置来评估此 ACI 列表。这意味着,接近目录树根目录的 ACI 不会优先于与目录树保留更接近的 ACI。
在 Directory 服务器中,ACT 中的 deny 权限优先于 allow 权限。例如,如果您在目录的根目录中拒绝写入权限,则任何用户都可以写入该目录,无论其他 ACI 是否授予这个权限。要为目录授予特定用户写入权限,您必须对原始拒绝规则添加例外,以允许用户在该目录中写入。
注意
为了改进 ACI,请使用精细的 允许规则,而不是 拒绝规则

18.5. ACI 的限制

设置 ACI 时,会有以下限制:
  • 如果您的目录数据库通过多个服务器分发,则以下限制适用于您可在 ACI 中使用的关键字:
    • ACI 取决于使用 groupdn 关键字的组条目必须位于与组条目相同的服务器上。
      如果组是动态的,则组的所有成员都必须在服务器上有一个条目。静态组的成员条目可以位于远程服务器上。
    • ACI 取决于 roledn 关键字的角色定义,必须与角色定义条目位于同一个服务器上。每个要拥有该角色的条目也必须位于同一服务器上。
    但是,您可以使用 userattr 关键字将目标条目中存储的值与存储在绑定用户条目中的值匹配。在这种情况下,即使绑定用户在服务器上没有存储 ACI 的条目,也会频繁评估访问。
  • 您不能在以下 ACI 关键字中使用虚拟属性,如服务类(CoS)属性:
    • targetfilter
    • targattrfilters
    • userattr
  • 访问控制规则仅在本地服务器上评估。例如,如果您在 ACI 关键字的 LDAP URL 中指定服务器的主机名,则忽略 URL。

18.6. 目录服务器处理复制拓扑中的 ACI

ACI 存储在 条目的 ci 属性中。因此,如果包含 ACI 的条目是复制数据库的一部分,则会复制 ACI。
ACI 始终在解析传入 LDAP 请求的服务器上评估。当消费者服务器收到更新请求时,它会在评估请求是否可在供应商上提供服务前向供应商服务器返回引用。

18.7. 使用命令行管理 ACI

本节描述了如何使用命令行管理 ACI。
注意
Web 控制台中不支持管理目录服务器 ACI。

18.7.1. 显示 ACI

使用 ldapsearch 工具使用命令行显示 ACI。例如,显示 dc=example,dc=com 和子条目上设置的 ACI:
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -x \
     -b "dc=example,dc=com" -s sub '(aci=*)' aci

18.7.2. 添加 ACI

使用 ldapmodify 工具添加 ACI。例如:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="userPassword") (version 3.0; acl "Allow users updating their password";
 allow (write) userdn= "ldap:///self";)

18.7.3. 删除 ACI

使用命令行删除 ACI:
  1. 显示条目上设置的 ACI。请参阅 第 18.7.1 节 “显示 ACI”
  2. 删除 ACI:
    • 如果在条目中只设置一个 aci 属性,或者您想要从条目中删除所有 ACI:
      # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
      dn: ou=People,dc=example,dc=com
      changetype: delete
      delete: aci
    • 如果条目中存在多个 ACI,您想要删除特定的 ACI,请指定确切的 ACI:
      # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
      dn: ou=People,dc=example,dc=com
      changetype: modify
      delete: aci
      aci: (targetattr="userPassword") (version 3.0; acl "Allow users
       updating their password"; allow (write) userdn= "ldap:///self";)
有关删除属性的详情,请参考 第 3.1.4.3 节 “从条目中删除属性”

18.7.4. 更新 ACI

使用命令行更新 ACI:
  1. 删除现有的 ACI。请参阅 第 18.7.3 节 “删除 ACI”
  2. 使用更新的设置添加新的 ACI。请参阅 第 18.7.2 节 “添加 ACI”

18.8. 使用 Web 控制台管理 ACI

这组指令为您提供了使用 web 控制台中的 LDAP 浏览器向导来管理访问控制指令(ACI)的基础知识。

18.8.1. 在 LDAP 浏览器中创建访问控制指令

您可以使用 web 控制台中的 LDAP 浏览器为 Red Hat Directory Server (MQTTS)条目创建并添加访问控制指令(ACI)条目。

先决条件

  • 访问 Web 控制台。
  • Red Hat Directory Server 中存在父条目。

流程

  1. 登录 Web 控制台并点击 Red Hat Directory Server
  2. Web 控制台加载 Red Hat Directory Server 界面后,单击 LDAP 浏览器
  3. 选择一个 LDAP 条目并点击 Options 菜单。
  4. 从下拉菜单中选择 ACIs
  5. 要使用 LDAP 浏览器向导创建 ACI,有两个选项:
    1. Add ACI 向导 使用向导创建 ACI。继续下一步。
    2. 单击 Add ACI manually,在文本字段中输入指令,然后点 Save ACI
  6. 按照向导中的步骤,在完成每个步骤后点 Next 按钮。
  7. 要创建 ACI,请查看向导生成的数据,然后点 Add ACI
  8. 要关闭向导窗口,请点击 Finish 按钮。

验证

  • 验证新的 ACI 是否出现在 Manage ACIs 窗口中。

18.8.2. 在 LDAP 浏览器中编辑访问控制指令

您可以使用 web 控制台中的 LDAP 浏览器 管理 ACI 窗口编辑 Red Hat Directory Server 条目的访问控制指令(ACI )。

先决条件

  • 访问 Web 控制台。
  • Red Hat Directory Server 中存在父条目。

流程

  1. 登录 Web 控制台并点击 Red Hat Directory Server
  2. Web 控制台加载 Red Hat Directory Server 界面后,单击 LDAP 浏览器
  3. 选择一个 LDAP 条目并点击 Options 菜单。
  4. 从下拉菜单中选择 ACIs
  5. 点 Options 菜单并选择 Edit ACI
  6. 修改文本字段中的说明,然后点 Save ACI

验证

  • Manage ACIs 窗口中,展开您修改的 ACI 并观察您的更改。

18.8.3. 在 LDAP 浏览器中删除访问控制指令

您可以使用 web 控制台中的 LDAP 浏览器 删除红帽目录服务器条目的访问控制指令(ACI)。

先决条件

  • 访问 Web 控制台。
  • Red Hat Directory Server 中存在父条目。

流程

  1. 登录 Web 控制台并点击 Red Hat Directory Server
  2. Web 控制台加载 Red Hat Directory Server 界面后,单击 LDAP 浏览器
  3. 选择一个 LDAP 条目并点击 Options 菜单。
  4. 从下拉菜单中选择 ACI 以打开 Manage ACIs 窗口。
  5. 点您要删除的 ACI 的 Node options 图标,然后选择 Remove ACI
  6. 选中 Yes, I'm sure 复选框,然后单击 Delete ACI 按钮。

验证

  • Manage ACIs 窗口中,验证您删除的 ACI 不再出现在 ACI 列表中。

18.9. 定义目标

ACI 中的目标规则定义目录服务器将 ACI 应用到哪些条目。如果您没有设置目标,ACM 应用到包含 aci 属性和以下条目的条目。
在 ACI 中,以下突出显示的部分是目标规则:
(target_rule)(version 3.0; acl "ACL_name"; permission_rule bind_rules;)
对于复杂的 ACI,Directory 服务器在 ACI 中支持多个带有不同关键字的目标规则:
(target_rule_1)(target_rule_2)(...)(version 3.0; acl "ACL_name"; permission_rule bind_rules;)
如果您指定多个目标规则,则顺序不相关。请注意,您只能在 ACI 中使用以下每个关键字一次:
  • target
  • targetattr
  • targetattrfilters
  • targetfilter
  • target_from
  • target_to

语法

目标规则的一般语法是:
(keyword comparison_operator "expression")
  • 关键字 :设置目标的类型。请参阅 第 18.9.1 节 “常用的目标关键字”
  • compare_operator: Valid 值为 =!=,并且指明目标是否为表达式中指定的对象。
    警告
    出于安全考虑,红帽建议使用 != 运算符,因为它允许对所有其他条目或属性进行指定的操作。例如:
    (targetattr != "userPassword");(version 3.0; acl "example"); allow (write) ... );
    前面的示例允许用户在您设置 ACI 的 Distinguished Name (DN)下设置、更新或删除任何属性,但 userPassword 属性除外。但是,这还可让用户添加额外的 aci 属性,允许写入此属性的访问。
  • 表达式 :设置目标,且必须用引号括起来。表达式本身取决于您使用的关键字。

18.9.1. 常用的目标关键字

管理员经常使用以下目标关键字:

18.9.1.1. 以目录条目为目标

要根据 DN 及其下面的条目控制访问,请在 ACI 中使用 target 关键字。使用 target 关键字的目标规则将 DN 用作表达式:
(target comparison_operator "ldap:///distinguished_name")
注意
您必须使用目标的 DN 上的 target 关键字或更高级别的 DN 设置 ACI。例如,如果您以 ou=People,dc=example,dc=com 为目标,您必须在 ou=People,dc=example,dc=comdc=example,dc=com 中设置 ACI。

例 18.1. 使用 目标 关键字

要启用存储在 ou=People,dc=example,dc=com 条目中的用户,以搜索并显示其自身条目中的所有属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (target = "ldap:///ou=People,dc=example,dc=com") (version 3.0;
 acl "Allow users to read and search attributes of own entry"; allow (search, read)
 (userdn = "ldap:///self");)

target Keyword 中使用通配符

您可以使用 * 通配符来以多个条目为目标。
以下目标规则示例与 ou=People,dc=example,dc=com 中的所有条目匹配:它的 uid 属性设为以字母 a 开头的值:
(target = "ldap:///uid=a*,ou=People,dc=example,dc=com")
根据通配符的位置,该规则不仅适用于属性值,也应用到完整的 DN。因此,您可以使用通配符替换 DN 的部分内容。

例 18.2. 使用通配符以目录条目为目标

以下规则以 dc=example,dc=com 树中的所有条目为目标,它们带有匹配的 uid 属性,而不仅仅是存储在 dc=example,dc=com 条目本身中的条目:
(target = "ldap:///uid=user_name*,dc=example,dc=com")
以上目标规则与多个条目匹配,例如:
  • uid=user_name,dc=example,dc=com
  • uid=user_name,ou=People,dc=example,dc=com
  • uid=user_name2,dc=example,dc=com
重要
目录服务器不支持 DN 的后缀部分中的通配符。例如,如果您的目录的后缀是 dc=example,dc=com,则无法使用此后缀中的通配符使用带通配符的目标,如 (target = "ldap:///dc=39).com")

18.9.1.2. 目标属性

要将 ACI 中的访问限制到某些属性,请使用 targetattr 关键字。例如,这个关键字定义了:
  • 在读取操作中,哪些属性将返回到客户端
  • 在搜索操作中,将搜索哪些属性
  • 在写入操作中,可以将哪些属性写入对象
  • 在 add 操作中,创建新对象时可以添加哪些属性
注意
在某些情况下,您可以使用 targetattr 关键字将其他目标关键字与 targetattr 相结合来保护 ACI。例如,请参阅 第 18.9.3 节 “目标规则的高级用法”
重要
读取和 搜索操作 中,默认目标没有属性。没有 targetattr 关键字的 ACI 只对带有正确影响一个完整条目的 ACI 有用,例如 adddelete
要在目标规则中分隔使用 targetattr 关键字的多个属性,请使用 ||
(targetattr comparison_operator "attribute_1 || attribute_2 || ...")
表达式中设置的属性必须在 schema 中定义。
注意
表达式中指定的属性适用于您在其上创建 ACI 的条目,并在进一步的目标规则不限制的情况下应用到其下面的所有条目。

例 18.3. 使用 targetattr Keyword

要启用存储在 dc=example,dc=com 和所有子条目中的用户,以更新其自己条目的 userPassword 属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "userPassword") (version 3.0;
 acl "Allow users updating own userPassword";
 allow (write) (userdn = "ldap:///self");)

将通配符 与目标attr Keyword 搭配使用

例如,使用 * 通配符您可以以所有属性为目标:
(targetattr = "*")
警告
为安全起见,请不要将通配符用于 目标attr,因为它允许访问所有属性,包括操作属性。例如,如果用户可以添加或修改所有属性,用户可以创建额外的 ACI 并增加他们自己的权限。

18.9.1.3. 使用 LDAP 过滤器目标条目和属性

要针对一组与特定条件匹配的条目为目标,请使用带有 LDAP 过滤器的 target filter 关键字:
(targetfilter comparison_operator "LDAP_filter")
过滤器表达式是一个标准的 LDAP 搜索过滤器,如 第 14 章 查找目录条目 所述。

例 18.4. 使用 targetfilter 关键字

要为 cn=Human Resources,dc=example,dc.com 组的成员授予权限,以修改 department 属性设置为 EngineeringSales 的所有条目:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetfilter = "(|(department=Engineering)(department=Sales)")
 (version 3.0; acl "Allow HR updating engineering and sales entries";
 allow (write) (groupdn = "ldap:///cn=Human Resources,dc=example,dc.com");)
targetfilter 关键字以整个条目为目标。如果您将它与 targetattr 关键字结合使用,则 ACI 仅适用于目标条目的属性子集。请参阅 第 18.9.3.3 节 “目标与过滤器匹配的条目属性”
注意
当目标条目和属性分散到目录中时,使用 LDAP 过滤器很有用。但是,结果有时无法预测,因为过滤器不会直接命名您要管理访问权限的对象。过滤的 ACI 目标的一组条目可能会更改,因为属性会被添加或删除。因此,如果您在 ACI 中使用 LDAP 过滤器,请使用相同的过滤器验证它们是否以正确的条目和属性为目标,例如在 ldapsearch 操作中。

使用带有 targetfilter 关键字的通配符

targetfilter 关键字支持通配符与标准 LDAP 过滤器类似。例如,要针对其值以 adm 开头的所有 uid 属性为目标:
(targetfilter = "(uid=adm*) ...)

18.9.1.4. 使用 LDAP 过滤器目标属性值

您可以使用访问控制来目标属性的特定值。这意味着,如果该属性的值满足 ACI 中定义的条件,您可以对属性授予或拒绝权限。根据属性值授予或拒绝访问权限的 ACI,称为基于值的 ACI。
注意
这只适用于 ADDDEL 操作。您不能根据特定值限制搜索权限。
要创建基于值的 ACI,请使用以下语法使用 targattrfilters 关键字:
  • 对于一个带有一个属性和过滤组合的操作:
    (targattrfilters="operation=attribute:filter")
  • 对于具有多个属性和过滤组合的一个操作:
    (targattrfilters="operation=attribute_1:filter_1 && attribute_2:filter_2 ... && attribute_m:filter_m")
  • 对于两个操作,每个操作都有多个属性和过滤组合:
    (targattrfilters="operation_1=attribute_1_1:filter_1_1 && attribute_1_2:filter_1_2 ... && attribute_1_m:filter_1_m , operation_2=attribute_2_1:filter_2_1 && attribute_2_2:filter_2_2 ... & attribute_2_n:filter_2_n ")
在前面的语法示例中,您可以将操作设置为 adddelattribute:filter 组合设置过滤器和过滤器应用到的属性。
下面描述了过滤器如何匹配:
  • 在创建条目和过滤器应用到新条目中的属性时,该属性的每个实例必须与过滤器匹配。
  • 删除条目和过滤器应用到条目中的属性时,该属性的每个实例也必须与过滤器匹配。
  • 修改条目和操作会添加一个属性,则应用到该属性的 add 过滤器必须匹配。
  • 如果操作删除了属性,则应用到该属性的 del 过滤器必须匹配。如果条目中已存在的属性的单个值被替换,则 adddel 过滤器必须都匹配。

例 18.5. 使用 targattrfilters Keyword

要创建 ACI,允许用户在自己的条目中添加任何角色,但 Admin 角色除外,并添加 telephone 属性,只要值以 123 前缀开头:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targattrfilters="add=nsroledn:(!(nsroledn=cn=Admin)) &&
 telephoneNumber:(telephoneNumber=123*)") (version 3.0;
 acl "Allow adding roles and telephone";
 allow (add) (userdn = "ldap:///self");)

18.9.2. 更多目标关键字

这部分描述了不经常使用的目标关键字。

18.9.2.1. 目标源和目标 DN

在某些情况下,管理员希望用户移动目录条目。在 ACI 中使用 target_fromtarget_to 关键字,您可以指定操作的源和目标,而无需启用用户:
  • 将条目从 ACI 中设置的不同源移动。
  • 将条目移到 ACI 中设置的不同目的地。
  • 从源 DN 中删除现有条目:
  • 将新条目添加到目标 DN。

例 18.6. 使用 target_fromtarget_to Keywords

例如,要启用 uid=user,dc=example,dc=com 帐户,将用户帐户从 cn=staging,dc=example,dc=com 条目移到 cn=body,dc=example,dc=com
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (target_from="ldap:///uid=*,cn=staging,dc=example,dc=com")
 (target_to="ldap:///cn=People,dc=example,dc=com")
 (version 3.0; acl "MODDN from"; allow (moddn))
 userdn="ldap:///uid=user,dc=example,dc=com";)
注意
ACI 仅适用于定义它们的子树。在上例中,ACI 仅适用于 dc=example,dc=com 子树。
如果没有设置 target_fromtarget_to 关键字,则 ACI 会匹配任何 source 或 destination。

18.9.3. 目标规则的高级用法

通过组合多个关键字,您可以创建复杂的目标规则。本节提供了目标规则的高级用法示例。

18.9.3.1. 委派创建和维护组的权限

在某些情况下,管理员希望将权限委派给其他帐户或组。通过组合目标关键字,您可以创建可以解决这个问题的安全 ACI。

例 18.7. 委派创建和维护组的权限

要启用 uid=用户,ou=People,dc=example,dc=com" 帐户在 ou=groups,dc=example,dc=com 条目中创建和更新组:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (target = "ldap:///cn=*,ou=Groups,dc=example,dc=com")
 (targattrfilters="add=objectclass:(|(objectclas=top)(objectclass=groupOfUniqueNames)))
 (targetattr="cn || uniqueMember || objectClass")
 (version 3.0; acl "example"; allow (read, search, write, add)
 (userdn = "ldap:///uid=test,ou=People,dc=example,dc=com");)
为了安全起见,上例添加了某些限制。uid=test,ou=People,dc=example,dc=com 用户:
  • 可以创建必须包含 topgroupOfUniqueNames 对象类的对象。
  • 无法添加额外的对象类,如 帐户。例如,这可以防止使用 Directory 服务器帐户进行本地身份验证,为 root 用户创建具有无效用户 ID 的新用户,如 0。
targetfilter 规则确保 ACI 条目仅适用于具有 groupofuniquenames 对象类的条目,并且 targetattrfilter 规则可确保不能添加其他对象类。

18.9.3.2. 定位条目和属性

目标 根据 DN 控制访问。但是,如果您将其与通配符和 targetattr 关键字结合使用,您可以针对条目和属性为目标。

例 18.8. 定位条目和属性

要启用 uid=user,ou=People,dc=example,dc.com 用户,以便在 dc=example,dc=com 子树中的所有机构单元中读取和搜索组成员:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (target="ldap:///cn=*,dc=example,dc=com")(targetattr="member" || "cn") (version 3.0;
 acl "Allow uid=user to search and read members of groups";
 allow (read, search) (userdn = "ldap:///uid=user,ou=People,dc=example,dc.com");)

18.9.3.3. 目标与过滤器匹配的条目属性

如果您在两个目标规则中组合 targetattrtargetfilter 关键字,您可以在与过滤器匹配的条目中针对某些属性。

例 18.9. 目标与过滤器匹配的条目属性

要允许 cn=Engineering Admins,dc=example,dc=com 组的成员修改 department 属性设置为 Engineering 的所有条目的 jpegPhotomanager 属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "jpegPhoto || manager")
 (targetfilter = "(department=Engineering)") (version 3.0;
 acl "Allow engineering admins updating jpegPhoto and manager of department members";
 allow (write) (groupdn = "ldap:///cn=Engineering Admins,dc=example,dc.com");)

18.9.3.4. 以单个目录条目为目标

要以单个目录条目为目标,请组合 targetattrtargetfilter 关键字。

例 18.10. 以单个目录条目为目标

要启用 uid=user,ou=People,dc=example,dc=com 用户可以在 ou=Engineering,dc=example,dc=com 条目中读和搜索 oucn 属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=Engineering,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "ou || cn")
 (targetfilter = "(ou=Engineering)") (version 3.0;
 acl "Allow uid=user to search and read engineering attributes";
 allow (read, search) (userdn = "ldap:///uid=user,ou=People,dc=example,dc.com");)
若要启用前面的示例,仅以 ou=Engineering,dc=example,dc=com 条目为目标,则 ou=Engineering,dc=example,dc=com 中的子条目不能将 ou 属性设置为 Engineering
重要
如果您的目录结构发生了变化,则这些类型的 ACI 可能会失败。
或者,您可以创建一个与绑定请求中的用户输入匹配的绑定规则,并使用存储在目标条目的属性值。请参阅 第 18.11.2.1 节 “根据匹配值定义访问”

18.10. 定义权限

权限规则定义与 ACI 关联的权限,以及是否允许或拒绝访问。
在 ACI 中,以下突出显示的部分是权限规则:
(target_rule) (version 3.0; acl "ACL_name"; permission_rule bind_rules;)

语法

权限规则的一般语法是:
permission (rights)

例 18.11. 定义权限

要启用存储在 ou=People,dc=example,dc=com 条目中的用户,以搜索并显示其自身条目中的所有属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (target = "ldap:///ou=People,dc=example,dc=com") (version 3.0;
 acl "Allow users to read and search attributes of own entry"; allow (search, read)
 (userdn = "ldap:///self");)

18.10.1. 用户权限

权限规则的权限定义了授予或拒绝的操作。在 ACI 中,您可以设置以下一个或多个权限:

表 18.1. 用户右边

right 描述
读取 设置用户是否可以读取目录数据。此权限只适用于 LDAP 中的搜索操作。
write 通过添加、修改或删除属性来设置用户是否可以修改条目。此权限适用于 LDAP 中的 modifymodrdn 操作。
add 设置用户可以创建条目。此权限只适用于 LDAP 中的 add 操作。
delete 设置用户是否可以删除条目。此权限只适用于 LDAP 中的 delete 操作。
search 设置用户可以搜索目录数据。要查看作为搜索结果的一部分返回的数据,分配 searchread 权限。此权限只适用于 LDAP 中的搜索操作。
compare 设置用户是否可以将其提供的数据与目录中存储的数据进行比较。通过 比较 权限,目录会返回成功或失败消息以响应查询,但用户无法看到 entry 或 属性的值。此权限仅适用于 LDAP 中的比较操作。
selfwrite 设置用户是否可以从组添加或删除自己的 DN。这个右边仅用于组管理。
proxy
设置指定的 DN 是否可以使用另一个条目的权限访问目标。代理右侧的代理 在 ACL 范围内被授予,作为正确授予的用户或组可以作为任何目录服务器用户运行命令。您不能将代理权限限制为某些用户。
为安全起见,设置 ACI,它在目录的最目标级别设置 proxy 权限。
all 设置除 代理外的所有权限

18.10.2. LDAP 操作所需的权限

本节介绍了您必须根据您要授权其执行的 LDAP 操作类型向用户授予权限。
  • 添加一个条目:
    • 授予对 要添加的 条目的添加权限。
    • 授予条目中每个属性值 的写入权限。默认情况下会授予此右边,但可使用 targattrfilters 关键字进行限制。
  • 删除条目:
    • 授予对 您要删除的 条目的删除权限。
    • 授予条目中每个属性值 的写入权限。默认情况下会授予此右边,但可使用 targattrfilters 关键字进行限制。
  • 修改条目中的属性:
    • 授予属性类型 的写入权限
    • 授予每个属性类型值 的写入权限。默认情况下会授予此右边,但可使用 targattrfilters 关键字进行限制。
  • 修改条目的 RDN:
    • 授予条目 的写入权限
    • 授予新 RDN 中使用的属性类型 的写入权限
    • 如果要授予删除旧 RDN 的权利,授予旧 RDN 中使用的属性类型 的写入权限
    • 授予新 RDN 中使用的属性值 的写入权限。默认情况下会授予此右边,但可使用 targattrfilters 关键字进行限制。
  • 比较属性值:
    • 授予属性类型 的比较 权限。
  • 搜索条目:
    • 授予搜索过滤器中使用的每个属性类型 的搜索 权限。
    • 授予对条目中使用的属性类型 的读取权限

18.10.3. 访问控制和 modrdn 操作

要使用 ACI 显式拒绝 modrdn 操作,请将相关条目为目标,但忽略 targetattr 关键字。例如,要添加一个 ACI 来定义 cn=example,ou=Groups,dc=example,dc=com 组,无法在 ou=body,dc=example,dc=com 中重命名包含 cn 属性的条目:
ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (target="ldap:///cn=*,ou=people,dc=example,dc=com")
 (version 3.0; acl "Deny modrdn rights to the example group";
 deny(write) groupdn="ldap:///cn=example,ou=groups,dc=example,dc=com";)

18.11. 定义绑定规则

ACI 中的绑定规则定义必须满足所需的绑定参数,以便目录服务器应用 ACI。例如,您可以根据以下内容设置绑定规则:
  • dns
  • 组成员资格或分配的角色
  • 条目必须绑定的位置
  • 在绑定过程中必须使用的身份验证类型
  • 绑定发生的时间或天数
在 ACI 中,以下突出显示的部分是绑定规则:
(target_rule) (version 3.0; acl "ACL_name"; permission_rule bind_rules;)

语法

绑定规则的一般语法是:
keyword comparison_operator "expression"
  • 关键字 :设置绑定操作的类型。请参阅 第 18.11.1 节 “常用的绑定规则”
  • compare_operator: Valid 值为 =!=,并且指明目标是否为表达式中指定的对象。如果关键字支持其他比较运算符,则会在对应的部分中提到。
  • 表达式 :设置表达式,且必须用引号括起来。表达式本身取决于您使用的关键字。

18.11.1. 常用的绑定规则

管理员经常使用以下 bind 关键字:
另外,绑定规则通常使用布尔值运算符来合并。详情请查看 第 18.11.3 节 “使用布尔值 Operator 组合绑定规则”

18.11.1.1. 定义基于用户的访问权限

userdn 关键字允许您根据一个或多个 DN 授予或拒绝访问,并使用以下语法:
userdn comparison_operator "ldap:///distinguished_name || ldap:///distinguished_name || ..."
将表达式中的 DN 设置为:
注意
不要在 LDAP URL 中指定主机名或端口号。URL 始终应用到本地服务器。
18.11.1.1.1. 使用带有 userdn Keyword 的 DN
userdn 关键字设置为 DN,以仅将 ACI 应用到匹配的条目。要匹配多个条目,在 DN 中使用 * 通配符。
使用带有 DN 的 userdn 关键字必须与以下语法匹配:
userdn comparison_operator ldap:///distinguished_name

例 18.12. 使用带有 userdn Keyword 的 DN

要启用 uid=admin,ou=People,dc=example,dc=com 用户读取 ou=People,dc=example,dc=com 条目中所有其他用户的 管理器 属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="manager") (version 3.0; acl "Allow uid=admin reading manager attribute";
 allow (search, read) userdn = "ldap:///uid=admin,ou=People,dc=example,dc=com";)
18.11.1.1.2. 使用带有 LDAP 过滤器的 userdn Keyword
如果要动态允许或拒绝用户的权限,请使用带有 LDAP 过滤器的 userdn 关键字:
userdn comparison_operator "ldap:///distinguished_name??scope?(filter)"
注意
LDAP 过滤器支持 kiosk 通配符。

例 18.13. 使用带有 LDAP 过滤器的 userdn Keyword

要启用用户,其 department 的属性被设置为 Human Resources,以便可以更新 ou=People,dc=example,dc=com 条目中的用户的 homePostalAddress 属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="homePostalAddress") (version 3.0;
 acl "Allow HR setting homePostalAddress"; allow (write)
 userdn = "ldap:///ou=People,dc=example,dc=com??sub?(department=Human Resources)";)
18.11.1.1.3. 授予匿名访问权限
在某些情况下,管理员想要配置目录中数据的匿名访问。匿名访问意味着可以通过提供以下内容绑定到目录:
  • 没有绑定 DN 和密码
  • 有效的绑定 DN 和密码
要配置匿名访问,请在绑定 规则中使用 ldap:/// anyone 表达式和 userdn 关键字:
userdn comparison_operator "ldap:///anyone"

例 18.14. 授予匿名访问权限

要启用使没有身份验证的任何人都可以读取和搜索 ou=People,dc=example,dc=com 条目中的 sn, givenName, 和 telephoneNumber 属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="sn" || targetattr="givenName" || targetattr = "telephoneNumber")
 (version 3.0; acl "Anonymous read, search for names and phone numbers";
 allow (read, search) userdn = "ldap:///anyone";)
18.11.1.1.4. 授予对经过身份验证的用户的访问权限
在某些情况下,管理员希望向能够成功绑定到目录服务器的任何用户授予权限,但匿名绑定除外。要配置这个功能,请在绑定规则中将 ldap:///all 表达式与 userdn 关键字一起使用:
userdn comparison_operator "ldap:///all"

例 18.15. 授予对经过身份验证的用户的访问权限

要启用经过身份验证的用户,将自身作为成员添加到或从 ou=example,ou=groups,dc=example,dc=com 组中添加或删除:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=example,ou=Groups,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="member") (version 3.0;
 acl "Allow users to add/remove themselves from example group";
 allow (selfwrite) userdn = "ldap:///all";)
18.11.1.1.5. 启用用户访问您自己的条目
要设置允许或拒绝用户访问其自身条目的 ACI,请在绑定规则中使用 ldap:///self 表达式和 userdn 关键字:
userdn comparison_operator "ldap:///self"

例 18.16. 启用用户访问您自己的条目

要启用 ou=People,dc=example,dc=com 条目中的用户,以更新自己的 userPassword 属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="userPassword") (version 3.0;
 acl "Allow users updating their password";
 allow (write) userdn = "ldap:///self";)
18.11.1.1.6. 为用户的 Child 条目设置访问权限
只有在其绑定 DN 是目标条目的父项时,要指定用户被授予或拒绝对条目的访问权限,请在绑定规则中使用 self:///parent 表达式和 userdn 关键字:
userdn comparison_operator "ldap:///parent"

例 18.17. 为用户的 Child 条目设置访问权限

要启用 cn=用户,ou=People,dc=example,dc=com 用户更新其自身子条目的 manager 属性,如 cn=example,cn=user,ou=People,dc=example,dc=com
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: cn=user,ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="manager") (version 3.0;
 acl "Allow cn=user to update manager attributes";
 allow (write) userdn = "ldap:///parent";)

18.11.1.2. 定义基于组的访问

基于组的 ACI 允许您通过向组添加或删除用户来管理访问权限。要配置基于组成员资格的 ACI,请使用 groupdn 关键字。如果用户是一个或多个指定组的成员,则 ACI 会匹配。
使用 groupdn 关键字时,Directory 服务器会根据以下属性验证组成员资格:
  • 成员
  • uniqueMember
  • memberURL
  • memberCertificateDescription
使用 groupdn 关键字绑定规则使用以下语法:
groupdn comparison_operator "ldap:///distinguished_name || ldap:///distinguished_name || ..."
将表达式中的 DN 设置为:
如果您在一个绑定规则中设置了多个 DN,则目录服务器如果经过身份验证的用户是其中一个组的成员,则目录服务器会应用 ACI。要将用户设置为多个组的成员,使用多个 groupdn 关键字,并使用布尔值 and 操作符将其组合在一起。详情请查看 第 18.11.3 节 “使用布尔值 Operator 组合绑定规则”
注意
不要在 LDAP URL 中指定主机名或端口号。URL 始终应用到本地服务器。
18.11.1.2.1. 使用带有 groupdn Keyword 的 DN
要将 ACI 应用到组的成员,请将 groupdn 关键字设置为组的 DN。
groupdn 关键字设置为 DN 使用以下语法:
groupdn comparison_operator ldap:///distinguished_name

例 18.18. 使用带有 groupdn Keyword 的 DN

要启用 cn=example,ou=Groups,dc=example,dc=com 组的成员,以搜索并读取 ou=People,dc=example,dc=com 中的条目的 manager 属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="manager") (version 3.0;
 acl "Allow example group to read manager attribute";
 allow (search, read) groupdn = "ldap:///cn=example,ou=Groups,dc=example,dc=com";)
18.11.1.2.2. 使用带有 LDAP 过滤器的 groupdn Keyword
使用带有 groupdn 关键字的 LDAP 过滤器,您可以定义经过身份验证的用户必须是过滤器搜索返回的至少一个组的成员,以匹配 ACI。
带有 LDAP 过滤器的 groupdn 关键字使用以下语法:
groupdn comparison_operator "ldap:///distinguished_name??scope?(filter)"
注意
LDAP 过滤器支持 kiosk 通配符。

例 18.19. 使用带有 LDAP 过滤器的 groupdn Keyword

要启用 dc=example,dc=com 和子树中的组成员,其 manager 属性设置为 example,请更新 ou=People,dc=example,dc=com 中的条目的 homePostalAddress
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="homePostalAddress") (version 3.0;
 acl "Allow manager=example setting homePostalAddress"; allow (write)
 userdn = "ldap:///dc=example,dc=com??sub?(manager=example)";)

18.11.2. 进一步绑定规则

本节论述了不经常使用的绑定规则。

18.11.2.1. 根据匹配值定义访问

在绑定规则中使用 userattr 关键字,以指定用于绑定到目录和目标条目的条目之间必须匹配哪些属性。
userattr 关键字使用以下语法:
userattr comparison_operator "attribute_name#bind_type_or_attribute_value
如需了解更多详细信息,请参阅:
重要
默认情况下,Directory 服务器会评估他们所创建条目的访问权限。但是,为了避免同一级别的用户对象,在使用 userattr 关键字时,目录服务器不会向设置 ACI 的条目授予 添加权限。要配置此行为,请将 userattr 关键字与 parent 关键字一起使用,并在级别 0 上授予权限。
18.11.2.1.1. 使用 USERDN 绑定类型
要在绑定用户 DN 与属性中存储的 DN 匹配时应用 ACI,请使用 USERDN 绑定类型。
具有 USERDN 绑定类型的 userattr 关键字需要以下语法:
userattr comparison_operator "attribute_name#USERDN"

例 18.20. 使用 USERDN 绑定类型

为管理器授予其自身关联的 telephoneNumber 属性的所有权限:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "telephoneNumber")
 (version 3.0; acl "Manager: telephoneNumber";
 allow (all) userattr = "manager#USERDN";)
如果对 ou=People,dc=example,dc=com 中的条目执行操作的用户 DN 匹配此条目的 manager 属性中的 DN,则前面的 ACI 被评估为 true。
18.11.2.1.2. 使用 GROUPDN 绑定类型
要在绑定用户 DN 是属性中设置的组成员时应用 ACI,请使用 GROUPDN 绑定类型。
带有 GROUPDN 绑定类型的 userattr 关键字需要以下语法:
userattr comparison_operator "attribute_name#GROUPDN"

例 18.21. 使用 GROUPDN 绑定类型

要授予用户删除其在 ou=Social Committee,ou=Groups,dc=example,dc=com 条目下拥有的组条目的权限:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=Social Committee,ou=Groups,dc=example,dc=com
changetype: modify
add: aci
aci: (target="ou=Social Committee,ou=Groups,dc=example,dc=com)
 (targattrfilters="del=objectClass:(objectClass=groupOfNames)")
 (version 3.0; acl "Delete Group";
 allow (delete) userattr = "owner#GROUPDN";)
如果执行操作的用户的 DN 是 owner 属性中指定的组的成员,则前面的 ACI 会被评估为 true。
指定组可以是动态组,并且组的 DN 可以在数据库中的任何后缀下。但是,服务器这种 ACI 的评估非常需要资源密集型。
如果您使用与目标条目相同的静态组,请使用以下表达式来提高性能:
userattr comparison_operator "ldap:///distinguished_name?attribute_name#GROUPDN"
18.11.2.1.3. 使用 ROLEDN 绑定类型
要在绑定用户属于属性中指定的角色时应用 ACI,请使用 ROLEDN 绑定类型。
具有 ROLEDN 绑定类型的 userattr 关键字需要以下语法:
userattr comparison_operator "attribute_name#ROLEDN"

例 18.22. 使用 ROLEDN 绑定类型

要启用带有 cn=Administrators,dc=example,dc=com 角色的用户,以搜索和读取 ou=People,dc=example,dc=com 中的条目的 管理器 属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (version 3.0; acl "Allow example role owners to read manager attribute";
 allow (search, read) userattr = manager#ROLEDN;)
指定的角色可以在数据库中的任何后缀下。如果您也正在使用过滤的角色,则这种 ACI 的评估将使用服务器上的很多资源。
如果您使用静态角色定义,且角色条目与目标条目位于同一个后缀下,请使用以下表达式来提高性能:
18.11.2.1.4. 使用 SELFDN 绑定类型
当绑定用户的 DN 在条目的单值属性中设置时,SELFDN 绑定类型允许您授予权限。
带有 SELFDN 绑定类型的 userattr 关键字需要以下语法:
userattr comparison_operator "attribute_name#SELFDN"

例 18.23. 使用 SELFDN 绑定类型

要启用用户可以添加 ipatokenuniqueid=*,cn=otp,dc=example,dc=com 条目,其在 ipatokenOwner 属性中设置了绑定用户的 DN:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=otp,dc=example,dc=com
changetype: modify
add: aci
aci: (target = "ldap:///ipatokenuniqueid=*,cn=otp,dc=example,dc=com")
 (targetfilter = "(objectClass=ipaToken)")(version 3.0;
 acl "token-add-delete"; allow (add) userattr = "ipatokenOwner#SELFDN";)
18.11.2.1.5. 使用 LDAPURL 绑定类型
要在绑定 DN 与目标条目属性中指定的过滤器匹配时应用 ACL,请使用 LDAPURL 绑定类型。
具有 LDAPURL 绑定类型的 userattr 关键字需要以下语法:
userattr comparison_operator "attribute_name#LDAPURL"

例 18.24. 使用 LDAPURL 绑定类型

要为包含 aciurl 属性的用户对象授予读和搜索权限,其将 aciurl 属性设置为 ldap:///ou=People,dc=example,dc=com???one? (uid=userö):
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "*")
 (version 3.0; acl "Allow read,search "; allow (read,search)
 (userattr = "aciurl#LDAPURL);)
18.11.2.1.6. 使用带有 Inheritance 的用户attr Keyword
当您使用 userattr 关键字关联用于与目标条目绑定的条目时,ACT 仅适用于指定的目标,而不应用到下面的条目。在某些情况下,管理员希望在目标条目下扩展 ACI 的应用。这可以通过使用 parent 关键字并指定应继承 ACI 的目标下面的级别数。
userattr 关键字与 parent 关键字搭配使用时,语法如下:
userattr comparison_operator "parent[inheritance_level].attribute_name#bind_type_or_attribute_value
  • inheritance_level: Comma 分隔列表,用于指示目标下面多少级别继承 ACI。您可以在目标条目下面包括五个级别(01234)。零(0)表示目标条目。
  • attribute_name :以 userattrgroupattr 关键字为目标的属性。
  • bind_type_or_attribute_value :设置属性值或绑定类型,如 USERDN
例如:
userattr = "parent[0,1].manager#USERDN"
如果绑定 DN 与目标条目的 manager 属性匹配,则此绑定规则会被评估为 true。当绑定规则被评估为 true 时,授予的权限将应用到目标条目及其下面的所有条目。

例 18.25. 使用带有 Inheritance 的用户attr Keyword

要启用用户读取和搜索 cn=Profiles,dc=example,dc=com 条目,其中用户的 DN 在 owner 属性中设置,以及包含 cn=mail,cn=Profiles,dc=com 和 cn= news,cn=Profiles,dc=com 的第一个子条目级别:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: cn=Profiles,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="*") (version 3.0; acl "Profile access",
 allow (read,search) userattr="parent[0,1].owner#USERDN" ;)

18.11.2.2. 定义从特定 IP 地址或范围的访问

绑定规则中的 ip 关键字允许您从特定 IP 地址或 IP 地址范围授予或拒绝访问。
使用 ip 关键字绑定规则使用以下语法:
ip comparison_operator "IP_address_or_range"

例 18.26. 在绑定规则中使用 IPv4 地址范围

拒绝从 192.0.2.0/24 网络访问 dc=example,dc=com 条目:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "*") (version 3.0;acl "Deny 192.0.2.0/24"; deny (all)
 (userdn = "ldap:///anyone") and (ip != "192.0.2.");)

例 18.27. 在绑定规则中使用 IPv6 地址范围

拒绝从 2001:db8::/64 网络访问 dc=example,dc=com 条目:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "*") (version 3.0;acl "Deny 2001:db8::/64"; deny (all)
 (userdn = "ldap:///anyone") and (ip != "2001:db8::");)

18.11.2.3. 定义从特定主机或域的访问

绑定规则中的 dns 关键字允许您授予或拒绝特定主机或域的访问。
警告
如果目录服务器无法使用 DNS 将连接的 IP 地址解析为其完全限定域名(FQDN),服务器不会应用带有此客户端的 dns 绑定规则的 ACI。
如果无法使用 DNS 解析客户端 IP 地址,请使用 ip 关键字和 IP 地址。请参阅 第 18.11.2.2 节 “定义从特定 IP 地址或范围的访问”
使用 dns 关键字绑定规则使用以下语法:
dns comparison_operator "host_name_or_domain_name"

例 18.28. 定义来自特定主机的访问

拒绝从 client.example.com 主机访问 dc=example,dc=com 条目:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "*") (version 3.0;acl "Deny client.example.com"; deny (all)
 (userdn = "ldap:///anyone") and (dns != "client.example.com");)

例 18.29. 定义从特定域的访问

拒绝从 example.com 域中的所有主机访问 dc=example,dc=com 条目:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "*") (version 3.0;acl "Deny example.com"; deny (all)
 (userdn = "ldap:///anyone") and (dns != "*.example.com");)

18.11.2.4. 连接中需要级别安全性

连接的安全性通过其 Security Strength Factor (SSF)决定,它设定处理操作所需的最小密钥强度。在绑定规则中使用 ssf 关键字,您可以设置连接必须使用一定级别的安全。这可让您强制操作(如密码更改)通过加密连接执行。
任何操作的 SSF 的值是 TLS 连接和 SASL 绑定之间的值高。这意味着,如果将服务器配置为通过 TLS 运行,并且为 SASL/GSSAPI 配置复制协议,则操作的 SSF 是确保可用加密类型更安全。
使用 ssf 关键字绑定规则使用以下语法:
ssf comparison_operator key_strength
您可以使用以下比较运算符:
  • = (等于)
  • ! (不等于)
  • & lt; (小于)
  • &gt; (greater than)
  • &lt;= (不小于或等于)
  • &gt;=(greater or equal)
如果将 key_strength 参数设置为 0, 则 LDAP 操作不需要安全操作。

例 18.30. 连接中需要级别安全性

要在 dc=example,dc=com 条目中配置该用户,只能在 SSF 为 128 或更高版本时更新其 userPassword 属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "userPassword") (version 3.0;
 acl "Allow users updating own userPassword";
 allow (write) (userdn = "ldap:///self") and (ssf >= "128");)

18.11.2.5. 在星期的特定天定义访问权限

绑定规则中的 dayofweek 关键字允许您根据一周中的日期授予或拒绝访问。
注意
目录服务器使用服务器上的时间来评估 ACI,而不是客户端的时间。
使用 dayofweek 关键字绑定规则使用以下语法:
dayofweek comparison_operator "comma-separated_list_of_days"

例 18.31. 在星期的特定天数授予访问权限

要拒绝 uid=用户,ou=People,dc=example,dc=com 用户条目的访问,以便在 Saturdays 和 Sundays 上绑定到服务器:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (version 3.0; acl "Deny access on Saturdays and Sundays";
 deny (all)
 (userdn = "ldap:///uid=user,ou=People,dc=example,dc=com") and
 (dayofweek = "Sun,Sat");)

18.11.2.6. 在一天的特定时间定义访问权限

绑定规则中的 timeofday 关键字允许您根据日期的时间授予或拒绝访问。
注意
目录服务器使用服务器上的时间来评估 ACI,而不是客户端的时间。
使用 timeofday 关键字绑定规则使用以下语法:
timeofday comparison_operator "time"
您可以使用以下比较运算符:
  • = (等于)
  • ! (不等于)
  • & lt; (小于)
  • &gt; (greater than)
  • &lt;= (不小于或等于)
  • &gt;=(greater or equal)
重要
timeofday 关键字要求您以 24 小时格式指定时间。

例 18.32. 在一天的特定时间定义访问

要拒绝 uid=用户,ou=People,dc=example,dc=com 用户条目的访问,以便在 6pm 到 0am 之间绑定到服务器:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
 aci: (version 3.0; acl "Deny access between 6pm and 0am";
 deny (all)
 (userdn = "ldap:///uid=user,ou=People,dc=example,dc=com") and
 (timeofday >= "1800" and timeofday < "2400");)

18.11.2.7. 根据身份验证方法定义访问

绑定规则中的 authmethod 关键字设置客户端在连接到服务器时必须使用哪些身份验证方法以应用 ACI。
使用 authmethod 关键字绑定规则使用以下语法:
authmethod comparison_operator "authentication_method"
您可以设置以下验证方法:
  • :不需要身份验证,并代表匿名访问。这是默认值。
  • simple :客户端必须提供要绑定到目录的用户名和密码。
  • SSL :客户端必须使用数据库、智能卡或其他设备中的 TLS 证书绑定到目录。有关基于证书的身份验证的详情,请参考 第 9.9 节 “使用基于证书的客户端身份验证”
  • SASL :客户端必须通过简单身份验证和安全层(SASL)连接绑定到目录。当您在绑定规则中使用此验证方法时,还要指定 SASL 机制,如 EXTERNAL

例 18.33. 仅使用 EXTERNAL SASL 身份验证方法为连接启用访问

如果连接没有使用基于证书的身份验证方法或 SASL,则拒绝对服务器的访问:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (version 3.0; acl "Deny all access without certificate"; deny (all)
 (authmethod = "none" or authmethod = "simple");)

18.11.2.8. 根据角色定义访问权限

绑定规则中的 roledn 关键字允许您授予或拒绝对具有一个或多个角色集的用户的访问权限。
注意
红帽建议使用组而不是角色。有关角色和限制的详情,请参考 第 8.2.1 节 “关于角色”
使用 roledn 关键字绑定规则使用以下语法:
roledn comparison_operator "ldap:///distinguished_name || ldap:///distinguished_name || ..."
注意
如果 DN 包含逗号,请使用反斜杠转义逗号。

例 18.34. 根据角色定义访问权限

要启用在 nsRole 属性中设置的 cn=Human Resources,ou=People,dc=example,dc=com 角色的用户,以搜索并读取 ou=People,dc=example,dc=com 中的条目的 管理器 属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="manager") (version 3.0;
 acl "Allow manager role to update manager attribute";
 allow (search, read) roledn = "ldap:///cn=Human Resources,ou=People,dc=example,dc=com";)

18.11.3. 使用布尔值 Operator 组合绑定规则

在创建复杂的绑定规则时,可以使用 AND, OR, 和 NOT 布尔操作符对多个关键字进行组合。
使用布尔值运算符绑定规则使用以下语法:
bind_rule_1 boolean_operator bind_rule_2...

例 18.35. 使用布尔值 Operator 组合绑定规则

要配置属于 cn=Administrators,ou=Groups,dc=example,comcn=Operators,ou=Groups,dc=example,com 组权限的用户可以读取、搜索、添加、更新和删除 ou=People,dc=example,dc=com 中的条目:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (target="ldap:///ou=People,dc=example,dc=com") (version 3.0;
 acl "Allow members of administrators and operators group to manage users";
 allow (read, search, add, write, delete)
 groupdn = "ldap:///cn=Administrators,ou=Groups,dc=example,com" AND
 groupdn = "ldap:///cn=Operators,ou=Groups,dc=example,com";)

目录服务器评估布尔值 Operator

目录服务器使用以下规则评估布尔值运算符:
  • 从左到右的所有表达式。
    在以下示例中,bind_rule_1 会被首先评估:
    (bind_rule_1) OR (bind_rule_2)
  • 从内部到最接近的表达式。
    在以下示例中,bind_rule_2 会被首先评估,bind_rule_3 秒:
    (bind_rule_1) OR ((bind_rule_2) AND (bind_rule_3))
  • 不在 ANDOR 运算符之前。
    在以下示例中,bind_rule_2 会被首先评估:
    (bind_rule_1) AND NOT (bind_rule_2)
    ANDOR 运算符没有优先级顺序。

18.12. 检查条目上的访问权限(受影响的右边)

查找特定条目中用户对属性的访问权限,为管理员提供便捷的方式,以便管理员查找和控制访问权限。
获得有效权限 是一种扩展目录搜索的方法,以显示哪些访问权限,如读取、搜索、写入和自我写入、添加和删除 - 用户对于指定条目。
在目录服务器中,常规用户可以查看他们可以查看的条目的权限,并可检查其他个人条目的访问权限。Directory Manager 可以检查一个用户具有其他用户的权限。
在两种常见情况下,检查条目的有效权限很有用:
  • 管理员可以使用 get valid rights 命令更好地组织目录的访问控制指令。经常需要限制一组用户可以查看或编辑另一个组。例如,QA Managers 组的成员可能有权限搜索并读 managersalary 等属性,当只有 HR Group 的成员有权限修改或删除它们。检查用户或组的有效权限是验证是否有适当的访问控制。
  • 用户可以运行 get valid rights 命令,以查看自己可在其个人条目上查看或修改哪些属性。例如,用户应该有权访问 homePostalAddresscn 等属性,但只能对 managersalary 属性具有读取访问权限。
getEffectiveRights 搜索中涉及三个实体。第一个是 请求者,这是发出 getEffectiveRights 搜索操作时经过身份验证的条目。第二个是评估其权利 的主题,它被定义为 GER 控制中的 授权 DN。第三个是 目标,它由请求搜索基本、搜索过滤器和属性列表定义。

18.12.1. 带有 Get Effective rights Search 的权利显示

当在命令行中搜索任何 get valid rights 搜索时,显示请求者必须属于目标条目的权利。
对于任何条目,可以使用两种类型的访问权限:第一个是高级别权限,对条目本身的权限,这意味着用户 A 可以对整个用户 B 条目执行的操作类型。第二个访问权限级别更为精细,显示 给定属性用户 A 具有哪些权限。在这种情况下,用户 A 可能对同一条目的不同属性具有不同的访问权限。用户允许的任何访问控制都是 对该条目的有效权限
例如:
entryLevelRights: vadn
attributeLevelRights: givenName:rscWO, sn:rscW, objectClass:rsc, uid:rsc, cn:rscW
表 18.2 “条目右边” 表 18.3 “属性右边” 分别显示条目和属性的访问权限,它们分别由 get valid rights 搜索返回。

表 18.2. 条目右边

权限 描述
a 添加一个条目。
d 删除此条目。
n 重命名 DN。
v 查看条目。

表 18.3. 属性右边

权限 描述
r 读。
s 搜索。
w 写(mod-add)。
o Obliterate(mod-del).与删除类似。
c 比较。
W 自我写入。
O 自我删除。

18.12.3. GER 搜索示例

根据需要返回的信息类型以及正在搜索的条目和属性类型,可以运行 GER 搜索的方式。

18.12.3.1. 检查访问右边的常规示例

用于有效权限搜索的一个常见场景是让常规用户决定自己个人条目可以进行了哪些更改。
例如,Ted Morris 希望检查他必须检查其条目的权限。-D-E 选项都给出其条目作为请求者。由于他正在检查其个人条目,-b 选项还包含其 DN。

例 18.36. 检查个人右边(用户 A 到用户 A)

# ldapsearch -x -p 389 -h server.example.com -D "uid=tmorris,ou=people,dc=example,dc=com" -W -b "uid=tmorris,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=tmorris,ou=people,dc=example,dc=com' "(objectClass=*)"

 dn: uid=tmorris,ou=People,dc=example,dc=com
 givenName: Ted
 sn: Morris
 ou: IT
 ou: People
 l: Santa Clara
 manager: uid=jsmith,ou=People,dc=example,dc=com
 roomNumber: 4117
 mail: tmorris@example.com
 facsimileTelephoneNumber: +1 408 555 5409
 objectClass: top
 objectClass: person
 objectClass: organizationalPerson
 objectClass: inetOrgPerson
 uid: tmorris
 cn: Ted Morris
 userPassword: {SSHA}bz0uCmHZM5b357zwrCUCJs1IOHtMD6yqPyhxBA==
 entryLevelRights: v
 attributeLevelRights: givenName:rsc, sn:rsc, ou:rsc, l:rsc, manager:rsc, roomNumber:rscwo, mail:rscwo, facsimileTelephoneNumber:rscwo, objectClass:rsc, uid:rsc, cn:rsc, userPassword:wo
例如,Ted Morris 可能是一个经理,或者在需要编辑其他用户的条目(如 IT 或人工资源)中工作。在这种情况下,他可能希望检查自己对另一个用户条目的权限,如 例 18.37 “通过另一个用户单独检查一个用户的权利(用户 A 到用户 B)” 中所示,Ted (-D)会检查其权利(-E)到 Dave Miller 条目(-b):

例 18.37. 通过另一个用户单独检查一个用户的权利(用户 A 到用户 B)

# ldapsearch -p 389 -h server.example.com -D "uid=tmorris,ou=people,dc=example,dc=com" -W -b "uid=dmiller,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=tmorris,ou=people,dc=example,dc=com' "(objectClass=*)"

dn: uid=dmiller,ou=People,dc=example,dc=com
...
entryLevelRights: vad
attributeLevelRights: givenName:rscwo, sn:rscwo, ou:rscwo, l:rscwo, manager:rsc, roomNumber:rscwo, mail:rscwo, facsimileTelephoneNumber:rscwo, objectClass:rscwo, uid:rscwo, cn:rscwo, userPassword:rswo
对于所有属性,Ted Morris 具有对 Dave Miller 条目的读、搜索、比较、修改和删除权限。这些结果与检查 Ted Morris 对其自己的条目的访问权限不同,因为他只具有对这些属性的读、搜索和比较权利。
Directory Manager 能够检查一个用户具有另一个用户条目的权限。在 例 18.38 “Directory Manager 的检查一个用户超过另一个用户(用户 A 到用户 B)” 中,目录管理器检查经理 Jane Smith (-E)已超过了其子级,Ted Morris (-b):

例 18.38. Directory Manager 的检查一个用户超过另一个用户(用户 A 到用户 B)

# ldapsearch -p 389 -h server.example.com -D "cn=Directory Manager" -W -b "uid=tmorris,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=jsmith,ou=people,dc=example,dc=com' "(objectClass=*)"

dn: uid=tmorris,ou=People,dc=example,dc=com
...
entryLevelRights: vadn
attributeLevelRights: givenName:rscwo, sn:rscwo, ou:rscwo, l:rscwo, manager:rscwo, roomNumber:rscwo, mail:rscwo, facsimileTelephoneNumber:rscwo, objectClass:rscwo, uid:rscwo, cn:rscwo, userPassword:rscwo
只有管理员才能检索不同用户对条目具有的有效权限。如果 Ted Morris 尝试确定 Dave Miller 对 Dave Miller 条目的权限,则他会收到不正确的访问错误:
# ldapsearch -p 389 -h server.example.com -D "uid=dmiller,ou=people,dc=example,dc=com" -W -b "uid=tmorris,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=tmorris,ou=people,dc=example,dc=com' "(objectClass=*)"

ldap_search: Insufficient access
ldap_search: additional info: get-effective-rights: requester has no g permission on the entry
但是,普通用户可以运行 get valid rights search 以查看另一个用户必须具有哪些个人条目的权限。在 例 18.39 “检查一些个人条目是否拥有权利” 中,Ted Morris 检查 Dave Miller 在 Ted Morris 条目上是否有权限。

例 18.39. 检查一些个人条目是否拥有权利

# ldapsearch -p 389 -h server.example.com -D "uid=tmorris,ou=people,dc=example,dc=com" -W -b "uid=tmorris,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=dmiller,ou=people,dc=example,dc=com' "(objectClass=*)"

dn: uid=tmorris,ou=people,dc=example,dc=com
...
entryLevelRights: v
attributeLevelRights: givenName:rsc, sn:rsc, ou:rsc, l:rsc,manager:rsc, roomNumber:rsc, mail:rsc, facsimileTelephoneNumber:rsc, objectClass:rsc, uid:rsc, cn:rsc, userPassword:none
在这种情况下,Dave Miller 能够查看条目的 DN,以及读取、搜索和比较 ou、giveNamel 和其他属性以及没有对 userPassword 属性的权利。

18.12.3.2. 为非独占属性搜索 Effective rights 的示例

默认情况下,对于没有值的条目中的属性不会给出信息;例如,如果删除了 userPassword 值,则对上述条目的任何有效权限搜索将不会返回 userPassword 的任何有效权限,即使可以允许自写和自我删除权限。
使用带有适当权限的、带有星号 (*) 的搜索会返回条目可用的每个属性,包括条目上未设置的属性。

例 18.40. 非独占属性的返回影响右边

# ldapsearch -D "cn=Directory Manager" -W -b "uid=scarter,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" "*"  

dn: uid=scarter,ou=People,dc=example,dc=com
givenName: Sam
telephoneNumber: +1 408 555 4798
sn: Carter
ou: Accounting
ou: People
l: Sunnyvale
manager: uid=dmiller,ou=People,dc=example,dc=com
roomNumber: 4612
mail: scarter@example.com
facsimileTelephoneNumber: +1 408 555 9700
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
uid: scarter
cn: Sam Carter
userPassword: {SSHA}Xd9Jt8g1UsHC8enNDrEmxj3iJPKQLItlDYdD9A==
entryLevelRights: vadn
attributeLevelRights: objectClass:rscwo, aci:rscwo, sn:rscwo, cn:rscwo, description:rscwo, seeAlso:rscwo, telephoneNumber:rscwo, userPassword:rscwo, destinationIndicator:rscwo, facsimileTelephoneNumber:rscwo, internationaliSDNNumber:rscwo, l:rscwo, ou:rscwo, physicalDeliveryOfficeName:rscwo, postOfficeBox:rscwo, postalAddress:rscwo, postalCode:rscwo, preferredDeliveryMethod:rscwo, registeredAddress:rscwo, st:rscwo, street:rscwo, teletexTerminalIdentifier:rscwo, telexNumber:rscwo, title:rscwo, x121Address:rscwo, audio:rscwo, businessCategory:rscwo, carLicense:rscwo, departmentNumber:rscwo, displayName:rscwo, employeeType:rscwo, employeeNumber:rscwo, givenName:rscwo, homePhone:rscwo, homePostalAddress:rscwo, initials:rscwo, jpegPhoto:rscwo, labeledUri:rscwo, manager:rscwo, mobile:rscwo, pager:rscwo, photo:rscwo, preferredLanguage:rscwo, mail:rscwo, o:rscwo, roomNumber:rscwo, secretary:rscwo, uid:rscwo,x500UniqueIdentifier:rscwo, userCertificate:rscwo, userSMIMECertificate:rscwo, userPKCS12:rscwo
列出了可用于该条目的所有属性,如 机密,即使该属性不存在。

18.12.3.3. 针对特定属性或对象类搜索受影响的示例

另外,可以进一步搜索与属性相关的 GER,可以搜索特定属性和属性集合的权限,并列出条目中设置的某一对象类提供的所有属性。
第 18.12.2 节 “Get Effectives Search 的格式” 中格式化示例中列出的一个选项是 attributeList。要只返回特定属性的有效权限,请在 search 命令末尾列出以空格分开的属性。

例 18.41. 为特定属性获得受影响的结果

# ldapsearch -D "cn=Directory Manager" -W -b "uid=scarter,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" cn mail initials  

dn: uid=scarter,ou=People,dc=example,dc=com
cn: Sam Carter
mail: scarter@example.com
entryLevelRights: vadn
attributeLevelRights: cn:rscwo, mail:rscwo, initials:rscwo
可以像 例 18.41 “为特定属性获得受影响的结果” 中的 initials 属性一样,可以在 attributeList 中指定不存在的属性,以查看可用的权利,类似于使用星号列出所有属性。
Directory Manager 也可以列出特定对象类所有可用的属性的权限。此选项具有格式 属性@objectClass。这会返回两个条目:指定 GER 主题的第一个,另一个用于对象类的模板条目。

例 18.42. 获取对象类中属性的结果

# ldapsearch -D "cn=Directory Manager" -W -b "uid=scarter,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" uidNumber@posixAccount   
...
dn: cn=template_posixaccount_objectclass,uid=scarter,ou=people,dc=example,dc=com
uidnumber: (template_attribute)
entryLevelRights: v
attributeLevelRights: uidNumber:rsc
注意
只有在请求者(-D)是目录管理器时,使用搜索格式 属性@objectClass 才可用。
使用星号(*)而不是一个特定的属性,会返回特定 GER 主题的所有属性(包括存在的和不存在的),以及对象类模板的完整属性。

例 18.43. 获取对象类所有属性的结果

# ldapsearch -D "cn=Directory Manager" -W -b "uid=scarter,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" *@posixaccount   
...
dn: cn=template_posixaccount_objectclass,uid=scarter,ou=people,dc=example,dc=com 
objectClass: posixaccount 
objectClass: top 
homeDirectory: (template_attribute) 
gidNumber: (template_attribute) 
uidNumber: (template_attribute) 
uid: (template_attribute) 
cn: (template_attribute) 
entryLevelRights: v 
attributeLevelRights: cn:rsc, uid:rsc, uidNumber:rsc, gidNumber:rsc, homeDirectory:rsc, objectClass:rsc, userPassword:none, loginShell:rsc, gecos:rsc, description:rsc, aci:rsc

18.12.3.4. 为 Non-Existent 条目的 Get Effective rights 搜索示例

管理员可能希望根据现有的访问控制规则检查特定用户(jsmith)必须哪些权限对于不存在的用户。要检查不存在的条目,服务器会在该子树中生成一个模板条目。例如,若要检查模板条目 cn=joe 新用户 cn=joe new user,cn=accounts,ou=body,dc=example,dc=com,服务器会创建 cn=template,cn=accounts,ou=body,dc=example,dc=com
要检查不存在的条目,get valid rights search 可以使用指定的对象类生成包含(不存在)条目的所有潜在属性的模板条目。对于 cn=joe 新用户,cn=accounts,ou=body,dc=example,dc=com with person 对象类(@person),服务器会生成 cn=template_person_objectclass,cn=accounts,ou=body,dc=example,dc=com
当服务器创建模板条目时,它使用对象类定义中的第一个 MUST 属性来创建 RDN 属性(如果没有 MUST 属性,则使用 MAY)。但是,这可能会导致错误 RDN 值,该值反过来违反或绕过给定子树的 ACI。在这种情况下,可以通过将对象类传递给对象类来指定要使用的 RDN 值。其格式为 @objectclass:rdn_attribute
例如,要检查 scarter 的权利,以了解带有 uidNumber 的不存在的 Posix 条目作为其 RDN:
# ldapsearch -D "cn=Directory Manager" -W -b "ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" @posixaccount:uidnumber

dn: uidNumber=template_posixaccount_objectclass,ou=people,dc=example,dc=com
entryLevelRights: v
attributeLevelRights: description:rsc, gecos:rsc, loginShell:rsc, userPassword
 :rsc, objectClass:rsc, homeDirectory:rsc, gidNumber:rsc, uidNumber:rsc, uid:
 rsc, cn:rsc

18.12.3.5. 获取 Effectiverights 搜索属性的示例

常规 ldapsearches 中不会返回操作属性,包括 get valid rights search。要返回操作属性的信息,请使用加号(+)。这只返回条目中可以使用的操作属性。

例 18.44. 为过期属性获得 Effective rights 结果

# ldapsearch -D "cn=Directory Manager" -W -x -b "uid=scarter,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" "+"  

dn: uid=scarter,ou=People,dc=example,dc=com
entryLevelRights: vadn
attributeLevelRights: nsICQStatusText:rscwo, passwordGraceUserTime:rscwo, pwdGraceUserTime:rscwo, nsYIMStatusText:rscwo, modifyTimestamp:rscwo, passwordExpWarned:rscwo, pwdExpirationWarned:rscwo, entrydn:rscwo, aci:rscwo, nsSizeLimit:rscwo, nsAccountLock:rscwo, passwordExpirationTime:rscwo, entryid:rscwo, nsSchemaCSN:rscwo, nsRole:rscwo, retryCountResetTime:rscwo, ldapSchemas:rscwo, nsAIMStatusText:rscwo, copiedFrom:rscwo, nsICQStatusGraphic:rscwo, nsUniqueId:rscwo, creatorsName:rscwo, passwordRetryCount:rscwo, dncomp:rscwo, nsTimeLimit:rscwo, passwordHistory:rscwo, pwdHistory:rscwo, nscpEntryDN:rscwo, subschemaSubentry:rscwo, nsYIMStatusGraphic:rscwo, hasSubordinates:rscwo, pwdpolicysubentry:rscwo, nsAIMStatusGraphic:rscwo, nsRoleDN:rscwo, createTimestamp:rscwo, accountUnlockTime:rscwo, copyingFrom:rscwo, nsLookThroughLimit:rscwo, nsds5ReplConflict:rscwo, modifiersName:rscwo, parentid:rscwo, passwordAllowChangeTime:rscwo, nsBackendSuffix:rscwo, nsIdleTimeout:rscwo, ldapSyntaxes:rscwo, numSubordinates:rscwo

18.12.3.6. Get Effective rights 结果和访问控制规则的示例

根据对 get 有效权限主题条目生效的任何 ACL 返回有效的权限。
例如,这个 ACL 被设置,在这个示例中,它是唯一 ACL 集:
dn: dc=example,dc=com
objectClass: top
objectClass: domain
dc: example
aci: (target=ldap:///ou=Accounting,dc=example,dc=com)(targetattr="*")(version
 3.0; acl "test acl"; allow (read,search,compare) (userdn = "ldap:///anyone") ;)

dn: ou=Accounting,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: Accounting
因为 ACL 不包含 dc=example,dc=com 子树,所以 get valid rights search 会显示用户对 dc=example,dc=com 条目没有任何权限:

例 18.45. 使用 No ACL Set (Directory Manager)获得 Effective rights 结果

# ldapsearch -D "cn=Directory Manager" -W -b "dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" "*@person"

dn: cn=template_person_objectclass,uid=scarter,ou=people,dc=example,dc=com
objectClass: person
objectClass: top
cn: (template_attribute)
sn: (template_attribute)
description: (template_attribute)
seeAlso: (template_attribute)
telephoneNumber: (template_attribute)
userPassword: (template_attribute)
entryLevelRights: none
attributeLevelRights: sn:none, cn:none, objectClass:none, description:none, seeAlso:none, telephoneNumber:none, userPassword:none, aci:none
如果常规用户而不是 Directory Manager,请尝试运行同一命令,则结果将为空。

例 18.46. 在没有 ACL 设置的情况下获得 Effective 的结果(普通用户)

# ldapsearch -D "uid=scarter,ou=people,dc=example,dc=com" -W -b "dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" "*@person"

18.12.4. Get Effective rights 返回码

如果没有为 get valid rights 搜索设置 criticality,并且发生错误,则返回常规条目信息,而是代替 entryLevelRightsattributeLevelRights 的权利,则返回错误代码。此代码可以提供有关正在查询的条目配置的信息。表 18.4 “返回的 Result Codes” 总结错误代码及其可以转发的潜在配置信息。

表 18.4. 返回的 Result Codes

代码 Description
0 成功完成。
1 操作错误。
12 关键扩展不可用。如果将 criticality 表达式设为 true,且正在查询的条目上不存在有效权限,则返回此错误。
16 没有这样的属性。如果特别查询访问权限的属性,但该属性在架构中不存在,则会返回此错误。
17 未定义的属性类型。
21 无效的属性语法。
50 权利不足。
52 不可用。
53 取消静默执行。
80 其他。

18.13. 日志记录访问控制信息

要记录访问控制信息,请将 nsslapd-errorlog-level 参数设置为包含 128 (访问控制列表处理)的值。有关设置错误日志级别的详情,请参考 第 21.3.7 节 “配置日志级别”

18.14. 高级访问控制:使用 Macro ACI

宏 ACI 提高了灵活性。例如,您可以添加子树并自动获得与其他子树相同的定制访问控制,而无需添加任何 ACI。作为副作用,ACI 数量会较小,但 Macro ACI 处理比常规 ACI 的成本要高得多。
宏是用于在 ACI 中代表 DN 或 DN 的部分占位符。您可以使用宏来代表 ACI 的目标部分或绑定规则部分的 DN,或两者。在实践中,当目录服务器获取传入的 LDAP 操作时,ACI 宏与 LDAP 操作的目标资源匹配。如果存在匹配项,则宏将被目标资源的 DN 值替代。然后目录服务器通常会评估 ACI。

18.14.1. 宏 ACI 示例

图 18.1 “Macro ACI 的目录树示例” 显示使用宏 ACI 来有效地减少 ACI 总数的目录树。此图图使用具有相同树结构的重复子域模式(ou=groups, ou=body)。此模式也在树中重复,因为 Example Corp. 目录树存储后缀 dc=hostedCompany2,dc=example,dc=comdc=hostedCompany3,dc=com
目录树中应用的 ACI 也具有重复模式。例如,以下 ACI 位于 dc=hostedCompany1,dc=example,dc=com 节点上:
aci: (targetattr="*")(targetfilter=(objectClass=nsManagedDomain))
     (version 3.0; acl "Domain access"; allow (read,search) 
     groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=hostedCompany1,dc=example,dc=com";)
此 ACI 将 DomainAdmins 组的读和搜索权限授予 dc=hostedCompany1,dc=example,dc=com 树中的任何条目。

图 18.1. Macro ACI 的目录树示例

Macro ACI 的目录树示例
以下 ACI 位于 dc=hostedCompany1,dc=example,dc=com 节点上:
aci: (targetattr="*")(targetfilter=(objectClass=nsManagedDomain))
    (version 3.0; acl "Domain access"; allow (read,search)
    groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=hostedCompany1,dc=example,dc=com";)
以下 ACI 位于 dc=subdomain1,dc=hostedCompany1,dc=example,dc=com 节点上:
aci: (targetattr="*")(targetfilter=(objectClass=nsManagedDomain))
     (version 3.0; acl "Domain access"; allow (read,search)
     groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=subdomain1,dc=hostedCompany1,dc=example,dc=com";)
以下 ACI 位于 dc=hostedCompany2,dc=example,dc=com 节点上:
aci: (targetattr="*")(targetfilter=(objectClass=nsManagedDomain))
     (version 3.0; acl "Domain access"; allow (read,search)
     groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=hostedCompany2,dc=example,dc=com";)
以下 ACI 位于 dc=subdomain1,dc=hostedCompany2,dc=example,dc=com 节点上:
aci: (targetattr="*")(targetfilter=(objectClass=nsManagedDomain))
     (version 3.0; acl "Domain access"; allow (read,search)
     groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=subdomain1,dc=hostedCompany2,dc=example,dc=com";)
在上面显示的四个 ACI 中,唯一不同的 DN 是 groupdn 关键字中指定的 DN。将宏用于 DN,可以在 dc=example,dc=com 节点上将这些 ACI 替换为树根的 ACI。这个 ACI 读取如下:
aci: (target="ldap:///ou=Groups,($dn),dc=example,dc=com")
     (targetattr="*")(targetfilter=(objectClass=nsManagedDomain))
     (version 3.0; acl "Domain access"; allow (read,search)
     groupdn="ldap:///cn=DomainAdmins,ou=Groups,[$dn],dc=example,dc=com";)
在新的 ACI 中使用 target 关键字(之前没有使用)。
在本例中,ACM 的数量从 4 个减少到一。真正优点是您在目录树中减少重复模式的数量。

18.14.2. 宏 ACI 语法

宏 ACI 包括以下类型的表达式来替换 DN 或 DN 的一部分:
  • ($dn)
  • [$DN]
  • ($attr.attrName),其中 attrName 代表目标条目中包含的属性
在本节中,用来提供绑定凭证的 ACI 关键字(如 userdnroledngroupdnuserattr )被集中称为 主题,而不是 ACI 的目标。宏 ACI 可以在目标部分或 ACI 的主题部分使用。
表 18.5 “ACI Keywords 中的宏” 显示您可以使用 DN 宏的 ACI 的部分:

表 18.5. ACI Keywords 中的宏

Macro ACI Keyword
($dn) target, targetfilter, userdn, roledn, groupdn, userattr
[$DN] targetfilter, userdn, roledn, groupdn, userattr
($attr.attrName) userDN, roledn, groupdn, userattr
适用以下限制:
  • 如果您在 targetfilter, userdn, roledn, groupdn, userattr 中使用 ($dn),则必须定义一个包括 ($dn) 的目标。
  • 如果您在 targetfilter, userdn, roledn, groupdn, userattr 中使用 [$dn],则必须定义一个包括 ($dn) 的目标。
注意
在使用任何宏时,您始终 需要一个包含 ($dn) 宏的目标定义。
您可以组合 ($dn) 宏和 ($attr.attrName) 宏。

18.14.2.1. 宏匹配($dn)

($dn) 宏被 LDAP 请求中目标资源的匹配部分替代。例如,您在 cn=all,ou=groups,dc=subdomain1,dc=hostedCompany1,dc=example,dc=com 条目中有一个 LDAP 请求,其定义目标如下:
(target="ldap:///ou=Groups,($dn),dc=example,dc=com")
($dn) 宏与 dc=subdomain1,dc=hostedCompany1 匹配。
当 ACI 的主题也使用 ($dn) 时,与目标匹配的子字符串用于扩展主题。例如:
aci: (target="ldap:///ou=*,($dn),dc=example,dc=com")
     (targetattr = "*") (version 3.0; acl "Domain access"; allow (read,search)
     groupdn="ldap:///cn=DomainAdmins,ou=Groups,($dn),dc=example,dc=com";)
在这种情况下,如果目标中的字符串匹配 ($dn)dc=subdomain1,dc=hostedCompany1,则主题中使用相同的字符串。然后,ACI 会扩展如下:
aci: (target="ldap:///ou=Groups,dc=subdomain1,dc=hostedCompany1,
     dc=example,dc=com") (targetattr = "*") (version 3.0; acl "Domain
     access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,
     dc=subdomain1,dc=hostedCompany1,dc=example,dc=com";)
扩展宏后,目录服务器会根据正常进程评估 ACI,以确定是否授予访问权限。

18.14.2.2. [$dn] 的宏匹配

[$dn] 的匹配机制与 $dn 稍有不同。目标资源的 DN 会多次检查,每次丢弃最旧的 RDN 组件时,直到找到匹配项为止。
例如,您有以 cn=all,ou=groups,dc=subdomain1,dc=hostedCompany1,dc=example,dc=com 子树为目标的 LDAP 请求,以及以下 ACI:
aci: (target="ldap:///ou=Groups,($dn),dc=example,dc=com")
     (targetattr = "*") (version 3.0; acl "Domain access"; allow (read,search)
     groupdn="ldap:///cn=DomainAdmins,ou=Groups,[$dn],dc=example,dc=com";)
扩展此 ACI 的步骤如下:
  1. ($DN) 匹配 dc=subdomain1,dc=hostedCompany1
  2. 主题中的 [$DN] 替换为 dc=subdomain1,dc=hostedCompany1
    结果为 groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=subdomain1,dc=hostedCompany1,dc=example,dc=com"。如果绑定 DN 是该组的成员,则匹配的进程将停止,并且评估 ACI。如果不匹配,该过程将继续。
  3. 主题中的 [$DN] 替换为 dc=hostedCompany1
    结果为 groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=hostedCompany1,dc=example,dc=com"。在这种情况下,如果绑定 DN 不是该组的成员,则不会评估 ACI。如果是一个成员,则评估 ACI。
[$dn] 宏的优点是,它提供了为目录树中的所有子域授予域级别管理员访问权限的灵活方式。因此,表示域之间的分层关系非常有用。
例如,请考虑以下 ACI:
aci: (target="ldap:///ou=*, ($dn),dc=example,dc=com")
     (targetattr="*")(targetfilter=(objectClass=nsManagedDomain))
     (version 3.0; acl "Domain access"; allow (read,search)
     groupdn="ldap:///cn=DomainAdmins,ou=Groups,[$dn],dc=example,dc=com";)
它为 dc=hostedCompany1 下的所有子域授予了访问 cn=DomainAdmins,ou=Groups,dc=hostedCompany1,dc=example,dc=com 成员的权限,因此属于那个组的管理员可以访问如 ou=people,dc=subdomain1.1,dc=subdomain1 的子树。
但是,同时,cn=DomainAdmins,ou=Groups,dc=subdomain1.1 的成员将被拒绝访问 ou=body,dc=hostedCompany1ou=body,dc=subdomain1,dc=hostedCompany1 节点。

18.14.2.3. 宏匹配($attr.attrName)

DN 的主题部分始终使用 ($attr.attrName) 宏。例如,定义以下 roledn
roledn = "ldap:///cn=DomainAdmins,($attr.ou)"
现在,假设服务器收到在以下条目的目标 LDAP 操作:
dn: cn=Jane Doe,ou=People,dc=HostedCompany1,dc=example,dc=com
cn: Jane Doe
sn: Doe
ou: Engineering,dc=HostedCompany1,dc=example,dc=com
...
为了评估 ACI 的 roledn 部分,服务器将查看目标条目中存储的 ou 属性,并使用此属性的值来扩展宏。因此,在示例中,roledn 被扩展如下:
roledn = "ldap:///cn=DomainAdmins,ou=Engineering,dc=HostedCompany1,dc=example,dc=com"
然后目录服务器会根据普通的 ACI 评估算法评估 ACI。
当属性被多值时,每个值都会被用来扩展宏,第一个提供成功匹配项的值。例如:
dn: cn=Jane Doe,ou=People,dc=HostedCompany1,dc=example,dc=com 
cn: Jane Doe 
sn: Doe 
ou: Engineering,dc=HostedCompany1,dc=example,dc=com
ou: People,dc=HostedCompany1,dc=example,dc=com...
在这种情况下,当 Directory 服务器评估 ACI 时,它会在以下扩展表达式上执行逻辑 OR :
roledn = "ldap:///cn=DomainAdmins,ou=Engineering,dc=HostedCompany1,dc=example,dc=com"

roledn = "ldap:///cn=DomainAdmins,ou=People,dc=HostedCompany1,dc=example,dc=com"

18.15. 在目录管理器上设置访问控制

从维护角度而言,具有不受限制的管理用户有意义。目录管理器需要高级别的访问权限来执行维护任务并响应事件。
但是,由于 Directory Manager 用户的强大功能,建议某些级别的访问控制来防止未经授权的访问或攻击以 root 用户身份执行。
常规访问控制规则应用到目录树,目录管理器不是常规用户条目,因此不能(常规) ACI 应用到 Directory Manager 用户。ACI 通过特殊的插件配置条目应用。

18.15.1. 关于目录管理器帐户上的访问控制

普通访问控制规则不适用于 Directory Manager 用户。Directory Manager 用户的权限在目录服务器中硬编码,无法在绑定规则中使用。
目录管理器的访问控制是通过 RootDN 访问控制插件 实现的。此插件适用于目录服务器配置,因此可将一些访问控制规则应用到 Directory Manager 条目。
该插件不定义标准 ACL。有些信息已经代表,包括目标(目录管理器条目)和允许的权限(全部)。RootDN 访问控制插件的目的是不限制目录管理器可以 做什么 ;其目的是通过限制谁以目录管理器(即使使用有效凭证)登录,从而根据其位置或时间提供级别的安全性。
因此,Directory Manager 的 ACI 只设置绑定规则:
与其他访问控制规则一样,拒绝规则监管规则。
重要
确保 Directory Manager 始终具有允许的访问级别。Directory Manager 可能需要在非小时内执行维护操作(当用户负载非常轻便)或响应故障。在这种情况下,设置基于字符串的时间或日常访问控制规则可能会阻止 Directory Manager 能够适当地管理该目录。

18.15.2. 配置 RootDN 访问控制插件

默认禁用 root DN 访问控制规则。启用 RootDN Access Control 插件,然后设置适当的访问控制规则。
注意
在插件条目中,只能为 Directory Manager 设置一个访问控制规则,它适用于所有访问整个目录。
  1. 启用 RootDN 访问控制 插件:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin root-dn enable
    Plugin 'RootDN Access Control' enabled
    ...
    
  2. 为访问控制指令设置绑定规则。例如:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin root-dn set --open-time=0600 --close-time=2100 --allow-host="*.example.com" --deny-host="*.remote.example.com"
    您可以设置以下参数:
    • --open-time--close-time 用于基于时间的访问控制。
    • --days-allowed 用于基于日常访问控制。
    • --allow-host--deny-host--allow-ip--deny-ip 用于基于主机的访问控制。这些是所有多值属性,您可以使用通配符来允许或拒绝 IP 范围或域。
      重要
      拒绝规则具有更高的优先级,然后允许规则。例如,如果 --allow-host 参数设为 192.168.1.0/24 example.com,并且 --deny-host 设置为 192.168.1.0/24 front-office.example.com,则阻止从 front-office.example.com 子域中的所有主机访问,因为目录管理器会被阻止。
  3. 重启 Directory 服务器:
    # dsctl instance_name restart

第 19 章 使用健康检查功能来识别问题

dsctl healthcheck 命令分析目录服务器实例,以了解潜在的问题,并推荐解决方案来解决它们。
下表显示了检查健康检查功能执行:

表 19.1. 检查概述

组件 重要性 结果代码 描述
后端 DSBLE0003 数据库没有初始化。创建数据库,但数据库为空。
后端 Medium DSBLE0001 配置中缺少后端的映射树条目。
config DSCLE0001 禁用高分辨率时间戳。
config DSVIRTLE0001 虚拟属性被错误地索引。角色或服务(CoS)定义使用的索引属性可能会破坏搜索结果。
操作系统 Medium DSPERMLE0001 /etc/resolve.conf 文件中设置的权限与 0644 不同。
操作系统 DSDSLE0001 磁盘空间较低
操作系统 DSPERMLE0002 /etc/dirsrv/slapd-instance_name/pin.txt/etc/dirsrv/slapd-instance_name/pwdfile.txt 文件设置的权限与 0400 不同。
插件 DSRILE0001 参考完整性 插件设置了更新延迟。这可能导致复制问题。
插件 DSRILE0002 参考完整性 插件丢失索引。如果没有索引,插件会为每个删除操作查询某些属性。这可能导致硬检测的未索引搜索和高 CPU 用量。
复制 DSREPLLE0002 数据库中存在冲突条目。
复制 DSSKEWLE0001 复制时间偏移时间大于 6 小时,小于 12 小时。
复制 Medium DSCLLE0001 changelog 修剪被禁用。在这种情况下,changelog 会在没有限制的情况下增长。
复制 Medium DSREPLLE0004 健康检查无法检索复制状态。
复制 Medium DSREPLLE0003 拓扑不同步,但复制工作正常。
复制 Medium DSREPLLE0005 无法访问远程副本。
复制 Medium DSSKEWLE0002 复制时间偏移时间大于 12 小时,小于 24 小时。
复制 DSREPLLE0001 拓扑不同步,复制无法正常工作。
复制 DSSKEWLE0003 复制时间偏移时间大于 24 小时。复制会话可能会破坏。
安全性 Medium DSELE0001 最小 TLS 版本设置为小于 TLS 1.2 的值。
安全性 DSCLE0002 配置了弱密码存储方案。
Server DSBLE0002 健康检查无法查询后端。
TLS 证书 Medium DSCERTLE0001 服务器证书在下一个 30 天内过期。
TLS 证书 DSCERTLE0002 服务器证书已过期。

19.1. 运行目录服务器健康检查

要运行健康检查,请输入:
# dsctl instance_name healthcheck
Beginning lint report, this could take a while ...
Checking Backends ...
Checking Config ...
Checking Encryption ...
Checking FSChecks ...
Checking ReferentialIntegrityPlugin ...
Checking MonitorDiskSpace ...
Checking Replica ...
Checking Changelog5 ...
Checking NssSsl ...
Healthcheck complete.
1 Issue found!  Generating report ...

例 19.1. 健康检查可能的报告

以下显示了一个健康检查报告示例:
[1] DS Lint Error: DSELE0001
--------------------------------------------------------------------------------
Severity: MEDIUM 
Affects:
 -- cn=encryption,cn=config

Details:
-----------
This Directory Server may not be using strong TLS protocol versions. TLS1.0 is known to
have a number of issues with the protocol. Please see:

https://tools.ietf.org/html/rfc7457

It is advised you set this value to the maximum possible.

Resolution:
-----------
There are two options for setting the TLS minimum version allowed.  You,
can set "sslVersionMin" in "cn=encryption,cn=config" to a version greater than "TLS1.0"
You can also use 'dsconf' to set this value.  Here is an example:

    # dsconf slapd-instance_name security set --tls-protocol-min=TLS1.2

You must restart the Directory Server for this change to take effect.

Or, you can set the system wide crypto policy to FUTURE which will use a higher TLS
minimum version, but doing this affects the entire system:

    # update-crypto-policies --set FUTURE


===== End Of Report (1 Issue found) =====
要以 JSON 格式显示输出,请将 --json 参数传递给命令:
# dsctl --json instance_name healthcheck

例 19.2. JSON 格式可能的健康检查报告

以下显示了一个 JSON 格式显示健康检查报告示例:
[
    {
        "dsle": "DSELE0001",
        "severity": "MEDIUM",
        "items": [
            "cn=encryption,cn=config"
        ],
        "detail": "This Directory Server may not be using strong TLS protocol versions. TLS1.0 is known to\nhave a number of issues with the protocol. Please see:\n\nhttps://tools.ietf.org/html/rfc7457\n\nIt is advised you set this value to the maximum possible.",
        "fix": "There are two options for setting the TLS minimum version allowed.  You,\ncan set \"sslVersionMin\" in \"cn=encryption,cn=config\" to a version greater than \"TLS1.0\"\nYou can also use 'dsconf' to set this value.  Here is an example:\n\n    # dsconf slapd-instance_name security set --tls-protocol-min=TLS1.2\n\nYou must restart the Directory Server for this change to take effect.\n\nOr, you can set the system wide crypto policy to FUTURE which will use a higher TLS\nminimum version, but doing this affects the entire system:\n\n    # update-crypto-policies --set FUTURE"
    }
]

第 20 章 管理用户身份验证

当用户连接到 Red Hat Directory Server 时,首先是经过身份验证的用户。然后,目录会根据身份验证过程中建立的身份,授予用户访问权限和资源限值。
本章描述了管理用户的任务,包括为该目录配置密码和帐户锁定策略、拒绝用户访问该目录的组,并根据用户的绑定 DN 限制可用的系统资源。

20.1. 设置用户密码

只有在有 userPassword 属性且还没有激活时,才能使用条目绑定到目录。由于用户密码存储在目录中,因此可以使用任何 LDAP 操作(如使用 ldapmodify 实用程序)设置或重置用户密码。
当管理员更改用户的密码时,Directory 服务器会将用户条目中的 pwdReset 操作属性设置为 true。应用可以使用此属性来识别管理员是否重置了用户的密码。
有关创建和修改目录条目的详情,请参考 第 3 章 管理目录条目。有关取消激活用户帐户的详情,请参考 第 20.16 节 “手动取消激活用户和角色”
只有密码管理员,如 第 20.2 节 “设置密码管理员” 所述,root DN 才能添加预先哈希的密码。这些用户也可以违反密码策略。
警告
当使用密码管理员帐户或 目录管理器 (root DN)设置密码时,将绕过密码策略且不验证。不要将这些帐户用于常规用户密码管理。仅使用它们来执行需要绕过密码策略的密码管理任务。

20.2. 设置密码管理员

Directory Manager 可将 密码管理员 角色添加到用户或一组用户。由于需要设置访问控制指令(ACI),因此建议使用组来允许一个 ACI 集来管理所有密码管理员。密码管理员可以执行任何用户密码操作,包括:
  • 强制用户更改密码,
  • 将用户的密码改为密码策略中定义的不同存储方案,
  • 绕过密码语法检查,
  • 并添加已哈希密码。
第 20.1 节 “设置用户密码” 所述,建议由数据库中的现有角色完成普通密码更新,并有权更新 userPassword 属性。红帽建议不要将密码管理员帐户用于这些普通任务。
您可以将用户或组指定为密码管理员:
  • 在本地策略中。例如:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com localpwp set ou=people,dc=example,dc=com --pwdadmin "cn=password_admins,ou=groups,dc=example,dc=com"
  • 在全局策略中。例如:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy set --pwdadmin "cn=password_admins,ou=groups,dc=example,dc=com"
注意
您可以在 cn=config 条目下添加新的 passwordAdminSkipInfoUpdate: on/off 设置,以提供对密码管理员执行的密码保护的精细控制。当您启用此设置时,密码更新不会更新某些属性,例如 passwordHistory,passwordExpirationTime,passwordRetryCount,pwdReset, 和 passwordExpWarned

20.3. 外部更改密码

虽然大多数密码可以通过 ldapmodify 操作来更改,但有些密码无法通过常规 LDAP 操作进行更改。这些密码可能存储在 Directory 服务器之外,如存储在 SASL 应用程序中的密码。这些密码可以通过 密码更改扩展操作 进行修改。
目录服务器支持 RFC 3062 中定义的密码更改扩展操作,因此用户可以使用适当的客户端以符合标准的方式更改密码。dsidm 工具传递指定用户的密码更改:
# dsidm ldap://server.example.com -D bind_dn -W -b dc=example,dc=com account change_password user newPassword oldPassword
重要
密码操作必须通过安全连接执行,即 SASL、TLS 或 STARTTLS。有关在 LDAP 客户端工具中使用安全连接的详情,请参考 第 9.9.4 节 “使用证书进行身份验证”
有关参数的详情,请查看 dsidm instance_name 帐户 change_password --help 命令的输出。
要使用 STARTTLS,它会在非安全端口上运行命令,请使用 -Z 选项和标准 LDAP 端口号运行 dsidm。密码扩展更改操作的格式如下:
# dsidm ldap://server.example.com -Z bind_dn -W -b dc=example,dc=com account change_password user newPassword oldPassword
注意
要使 STARTTLS 连接正常工作,必须配置 TLS 环境变量,如 第 9.9.4 节 “使用证书进行身份验证” 所述。
使用 -Z 选项强制连接成功。
若要修改条目的密码,请以任何其他操作一样运行 dsidm。需要指定一个绑定 DN,即使帐户与绑定 DN 中给出的相同。例如:
# dsidm ldap://server.example.com -Z bind_dn -W -b dc=example,dc=com account change_password user newPassword oldPassword
对密码更改操作强制执行访问控制。如果绑定 DN 没有更改指定密码的权限,则操作将失败,并显示 Insufficient rights 错误。

20.4. 管理密码策略

密码策略通过强制实施一定级别的安全性来最小化使用密码的风险。例如,密码策略可以定义:
  • 用户必须根据时间表更改其密码。
  • 用户必须提供非主要密码。
  • 密码语法必须满足某些复杂性要求。
警告
当使用密码管理员帐户或 目录管理器 (root DN)设置密码时,将绕过密码策略且不验证。不要将这些帐户用于常规用户密码管理。仅使用它们来执行需要绕过密码策略的密码管理任务。
目录服务器支持精细的密码策略,因此密码策略可以应用到整个目录(global 密码策略)、一个特定子树(subtree-levellocal 密码策略) 或一个特定用户 (user-levellocal密码策略)。
应用到用户帐户的完整密码策略由以下元素组成:
  • 密码策略检查的类型或级别。此信息指示服务器是否应该检查并强制实施全局密码策略,还是本地(子树/用户级别)密码策略。
    密码策略在反转的 pyramid 中工作,从常规到特定的。全局密码策略由子树级密码策略替代,该策略由用户级密码策略替代。仅对条目强制执行一个密码策略;密码策略不会被添加。这意味着,如果在全局或子树级别策略中配置了特定属性,但没有在用户级密码策略中,则属性在尝试登录时不会用于用户,因为 active, applied 策略是用户级策略。
  • 密码添加和修改信息。密码信息包括密码语法和密码历史记录详情。
  • 绑定信息。绑定信息包括允许的宽限期数量、密码参与属性和跟踪绑定失败。
注意
建立密码策略后,可以通过配置帐户锁定策略来保护用户密码免受潜在的威胁。帐户锁定可防止尝试通过重复猜测用户密码来破坏目录的黑客。

20.4.1. 配置全局密码策略

默认情况下禁用全局密码策略设置。本节提供了一些配置全局密码策略的示例。
注意
配置密码策略后,配置帐户锁定策略。详情请查看 第 20.9 节 “配置基于密码的帐户锁定策略”

20.4.1.1. 使用命令行配置全局密码策略

使用 dsconf 工具显示并编辑全局密码策略设置:
  1. 显示当前设置:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy get
    Global Password Policy: cn=config
    ------------------------------------
    passwordstoragescheme: PBKDF2_SHA256
    passwordChange: on
    passwordMustChange: off
    passwordHistory: off
    passwordInHistory: 6
    ...
  2. 调整密码策略设置。例如,要启用密码语法检查并将密码的最小长度设置为 12 个字符,请输入:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy set --pwdchecksyntax=on --pwdmintokenlen=12
    如需可用设置的完整列表,请输入:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy set --help
  3. 启用密码策略:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy set --pwdlockout on

20.4.1.2. 使用 Web 控制台配置全局密码策略

使用 Web 控制台配置全局密码策略:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Database 菜单。
  4. 密码策略 菜单中,选择 Global Policy
  5. 设置全局密码策略设置。您可以在以下类别中设置参数:
    • 常规设置,如密码存储方案
    • 密码过期设置,如密码过期的时间。
    • 帐户锁定设置,例如在应锁定帐户的登录尝试次数后。
    • 密码语法设置,如最小密码长度。
    要显示参数的 cn=config 条目中的工具提示和对应属性名称,请将鼠标光标悬停在设置上。详情请查看 红帽目录服务器配置、命令和文件参考 中的参数描述。
  6. 点击 Save

20.4.2. 使用本地密码策略

与定义整个目录的设置的全局密码策略不同,本地密码策略是特定用户或子树的策略。
当精细的密码策略没有设置密码语法时,如果 nsslapd-pwpolicy-inherit-global 参数为 on,则可以从全局策略继承语法。
如果定义了 --pwpinheritglobal 选项,则 local 策略中的 passwordcheck Locator 选项设置为 OFF,并在全局策略中继承以下属性到本地策略:
  • passwordchecksyntax
  • passwordminlength
  • passwordmindigits
  • passwordminalphas
  • passwordminuppers
  • passwordminlowers
  • passwordminspecials
  • passwordmin8bit
  • passwordmaxrepeats
  • passwordmincategories
  • passwordmintokenlength

20.4.2.1. 其中目录服务器存储本地密码策略条目

当您使用 dsconf localpwp adduserdsconf localpwp addsubtree 命令时,Directory 服务器会创建一个用于存储策略属性的条目:
  • 对于子树(如 ou=body,dc=example,dc=com),添加了以下条目:
    • 在子树级别上的容器条目(nsPwPolicyContainer),用于保存子树及其所有子项的各种密码策略相关条目。例如:
      dn: cn=nsPwPolicyContainer,ou=people,dc=example,dc=com
      objectClass: top
      objectClass: nsContainer
      cn: nsPwPolicyContainer
    • 用于保存特定于子树的所有密码策略属性的实际密码策略规格条目(nsPwPolicyEntry)。例如:
      dn: cn="cn=nsPwPolicyEntry,ou=people,dc=example,dc=com",
       cn=nsPwPolicyContainer,ou=people,dc=example,dc=com
      objectclass: top
      objectclass: extensibleObject
      objectclass: ldapsubentry
      objectclass: passwordpolicy
    • 具有指向上述(nsPwPolicyEntry)条目的 pwdpolicysubentry 值的 CoS 模板条目(nsPwTemplateEntry)条目。例如:
      dn: cn="cn=nsPwTemplateEntry,ou=people,dc=example,dc=com",
       cn=nsPwPolicyContainer,ou=people,dc=example,dc=com
      objectclass: top
      objectclass: extensibleObject
      objectclass: costemplate
      objectclass: ldapsubentry
      cosPriority: 1
      pwdpolicysubentry: cn="cn=nsPwPolicyEntry,ou=people,dc=example,dc=com",
           cn=nsPwPolicyContainer,ou=people,dc=example,dc=com
    • 子树级别的 CoS 规格条目。例如:
      dn: cn=newpwdpolicy_cos,ou=people,dc=example,dc=com
      objectclass: top
      objectclass: LDAPsubentry
      objectclass: cosSuperDefinition
      objectclass: cosPointerDefinition
      cosTemplateDn: cn=cn=nsPwTemplateEntry\,ou=people\,dc=example,dc=com,
       cn=nsPwPolicyContainer,ou=people,dc=example,dc=com
      cosAttribute: pwdpolicysubentry default operational
  • 对于用户(例如,uid=user_name,ou=body,dc=example,dc=com),添加了以下条目:
    • 父级别的容器条目(nsPwPolicyContainer),用于保存用户及其所有子项的各种密码策略相关条目。例如:
      dn: cn=nsPwPolicyContainer,ou=people,dc=example,dc=com
      objectClass: top
      objectClass: nsContainer
      cn: nsPwPolicyContainer
    • 用于保存特定于用户的密码策略属性的实际密码策略规格条目(nsPwPolicyEntry)。例如:
      dn: cn="cn=nsPwPolicyEntry,uid=user_name,ou=people,dc=example,dc=com",
       cn=nsPwPolicyContainer,ou=people,dc=example,dc=com
      objectclass: top
      objectclass: extensibleObject
      objectclass: ldapsubentry
      objectclass: passwordpolicy

20.4.2.2. 配置本地密码策略

配置本地密码策略:
注意
目前,您只能使用命令行设置本地密码策略。
  1. 验证子树或用户条目是否已存在本地密码策略。例如:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com localpwp get "ou=People,dc=example,dc=com"
    Error: The policy wasn't set up for the target dn entry or it is invalid
    如果不存在本地策略,请创建一个:
    • 创建子树密码策略:
      # dsconf -D "cn=Directory Manager" ldap://server.example.com localpwp addsubtree "ou=People,dc=example,dc=com"
    • 创建用户密码策略:
      # dsconf -D "cn=Directory Manager" ldap://server.example.com localpwp adduser "uid=user_name,ou=People,dc=example,dc=com"
    重要
    当您创建新的本地策略时,上一命令会自动将 cn=config 条目中的 nsslapd-pwpolicy-local 参数设置为 on
    如果不应该启用本地密码策略,请手动将参数设置为 off
    dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy set --pwdlocal off
  2. 设置本地策略属性。例如,要启用密码过期并将最长密码过期时间设置为 14 天(1209600 秒):
    • 在子树密码策略中:
      # dsconf -D "cn=Directory Manager" ldap://server.example.com localpwp set --pwdexpire=on --pwdmaxage=1209600 "ou=People,dc=example,dc=com"
    • 在用户密码策略中:
      # dsconf -D "cn=Directory Manager" ldap://server.example.com localpwp set --pwdexpire=on --pwdmaxage=1209600 "uid=user_name,ou=People,dc=example,dc=com"
    如需可用设置的完整列表,请输入:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com localpwp set --help

20.5. 配置临时密码规则

目录服务器密码策略支持在用户帐户中设置临时密码。如果您为用户分配临时密码,Directory 服务器会拒绝除密码更改之外的任何其他操作,直到用户更改密码。
以下是临时密码的功能:
  • 只有 cn=Directory Manager 帐户才能分配临时密码。
  • 目录服务器只允许身份验证尝试固定次数,以避免攻击者探测密码。
  • 目录服务器允许在指定延迟后尝试,以配置在设置后临时密码不可用。
  • 目录服务器只允许身份验证尝试指定时间,以便在用户不使用或重置它时临时密码过期。
  • 如果身份验证成功,Directory 服务器要求用户在服务器执行任何其他操作前重置密码。
默认情况下禁用临时密码规则。您可以在全局或本地密码策略中配置它们。

20.5.1. 在全局密码策略中启用临时密码策略

为整个目录服务器实例启用临时密码功能:
  1. 如果管理员重置密码,则启用该用户的密码。
  2. 在全局密码策略中配置该功能。
如果管理员更新了一个用户的 userPassword 属性,并将 passwordMustChange 属性设置为 on,目录服务器会应用临时密码规则。

流程

  1. 配置用户在管理员重置后必须更改密码:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com  pwpolicy set --pwdmustchange on
  2. 在全局密码策略中配置临时密码策略设置:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy set --pwptprmaxuse 5 --pwptprdelayexpireat 3600 --pwptprdelayvalidfrom 60
    在本例中:
    • --pwptprmaxuse 选项将用户可以使用临时密码的最大尝试次数设置为 5
    • --pwptprdelayexpireat 选项将临时密码到期前的时间设置为 3600 秒(1 小时)
    • --pwptprdelayvalidfrom 选项配置 --pwptprdelayexpireat 中设置的时间在管理员重置用户密码后启动 60 秒。

验证

  • 显示存储临时密码规则的属性:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy get | grep -i TPR
    passwordTPRMaxUse: 5
    passwordTPRDelayExpireAt: 3600
    passwordTPRDelayValidFrom: 60

20.5.2. 在本地密码策略中启用临时密码策略

要为特定用户或子树启用临时密码功能,如果管理员重置密码,用户必须更改密码,并在本地密码策略中配置该功能。
如果管理员更新了一个用户的 userPassword 属性,并将 passwordMustChange 属性设置为 on,目录服务器会应用临时密码规则,如果用户:
  • 启用本地密码策略
  • 存储在启用了本地密码策略的子树中

流程

  1. 配置用户在管理员重置后必须更改密码:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com  pwpolicy set --pwdmustchange on
  2. 配置临时密码规则设置:
    • 对于子树:
      # dsconf -D "cn=Directory Manager" ldap://server.example.com localpwp addsubtree --pwptprmaxuse 5 --pwptprdelayexpireat 3600 --pwptprdelayvalidfrom 60 ou=People,dc=example,dc=com
    • 对于用户:
      # dsconf -D "cn=Directory Manager" ldap://server.example.com localpwp adduser --pwptprmaxuse 5 --pwptprdelayexpireat 3600 --pwptprdelayvalidfrom 60 uid=example,ou=People,dc=example,dc=com
    请注意,您只能对存在的条目设置本地密码策略。
    在这些示例中:
    • --pwptprmaxuse 选项将用户可以使用临时密码的最大尝试次数设置为 5
    • --pwptprdelayexpireat 选项将临时密码过期前的时间设置为 3600 秒(1 小时)。
    • -pwptprdelayvalidfrom 选项配置 --pwptprdelayexpireat 中设置的时间在管理员重置用户密码后启动 60 秒。

验证

  • 显示可分辨名称(DN)的本地密码策略:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com localpwp get distinguished_name | grep -i TPR
    passwordTPRMaxUse: 5
    passwordTPRDelayExpireAt: 3600
    passwordTPRDelayValidFrom: 60

20.6. 了解密码过期控制

当用户使用有效密码向目录服务器进行身份验证时,如果密码过期,将很快过期或需要重置,服务器会将以下 LDAP 控制发回到客户端:
  • 过期的控制(2.16.840.1.113730.3.4.4):指示密码已过期。目录服务器在以下情况下发送这个控制:
    • 密码已过期,宽限期已耗尽。服务器拒绝绑定并显示 Error 49 消息。
    • 密码已过期,但宽限期仍可用。允许绑定。
    • 如果在 cn=config 条目中启用了 passwordMustChange,则用户需要在管理员更改后重置密码。允许绑定,但除了更改密码外的任何后续操作都会产生 Error 53 信息。
  • 过期控制(2.16.840.1.113730.3.4.5):表示密码将很快过期。目录服务器在以下情况下发送这个控制:
    • 密码将在 cn=config 条目中的 passwordWarning 属性中设置的密码警告周期内过期。
    • 如果在 cn=config 条目的 passwordSendExpiringTime 属性中启用了密码策略配置选项,则会始终返回过期控制,无论密码是否在警告周期内。
  • 绑定响应控制(1.3.6.1.4.1.42.2.27.8.5.1):控制包含有关即将过期或即将过期的密码状态的详细信息。
    注意
    只有在客户端请求时,目录服务器仅发送绑定响应控制。例如,如果使用 ldapsearch,则必须将 -e ppolicy 参数传给命令,以请求绑定响应控制。

    例 20.1. 在查询中请求绑定响应控制

    如果您请求绑定响应控制,例如,通过将 -e ppolicy 参数传给 ldapsearch 命令,服务器会返回有关帐户过期的详细信息。例如:
    # ldapsearch -D "uid=user_name,dc=example,dc=com" -xLLL -W \
         -b "dc=example,dc=com" -e ppolicy
    ldap_bind: Success (0); Password expired (Password expired, 1 grace logins remain)

20.7. 管理目录管理器密码

Directory Manager 是特权数据库管理员,类似于 Linux 中的 root 用户。Directory Manager 条目和对应的密码是在实例安装过程中设置的。
目录管理器的默认可分辨名称(DN)是 cn=Directory Manager

20.7.1. 重置目录管理器密码

如果您丢失了 Directory Manager 密码,请重置它:
  1. 停止 Directory 服务器实例:
    # dsctl instance_name stop
  2. 生成新的密码哈希。例如:
    # pwdhash -D /etc/dirsrv/slapd-instance_name password
    {PBKDF2_SHA256}AAAgABU0bKhyjY53NcxY33ueoPjOUWtl4iyYN5uW...
    指定目录服务器配置的路径会自动使用 nsslapd-rootpwstoragescheme 属性中设置的密码存储方案来加密新密码。
  3. 编辑 /etc/dirsrv/slapd-instance_name/dse.ldif 文件,并将 nsslapd-rootpw 属性设置为上一步中显示的值:
    nsslapd-rootpw: {PBKDF2_SHA256}AAAgABU0bKhyjY53NcxY33ueoPjOUWtl4iyYN5uW...
  4. 启动 Directory 服务器实例:
    # dsctl instance_name start

20.7.2. 更改目录管理器密码

本节论述了如何更改目录管理器帐户的密码。

20.7.2.1. 使用命令行更改目录管理器密码

使用以下选项之一设置新密码:
重要
仅使用加密连接设置密码。使用未加密的连接可以将密码公开给网络。如果您的服务器不支持加密的连接,请使用 Web 控制台更新 Directory Manager 密码。请参阅 第 20.7.2.2 节 “使用 Web 控制台更改目录管理器密码”
  • nsslapd-rootpw 参数设置为纯文本值,目录服务器会自动加密:
    # dsconf -D "cn=Directory Manager" ldaps://server.example.com config replace nsslapd-rootpw=password
    警告
    不要在密码中使用大括号({})。目录服务器以 {password-storage-scheme}hashed_password 格式存储密码。服务器将大括号中的字符解释为密码存储方案。如果字符串是无效的存储方案,或者密码没有正确哈希,则目录管理器无法连接到服务器。
  • 要手动加密密码并在 nsslapd-rootpw 参数中对其进行设置:
    1. 生成新的密码哈希。例如:
      # pwdhash -D /etc/dirsrv/slapd-instance_name password
      {PBKDF2_SHA256}AAAgAMwPYIhEkQozTagoX6RGG5E7d6/6oOJ8TVty...
      指定目录服务器配置的路径会自动使用 nsslapd-rootpwstoragescheme 属性中设置的密码存储方案来加密新密码。
    2. 使用安全连接(STARTTLS)将 nsslapd-rootpw 属性设置为上一步中显示的值:
      # dsconf -D "cn=Directory Manager" ldaps://server.example.com config replace nsslapd-rootpw="{PBKDF2_SHA256}AAAgAMwPYIhEkQozTagoX6RGG5E7d6/6oOJ8TVty..."

20.7.2.2. 使用 Web 控制台更改目录管理器密码

作为管理员,执行这些步骤以更改密码:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings 菜单,然后选择 Server Settings
  4. 打开 Directory Manager 选项卡。
  5. Directory Manager PasswordConfirm Password 字段中输入新密码
  6. 另外,还可设置不同的密码存储方案。
  7. 点击 Save

20.7.3. 更改目录管理器密码存储主题

密码存储方案指定目录服务器使用哪个算法哈希密码。要使用命令行更改存储方案,您的服务器必须支持加密的连接。如果您的服务器不支持加密的连接,请使用 Web 控制台来设置存储方案。请参阅 第 20.7.3.2 节 “使用 Web 控制台更改目录管理器密码存储主题”
请注意,目录管理器(nsslapd-rootpwstoragescheme)的存储方案可能与用于加密用户密码的方案(nsslapd-pwstoragescheme)不同。
有关支持的密码存储方案列表,请参阅 红帽目录服务器配置、命令和文件参考中的相应部分
注意
如果更改了目录管理器的密码存储方案,还必须重置其密码。现有密码无法重新加密。

20.7.3.1. 使用命令行更改目录管理器密码存储主题

如果您的服务器支持加密连接,请执行以下步骤来更改密码存储方案:
  1. 生成使用新存储方案的新密码哈希。例如:
    # pwdhash -s PBKDF2_SHA256 password
    {PBKDF2_SHA256}AAAgAMwPYIhEkQozTagoX6RGG5E7d6/6oOJ8TVty...
  2. nsslapd-rootpwstoragescheme 属性设置为存储 scheme,将 nsslapd-rootpw 属性设置为在前一个步骤中显示的值,使用安全连接 (STARTTLS):
    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-rootpwstoragescheme=PBKDF2_SHA256 nsslapd-rootpw="{PBKDF2_SHA256}AAAgAMwPYIhEkQozTagoX6RGG5E7d6/6oOJ8TVty..."

20.7.3.2. 使用 Web 控制台更改目录管理器密码存储主题

执行这些步骤,使用 Web 控制台更改密码:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings 菜单,然后选择 Server Settings
  4. 打开 Directory Manager 选项卡。
  5. 设置密码存储方案。
  6. 目录服务器无法使用新的存储方案重新加密当前密码。因此,在 Directory Manager PasswordConfirm Password 字段中输入新密码。
  7. 单击 Save Configuration

20.7.4. 更改目录管理器 DN

作为管理员,执行以下步骤将目录管理器 DN 更改为 cn=New Directory Manager
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-rootdn="cn=New Directory Manager"
请注意,目录服务器只支持使用命令行更改目录管理器 DN。

20.8. 检查无密码访问的帐户可用性

大多数时间,目录服务器返回关于用户帐户的身份验证信息,客户端以该用户身份实际绑定(或尝试绑定)。绑定尝试需要某种形式的用户凭证,通常是密码或证书。虽然目录服务器允许未经身份验证的绑定和匿名绑定,但这些绑定都不会返回任何用户帐户信息。
在某些情况下,客户端需要有关用户帐户的信息 - 特别是是否应该允许帐户进行身份验证 - 为了执行其他操作,但客户端没有或对目录服务器中的用户帐户使用任何凭证。基本上,客户端需要执行一个凭据的、没有验证的绑定操作来检索用户帐户信息(包括密码过期信息(如果帐户有密码)。
这可以通过通过 Account Usability Extension Control 来通过 ldapsearch 来完成。此控制的工作方式如同为给定用户执行经过身份验证的绑定操作,并返回该用户的帐户状态,但不实际绑定到服务器。这允许客户端确定该帐户是否可用于登录,然后将该帐户信息传递给另一个应用,如 PAM。
例如,使用 Account Usability Extension Control 可以允许系统将 Directory 服务器用作其身份后端来存储用户数据,但使用免密码身份验证方法,如智能卡或 SSH 密钥,其中身份验证操作是在目录服务器之外执行。

20.8.2. 更改用户可以执行帐户的搜索功能

默认情况下,只有目录管理器可以使用 Account Usability Extension Control。其他用户可以通过在支持的控制条目上设置适当的 ACI 来使用 Account Usability Extension Control。控制条目为帐户 Usability Extension Control OID, 1.3.6.1.4.1.42.2.27.9.5.8 命名。
例如,要启用 cn=Administrators,ou=groups,dc=example,dc=com 组的成员读取所有用户的帐户 Usability Extension 控制:
# ldapmodify -D "cn=Directory Manager" -W -x

dn: oid=1.3.6.1.4.1.42.2.27.9.5.8,cn=features,cn=config
changetype: modify
add: aci
aci: (targetattr = "*")(version 3.0; acl "Account Usable"; allow (read)(groupdn = "ldap:///cn=Administrators,ou=groups,dc=example,dc=com");)

20.9. 配置基于密码的帐户锁定策略

基于密码的帐户锁定策略可以防止通过重复尝试猜测用户密码来破坏该目录的黑客策略。可以设置密码策略,以便在给定数量的失败尝试绑定后锁定该目录。

20.9.1. 使用命令行配置帐户锁定策略

使用 dsconf pwpolicy set 命令配置帐户锁定策略设置。例如,要启用 lockout 策略并配置在 4 次失败的登录尝试后锁定该帐户:
# dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy set --pwdlockout on --pwdmaxfailures=4
以下参数控制帐户密码策略:
  • --pwdlockout :将此参数设置为 onoff,以启用或禁用帐户锁定功能。
  • --pwdunlock :将此参数设置为 on,以在锁定持续时间后解锁帐户。
  • --pwdlockoutduration :设置帐户将被锁定的秒数。
  • --pwdmaxfailures :在帐户锁定前设置允许失败的密码尝试的最大数量。
  • --pwdresetfailcount :设置目录服务器重置帐户的失败登录数前的秒数。

20.9.2. 使用 Web 控制台配置帐户锁定策略

使用 Web 控制台配置帐户锁定策略:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Database 选项卡,然后选择 Global Password Policy
  4. Account Lockout 选项卡中,启用 Enable Account Lockout 设置并设置参数。例如:
    要显示参数的 cn=config 条目中的工具提示和对应属性名称,请将鼠标光标悬停在设置上。详情请查看 红帽目录服务器配置、命令和文件参考 中的参数描述。
  5. 点击 Save

20.9.3. 禁用传统密码锁定行为

当达到最大密码失败时(passwordMaxFailure)时,可以解释不同的方法。它取决于服务器如何计算整个故障计数中最后一次失败的尝试。
LDAP 客户端的传统行为是假定达到限制 失败。因此,如果失败限制设置为三个,则锁定会在第四个尝试失败时发生。这也意味着,如果第四个尝试成功,用户可以成功进行身份验证,即使用户技术上达到失败限制。在计数上是 n+1
LDAP 客户端往往预期最大失败限制来查看计数中最后一次失败的尝试作为最终尝试。因此,如果失败限制被设置为三个,则在第三个失败时,则帐户会被锁定。第四个尝试(即使使用正确的凭据)会失败。在计数上是 n
第一个场景 - 只有在超过尝试计数时帐户被锁定 - 是历史行为,因此这被视为旧的密码策略行为。在目录服务器中,默认启用此策略,因此只有在失败计数为 n+1 时,才会锁定帐户。这个旧行为可以被禁用,以便较新的 LDAP 客户端在期望时收到错误(LDAP_CONSTRAINT_VIOLATION)。这在 passwordLegacyPolicy 参数中设置。
禁用旧的密码锁定行为:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace passwordLegacyPolicy=off

20.10. 配置基于时间的帐户锁定策略

除了锁定帐户进行失败的身份验证尝试外,另一种定义帐户锁定策略的方法是将其基于帐户不活跃或帐户年龄。帐户策略插件使用 相对 时间设置来确定是否应该锁定帐户。
注意
角色或服务类可用于根据 绝对 帐户时间在激活帐户中使用。例如,可以创建 CoS,以激活在特定日期之前创建的每个帐户。
帐户策略插件需要三个配置条目:
  • 插件本身的配置条目。这会设置用于该服务器上配置的所有帐户策略的全局值。
  • 帐户策略配置条目。此条目位于用户目录中,基本上是一个模板,它被引用并应用到用户帐户条目。
  • 应用帐户策略条目的条目。用户帐户可以直接引用帐户策略,或者 CoS 或角色可用于自动将帐户策略应用到一组用户帐户。
    注意
    通过 acctPolicySubentry 属性应用帐户策略。虽然此属性可以直接添加到用户帐户,但此属性是单值 - 这意味着只能将一个帐户策略应用到该帐户。
    在大多数情况下可能会很正常。但是,一个机构可能有意创建两个帐户策略,一个用于帐户不活跃,然后根据年龄进行帐户过期。
    使用 CoS 应用帐户策略,允许将多个帐户策略用于帐户。

20.10.1. 帐户策略插件语法

帐户策略插件本身只有两个配置属性:
  • nsslapd-pluginEnabled,它设定插件是否启用或禁用。此属性默认为 off
  • nsslapd-pluginarg0,指向插件配置目录的 DN。配置条目通常是插件本身的子条目,如 cn=config,cn=Account Policy Plugin,cn=plugins,cn=config
在以前的版本中,帐户策略在两个部分定义:
  • nsslapd-pluginarg0 属性中标识的插件配置条目。这会为插件设置全局配置,用于识别帐户策略配置条目和管理用户帐户条目。这些设置适用于服务器。
    配置条目属性在 Red Hat Directory Server Configuration, Command, Command, and File Reference 中的 Account Policy Plug-in Attributes 部分中进行了描述。
  • 帐户策略配置条目。这类似于模板条目,它为帐户策略设置特定值。用户帐户 - 直接或通过 CoS 条目 - 引用此帐户策略条目。
    下表中描述了帐户策略和用户条目属性:

    表 20.2. 帐户策略条目和用户条目属性

    属性 定义 配置或用户条目
    accountpolicy (对象类) 为在activation 或 expiration 策略中的帐户定义模板条目。 配置
    accountInactivityLimit (attribute) 在帐户被锁定前,设置帐户最后一次登录时间(以秒为单位)的时间(以秒为单位)。 配置
    acctPolicySubentry (attribute) 标识属于帐户策略的任何条目(特别是帐户锁定策略)。此属性的值指向应用到该条目的帐户策略的 DN。 User
    createTimestamp (operational 属性) 包含最初创建的日期和时间。 User
    lastLoginTime (operational 属性) 包含给定帐户向目录进行身份验证的时间戳。 User

20.10.2. 帐户身份和帐户过期

帐户策略 插件允许您设置:
  • 帐户过期:帐户在创建帐户后被禁用一定时间。
  • 帐户不活跃:帐户在最后一次成功登录后被禁用了一定时间。这可让您自动禁用未使用的帐户。
禁用的帐户无法再登录。
设置 帐户策略 插件:
  1. 启用帐户策略插件:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy enable
  2. 设置插件配置条目:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy set --config-entry="cn=config,cn=Account Policy Plugin,cn=plugins,cn=config"
  3. 创建插件配置条目:
    • 要将 CoS 或角色与帐户策略搭配使用,请将 alwaysRecordLogin 值设置为 yes。这意味着每个条目都有登录时间,即使它没有 acctPolicySubentry 属性。
    • 将用于帐户策略评估的 primary 属性设置为 stateAttrName 的值。对于帐户不活跃,请使用 lastLoginTime 属性。对于简单的帐户过期时间,请使用 createTimestamp 属性。
    • 您可以在 altStateAttrName 中设置二级属性,该属性会在 stateAttrName 中定义的主属性不存在。如果没有指定属性作为替代值,则使用默认值 createTimestamp
      警告
      如果 primary 属性的值被设置为 lastLoginTime,并且 altStateAttrName 设置为 createTimestamp,则现有环境中的用户会在帐户没有 lastLoginTime 属性时自动锁定,并且 createTimestamp 比配置的不活跃周期旧。
      对于这种情况,请将 alternatives 属性设置为 1.1。这会明确地声明不使用任何属性作为替代方案。下一次登录时,将自动创建 lastLoginTime 属性。
    • 设置要使用的属性,以显示哪些条目应用了帐户策略(cctPolicySubentry)。
    • 在帐户策略中设置属性,它用于设置实际超时时间,以秒为单位(accountInactivityLimit)。
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy config-entry set "cn=config,cn=Account Policy Plugin,cn=plugins,cn=config" --always-record-login yes --state-attr lastLoginTime --alt-state-attr 1.1 --spec-attr acctPolicySubentry --limit-attr accountInactivityLimit
  4. 重启服务器以载入新插件配置:
    # dsctl instance_name restart
  5. 定义帐户策略:
    # ldapadd -a -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    
    dn: cn=Account Inactivation Policy,dc=example,dc=com
    
    objectClass: top
    objectClass: ldapsubentry
    objectClass: extensibleObject
    objectClass: accountpolicy
    accountInactivityLimit: 2592000
    cn: Account Inactivation Policy
  6. 创建服务模板条目的类:
    # ldapadd -a -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    
    dn: cn=TempltCoS,dc=example,dc=com
    
    objectClass: top
    objectClass: ldapsubentry
    objectClass: extensibleObject
    objectClass: cosTemplate
    acctPolicySubentry: cn=Account Inactivation Policy,dc=example,dc=com
    帐户策略可以直接在用户条目上定义,而不使用 CoS。但是,使用 CoS 允许为多个条目可靠地应用和更新帐户策略,并允许将多个策略应用到条目。
  7. 创建服务定义条目的类。CoS 的受管条目是帐户策略属性,acctPolicySubentry。这个示例将 CoS 应用到整个目录树:
    # ldapadd -a -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    
    dn: cn=DefnCoS,dc=example,dc=com
    
    objectClass: top
    objectClass: ldapsubentry
    objectclass: cosSuperDefinition
    objectclass: cosPointerDefinition
    cosTemplateDn: cn=TempltCoS,dc=example,dc=com
    cosAttribute: acctPolicySubentry default operational-default

20.10.3. 禁用帐户在密码过期后保留时间挂载

目录服务器允许您配置一个帐户策略,该策略在密码过期后禁用帐户一定时间。禁用帐户无法再登录。
要设置此配置,请按照 第 20.10.2 节 “帐户身份和帐户过期” 中的步骤操作。但是,在配置插件配置条目时,使用以下设置:
dn: cn=config,cn=Account Policy Plugin,cn=plugins,cn=config

objectClass: top
objectClass: extensibleObject
cn: config
alwaysrecordlogin: yes
stateAttrName: non_existent_attribute
altStateAttrName: passwordExpirationTime
specattrname: acctPolicySubentry
limitattrname: accountInactivityLimit
此配置在 stateAttrName 参数中使用 dummy 值。因此,只有 altStateAttrName 参数中设置的 passwordExpirationTime 属性才会用于计算帐户何时过期。
要额外记录用户条目的 lastLoginTime 属性中最后一次成功登录的时间,请设置:
dn: cn=config,cn=Account Policy Plugin,cn=plugins,cn=config

alwaysRecordLoginAttr: lastLoginTime
使用这个配置,如果用户的 passwordExpirationTime 属性和 accountInactivityLimit 参数的值中设定的时间总和,则会自动禁用帐户。使用这个配置,如果用户的 passwordExpirationTime 属性中的值和 accountInactivityLimit 参数中的值总和超过时间,则会自动禁用帐户,因为 alwaysRecordLoginAttr 属性上次更新。

20.10.4. 在不设置锁定策略的情况下跟踪登录时间

也可以使用帐户策略插件来跟踪用户登录时间,而无需 设置过期时间或不活跃的时间。在这种情况下,帐户策略插件用于将 lastLoginTime 属性添加到用户条目,但不需要设置其他策略规则。
在这种情况下,将帐户策略插件设置为正常,以跟踪登录时间。但是,不要创建 CoS 来处理正在跟踪的登录信息。
  1. 启用帐户策略插件:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy enable
  2. 创建插件配置条目以记录登录时间:
    • alwaysRecordLogin 值设置为 yes,以便每个条目都有登录时间记录。
    • lastLoginTime 属性设置为用于帐户策略的属性(stateattrname)。
    • 设置要使用的属性,以显示哪些条目应用了帐户策略(cctPolicySubentry)。
    • 在帐户策略中设置属性,用于设置实际的超时时间,以秒为单位(accountInactivityLimit)。
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy config-entry set "cn=config,cn=Account Policy Plugin,cn=plugins,cn=config" --always-record-login yes --state-attr lastLoginTime --alt-state-attr createTimestamp --spec-attr acctPolicySubentry --limit-attr accountInactivityLimit
  3. 重启服务器以载入新插件配置:
    # dsctl instance_name restart

20.10.5. 解锁不活动帐户

如果帐户因为达到不活跃限制而被锁定,您可以使用以下方法之一重新激活它:
  • 使用 dsidm 工具:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" account unlock "uid=example"
  • 通过将 lastLoginTime 属性重置为当前时间戳来手动:
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    
    dn: uid=example,ou=people,dc=example,dc=com
    changetype: modify
    replace: lastLoginTime
    lastLoginTime: 20210901000000Z
    lastLoginTime 属性将其值存储在 GMT/UTC 时间(Zulu 时区),由附加的 Z 指示到时间戳。

20.11. 复制帐户锁定属性

如果登录尝试失败了一定次数,则帐户锁定策略将阻止用户 ID 访问目录服务器。这可防止黑客或其他恶意人员通过猜测密码来静默访问目录服务器。密码策略在本地设置,通常帐户锁定属性是每个副本的本地。这意味着,人可以尝试登录一个副本,直到达到帐户锁定计数前,然后再次尝试另一个副本。防止复制与条目帐户锁定计数相关的属性,以便在单一供应商上尝试登录失败时,恶意用户会被锁定到配置中的每个供应商和消费者副本。
默认情况下,不会复制三个密码策略属性,即使其他密码策略属性也是如此。这些属性与登录失败和锁定周期相关:
  • passwordRetryCount
  • retryCountResetTime
  • accountUnlockTime

20.11.1. 管理帐户锁定和复制

在复制环境中强制执行密码和帐户锁定策略稍有不同:
  • 在数据供应商上强制执行密码策略。
  • 在参与复制的所有服务器上强制使用帐户锁定。
目录中的一些密码策略信息会自动复制:
  • passwordMinAge and passwordMaxAge
  • passwordExp
  • passwordWarning
但是,配置信息保存在本地,且不复制。此信息包括密码语法以及密码修改的历史记录。除非为复制进行了特别配置的,否则不会复制帐户锁定计数器和层。
在复制环境中配置密码策略时,请确保这些元素已就位,因此密码策略和帐户锁定设置会一致强制执行:
  • 所有副本都会发出来自即将等待密码过期的服务器的警告。此信息保留在每台服务器上,因此如果用户依次绑定到多个副本,则多次会发出相同的警告。另外,如果用户更改密码,则可能需要时间来将此信息过滤到副本。如果用户更改密码,然后立即重新绑定,则可能会发现绑定失败,直到副本注册更改为止。
  • 所有服务器上应该执行相同的绑定行为,包括供应商和副本。确保在每个服务器上创建相同的密码策略配置信息。
  • 帐户锁定计数器在多层次环境中可能无法按预期工作。默认情况下,帐户锁定计数器不会被复制(尽管可以进行配置)。如果帐户锁定属性没有复制,则用户可以从一个服务器锁定,但可以成功绑定到另一台服务器(或者,用户可能被解锁在一个服务器上,仍然阻止在另一台服务器上)。如果复制了帐户锁定属性,那么在一个服务器上的帐户锁定变化以及该更改被传播到其他服务器时,可能会滞后。它取决于复制计划。
  • 为复制创建的条目(例如,服务器身份)需要有永不过期的密码。要确保这些特殊用户有没有过期的密码,请在条目中添加 passwordExpirationTime 属性,并为它赋予 20380119031407Z (有效范围的顶部)。
注意
如果启用了密码策略,并且 alwaysRecordLogin 参数设置为 yes,则 lastLoginTime 属性的值可以在供应商和只读副本上有所不同。例如,如果用户登录到只读副本,则 lastLoginTime 属性会在本地更新,但该值不会复制到供应商服务器。

20.11.2. 配置目录服务器以复制密码策略属性

特殊的核心配置属性,用于控制是否复制密码策略操作属性。这是 passwordIsGlobalPolicy 属性,它在消费者目录服务器配置中启用,以允许使用者接受密码策略操作属性。
默认情况下,此属性设为 off
要启用复制这些属性,请更改消费者上的 passwordIsGlobalPolicy 配置参数:
# dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy set --pwdisglobal="on"
将该值更改为 on 允许复制 passwordRetryCountretryCountResetTimeaccountUnlockTime

20.11.3. 为密码策略属性配置同步复制

设置 passwordIsGlobalPolicy 属性会影响复制中的消费者,从而使使用者能够接收这些属性的更新。要控制密码策略属性是否实际由供应商复制,请使用部分复制,用于控制复制哪些特定条目属性。
如果复制密码策略属性,请确保这些属性包含在部分复制协议中(与默认情况下相同)。
如果在消费者上将 passwordIsGlobalPolicy 属性设置为 off,则不应复制密码策略属性,请使用部分复制(在 第 15.1.7 节 “使用 DNATactional Replication 复制子属性集”中相同)强制该属性在供应商中,并在复制协议中特别排除这些属性。
有关配置复制的详情,请参考:
当您在上面链接的步骤中创建复制协议时,请配置部分复制:
  1. 在供应商上配置复制协议时,请单击 Show Advanced Settings
  2. Exclude Attributes 字段中输入 passwordRetryCountretryCountResetTime,以及 accountUnlockTime 属性名称。
  3. 完成配置复制协议。

20.12. 启用不同类型的绑定

每当实体登录或访问目录服务器时,它将 绑定到 目录。有很多不同类型的绑定操作,有时根据绑定方法(如简单绑定或自动绑定)以及一些根据用户绑定的身份绑定到该目录(匿名和未经身份验证的绑定)。
以下小节包含可提高绑定安全性(如 第 20.12.1 节 “需要安全绑定”)或简化绑定操作(如 第 20.12.4 节 “配置自动绑定”)的配置参数。

20.12.1. 需要安全绑定

一个简单的绑定是使用简单的绑定 DN 密码组合与目录服务器进行身份验证时。虽然可以使用密码文件而不是直接通过命令行发送密码,但这两种方法仍需要通过线发送或访问纯文本密码。这使得密码容易受到破坏连接的任何人。
可能需要简单的绑定通过安全连接(TLS 或 STARTTLS)进行,这样可有效地加密明文密码,因为它使用 bind 操作发送。(也可以使用替代方案来简单绑定,如 SASL 身份验证和基于证书的身份验证。)
重要
除了常规用户登录到服务器和 LDAP 操作外,服务器到服务器的连接也会受到简单绑定的安全连接的影响。复制、同步和数据库链都可以在服务器之间使用简单的绑定,例如:
如果启用了 nsslapd-require-secure-binds 属性,请确保复制协议、同步协议和串联配置指定安全连接。否则,这些操作将失败。
注意
对绑定操作需要安全连接只适用于 经过身份验证的绑定。没有密码(匿名和未经身份验证的绑定)的绑定操作可以通过标准连接进行。
  1. nsslapd-require-secure-binds 配置参数设置为 on
    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-require-secure-binds=on
  2. 重启实例:
    # dsctl instance_name restart

20.12.2. 禁用匿名绑定

如果用户试图在不提供任何用户名或密码的情况下连接到目录服务器,则这是一个 匿名绑定。匿名绑定简化了常见的搜索和读取操作,如检查目录或电子邮件地址,而无需用户首先向目录进行身份验证。
注意
默认情况下,允许匿名绑定(on)用于搜索和读取操作。这允许访问 常规目录条目,其中包括用户和组条目,以及根 DSE 等配置条目。另一个选项 rootdse 允许匿名搜索和读取访问搜索根 DSE 本身,但限制对所有其他目录条目的访问。
但是,匿名绑定存在风险。必须就位适当的 ACI,才能限制对敏感信息的访问,并禁止修改和删除等操作。此外,匿名绑定可用于拒绝服务攻击或恶意人员访问服务器。
第 18.11.1.1.3 节 “授予匿名访问权限” 包括一个设置 ACI 的示例,以控制匿名用户可以访问哪些,第 14.5.4 节 “在匿名绑定上设置资源限值” 包含有关为匿名用户放置资源限值的信息。
如果这些选项不提供足够级别的安全性,则可以完全禁用匿名绑定:
  1. nsslapd-allow-anonymous-access 配置参数设为 off
    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-allow-anonymous-access=off
  2. 重启实例:
    # dsctl instance_name restart
注意
禁用匿名绑定后,用户无法使用其 RDN 登录。需要提供完整的 DN 才能登录。
另外,当禁用匿名绑定时,会自动禁用未经身份验证的绑定。

20.12.3. 允许未验证的绑定

未经身份验证的绑定是到目录服务器的连接,用户提供了一个空密码。使用默认设置,目录服务器在这种情况下拒绝访问:
# ldapsearch -w "" -p 389 -h server.example.com -b "dc=example,dc=com" \
     -s sub -x "(objectclass=*)"

ldap_bind: Server is unwilling to perform (53)
	additional info: Unauthenticated binds are not allowed
警告
红帽建议不要启用未经身份验证的绑定。此验证方法允许用户在不提供密码作为任何帐户(包括目录管理器)的情况下绑定。绑定后,用户可以使用用于绑定的帐户的权限访问所有数据。
要启用不安全的未经身份验证的绑定,请在 上将 nsslapd-allow-unauthenticated-binds 配置选项设置为:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-allow-unauthenticated-binds=on

20.12.4. 配置自动绑定

Autobind 是一种根据本地 UNIX 凭证连接到目录服务器的方法,该凭据映射到目录本身中存储的身份。Autobind 在两个部分进行配置:
在配置自动绑定前,请先确保启用了 LDAPI。然后,配置自动绑定映射(在 第 20.12.4.2 节 “配置 自动绑定 功能”中)。

20.12.4.1. Autobind 和 LDAPI 概述

进程间通信(IPC)是一种在 Unix 机器上或网络上分隔进程的方法,以直接相互通信。LDAPI 是通过这些 IPC 连接运行 LDAP 连接的方法,这意味着 LDAP 操作可以通过 Unix 套接字运行。这些连接比常规 LDAP 连接更快、更安全。
目录服务器使用这些 LDAPI 连接来允许用户立即绑定到目录服务器,或使用支持 Unix 套接字连接的工具访问目录服务器。Autobind 使用 Unix 用户的 uid:gid,并将该用户映射到目录服务器中的条目,然后允许访问该用户。
Autobind 允许映射到三个目录条目:
  • 用户条目,如果 Unix 用户与一个用户条目匹配
  • 如果 Unix 用户是 root 用户,或者 nsslapd-ldapimaprootdn中定义的超级用户,则目录管理器

图 20.1. 自动绑定连接路径

自动绑定连接路径
特殊的自动绑定用户是在特殊的自动绑定后缀下的条目(在常规用户子树之外)。下的条目通过其用户和组 ID 号来标识:
gidNumber=gid+uidNumberuid, autobindsuffix
如果没有启用 autobind,但 LDAPI 是匿名绑定到目录服务器的 Unix 用户,除非它们提供了其他绑定凭证。
注意
Autobind 允许客户端在不提供绑定用户名和密码或使用其他 SASL 身份验证机制的情况下向目录服务器发送请求。根据 LDAP 标准,如果没有向请求提供绑定信息,服务器会将请求作为匿名绑定进行处理。要符合标准,这需要某种类型的绑定信息,任何使用自动绑定的客户端都应向请求发送 SASL/EXTERNAL。
有关配置 SASL 的详情,请参考 第 9.10 节 “设置 SASL 身份映射”

20.12.4.2. 配置 自动绑定 功能

启用 Autobind 功能只允许对目录服务器的匿名访问。但是,您可以将 Linux 用户映射到目录服务器条目,并将 root 用户映射到 Directory Manager:
  1. 验证 nsslapd-ldapiautobind 参数是否已启用,这是默认设置:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com config get nsslapd-ldapiautobind
    nsslapd-ldapiautobind: on
  2. 如果将 nsslapd-ldapiautobind 参数设置为 off,请启用它:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-ldapiautobind=on
  3. 要映射用户条目,请设置:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-ldapimaptoentries=on nsslapd-ldapiuidnumbertype=uidNumber nsslapd-ldapigidnumbertype=gidNumber nsslapd-ldapientrysearchbase=ou=People,dc=example,dc=com
    • nsslapd-ldapimaptoentries=on 启用条目映射。
    • nsslapd-ldapiuidnumbertype=uidNumber 设置包含 Unix UID 号的目录服务器中的属性。
    • nsslapd-ldapigidnumbertype=gidNumber 设置包含 Unix GID 号的目录服务器中的属性。
    • nsslapd-ldapientrysearchbase=ou=People,dc=example,dc=com 设置搜索用户条目的 DN。
  4. (可选)要将 Red Hat Enterprise Linux 中的 root 用户映射到 Directory Server 中的 cn=Directory Manager 帐户:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-ldapimaprootdn="cn=Directory Manager"
  5. 重启实例:
    # dsctl instance_name restart

20.13. 使用透传身份验证

直通身份验证(PTA)是一种机制,它允许一个 Red Hat Directory Server 实例参考另一个机制来验证绑定请求。直通身份验证是通过 PTA 插件实现的;启用后,插件可让目录服务器实例接受简单的绑定操作(基于密码)用于不存储在本地数据库中的条目。
目录服务器使用 PTA 管理目录服务器独立实例上的用户和配置目录。
第一个实例充当 PTA 目录服务器,该服务器是通过绑定到另一个目录服务器的服务器。第二个实例充当身份验证目录,这是包含该条目的服务器,并验证请求客户端的绑定凭据。
直通子树 是 PTA 目录中 不存在 的子树。当用户的绑定 DN 包含此子树时,用户的凭据将传递给身份验证目录。

图 20.2. 简单传递身份验证过程

简单传递身份验证过程
以下是通过身份验证的工作方式:
  1. 配置目录服务器(身份验证目录)安装在机器 A 上。配置目录始终包含带有身份验证用户条目的后缀,如 o=114。在本例中,服务器名称为 authdir.example.com
  2. 然后,在机器 B 上安装用户目录服务器(PTA 目录)。用户目录存储 root 后缀,如 dc=example,dc=com。在本例中,服务器名称为 userdir.example.com
  3. 使用以下命令在 userdir.example.com 上设置插件:
    # dsconf -D "cn=Directory Manager" ldap://userdir.example.com plugin pass-through-auth enable
    # dsconf -D "cn=Directory Manager" ldap://userdir.example.com plugin pass-through-auth url add "ldap://authdir.example.com/o=RedHat"
  4. userdir.example.com 上重新启动目录服务器。
  5. 用户主目录现在被配置为,向配置目录 authdir.example.com 发送带有包括 o=RedHat 的 DN 的所有绑定请求。
  6. 用户目录允许 o=rhcs 中的任何用户 绑定。

20.13.1. PTA 插件语法

PTA 插件配置信息在 PTA 目录中的 cn=Pass Through Authentication,cn=plugins,cn=config 条目中指定(配置为通过绑定请求传递给身份验证目录)使用所需的 PTA 语法。
使用以下命令来管理直通身份验证 URL:
  • 添加直通身份验证 URL:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin pass-through-auth url add URL
  • 修改直通身份验证 URL:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin pass-through-auth url modify old_URL new_URL
  • 删除直通身份验证 URL:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin pass-through-auth url delete URL
PTA 插件语法的变量组件在 表 20.3 “PTA 插件参数” 中进行了描述。
注意
LDAP URL (ldap|ldaps://authDS/subtree)必须独立于可选参数(maxconns, maxops, timeout, ldver, connlifetime, startTLS)。如果定义了任何可选参数,则必须定义所有这些参数,即使只使用默认值。
可以通过每次递增 nsslapd-pluginarg 属性后缀来指定几个验证目录或子树,如 第 20.13.3.2 节 “指定多个验证目录服务器” 所述。例如:
nsslapd-pluginarg0: LDAP URL for the first server
nsslapd-pluginarg1: LDAP URL for the second server
nsslapd-pluginarg2: LDAP URL for the third server
...
可选参数按照语法中显示的顺序在下表中描述。

表 20.3. PTA 插件参数

变量 定义
state 定义插件是否启用或禁用。可接受值为 onoff
ldap|ldaps 定义 TLS 是否用于两个目录服务器之间的通信。请参阅 第 20.13.2.1 节 “配置服务器以使用安全连接” 了解更多信息。
authDS 身份验证目录主机名。通过添加冒号,然后添加端口号,可以给定目录服务器的端口号。例如: ldap://dirserver.example.com:389/。如果没有指定端口号,PTA 服务器会尝试使用其中一个标准端口进行连接:
如果在 URL 中指定 ldap://,端口 389。
如果在 URL 中指定 ldaps://,则端口 636。
请参阅 第 20.13.2.2 节 “指定 Authenticating 目录服务器” 了解更多信息。
子树 直通子树。PTA 目录服务器从 DN 位于此子树中的所有客户端通过绑定请求传递给身份验证目录服务器。请参阅 第 20.13.2.3 节 “指定 Pass-Through Subtree” 了解更多信息。此服务器上不能存在此子树。
maxconns 可选。PTA 目录可以同时打开到身份验证目录的最大连接数。默认值为 3。请参阅 第 20.13.2.4 节 “配置可选参数” 了解更多信息。
maxops 可选。PTA 目录可以同时同时操作的最大数量(通常是绑定请求)可以发送到单一连接中的身份验证目录。默认值为 5。请参阅 第 20.13.2.4 节 “配置可选参数” 了解更多信息。
timeout 可选。PTA 目录从身份验证目录服务器等待响应的时间限制(以秒为单位)。如果超过这个超时,服务器会向客户端返回错误。默认值为 300 秒(5 分钟)。指定零(0)以指示不应强制实施时间限制。请参阅 第 20.13.2.4 节 “配置可选参数” 了解更多信息。
ldver 可选。用于连接到身份验证目录的 LDAP 协议版本。目录服务器支持 LDAP 版本 2 和 3。默认为版本 3,红帽强烈建议不要使用 LDAPv2,因为它是非常旧且已被弃用的技术。请参阅 第 20.13.2.4 节 “配置可选参数” 了解更多信息。
connlifetime 可选。可以使用连接的时间限制(以秒为单位)。如果在这段时间到期后客户端启动绑定请求,服务器将关闭连接并打开与身份验证目录的新连接。除非启动了绑定请求,否则服务器不会关闭连接,并且目录决定超过连接生命周期。如果没有指定这个选项,或者只列出一个主机,则不会强制执行连接生命周期。如果列出了两个或多个主机,则默认为 300 秒(5 分钟)。请参阅 第 20.13.2.4 节 “配置可选参数” 了解更多信息。
startTLS
可选。使用 STARTTLS 进行与身份验证目录的连接的标记。STARTTLS 通过标准端口建立安全连接,因此使用 LDAP 而不是 LDAPS 连接非常有用。TLS 服务器和 CA 证书都需要在两个服务器上可用。
默认值为 0, 即关闭。要启用 STARTTLS,请将其设置为 1。要使用 STARTTLS,LDAP URL 必须使用 ldap:,而不是 ldaps:
请参阅 第 20.13.2.4 节 “配置可选参数” 了解更多信息。

20.13.2. 配置 PTA 插件

修改 PTA 配置:
  1. 使用 dsconf 插件 pass-through-auth 命令修改 cn=Pass Through Authentication,cn=plugins,cn=config 条目。
  2. 重启目录服务器。
在配置任何 PTA 插件参数前,Directory 服务器中必须存在 PTA 插件条目。如果这个条目不存在,请使用适当的语法创建它,如 第 20.13.1 节 “PTA 插件语法” 所述。
注意
如果在目录的不同实例上安装了用户和配置目录,则 PTA 插件条目会自动添加到用户目录的配置中。
本节提供有关在以下部分中配置插件的信息:

20.13.2.1. 配置服务器以使用安全连接

PTA 目录可以配置为通过在 PTA 目录的 LDAP URL 中指定 LDAPS,通过 TLS 与身份验证目录通信。例如:
nsslapd-pluginarg0: ldaps://ldap.example.com:636/o=example

20.13.2.2. 指定 Authenticating 目录服务器

身份验证目录包含客户端试图绑定的条目的绑定凭证。PTA 目录将绑定请求传递给主机,定义为身份验证目录。要指定身份验证目录服务器,请将 PTA 目录的 LDAP URL 中的 authDS 替换为验证目录的主机名,如 表 20.3 “PTA 插件参数” 所述。
  1. 使用 dsconf 插件 pass-through-auth 命令编辑 PTA 插件条目:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin pass-through-auth add ldap://server.example.com/o=example
    (可选)包含端口号。如果没有提供端口号,PTA Directory 服务器会尝试对 ldap:// 使用标准端口(389)或 ldaps:// 的安全端口(636)进行连接。
    如果 PTA 目录服务器和身份验证目录服务器之间的连接中断或者无法打开连接,则 PTA 目录服务器会将请求发送到指定的下一个服务器(若有)。根据需要,可以指定多个目录服务器,以便在第一个目录服务器不可用时提供故障转移。所有身份验证目录服务器都在 nsslapd-pluginarg0 属性中设置。
    多个身份验证目录服务器以空格分隔的 host:port 对列表中列出,其格式如下:
    ldap|ldaps://host1:port1 host2:port2/subtree
  2. 重新启动服务器。
    # dsctl instance_name restart

20.13.2.3. 指定 Pass-Through Subtree

PTA 目录通过绑定请求从直通子树中定义的所有客户端传递给身份验证目录。子树通过替换 PTA 目录的 LDAP URL 中的 subtree 参数来指定。
PTA 目录中不能存在直通子树。如果这样做,PTA 目录会尝试使用自己的目录的内容解析绑定请求,绑定会失败。
  1. 使用 dsconf 插件 pass-through-auth 命令将 LDIF 文件导入到目录中:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin pass-through-auth add ldap://server.example.com/o=example
    有关此语法中的变量组件的详情,请参考 表 20.3 “PTA 插件参数”
  2. 重启服务器:
    # dsctl instance_name restart

20.13.2.4. 配置可选参数

可使用 LDAP URL 设置 PTA 连接的额外参数。
ldap|ldaps://authDS/subtree maxconns, maxops, timeout, ldver, connlifetime, startTLS
  • PTA 目录服务器可以同时打开到身份验证目录的最大连接数,由 PTA 语法中的 maxconns 表示。默认值为 3
  • PTA 目录服务器可同时向单个连接中的身份验证目录服务器发送的最大绑定请求数量。在 PTA 语法中,此参数是 maxops。默认值为 5
  • PTA 目录服务器的时间限制,以等待来自身份验证目录服务器的响应。在 PTA 语法中,这个参数是 超时。默认值为 300 秒(5 分钟)。
  • 用于连接到身份验证目录服务器的 PTA 目录服务器的 LDAP 协议版本。在 PTA 语法中,此参数是 ldver。默认值为 LDAPv3
  • 可以使用连接的时间限制(以秒为单位)。如果在这段时间到期后客户端启动绑定请求,服务器将关闭连接并打开与身份验证目录服务器的新连接。除非启动了绑定请求,服务器不会关闭连接,并且服务器确定已超过超时。如果没有指定这个选项,或者在 authDS 参数中只列出一个身份验证目录服务器,则不会强制执行时间限制。如果列出了两个或多个主机,则默认为 300 秒(5 分钟)。在 PTA 语法中,这个参数是 connlifetime
  • 是否将 STARTTLS 用于连接。STARTTLS 通过标准 LDAP 端口创建一个安全连接。对于 STARTTLS,服务器必须安装有服务器和 CA 证书,但它们不需要在 TLS 中运行。
    默认值为 0, 即 STARTTLS 为 off。要启用 STARTTLS,请将其设置为 1。要使用 STARTTLS,LDAP URL 必须使用 ldap:,而不是 ldaps:
  1. 使用 dsconf 插件 pass-through-auth 命令编辑插件条目:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin pass-through-auth add ldap://server.example.com/o=example 3,5,300,3,300,0
    (在这个示例中,每个可选参数都被设置为默认值。) 确保 subtree 参数和可选参数之间有一个空格。
    注意
    虽然这些参数是可选的,但如果定义了其中任何一个参数,但也必须定义它们,即使它们使用了默认值。
  2. 重启服务器:
    # dsctl instance_name restart

20.13.3. PTA 插件语法示例

本节包含在 dse.ldif 文件中 PTA 插件语法示例:

20.13.3.1. 指定一个 Authenticating Directory 服务器和一个 Subtree

这个示例将 PTA 插件配置为接受可选变量的所有默认值。此配置会导致 PTA 目录服务器连接到身份验证目录服务器,以获取到 o=example 子树的所有绑定请求。身份验证目录服务器的主机名是 configdir.example.com
dn: cn=Pass Through Authentication,cn=plugins,cn=config
...
nsslapd-pluginEnabled: on
nsslapd-pluginarg0: ldap://configdir.example.com/o=example
...

20.13.3.2. 指定多个验证目录服务器

如果 PTA 目录服务器和身份验证目录服务器之间的连接中断或者无法打开连接,则 PTA 目录服务器会将请求发送到指定的下一个服务器(若有)。根据需要,可以指定多个目录服务器,以便在第一个目录服务器不可用时提供故障转移。所有身份验证目录服务器都在 nsslapd-pluginarg0 属性中设置。多个身份验证目录服务器列在 host:port 对列表中。例如:
dn: cn=Pass Through Authentication,cn=plugins,cn=config
...	
nsslapd-pluginEnabled: on
nsslapd-pluginarg0: ldap://configdir.example.com:389 config2dir.example.com:1389/o=example
...
注意
nsslapd-pluginarg0 属性设置身份验证目录服务器;额外的 nsslapd-pluginargN 属性可以为 PTA 插件设置额外的 后缀,但不设置额外的 主机

20.13.3.3. 指定一个目录服务器和多个子树

以下示例将 PTA 目录服务器配置为传递多个子树的绑定请求(使用参数默认值):
dn: cn=Pass Through Authentication,cn=plugins,cn=config
...	
nsslapd-pluginEnabled: on
nsslapd-pluginarg0: ldap://configdir.example.com/o=example
nsslapd-pluginarg1: ldap://configdir.example.com/dc=example,dc=com
...

20.13.3.4. 使用非默认值参数值

这个示例仅将非默认值(10)用于最大连接参数 maxconns 数。其他参数都被设置为默认值。但是,由于指定了一个参数,因此所有参数都必须明确定义语法。
dn: cn=Pass Through Authentication,cn=plugins,cn=config
...	
nsslapd-pluginEnabled: on
nsslapd-pluginarg0: ldap://configdir.example.com/o=example 10,5,300,3,300,1
...

20.13.3.5. 为不同的目录服务器指定不同的可选参数和子树

要为每个身份验证目录服务器指定不同的直通子树和可选参数值,请设置多个 LDAP URL/可选参数对。将 LDAP URL/可选参数对与单个空格分开,如下所示:
dn: cn=Pass Through Authentication,cn=plugins,cn=config
...
nsslapd-pluginEnabled: on
nsslapd-pluginarg0:ldap://configdir.example.com/o=example 10,15,30,3,600,0
nsslapd-pluginarg1:ldap://config2dir.example.com/dc=example,dc=com 7,7,300,3,300,1
...

20.14. 使用 Active Directory 格式的用户名进行身份验证

当您连接到目录服务器时,您必须指定用户的可分辨名称(DN),如 uid=user_name,ou=People,dc=example,dc=com 进行验证。但是 DN 可能会难以记住。如果启用并配置 AD DN 插件,您可以使用 Active Directory 格式的用户名,如 user_nameuser_name@,而不是 DN。
启用插件和用户使用不是 DN 格式的用户名连接到目录后,目录服务器会根据插件的配置搜索 DN。如果搜索返回一个 DN,Directory 服务器会使用此 DN 进行身份验证。如果返回任何或多个 DN,身份验证会失败。
注意
您只能使用命令行启用和配置 AD DN 插件。
要启用并配置插件,使其使用 example.com 作为默认域:
  1. 添加 cn=addn,cn=plugins,cn=config 插件条目并设置默认域:
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    dn: cn=addn,cn=plugins,cn=config
    changetype: add
    objectClass: top
    objectClass: nsSlapdPlugin
    objectClass: extensibleObject
    cn: addn
    nsslapd-pluginPath: libaddn-plugin
    nsslapd-pluginInitfunc: addn_init
    nsslapd-pluginType: preoperation
    nsslapd-pluginEnabled: on
    nsslapd-pluginId: addn
    nsslapd-pluginVendor: 389 Project
    nsslapd-pluginVersion: 1.3.6.0
    nsslapd-pluginDescription: Allow AD DN style bind names to LDAP
    addn_default_domain: example.com
    插件条目中所需的 addn_default_domain 参数会设置默认域。如果在身份验证过程中指定的用户名不包含域名,则插件会附加此域。
  2. 为默认域添加配置条目:
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    dn: cn=example.com,cn=addn,cn=plugins,cn=config
    changetype: add
    objectClass: top
    objectClass: extensibleObject
    cn: example.com
    addn_base: ou=People,dc=example,dc=com
    addn_filter: (&(objectClass=account)(uid=%s))
    有关示例中使用的参数的详情,请查看 红帽目录服务器配置、命令和文件参考 中的描述。
    警告
    必须至少为默认域添加配置条目。如果缺少该条目,Directory 服务器将无法启动。
  3. 另外,您还可以按照上一步所述创建额外的域配置来支持多个域名。每个域配置都可以使用不同的搜索基础和过滤器。
  4. 重启 Directory 服务器实例:
    # dsctl instance_name restart

20.15. 使用 PAM 进行传递身份验证

对于 Unix 和 Linux 用户,很多系统已经有身份验证机制。最常见的身份验证框架之一是 可插拔验证模块 (PAM)。由于许多网络已有可用的身份验证服务,管理员可能希望继续使用这些服务。可将 PAM 模块配置为告知目录服务器为 LDAP 客户端使用现有的身份验证存储。
PAM 在红帽目录服务器中通过身份验证使用 PAM Pass Through Auth 插件,这使得 Directory 服务器能够使 PAM 服务能够验证 LDAP 客户端。

图 20.3. PAM 传递身份验证过程

PAM 传递身份验证过程
注意
在验证用户时,PAM 通过身份验证与帐户一同工作,假设使用了适当的映射方法(ENTRY)。但是,PAM 通过身份验证不会针对全局或本地设置的密码策略验证密码,因为密码已设置并存储在 PAM 模块中,而不是存储在 Directory 服务器中。

20.15.1. PAM 直通身份验证配置选项

PAM 通过身份验证在 PAM Pass Through Auth 插件容器条目下的子条目中配置。可以有多个 PAM 通过身份验证策略,应用到不同的后缀或后缀中的不同条目。
为 PAM 可以配置几个不同的区域:
  • 由 PAM Pass Through Auth 插件控制的后缀。这涵盖了要排除的后缀,包括后缀以及如何处理缺少的后缀。
  • 配置的后缀中的单个条目,它们是身份验证配置的目标。默认情况下,后缀中的所有条目都包含在身份验证范围内,但可以配置多个不同的 PAM Through Auth 插件实例,然后将不同的插件配置应用到不同的用户。
  • PAM 属性映射。提供给目录服务器的凭据必须以某种方式映射到 LDAP 条目,然后返回到 PAM 服务中的凭据。这可以通过定义映射方法,然后(可选)用来匹配凭据的 LDAP 属性来完成。
  • 常规配置,如使用 TLS 连接、PAM 服务使用,以及是否回退到 LDAP 身份验证(如果 PAM 身份验证失败)。
注意
PAM Pass Through Auth 插件可以有多个配置实例。PAM Pass Through Auth 插件的实例可以通过使用 pamFilter 属性设置 LDAP 过滤器来搜索要用于插件的特定条目的子集。
有关您可以设置的属性列表,请参阅 Red Hat Directory Server Configuration, Command, and File Reference 中的 PAM Pass Through Auth Plug-in Attributes 部分。

20.15.1.1. 为 PAM PTA 指定目标的后缀

PAM PTA 插件默认对所有后缀应用,除非被明确排除。排除和包括后缀可以帮助对目录中的哪些区域使用 PAM 身份验证而不是 LDAP 身份验证的目标。
注意
PAM Pass Through authentication 条目的目标必须是后缀,而不是任意子树。如 第 2.1 节 “创建和维护后缀” 所述,后缀是与特定后端数据库关联的子树,如 cn=config,它与 root 后缀 dc=example,dc=com 关联,它与 用户Root 关联。
pamExcludeSuffix 属性排除一个后缀。默认情况下,只有配置子树(cn=config)会被排除。或者,PAM PTA 插件可以应用到带有 pamIncludeSuffix 属性的后缀。这两个属性都是多值。
如果设置了 include 属性,例如,则会自动排除所有其他后缀。同样,如果设置了 exclude 属性,则会自动包含所有其他后缀。
pamExcludeSuffix: cn=config
使用 pamIncludeSuffix 时,仅包含给定的后缀,所有其他后缀都会被自动排除。由于此属性是多值的,因此可以通过明确列出后缀,将多个后缀包含在 PAM 评估中。
pamIncludeSuffix: ou=Engineering,dc=example,dc=com
pamIncludeSuffix: ou=QE,dc=example,dc=com
pamMissingSuffix 属性告知服务器在指定的后缀(包括或排除)不存在时如何处理失败。如果设置为 IGNORE,如果没有后缀,则插件仅跳过该后缀并尝试下一个后缀。
pamMissingSuffix: IGNORE
pamIncludeSuffix: ou=Engineering,dc=example,dc=com
pamIncludeSuffix: ou=Not Real,dc=example,dc=com

20.15.1.2. 将不同的 PAM 直通身份验证配置应用到不同的条目

默认情况下,PAM 通过身份验证策略应用到指定的后缀中的所有条目。但是,可以在 pamFilter 属性中指定 LDAP 过滤器,该过滤器标识要通过身份验证策略应用到的后缀中的特定条目。
这可用于使用多个 PAM 通过身份验证策略应用不同的 PAM 配置或将方法映射到不同的用户类型。

20.15.1.3. 设置 PAM PTA 映射

必须有一种将 LDAP 身份连接到 PAM 身份的方法。定义的第一个操作是用来映射条目 的方法。有三个选项: DN、RDN 和 ENTRY。ENTRY 使用条目中的用户定义的属性。
可以在排序的、以空格分隔的列表形式提供多个映射方法。该插件会尝试按列出的顺序使用每个映射方法,直到身份验证成功或直至其到达列表的末尾。
例如,此映射方法首先根据列出方法的顺序映射 RDN 方法,然后是 ENTRY,然后按照列出方法的顺序进行映射:
pamIDMapMethod: RDN ENTRY DN
表 20.4 “PAM 身份验证的映射方法” 中列出了不同的映射方法。
注意
激活中的目录服务器用户帐户仅使用 ENTRY 映射方法进行验证。使用 RDN 或 DN 时,其帐户处于激活的目录服务器用户仍然可以成功绑定到服务器。

表 20.4. PAM 身份验证的映射方法

映射 描述
RDN 此方法使用绑定 DN 中最接近 RDN 的值。这个方法的映射是由目录服务器定义的。如果没有给出,这是默认映射方法。
ENTRY 此方法从绑定 DN 条目中的用户定义的属性拉取 PAM 身份的值。identity 属性在 pamIDAttr 属性中定义。例如: pamIDAttr: customPamUid
DN 此方法使用与绑定 DN 的完整可分辨名称。这个方法的映射是由目录服务器定义的。

20.15.1.4. 配置常规 PAM PTA 设置

可以为 PAM 身份验证设置三个常规配置设置:
  • 要发送到 PAM 的服务名称(pamService);这是要在 /etc/pam.d中使用的配置文件的名称
  • 是否需要安全连接(pamSecure)
  • 如果 PAM 身份验证失败,是否回退到 LDAP 身份验证(pamFallback)
pamFallback: false
pamSecure: false
pamService: ldapserver

20.15.2. 配置 PAM 透传身份验证

注意
对于可插拔验证模块(PAM)直通身份验证,可能存在多个配置实例。PAM Pass Through Authentication 的实例可以通过使用 pamFilter 属性设置 LDAP 过滤器来搜索要与插件搭配使用的特定条目。
PAM 直通身份验证通过命令行进行配置。
  1. 确保 PAM 服务已被完全配置。
  2. 从 PAM 配置文件中删除 pam_fprintd.so 模块。
    重要
    pam_fprintd.so 模块不能位于 PAM Pass Through Auth 插件配置的 pamService 属性引用的配置文件中。使用 PAM fprintd 模块会导致 Directory 服务器达到最大文件描述符限制,并可能导致 Directory 服务器进程中止。
  3. 启用 PAM Pass Through Auth 插件:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin set "PAM Pass Through Auth" --enabled on
  4. 创建 PAM Pass Through Auth 配置条目:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin pass-through-auth pam-config "Admin PAM PTA Config" add --exclude-suffix="cn=config" --id_map_method="RDN ENTRY" --id-attr="customPamUid" --filter="(manager=uid=example_user,ou=people,dc=example,dc=com pamFallback: FALSE" --secure="TRUE" --service="ldapserver"
  5. 重启实例:
    # dsctl instance_name restart

20.15.3. 在 Active Directory 中使用 PAM 传递身份验证作为后端

PAM 传递身份验证将凭据从目录服务器转发到 PAM 服务。一个选项是为目录服务器设置和配置 PAM 模块。另一个选项 - 和在某些基础架构中可能更容易地重复使用和更方便的选项 - 方法是使用系统安全服务守护进程(SSSD)来配置 PAM。由于 SSSD 可以使用各种不同的身份存储,所以可使用许多不同的服务器或服务来提供凭证,包括 Active Directory。
通过 SSSD 使用通过身份验证进行传递是一类服务链。PAM PTA 插件配置为正常。它指向要使用的给定 PAM 服务文件。此服务文件由 SSSD 管理,SSSD 被配置为与需要的任何身份提供程序连接,甚至多个供应商。

图 20.4. 使用 SSSD 进行 PAM 传递身份验证

使用 SSSD 进行 PAM 传递身份验证
使用 Active Directory 配置 PAM 传递身份验证:
  1. 将 SSSD 配置为使用 Active Directory 服务器作为其身份提供程序之一。
    此配置包括在 RHEL 系统直接与 Windows Active Directory 集成中的使用 SSSD 将 RHEL 系统直接连接到 AD 部分。
  2. 启用 PAM Pass Through Auth 插件,如下所示:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin set "PAM Pass Through Auth" --enabled on
  3. 创建 PAM Pass Through Auth 配置条目,如下所示:
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin pass-through-auth pam-config "AD PAM PTA Config" add --id_map_method="ENTRY" --id-attr="uid" --service="login" --include-suffix="ou=people,dc=example,dc=com" --missing-suffix="ERROR"
    这个示例使用 uid LDAP 属性作为用户名传递给 Active Directory,并只为人 OU 启用此配置。
  4. 重新启动目录服务器实例,以加载配置。
    # dsctl instance_name restart

20.16. 手动取消激活用户和角色

在激活时,单个用户帐户或一组帐户可以临时激活。帐户处于激活状态后,用户无法绑定到该目录。身份验证操作将失败。
使用操作属性 nsAccountLock 来激活用户和角色。当条目包含值为 truensAccountLock 属性时,服务器会拒绝绑定。
相同的流程用于在激活的用户和角色中使用。但是,当某个角色处于激活状态时,角色的成员将 处于激活状态,而不是角色条目本身。有关角色的常规以及如何与特定访问控制交互的更多信息,请参阅 第 8 章 整理和分组条目
警告
数据库上的根条目(与 root 或子后缀对应的条目)不能处于激活状态。第 3 章 管理目录条目 包含有关为 root 或子后缀创建条目的信息,第 2 章 配置目录数据库 包含有关创建根和子后缀的信息。

20.16.1. 显示帐户或角色的状态

显示以下状态:
  • 帐户,请输入:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" account entry-status "uid=user_name,ou=People,dc=example,dc=com"
    Entry DN: uid=user_name,ou=People,dc=example,dc=com
    Entry Creation Date: 20200813085535Z (2020-08-13 08:55:35)
    Entry Modification Date: 20200813085535Z (2020-08-13 08:55:35)
    Entry State: activated
    可选:将 -V 选项传递给命令以显示附加详情:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" account entry-status "uid=user_name,ou=People,dc=example,dc=com" -V
    Entry DN: uid=user_name,ou=People,dc=example,dc=com
    Entry Creation Date: 20200824160645Z (2020-08-24 16:06:45)
    Entry Modification Date: 20200824160645Z (2020-08-24 16:06:45)
    Entry Last Login Date: 20200824160645Z (2020-08-24 16:06:45)
    Entry Time Until Inactive: 2 seconds (2020-08-24 16:07:45)
    Entry State: activated
    以上输出是一个活跃的帐户示例,如输出的最后两行所示。不活动的帐户会提供类似如下的输出:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" account entry-status "uid=user_name,ou=People,dc=example,dc=com" -V
    Entry DN: uid=user_name,ou=People,dc=example,dc=com
    Entry Creation Date: 20200824160645Z (2020-08-24 16:06:45)
    Entry Modification Date: 20200824160645Z (2020-08-24 16:06:45)
    Entry Last Login Date: 20200824160645Z (2020-08-24 16:06:45)
    Entry Time Since Inactive: 3 seconds (2020-08-24 16:07:45)
    Entry State: inactivity limit exceeded
  • 角色,请输入:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" role entry-status "cn=Marketing,ou=People,dc=example,dc=com"
    Entry DN: cn=Marketing,ou=people,dc=example,dc=com
    Entry State: activated
要显示子树的状态而不是条目,请使用 subtree-status 而不是 entry-status 选项。使用 subtree-status 选项时,您可以指定过滤器(-f)和搜索范围(-s) 来缩小结果范围。另外,您可以使用 -i 选项重新定义搜索,使其只返回不活跃的帐户或 -o date 选项,仅返回在指定日期前不活跃的帐户:
# dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" account account "ou=People,dc=example,dc=com"  -f "(uid=*)" -V -o "2020-08-25T14:30:30"
以以下格式指定日期: YYYY-MM-DDTHH:MM:SS

20.16.2. 使用命令行激活和激活用户和角色

在激活中:
  • 用户帐户,请输入:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" account lock "uid=user_name,ou=People,dc=example,dc=com
  • 角色,请输入:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" role lock "cn=Marketing,ou=People,dc=example,dc=com
激活:
  • 用户帐户,请输入:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" account unlock "uid=user_name,ou=People,dc=example,dc=com
  • 角色,请输入:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" role unlock "cn=Marketing,ou=People,dc=example,dc=com

第 21 章 监控服务器和数据库活动

本章论述了监控数据库和红帽目录服务器日志。有关使用 SNMP 监控目录服务器的详情,请参考 第 21.10 节 “使用 SNMP 监控目录服务器”

21.1. 目录服务器日志文件的类型

目录服务器提供以下日志类型:
  • 访问日志 :包含有关客户端连接和与目录服务器实例的连接的信息。此日志类型默认启用。
  • 错误日志:包含错误的详细信息,以及目录在正常操作过程中遇到的事件的详细信息。此日志类型默认启用。
    警告
    如果 Directory 服务器无法写入错误日志,服务器会向 Syslog 服务发送错误消息并退出。此日志类型默认启用。
  • 审计日志:记录对每个数据库所做的更改以及服务器配置。默认不启用此日志。
  • 审计日志:记录失败的审计事件。默认不启用此日志。

21.2. 显示日志文件

您可以使用命令行和 Web 控制台显示目录服务器日志文件:

21.2.1. 使用命令行显示日志文件

要使用命令行显示日志文件,请使用 Red Hat Enterprise Linux 中包含的实用程序,如 lessmorecat。例如:
# less /var/log/dirsrv/slapd-instance_name/access
显示日志文件的位置:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config get nsslapd-accesslog nsslapd-errorlog nsslapd-auditlog nsslapd-auditfaillog

nsslapd-accesslog: /var/log/dirsrv/slapd-instance_name/access
nsslapd-errorlog: /var/log/dirsrv/slapd-instance_name/errors
nsslapd-auditlog: /var/log/dirsrv/slapd-instance_name/audit
nsslapd-auditfaillog: /var/log/dirsrv/slapd-instance_name/audit-failure
注意
如果没有启用日志类型的日志记录,则对应的日志文件不存在。

21.2.2. 使用 Web 控制台显示日志文件

显示目录服务器日志文件:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Monitoring 菜单。
  4. 打开 Logging 菜单,然后选择您要显示的日志文件。
  5. 另外,您还可以将以下设置应用到日志文件查看器中:
    • 设置要在 Log Lines To Show 字段中显示的行数。
    • 通过选择 continuously Refresh 来启用自动显示新日志条目
  6. 单击 Refresh 按钮以应用更改。

21.3. 配置日志文件

对于所有类型的日志文件,必须配置日志 创建 和日志 删除策略。日志创建策略会在启动新日志文件时设置,并在删除旧日志文件时日志删除策略集。

21.3.1. 启用或禁用日志

默认情况下启用访问和错误日志记录。但是,审计和审计失败日志记录默认是禁用的。
注意
禁用访问日志在某些情况下可能很有用,因为每个 2000 个访问目录都会大约增加 1MB 的日志文件。但是,在关闭访问日志记录前,请考虑此信息可以帮助进行故障排除。

21.3.1.1. 使用命令行启用或禁用日志记录

使用 dsconf config replace 命令修改控制目录服务器日志记录功能的 cn=config 子树中的参数:
  • 访问日志: nsslapd-accesslog-logging-enabled
  • 错误日志: nsslapd-errorlog-logging-enabled
  • 审计日志: nsslapd-auditlog-logging-enabled
  • 审计失败日志: nsslapd-auditfaillog-logging-enabled
例如,要启用审计日志记录,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-auditlog-logging-enabled=on

21.3.1.2. 使用 Web 控制台启用或禁用日志记录

在 web 控制台中启用或禁用日志记录:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server Settings 菜单,然后在 Logging 条目下选择要配置的日志类型。
  4. 为所选日志类型启用或禁用日志记录功能。
  5. (可选)设置额外的参数来定义,例如日志轮转或日志删除策略。
  6. 点击 Save

21.3.2. 配置特定于插件的日志记录

要进行调试,您可以为插件执行的操作启用访问和审计日志记录。详情请查看 Red Hat Directory Server Configuration, Command, and File Reference 中的 nsslapd-logAccessnsslapd-logAudit 参数。

21.3.3. 禁用高分辨率日志时间戳

使用默认设置,Directory 服务器会记录带有纳秒精度的条目:
[27/May/2016:17:52:04.754335904 -0500] schemareload - Schema validation passed.
[27/May/2016:17:52:04.894255328 -0500] schemareload - Schema reload task finished.
禁用高分辨率日志时间戳:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-logging-hr-timestamps-enabled=off
注意
禁用高分辨率日志时间戳的选项已弃用,并将在以后的发行版本中删除。
禁用高分辨率日志时间戳后,目录服务器仅记录第二个精度的日志:
[27/May/2016:17:52:04 -0500] schemareload - Schema validation passed.
[27/May/2016:17:52:04 -0500] schemareload - Schema reload task finished.

21.3.4. 定义日志文件轮转策略

要定期归档当前日志文件并创建新日志文件,请设置日志文件轮转策略。您可以使用命令行或 Web 控制台更新 cn=config 子树中的设置。
您可以设置以下配置参数来控制日志文件轮转策略:
访问模式
访问模式对新创建的日志文件设置文件权限。
  • 访问日志: nsslapd-accesslog-mode
  • 错误日志: nsslapd-errorlog-mode
  • 审计日志: nsslapd-auditlog-mode
  • 审计失败日志: nsslapd-auditfaillog-mode
日志的最大数量
设置要返回的最大日志文件数。达到文件数量时,Directory 服务器会在创建新日志文件前删除最旧的日志文件。
  • 访问日志: nsslapd-accesslog-maxlogsperdir
  • 错误日志: nsslapd-errorlog-maxlogsperdir
  • 审计日志: nsslapd-auditlog-maxlogsperdir
  • 审计失败日志: nsslapd-auditfaillog-maxlogsperdir
每个日志的文件大小
以 MB 为单位设置日志文件的最大大小,然后再轮转。
  • 访问日志: nsslapd-accesslog-maxlogsize
  • 错误日志: nsslapd-errorlog-maxlogsize
  • 审计日志: nsslapd-auditlog-maxlogsize
  • 审计失败日志: nsslapd-auditfaillog-maxlogsize
各自创建一个日志
设置日志文件的最长年龄。
  • nsslapd-accesslog-logrotationtime and nsslapd-accesslog-logrotationtimeunit
  • nsslapd-errorlog-logrotationtime and nsslapd-errorlog-logrotationtimeunit
  • nsslapd-auditlog-logrotationtime and nsslapd-auditlog-logrotationtimeunit
  • nsslapd-auditfaillog-logrotationtime and nsslapd-auditfaillog-logrotationtimeunit
另外,您可以使用以下参数轮转日志文件的时间:
  • nsslapd-accesslog-logrotationsynchournsslapd-accesslog-logrotationsyncmin
  • nsslapd-errorlog-logrotationsynchournsslapd-errorlog-logrotationsyncmin
  • nsslapd-auditlog-logrotationsynchour and nsslapd-auditlog-logrotationsyncmin
  • nsslapd-auditfaillog-logrotationsynchournsslapd-auditfaillog-logrotationsyncmin
每个日志文件都以标题开头,用于标识服务器版本、主机名和端口,以简化归档或交换日志文件。例如:
389-Directory/1.4.0.11 B2018.197.1151
server.example.com:389 (/etc/dirsrv/slapd-instance)

21.3.4.1. 使用命令行定义日志文件轮转策略

使用 dsconf config replace 命令修改控制目录服务器日志记录功能的参数。例如,对于错误日志,要设置访问模式 600,以保持最大 2 个,并轮转日志文件大小为 100 MB 或每 5 天,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-errorlog-mode=600 nsslapd-errorlog-maxlogsperdir=2 nsslapd-errorlog-maxlogsize=100 nsslapd-errorlog-logrotationtime=5 nsslapd-errorlog-logrotationtimeunit=day

21.3.4.2. 使用 Web 控制台定义日志文件轮转策略

21.3.5. 定义日志文件删除策略

如果您设置了删除策略,目录服务器会自动删除旧的 存档文件
注意
如果您设置了日志文件轮转策略,您只能设置日志文件删除策略。目录服务器在日志轮转时应用删除策略。
您可以设置以下配置参数来控制日志文件删除策略:
日志总大小
如果所有访问、错误、审计或审计失败日志文件的大小都增加配置的值,则会自动删除最旧的日志文件。
  • 访问日志: nsslapd-accesslog-logmaxdiskspace
  • 错误日志: nsslapd-errorlog-logmaxdiskspace
  • 审计日志: nsslapd-auditlog-logmaxdiskspace
  • 审计日志: nsslapd-auditfaillog-logmaxdiskspace
可用磁盘空间小于
当可用磁盘空间达到这个值时,最旧的存档文件会被自动删除。
  • 访问日志: nsslapd-accesslog-logminfreediskspace
  • 错误日志: nsslapd-errorlog-logminfreediskspace
  • 审计日志: nsslapd-auditlog-logminfreediskspace
  • 审计日志: nsslapd-auditfaillog-logminfreediskspace
当文件早于指定时间时
当日志文件早于配置的时间时,它会被自动删除。
  • 访问日志: nsslapd-accesslog-logexpirationtimensslapd-accesslog-logexpirationtimeunit
  • 错误日志: nsslapd-errorlog-logminfreediskspacensslapd-errorlog-logexpirationtimeunit
  • 审计日志: nsslapd-auditlog-logminfreediskspacensslapd-auditlog-logexpirationtimeunit
  • 审计日志: nsslapd-auditfaillog-logminfreediskspacensslapd-auditfaillog-logexpirationtimeunit

21.3.5.1. 使用命令行配置日志删除策略

使用 dsconf config replace 命令修改控制目录服务器日志记录功能的参数。例如,如果所有访问日志文件的总大小都增加 500 MB,则自动删除最旧的访问日志文件,请运行:
dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-accesslog-logmaxdiskspace=500

21.3.5.2. 使用 Web 控制台配置日志删除策略

21.3.6. 手动日志文件轮转

目录服务器支持所有这三个日志的自动日志文件轮转。但是,如果没有配置自动日志文件创建和删除策略,则可以手动轮转日志文件。默认情况下,可在以下位置找到访问、错误、审计和审计失败日志文件:
/var/log/dirsrv/slapd-instance
手动轮转日志文件:
  1. 停止该实例。
    # dsctl instance_name stop
  2. 移动或重命名正在轮转的日志文件,以便旧日志文件可用于将来的参考。
  3. 启动实例:
    # dsctl instance_name restart

21.3.7. 配置日志级别

访问和错误日志都可以记录不同的信息,具体取决于所设置的日志级别。
您可以设置以下配置参数来控制:
  • 访问日志: nsslapd-accesslog-level
  • 错误日志: nsslapd-errorlog-level
有关支持的日志级别的详情和列表,请参阅 红帽目录服务器配置、命令和文件参考中的相应部分
注意
从 default 更改日志级别可能会导致日志文件快速增长。红帽建议不要更改默认值,而无需红帽技术支持要求这样做。

21.3.7.1. 使用命令行配置日志级别

使用 dsconf config replace 命令设置日志级别。
例如,要启用搜索过滤器日志记录(32)和配置文件处理(64),请将 nsslapd-errorlog-level 参数设置为 96 (32 + 64):
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-errorlog-level=96
例如,要启用内部访问操作日志(4)以及连接、操作和结果(256)的日志记录,请将 nsslapd-accesslog-level 参数设置为 260 (4 + 256):
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-accesslog-level=260

21.3.7.2. 使用 Web 控制台配置日志级别

使用 Web 控制台配置访问和错误日志级别:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 配置:
    • 访问日志级别:
      1. 打开 Server SettingsLoggingAccess Log 菜单。
      2. Access Logging Levels 部分中选择日志级别。例如:
    • 错误日志级别:
      1. 打开 Server SettingsLoggingError Log 菜单。
      2. Error Logging Levels 部分中选择日志级别。例如:
  4. 点击 Save

21.3.7.3. 日志记录内部操作

几个操作会导致目录服务器中的其他内部操作。例如,如果用户删除条目,服务器将运行多个内部操作,例如查找条目并更新用户所属的组。本节介绍内部操作日志条目的格式。有关设置日志级别的详情,请参考 第 21.3.7 节 “配置日志级别”
目录服务器提供以下格式内部操作日志:
服务器发起的内部操作
服务器启动的内部操作日志条目示例:
[14/Jan/2021:09:45:25.814158882 -0400] conn=Internal(0) op=0(0)(0) MOD dn="cn=uniqueid generator,cn=config"
[14/Jan/2021:09:45:25.822103183 -0400] conn=Internal(0) op=0(0)(0) RESULT err=0 tag=48 nentries=0 etime=0.0007968796
对于此类型的日志条目:
  • conn 字段设置为 Internal,后跟 (0)
  • op 字段设置为 0 (0) (nesting_level)。对于服务器发起的内部操作,操作 ID 和内部操作 ID 始终为 0。对于没有嵌套的日志条目,嵌套级别为 0。
客户端发起的内部操作
客户端启动的内部操作日志条目示例:
[14/Jan/2021:09:45:14.382918693 -0400] conn=5 (Internal) op=15(1)(0) SRCH base="cn=config,cn=userroot,cn=ldbm database,cn=plugins,cn=config" scope=1 filter="objectclass=vlvsearch" attrs=ALL
[14/Jan/2021:09:45:14.383191380 -0400] conn=5 (Internal) op=15(1)(0) RESULT err=0 tag=48 nentries=0 etime=0.0000295419
[14/Jan/2021:09:45:14.383216269 -0400] conn=5 (Internal) op=15(2)(0) SRCH base="cn=config,cn=example,cn=ldbm database,cn=plugins,cn=config" scope=1 filter="objectclass=vlvsearch" attrs=ALL
[14/Jan/2021:09:45:14.383449419 -0400] conn=5 (Internal) op=15(2)(0) RESULT err=0
对于此类型的日志条目:
  • conn 字段设置为客户端连接 ID,后跟字符串 (内部)。
  • op 字段包含操作 ID,后跟 (internal_operation_ID) (嵌套ing_level)。内部操作 ID 可能会有所不同,没有嵌套的日志条目,嵌套级别为 0。
如果 nsslapd-plugin-logging 参数设置为 on,并且启用了内部操作日志记录,目录服务器还会记录插件的内部操作。

例 21.1. 启用插件的内部操作日志条目

如果您删除了 uid=user,dc=example,dc=com 条目,并且引用 完整性 插件会自动从 example 组中删除此条目,服务器日志:
[time_stamp] conn=2 op=37 DEL dn="uid=user,dc=example,dc=com"
[time_stamp] conn=2 (Internal) op=37(1) SRCH base="uid=user,dc=example,dc=com" scope=0 filter="(|(objectclass=*)(objectclass=ldapsubentry))" attrs=ALL
[time_stamp] conn=2 (Internal) op=37(1) RESULT err=0 tag=48 nentries=1 etime=0.0000129148
[time_stamp] conn=2 (Internal) op=37(2) SRCH base="dc=example,dc=com" scope=2 filter="(member=uid=user,dc=example,dc=com)" attrs="member"
[time_stamp] conn=2 (Internal) op=37(2) RESULT err=0 tag=48 nentries=0 etime=0.0000123162
[time_stamp] conn=2 (Internal) op=37(3) SRCH base="dc=example,dc=com" scope=2 filter="(uniquemember=uid=user,dc=example,dc=com)" attrs="uniquemember"
[time_stamp] conn=2 (Internal) op=37(3) RESULT err=0 tag=48 nentries=1 etime=0.0000128104
[time_stamp] conn=2 (Internal) op=37(4) MOD dn="cn=example,dc=example,dc=com"
[time_stamp] conn=2 (Internal) op=37(5) SRCH base="cn=example,dc=example,dc=com" scope=0 filter="(|(objectclass=*)(objectclass=ldapsubentry))" attrs=ALL
[time_stamp] conn=2 (Internal) op=37(5) RESULT err=0 tag=48 nentries=1 etime=0.0000130685
[time_stamp] conn=2 (Internal) op=37(4) RESULT err=0 tag=48 nentries=0 etime=0.0005217545
[time_stamp] conn=2 (Internal) op=37(6) SRCH base="dc=example,dc=com" scope=2 filter="(owner=uid=user,dc=example,dc=com)" attrs="owner"
[time_stamp] conn=2 (Internal) op=37(6) RESULT err=0 tag=48 nentries=0 etime=0.0000137656
[time_stamp] conn=2 (Internal) op=37(7) SRCH base="dc=example,dc=com" scope=2 filter="(seeAlso=uid=user,dc=example,dc=com)" attrs="seeAlso"
[time_stamp] conn=2 (Internal) op=37(7) RESULT err=0 tag=48 nentries=0 etime=0.0000066978
[time_stamp] conn=2 (Internal) op=37(8) SRCH base="o=example" scope=2 filter="(member=uid=user,dc=example,dc=com)" attrs="member"
[time_stamp] conn=2 (Internal) op=37(8) RESULT err=0 tag=48 nentries=0 etime=0.0000063316
[time_stamp] conn=2 (Internal) op=37(9) SRCH base="o=example" scope=2 filter="(uniquemember=uid=user,dc=example,dc=com)" attrs="uniquemember"
[time_stamp] conn=2 (Internal) op=37(9) RESULT err=0 tag=48 nentries=0 etime=0.0000048634
[time_stamp] conn=2 (Internal) op=37(10) SRCH base="o=example" scope=2 filter="(owner=uid=user,dc=example,dc=com)" attrs="owner"
[time_stamp] conn=2 (Internal) op=37(10) RESULT err=0 tag=48 nentries=0 etime=0.0000048854
[time_stamp] conn=2 (Internal) op=37(11) SRCH base="o=example" scope=2 filter="(seeAlso=uid=user,dc=example,dc=com)" attrs="seeAlso"
[time_stamp] conn=2 (Internal) op=37(11) RESULT err=0 tag=48 nentries=0 etime=0.0000046522
[time_stamp] conn=2 op=37 RESULT err=0 tag=107 nentries=0 etime=0.0010297858

21.3.8. 禁用用于调试的访问日志缓冲

为了进行调试,您可以禁用访问日志缓冲,这默认是启用的。禁用访问日志缓冲后,目录服务器将日志条目直接写入磁盘。
重要
不要在正常操作环境中禁用访问日志。当您禁用缓冲区时,目录服务器性能会降低,特别是在负载过重。

21.3.8.1. 使用命令行禁用访问日志缓冲

使用命令行禁用访问日志缓冲:
  • nsslapd-accesslog-logbuffering 参数设置为 off
    # dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-accesslog-logbuffering=off

21.3.8.2. 使用 Web 控制台禁用访问日志缓冲

使用 Web 控制台禁用访问日志缓冲:
  1. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  2. 选择实例。
  3. 打开 Server SettingsLoggingAccess Log
  4. 选择 Disable Access Log Buffering
  5. 单击 Save Configuration

21.4. 获取访问日志统计信息

logconv.pl 脚本解析访问日志,并返回服务器上运行的不同用户和操作的摘要信息。
在最简单的情况下,脚本只需解析访问日志(或日志):
# logconv.pl /relative/path/to/accessLog
脚本可以接受通配符来解析多个访问日志,这在使用了日志轮转时非常有用。
# logconv.pl /var/log/dirsrv/slapd-instance/access*
logconv.pl 的不同选项在 man page 和 Configuration, Command, and File Reference 中介绍。
logconv.pl 可以通过多种方式从访问日志中拉取常规使用信息。
在最简单的情况下,logconv.pl 会打印总操作列表、连接总数、每种操作类型计数,以及持久性搜索等某些扩展操作计数。
# logconv.pl /var/log/dirsrv/slapd-instance/access
Access Log Analyzer 8.2
Command: logconv.pl /var/log/dirsrv/slapd-instance/access
Processing 1 Access Log(s)...

[001] /var/log/dirsrv/slapd-instance/access	size (bytes):        77532

Total Log Lines Analysed:  527

Start of Logs:    14/Oct/2017:16:15:22.452909568
End of Logs:      14/Oct/2017:16:39:50.157790196

Processed Log Time:  0 Hours, 24 Minutes, 27.704877056 Seconds

Restarts:                     10
Secure Protocol Versions:
  - TLS1.2 client bound as uid=user_name,ou=people,o=example.com (11 connections)
  - TLS1.2 128-bit AES; client CN=CA Subsystem,O=example.com; issuer CN=Certificate Authority,O=example.com (11 connections)
  - TLS1.2 128-bit AES-GCM (2 connections)
  - TLS1.2 128-bit AES (3 connections)

Peak Concurrent Connections:  38
Total Operations:             4771
Total Results:                4653
Overall Performance:          97.5%

Total Connections:            249           (0.17/sec)  (10.18/min)
 - LDAP Connections:          107           (0.07/sec)  (4.37/min)
 - LDAPI Connections:         128           (0.09/sec)  (5.23/min)
 - LDAPS Connections:         14            (0.01/sec)  (0.57/min)
 - StartTLS Extended Ops:     2             (0.00/sec)  (0.08/min)

Searches:                     2963          (2.02/sec)  (121.13/min)
Modifications:                649           (0.44/sec)  (26.53/min)
Adds:                         785           (0.53/sec)  (32.09/min)
Deletes:                      10            (0.01/sec)  (0.41/min)
Mod RDNs:                     6             (0.00/sec)  (0.25/min)
Compares:                     0             (0.00/sec)  (0.00/min)
Binds:                        324           (0.22/sec)  (13.25/min)

Proxied Auth Operations:      0
Persistent Searches:          17
Internal Operations:          0
Entry Operations:             0
Extended Operations:          4
Abandoned Requests:           0
Smart Referrals Received:     0

VLV Operations:               30
VLV Unindexed Searches:       0
VLV Unindexed Components:     20
SORT Operations:              22

Entire Search Base Queries:   12
Paged Searches:               2
Unindexed Searches:           0
Unindexed Components:         149

FDs Taken:                    249
FDs Returned:                 212
Highest FD Taken:             107

Broken Pipes:                 0
Connections Reset By Peer:    0
Resource Unavailable:         0
Max BER Size Exceeded:        0

Binds:                        324
Unbinds:                      155
---------------------------------
 - LDAP v2 Binds:             41
 - LDAP v3 Binds:             180
 - AUTOBINDs(LDAPI):          103
 - SSL Client Binds:          0
 - Failed SSL Client Binds:   0
 - SASL Binds:                134
   - EXTERNAL: 114
   - GSSAPI: 20
 - Directory Manager Binds:   10
 - Anonymous Binds:           1

Cleaning up temp files...
Done.
除了操作和连接的摘要信息外,还详细介绍了与服务器的所有连接信息。此信息包括用于连接到服务器的最常见 IP 地址、带有最多失败的登录尝试的 DN、用于访问服务器的总绑定 DN,以及最常见的错误或返回代码。
其他连接摘要作为单个选项传递。例如,列出用于连接到服务器 (b) 数量,由服务器 (c) 返回的总连接代码通过 -bc 传递。
# logconv.pl -bc /var/log/dirsrv/slapd-instance/access
...
----- Total Connection Codes -----

U1              3    Cleanly Closed Connections
B1              1    Bad Ber Tag Encountered

----- Top 20 Bind DN's -----

Number of Unique Bind DN's: 212

1801            cn=Directory Manager
1297            Anonymous Binds
311             uid=jsmith,ou=people...
87              uid=bjensen,ou=peopl...
85              uid=mreynolds,ou=peo...
69              uid=jrockford,ou=peo...
55              uid=sspencer,ou=peop...
...
在特定开始时间(-S)或范围内,数据可以限制为特定开始时间(-S)后的条目。设置开始和结束时间后,logconv.pl 会首先打印给定的时间范围,然后显示该周期的概述。
# logconv.pl -S "[01/Jul/2016:16:11:47.000000000 -0400]" -E "[01/Jul/2016:17:23:08.999999999 -0400]" /var/log/dirsrv/slapd-instance/access
...
----------- Access Log Output ------------

Start of Logs:    01/Jul/2016:16:11:47
End of Logs:      01/Jul/2016:17:23:08
...
开始和结束期限仅为用于生成总摘要计数的数据设置时间限值。它仍然显示聚合或总计计数。要获得到 Directory 服务器的连接和操作中的模式视图,可以输出每分钟计数(-M)或每秒(-m)的数据。在这种情况下,数据会在时间单位递增输出到指定的 CSV 输出文件中。
# logconv.pl -m|-M outputFile accessLogFile
例如:
# logconv.pl -M /home/output/statsPerMin.txt /var/log/dirsrv/slapd-instance/access*
-M|-m 选项也可以与 -S-E 参数一起使用,在特定时间段内平均或每秒数。
文件中的每一行代表一个时间单位(以分钟或秒为单位),且该时间段的总数。CSV 文件(用于每分钟和每秒统计)包含以下列,顺序如下:
Time,time_t,Results,Search,Add,Mod,Modrdn,Delete,Abandon,Connections,SSL Conns,Bind,Anon Bind,Unbind,Unindexed
CSV 文件可以在任何电子表格计划中操作,如 LibreOffice Calc 以及许多其他商业应用程序中。导入 CSV 数据并生成 chart 或其他指标的流程取决于应用程序本身。
例如,要在 LibreOffice Calc 中创建 chart:
  1. 打开 CSV 文件。
  2. Insert 菜单,然后选择 Chart
  3. Chart Type 区域中,将 Chart 类型设置为 XY (Scatter)
    1. 将 sub 类型设置为行。
    2. 选择要按 X 值排序的选项。
  4. 接受其他屏幕中的默认值(特别是,使用列中的数据集),并将第一行和第一列设置为标签,并创建 chart。

21.5. 为 Graceful Shutdown 监控本地磁盘

请参阅 Red Hat Directory Server 性能调节指南中的 为 Graceful Shutdown 监控本地磁盘部分。

21.6. 监控服务器活动

请参阅红帽目录服务器性能调优指南中的监控服务器活动部分。

21.7. 监控数据库活动

请参阅红帽目录服务器性能调优指南中的监控数据库活动部分。

21.9. 启用和禁用计数器

nsslapd-counters 参数启用要运行的计数器。但是,运行计数器可能会影响性能,因此也可以关闭计数器。如果计数器关闭,则它们都的值为零(0)。
默认情况下,计数器已经启用。要启用或禁用性能计数器,请使用 ldapmodify。例如,禁用:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-counters=off

21.10. 使用 SNMP 监控目录服务器

第 21 章 监控服务器和数据库活动 中描述的服务器和数据库活动监控日志设置特定于目录服务器。您还可以使用简单网络管理协议(SNMP)监控目录服务器,这是用于监控网络活动的管理协议,可用于实时监控各种设备。
通过 AgentX 子代理可以通过 SNMP 监控目录服务器。SNMP 监控收集有关目录服务器的有用信息,如绑定信息、服务器上执行的操作和缓存信息。Directory Server SNMP 子代理支持 SNMP 陷阱来发送有关服务器实例运行状态更改的通知。

21.10.1. 关于 SNMP

SNMP 已经成为了其广泛的流行性。这是这种互操作性,以及 SNMP 可以处理特定于整个不同设备类的许多作业,这使得 SNMP 成为全局网络控制和监控的理想标准机制。SNMP 允许网络管理员统一所有网络监控活动,以及更广泛的目录服务器监控部分。
SNMP 用于交换网络活动的数据。使用 SNMP 时,数据在受管设备与网络管理应用程序(NMS)之间传输,用户远程管理网络。受管设备是运行 SNMP 的任何内容,如主机、路由器和目录服务器。NMS 通常是安装一个或多个网络管理应用程序的强大工作站。网络管理应用程序以图形方式显示有关受管设备的信息,该设备是启动或关闭的设备,以及接收多少错误消息等。
NMS 和受管设备之间通过使用两种类型的代理传输信息:子代理和 主代理。子代理收集有关受管设备的信息,并将信息传递给主代理。目录服务器具有子代理。主代理在各种子代理和 NMS 之间交换信息。master 代理通常在与它与之通信的子代理相同的主机上运行,尽管它可以在远程计算机上运行。
SNMP 属性的值(其他称为变量)保存在受管设备上,并根据需要报告到 NMS。每个变量称为 受管对象,这是代理可访问的任何内容,并发送到 NMS。所有受管对象都在管理信息基础(MIB)中定义,这是具有类似树结构的数据库。层次结构的顶级包含有关网络的最常规信息。每个分支都更具体,处理单独的网络区域。
SNMP 以协议数据单元(PDU)的形式交换网络信息。PDU 包含有关存储在受管设备上的变量的信息。这些变量(也称为受管对象)具有根据需要向 NMS 报告的值和标题。NMS 和受管设备之间的通信由 NMS 发送更新或请求信息,或者在服务器关闭时发送通知或警告(称为 trap )或警告(称为 trap )。

21.10.2. 启用和禁用 SNMP 支持

默认情况下,在 Directory 服务器中启用了 SNMP 协议,在配置子代理后,您可以使用它。
要在实例中启用或禁用 SNMP,请将 nsSNMPEnabled 参数设置为 onoff。例如,在 Directory 服务器实例中禁用 SNMP:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: cn=SNMP,cn=config
changetype: modify
replace: nsSNMPEnabled
nsSNMPEnabled: on

21.10.3. 设置参数以使用 SNMP 识别实例

目录服务器提供以下属性,可帮助识别使用 SNMP 的实例:
  • nsSNMPOrganization
  • nsSNMPLocation
  • nsSNMPContact
  • nsSNMPDescription
有关参数的详情,请查看红帽目录服务器 配置、命令和文件参考 中的 cn=SNMP 部分中的描述。
例如,要将 nsSNMPLocation 参数设置为 Munich,请
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: cn=SNMP,cn=config
changetype: modify
replace: nsSNMPLocation
nsSNMPLocation: Munich, Germany

21.10.4. 为目录服务器设置 SNMP 代理

要使用 SNMP 协议从目录服务器查询信息,请设置 SNMP 代理:
  1. 安装 389-ds-base-snmpnet-snmp 软件包:
    # yum install 389-ds-base-snmp net-snmp
  2. 要配置 SNMP master 代理,请编辑 /etc/snmp/snmpd.conf 文件,添加以下条目来启用代理可扩展性(AgentX)协议:
    master agentx
    有关 AgentX 协议的详情,请参考 RFC 2741
  3. 要配置 SNMP 子代理,请编辑 /etc/dirsrv/config/ldap-agent.conf 文件,为要监控的每个目录服务器实例添加一个 server 参数。例如:
    server slapd-instance_name
  4. 另外,还可创建一个 SNMP 用户帐户:
    1. 停止 snmpd 服务:
      # systemctl stop snmpd
    2. 创建 SNMP 用户帐户。例如:
      # net-snmp-create-v3-user -A authentication_password -a SHA \
           -X private_password -x AES user_name
      有关命令中使用的参数的详情,请查看 net-snmp-create-v3-user(1) man page。
    3. 启动 snmpd 服务:
      # systemctl start snmpd
  5. 另外,还可设置目录服务器描述性属性。详情请查看 第 21.10.3 节 “设置参数以使用 SNMP 识别实例”
  6. 启动 dirsrv-snmp 服务:
    # systemctl start dirsrv-snmp
  7. 另外,验证配置:
    1. 安装 net-snmp-utils 软件包:
      # yum install net-snmp-utils
    2. 查询目录服务器对象标识符(OID)。例如:
      # snmpwalk -v3 -u user_name -M /usr/share/snmp/mibs:/usr/share/dirsrv/mibs/ \
           -l AuthPriv -m +RHDS-MIB -A authentication_password -a SHA
           -X private_password -x AES server.example.com .1.3.6.1.4.1.2312.6.1.1

21.10.5. 配置 SNMP Traps

SNMP 陷阱基本上是一个阈值,它会在被监控的服务器遇到通知时触发通知。要使用陷阱,必须将 master 代理配置为接受陷阱并与其执行。例如,对于目录服务器实例的管理员,陷阱可以触发电子邮件通知。
子代理仅负责将陷阱发送到 master 代理。master 代理和陷阱处理器必须根据您使用的 SNMP master 代理的文档进行配置。
陷阱通过 实体表 的信息相关联,其中包含特定于目录服务器实例的信息,如名称和版本号。实体表第 21.10.6.3 节 “实体表” 中进行了描述。这意味着,当主代理收到陷阱时执行的操作是灵活的,例如向一个实例的 dsEntityContact 变量中定义的电子邮件地址发送电子邮件,同时向另一个实例的 dsEntityContact 变量中的页面号发送通知。
subagent 支持两个陷阱:
  • DirectoryServerDown.每当子代理检测到目录服务器可能没有运行时,都会生成此陷阱。此陷阱将发送有目录服务器实例描述、版本、物理位置和联系信息,这些信息在 dsEntityDescrdsEntityVersdsEntityLocationdsEntityContact 变量中详细介绍。
  • DirectoryServerStart.每当子代理检测到目录服务器已启动或重启时,都会生成此陷阱。此陷阱将发送有目录服务器实例描述、版本、物理位置和联系信息,这些信息在 dsEntityDescrdsEntityVersdsEntityLocationdsEntityContact 变量中详细介绍。

21.10.6. 使用管理信息基础

目录服务器的 MIB 是存储在 /usr/share/dirsrv/mibs 目录中的名为 redhat-directory.mib 的文件。此 MIB 包含与目录的网络管理相关的变量定义。这些变量称为受管对象。使用目录 MIB 和 Net-SNMP,您可以像网络上的所有其他受管设备一样监控您的目录。有关使用 MIB 的详情,请参考 第 21.10.4 节 “为目录服务器设置 SNMP 代理”
客户端工具需要加载目录服务器 MIB,以使用以下部分中列出的变量名称。
使用目录 MIB 可让管理员使用 SNMP 查看目录的管理信息,并实时监控服务器。目录 MIB 分为四个不同的受管对象表:
注意
SNMP 监控的所有目录服务器属性对计数器使用 64 位整数,即使在 32 位系统上也是如此。

21.10.6.1. 操作表

Operations Table 提供有关目录服务器访问、操作和错误的统计信息。表 21.1 “操作表:受管对象和描述” 描述存储在 redhat-directory.mib 文件 的操作 表中的受管对象。

表 21.1. 操作表:受管对象和描述

受管对象 描述
dsAnonymousBinds 从服务器启动以来匿名绑定到目录的绑定数量。
dsUnauthBinds 从服务器启动以来,未经身份验证的绑定到目录的数量。
dsSimpleAuthBinds 从服务器启动以来,绑定到使用简单身份验证方法(如密码保护)建立的目录数量。
dsStrongAuthBinds 从服务器启动以来,绑定到使用强身份验证方法(如 TLS 或 SASL 机制)建立的目录数量。
dsBindSecurityErrors 由于身份验证失败或服务器启动以来,目录被拒绝的绑定请求数。
dsInOps 从服务器启动以来,从另一个目录转发到此目录的操作数量。
dsReadOps 从应用程序启动以来此目录服务的读取操作数量。此对象的值始终为 0, 因为 LDAP 使用搜索操作间接实施读取操作。
dsCompareOps 从服务器启动以来此目录提供服务的比较操作数量。
dsAddEntryOps 从服务器启动以来此目录提供服务的添加操作数量。
dsRemoveEntryOps 从服务器启动以来此目录提供服务的删除操作数量。
dsModifyEntryOps 从服务器启动以来此目录提供服务的修改操作数量。
dsModifyRDNOps 从服务器启动以来此目录提供服务的修改 RDN 操作数量。
dsListOps 从服务器启动以来此目录提供服务的列表操作数。此对象的值始终为 0, 因为 LDAP 使用搜索操作间接实施列表操作。
dsSearchOps 从服务器启动以来此目录提供服务的搜索操作总数。
dsOneLevelSearchOps 从服务器启动以来此目录提供服务的一个级别的搜索操作数。
dsWholeSubtreeSearchOps 从服务器启动以来此目录提供服务的整个子树搜索操作数量。
dsReferrals 此目录返回的引用数量,以响应自服务器启动以来的客户端请求。
dsSecurityErrors 转发到没有满足安全要求的这个目录的操作数量。
dsErrors 因为错误(除了安全或引用错误)无法提供服务的请求数。错误包括名称错误、更新错误、属性错误和服务错误。部分服务请求不会计算为错误。

21.10.6.2. 条目表

Entries Table 提供有关目录条目内容的信息。表 21.2 “条目表:受管对象和描述” 描述存储在 redhat-directory.mib 文件中的 Entries 表中的受管对象。

表 21.2. 条目表:受管对象和描述

受管对象 描述
dsCopyEntries 此目录包含副本的目录条目数。此对象的值始终为 0 ( 因为当前没有执行任何更新)。
dsCacheEntries 目录中缓存的条目数。
dsCacheHits 从应用程序启动以来本地保存缓存的操作数量。

21.10.6.3. 实体表

Entity Table 包含有关目录服务器实例的识别信息。Entity Table 的值在 cn=SNMP,cn=config 条目中设置,如 第 21.10.3 节 “设置参数以使用 SNMP 识别实例” 所述。
表 21.3 “实体表:受管对象和描述” 描述存储在 redhat-directory.mib 文件 的实体 表中的受管对象。

表 21.3. 实体表:受管对象和描述

受管对象 描述
dsEntityDescr 为 Directory 服务器实例设置的描述。
dsEntityVers Directory 服务器实例的 Directory Server 版本号。
dsEntityOrg 负责 Directory 服务器实例的组织。
dsEntityLocation 目录服务器实例的物理位置。
dsEntityContact 负责 Directory 服务器实例的人员的名称和联系信息。
dsEntityName 目录服务器实例的名称。

21.10.6.4. 互动表

注意
subagent 不支持 Interaction 表。子代理可以查询表,但不会使用有效的数据进行更新。
表 21.4 “互动表:受管对象和描述” 描述存储在 redhat-directory.mib 文件的交互式表中的受管对象。

表 21.4. 互动表:受管对象和描述

受管对象 描述
dsIntTable 详情,在表的每一行中,与被监控目录服务器交互的历史记录相关。
dsIntEntry 包含目录服务器与对等目录服务器交互详情的条目。
dsIntIndex 唯一密钥的一部分以及 applIndex 来标识概念行,其中包含目录服务器(由 applIndex引用)和对等目录服务器之间的有用信息。
dsName 此条目所属的对等目录服务器的可分辨名称(DN)。
dsTimeOfCreation 创建此行时 sysUpTime 的值。如果在网络管理子系统初始化前创建了该条目,此对象将包含 0 的值。
dsTimeOfLastAttempt 最后一次尝试联系此目录服务器时,sysUpTime 的值。如果在网络管理子系统初始化前进行最后一次尝试,此对象将包含 0 的值。
dsTimeOfLastSuccess 最后一次尝试联系此目录服务器时,sysUpTime 的值成功。如果没有成功尝试,或者在网络管理子系统初始化前尝试上次成功尝试,则此条目将为零。
dsFailuresSinceLastSuccess 最后一次尝试联系此目录服务器成功后的失败次数。如果没有成功尝试,这个计数器将包含自创建此条目以来的失败次数。
dsFailures 创建此条目后累积失败。
dsSuccesses 创建此条目后累积成功。
dsURL 目录服务器应用程序的 URL。

第 22 章 使高可用性和灾难恢复计划

高效运行目录服务器部署的一部分是计划该最糟糕的情况。本章涵盖了在灾难恢复计划中草案灾难恢复计划的一般原则,并突出显示目录服务器中可用于灾难恢复方面的功能的一般原则。
灾难恢复 是一种计划并实施在存在某种灾难性故障时从一个操作环境过渡到另一个环境的方法。目录服务器的灾难恢复计划可能是更大的业务连续计划的一部分,也可以是针对目录服务中断的独立计划。
注意
本章涵盖了灾难恢复的非常通用概念。
灾难恢复可能非常复杂且特定于具体情况。考虑使用专业服务来设计、维护和测试对敏感或关键任务服务(如红帽目录服务器)的任何灾难恢复计划。

22.1. 识别潜在的场景

第一步是确定您可能遇到的潜在问题、哪些服务会受到影响以及您应该采取哪些响应。在 Red Hat Directory Server Deployment Guide 中,管理员对现有的和提议的基础架构进行站点调查,以确定要设计的目录类型。对灾难规划类似,与 表 22.1 “灾难场景和响应” 类似,确定您的数据基础架构的位置,确定丢失该组件的影响,并查看潜在的最佳响应。

表 22.1. 灾难场景和响应

场景 对基础架构的影响 理想的响应
数据崩溃 通过软件或硬件故障(或通过恶意攻击),在一个站点或一个服务器上的数据可能会损坏。如果该损坏的服务器是多层次复制中的供应商,那么在整个部署中可以快速传播损坏。 应有一个隔离的服务器,可访问最新未修正的数据备份。当检测到问题时,可以在常规基础架构上暂停复制,并且此服务器可以上线,以使用良好的数据重新初始化供应商。
自然灾难和其他 mass 事件 自然灾难可能会使整个办公室或数据中心离线,即使是长期的电源中断。 目录操作可以在另一个物理位置传输到具有相同数据的镜像站点。
服务器或机器丢失 一台机器可能会失败。 另一个具有相同数据的计算机可以假定机器的位置丢失。

22.2. 定义 Rollover 的 Type

灾难恢复(如现在所示),从一个系统转换到另一个系统的过程会尽可能少地中断服务。这称为 滚动,有三种不同的方法来执行滚动:
  • 滚动意味着基础架构在另一个站点完全镜像,并且备份站点始终与主站点保持在线和当前。这只需要一些调整,才能将操作从主切换到备份。
  • 滚动意味着备份站点的所有元素都就位(大量的网络连接、所有必需的应用程序和硬件),但系统不会被主动运行或仍然配置。这可能需要一些额外的时间来配置机器并获取系统运行。
  • 滚动表示站点可用,但有一些资源可立即可用来设置它。
滚动类型的明显区别在于设置备份站点所需的时间和费用。热和温站点具有更高的初始站来设置和运行。
根据计划的特定灾难场景,可以使用滚动类型混合。例如,单一服务器丢失的滚动计划可以通过创建和保留目录服务器实例的虚拟机副本来轻松地使用热滚动,从而可以在几分钟内上线。它甚至不需要将虚拟机保存在单独的工具或网络中。另一方面,计划对整个数据中心或办公室丢失一个冷滚动。
将滚动流程与灾难场景、预算和资源以及遇到问题的可能性匹配。

22.3. 识别用于灾难恢复的目录服务器功能

恢复的最硬部分不是硬件;它是服务器中数据的可靠副本。有三个目录服务器功能是用来为灾难恢复准备数据副本的工具:
  • 备份数据库并定期验证备份
  • 使用命名管道脚本,多层次复制、串联、备份数据库和监控服务器
另外,使用命名管道脚本监控服务器并使用其他目录服务器性能计数器在捕获和快速响应特定的关键事件时有效。

22.3.1. 备份用于灾难恢复的目录数据

用于灾难恢复的最有用的工具是频繁备份目录实例。归档可以存储在物理介质上,位置与主数据中心或现场存储在冷备份位置。
备份可以通过 cron 任务定期运行。例如,要每天在 22:00 (10pm)上创建 ldap://server.example.com 实例的备份:
0 22 * * 1    /usr/sbin/dsconf -D "cn=Directory Manager" ldap://server.example.com backup create
dsconf backup create 命令备份目录数据,而无需首先停止服务器。
注意
红帽建议备份多层次复制环境中所有服务器中的数据。
第 6.3 节 “备份目录服务器” 中涵盖了备份目录数据库和目录配置(dse.ldif 文件)。

22.3.2. 用于高可用性的多层复制

多层次复制是丢失单一服务器的最佳确定性,甚至可能是整个办公室或部门。虽然少量服务器是数据供应商,但多个服务器都拥有相同的数据 - 可能在单个复制环境中拥有供应商和中心。即使多个服务器离线,客户端也可以保留信息。
复制可用于通过数据复制到服务器,并更快地在线替换。
注意
为防止通过复制传播的数据损坏,经常备份数据库。
复制配置还允许在主供应商无法访问时引用故障转移服务器。这意味着,写入操作可以从客户端角度正常进行,即使服务器离线。

例 22.1. 多站点复制场景

在一些情况下,复制是灾难恢复的一种通用工具:
  • 对于单一服务器失败,存储在该实例上的所有数据都可以从其他服务器访问和检索。
  • 为了丢失整个办公室或共处工具,服务器可以镜像到完全不同的物理位置(由 Directory 服务器广泛的区域复制性能实现)。通过最少的工作量,可以将流量重定向到复制站点,而无需在线使新的服务器上线。
第 15 章 管理复制 中涵盖了配置复制。

22.3.3. 高可用性的串联数据库

是客户端向一台服务器发送请求的配置,它会自动将该请求转发到另一台服务器。数据库链接(或链中)中可以配置多个服务器,以便在一个服务器不可用时允许自动故障转移。

例 22.2. 链的情况

当串联与故障转移服务器列表相结合时,当客户端流量离线时,客户端流量也可以自动从单一服务器(甚至一组服务器)重定向。这无法帮助恢复,但它有助于管理从主服务器转换到备份服务器的转换。

22.4. 定义恢复过程

有很多工具可帮助进行灾难恢复,但有效的恢复过程会重新定义每个场景中要执行的操作计划。至少需要明确识别两个方面:
  • 什么信号表示灾难?有些事情是明显的(大量电源中断、网络丢失或触发),但其他情况需要定义。例如,需要在线备份服务器哪些信号?
  • 谁对灾难做出响应以及如何响应?发生灾难情况后,谁负责操作?它们如何通知该事件?它们应该做什么?
重要
  • 在站点存储灾难恢复计划中的打印副本。
  • 定期测试灾难恢复计划,并在配置和基础架构更改后测试。

22.5. 基本示例:执行恢复

管理员 John Smith 必须为其目录部署创建一个灾难恢复计划。示例 Corp. 有三个物理办公室,位于 San047、Dallas 和 Arlington。每个站点都有 10 个本地复制到本地的服务器,每个站点一个服务器都复制到其他两个站点的另一台服务器。
每个站点都有存储在其目录中的重要客户数据,以及人工资源数据。多个外部应用需要访问数据来执行计费等操作。
John Smith 的第一步是执行站点调查。他正在查找三方面:其目录使用量是什么(允许访问站点中的流量和流量负载)、其当前资产以及他们可能需要获取的资产。这和部署 Red Hat Directory Server 时执行的初始站点调查非常相似。
下一步是识别潜在的灾难场景。这三个站点中的两个高度容易受到自然灾难(Sanphone 和 Dallas)的攻击。所有三个站点都可能面临正常的中断,如电源或互联网访问的中断。此外,由于每个站点供应商都有自己的本地数据,每个站点都容易丢失服务器实例或机器。
John Smith 随后将其灾难恢复计划分成三个部分:
  • 计划 A 涵盖了丢失一个目录服务器实例
  • 计划 B 涵盖了某些类型的数据损坏或攻击
  • 规划 C 包括丢失整个办公室
对于计划 A 和 B,Soot Smith 决定使用热恢复来立即将功能从单个实例切换到备份。每个服务器每天使用 cron 作业备份,然后在虚拟机上复制并恢复存档。虚拟机保留在不同的子网中,但如果其对等点离线,则可以立即切换。John Smith 使用简单的 SNMP 陷阱来跟踪每个目录服务器实例的可用性。
规划 C 更为广泛。除了站点和本地备份之间的复制外,他决定向其他两个共同定位工具,每站点备份发送一次物理副本。它还为备用服务器提供适当的互联网访问和软件许可证,以恢复整个站点,使用虚拟机,另一个不同的 colocation 功能之一。他将 Arlington 站点指定为主要恢复位置,因为这是大多数 IT 员工所处的位置,然后是 San Wright 和 last Dallas,它基于人员的发布。对于每个事件,所有三个站点的 IT 管理员都将获得通知,管理器假定设置虚拟机、从物理备份中恢复目录服务器实例以及重新传输客户端流量。
John Smith 计划每季度审核和更新计划,以考虑任何新的硬件或应用程序更改。一年后,会根据 Disaster Plan C 中的步骤,所有三个站点都必须通过恢复和部署其他两个站点的步骤运行。

第 23 章 创建测试条目

dsctl ldifgen 命令创建具有不同类型的测试条目的 LDIF 文件。例如,您可以使用此 LDIF 文件填充测试实例或子树,以使用示例条目测试目录服务器的性能。
您可以将以下条目类型参数之一传递给 dsctl ldifgen
  • 用户 :创建一个包含用户条目的 LDIF 文件。
  • :创建一个包含静态组和成员条目的 LDIF 文件。
  • COS-def :创建一个 LDIF 文件,其中包含经典指针或间接服务(CoS)定义。
  • COS-template :创建一个包含 CoS 模板的 LDIF 文件。
  • 角色 :创建一个包含受管、过滤或间接角色条目的 LDIF 文件。
  • mod-load :创建包含修改操作的 LDIF 文件。使用 ldapmodify 工具导入此文件。
  • 嵌套 :创建一个 LDIF 文件,该文件包含级联或模糊树设计中的大量嵌套条目。
注意
dsctl ldifgen 命令只创建 LDIF 文件。要将文件加载到目录服务器实例中,请使用:
  • 使用 mod-load 选项创建 LDIF 文件后 ldapmodify 工具
  • 所有其他选项的 ldapadd 工具
除了 嵌套 条目类型外,如果您不提供任何命令行选项,dsctl ldifgen 命令将使用互动模式:
# dsctl instance_name ldifgen entry_type

23.1. 使用示例用户条目创建 LDIF 文件

使用 dsctl ldifgen users 命令创建带有示例用户条目的 LDIF 文件。例如,要创建一个名为 /tmp/users.ldif 的 LDIF 文件,该文件将 100,000 个通用用户添加到 dc=example,dc=com 后缀,请输入:
# dsctl instance_name ldifgen users --suffix "dc=example,dc=com" --number 100000 --generic --ldif-file=/tmp/users.ldif
请注意,命令会创建以下机构单元(OU),并将用户随机分配给这些 OUs:
  • ou=accounting
  • ou=product 开发
  • ou=product 测试
  • ou=human 资源
  • ou=payroll
  • ou=people
  • ou=groups
如需更多详细信息和其他选项,您可以使用创建 LDIF 文件,请输入:
# dsctl instance_name ldifgen users --help

23.2. 创建带有示例组条目的 LDIF 文件

使用 dsctl ldifgen groups 命令创建带有示例组条目的 LDIF 文件。例如,要创建一个名为 /tmp/groups.ldif 的 LDIF 文件,该文件将 500 个组添加到 ou=groups,dc=example,dc=com 条目,并且每个组都有 100 个成员,请输入:
# dsctl instance_name ldifgen groups --number 500 --suffix "dc=example,dc=com" --parent "ou=groups,dc=example,dc=com" --num-members 100 --create-members --member-parent "ou=People,dc=example,dc=com" --ldif-file /tmp/group.ldif example
请注意,命令还会创建 LDIF 语句,以在 ou=People,dc=example,dc=com 中添加用户条目。
重要
如果您创建大组并尝试使用 ldapmodif 工具添加组,您可以超过最大基本编码规则(BER)大小限制,导入会失败。在这种情况下,增加 cn=config 条目中的 nsslapd-maxbersize 参数的值。
有关创建 LDIF 文件后可以使用的详情和其他选项,请输入:
# dsctl instance_name ldifgen groups --help

23.3. 使用示例 CoS 定义创建 LDIF 文件

使用 dsctl ldifgen cos-def 命令创建带有类 Service (CoS)定义的 LDIF 文件。例如,要创建一个名为 /tmp/cos-definition.ldif 的 LDIF 文件,该文件将经典 CoS 定义添加到 ou=cos 定义dc=example,dc=com 条目:
# dsctl instance_name ldifgen cos-def Postal_Def --type classic --parent "ou=cos definitions,dc=example,dc=com" --cos-specifier businessCatagory --cos-template "cn=sales,cn=classicCoS,dc=example,dc=com" --cos-attr postalcode telephonenumber --ldif-file /tmp/cos-definition.ldif
有关示例中使用的选项以及您可以设置的其它选项创建 LDIF 文件的详情,请输入:
# dsctl instance_name ldifgen cos-def --help

23.4. 创建带有示例修改声明的 LDIF 文件

使用 dsctl ldifgen mod-load 命令创建一个包含更新操作的 LDIF 文件。
# dsctl instance_name ldifgen mod-load --parent dc=example,dc=com --num-users 1000 --create-users --mod-users 1000 --add-users 10 --del-users 100 --mod-users 1000 --modrdn-users 100 --mod-attrs cn uid sn --delete-users
这个命令使用执行以下操作的语句创建 /tmp/modifications.ldif 文件:
  1. 创建带有 1000 ADD 操作的 LDIF 文件,以创建用户条目。
  2. 通过更改其 cnuid、ssn 属性来修改所有条目。
  3. 添加额外的 10 个用户条目。
  4. 执行 100 个 MODRDN 操作。
  5. 删除 100 条目
  6. 删除结尾的所有剩余条目。
如需更多详细信息和其他选项,您可以使用创建 LDIF 文件,请输入:
# dsctl instance_name ldifgen mod-load --help

23.5. 创建带有嵌套示例条目的 LDIF 文件

使用 dsctl ldifgen 嵌套 命令创建一个包含大量嵌套级联结构的 LDIF 文件。例如,要创建一个名为 /tmp/nested.nldif 的 LDIF 文件,该文件在 dc=example,dc=com 条目下的不同机构单元(OU)中添加 600 个用户,每个 OU 包含最多 100 个用户:
# dsctl instance_name ldifgen nested --num-users 600 --node-limit 100 --suffix "dc=example,dc=com"
有关选项的详情,请输入:
# dsctl instance_name ldifgen nested --help

附录 A. 使用 LDAP 客户端工具

Red Hat Directory Server 使用 OpenLDAP 提供的 LDAP 工具(如 ldapsearchldapmodify)。OpenLDAP 工具选项在 OpenLDAP man page http://www.openldap.org/software/man.cgi 中进行了描述。
本附录提供了一些常见的使用场景和使用这些 LDAP 工具的示例。
第 14 章 查找目录条目 中提供了使用 ldapsearch 的更广泛的示例。第 3 章 管理目录条目 中提供了使用 ldapmodifyldapdelete 的更多示例。

A.1. 运行扩展操作

Red Hat Directory Server 支持各种扩展操作,特别是扩展搜索操作。扩展操作会传递额外的操作(如 get valid rights search 或 server-side sort),以及 LDAP 操作。同样,LDAP 客户端可以支持多种扩展操作。
OpenLDAP LDAP 工具以两种方式支持扩展操作。所有客户端工具(ldapmodify,ldapsearch 及其他)都使用 -e-E 选项来发送扩展操作。-e 参数可用于任何 OpenLDAP 客户端工具,并发送有关操作的常规指令,如如何处理密码策略。-E 仅用于 ldapsearches,并传递更有用的控制,如 GER 搜索、排序和页面信息,以及其他非支持扩展操作的信息。
另外,OpenSSH 具有另一个工具 ldapexop,它专门用于执行扩展搜索操作,这与运行 ldapsearch -E 相同。
使用 ldapsearch 的扩展操作格式通常是:
-E extended_operation_type=operation_parameters
当 OpenLDAP 工具明确处理扩展操作时,extend _operation_type 可以是别名,如 deref 用于解引用搜索,或者 sss 用于服务器端排序。支持的扩展操作已格式化输出。其他扩展操作(如 GER 搜索)会使用其 OID 而不是别名传递,然后 extended_operation_type 是 OID。对于不支持的操作,工具无法识别服务器的响应,因此输出不会被格式化。
例如,pg 扩展操作类型会格式化结果:
# ldapsearch -x -D "cn=Directory Manager" -W -b "ou=Engineers,ou=People,dc=example,dc=com" -E pg=3 "(objectclass=*)" cn

dn: uid=jsmith,ou=Engineers,ou=People,dc=example,dc=com
   cn: John Smith

dn: uid=bjensen,ou=Engineers,ou=People,dc=example,dc=com
   cn: Barbara Jensen

dn: uid=hmartin,ou=Engineers,ou=People,dc=example,dc=com
   cn: Henry Martin

Results are sorted.
next page size (3): 5
ldapexop 相同的操作只能使用简单页面结果操作的 OID 运行,以及操作的设置(每个页面的3 结果):
ldapexop 1.2.840.113556.1.4.319=3
但是 ldapexop 不接受 ldapsearch 相同的搜索参数范围,使其更灵活。

A.2. 比较条目

ldapcompare 检查条目,以查看指定的条目或条目是否包含特定值的属性。例如,检查条目是否具有 sn 值 Smith:
# ldapcompare -D "cn=Directory Manager" -W -p 389 -h server.example.com -x sn:smith uid=bjensen,ou=people,dc=example,dc=com
comparing type: "sn" value: "smith" in entry "uid=bjensen,ou=people,dc=example,dc=com"
compare FALSE

ldapcompare -D "cn=Directory Manager" -W -p 389 -h server.example.com -x sn:smith uid=jsmith,ou=people,dc=example,dc=com
comparing type: "sn" value: "smith" in entry "uid=jsmith,ou=people,dc=example,dc=com"
compare TRUE
compare 属性可以通过三种方式之一指定:
  • 直接在命令行中传递的单个 attribute:value 语句
    sn:Smith
  • 直接在命令行中传递的单个 attribute::base64value 语句,用于 jpegPhoto 或验证证书或 CRL 等属性
    jpegPhoto:dkdkPDKCDdko0eiofk==
  • 一个 attribute:file 语句,指向包含属性比较值列表的文件,脚本则通过列表迭代
    postalCode:/tmp/codes.txt
比较操作本身必须针对特定的条目或一组条目运行。单个条目 DN 可以通过命令行传递,也可以使用 -f 选项指定要比较的 DN 列表。

例 A.1. 将一个属性值与一个条目进行比较

attribute-value 比较和 DN 均通过脚本传递。
ldapcompare -D "cn=Directory Manager" -W -p 389 -h server.example.com -x sn:smith uid=jsmith,ou=people,dc=example,dc=com
comparing type: "sn" value: "smith" in entry "uid=jsmith,ou=people,dc=example,dc=com"
compare TRUE

例 A.2. 比较文件中的列表属性值

首先,创建一个可能的 sn 值的文件。
jensen
johnson
johannson
jackson
jorgenson
然后,创建条目列表来比较值。
uid=jen200,ou=people,dc=example,dc=com
uid=dsj,ou=people,dc=example,dc=com
uid=matthewjms,ou=people,dc=example,dc=com
uid=john1234,ou=people,dc=example,dc=com
uid=jack.son.1990,ou=people,dc=example,dc=com
然后运行脚本。
# ldapcompare -D "cn=Directory Manager" -W -p 389 -h server.example.com -x sn:/tmp/surnames.txt -f /tmp/names.txt
comparing type: "sn" value: "jensen" in entry "uid=jen200,ou=people,dc=example,dc=com"
compare TRUE

A.3. 更改密码

ldappasswd 命令可以设置新的用户定义的密码,或者为帐户生成新密码。可能还需要其他设置(用于绑定信息、连接信息或其他命令设置),并在 OpenLDAP manpages 中列出。
# ldappasswd -x -D bind_dn -W -p server_port -h server_hostname [-A | -a oldPassword] [-S | -s newPassword] [user]
重要
密码更改操作必须在安全连接上运行,如 TLS、STARTTLS 或 SASL。有关如何为 LDAP 客户端配置 TLS 的详情,请参考 第 9.9.4 节 “使用证书进行身份验证”

例 A.3. 目录管理器更改用户的密码 Over TLS

Directory Manager 将用户 uid=tuser1 的密码更改为通过 TLS 的 new_password,ou=People,dc=example,dc=com
# ldappasswd -D "cn=Directory Manager" -W -ZZ -p 389 -h server.example.com -x -s new_password "uid=tuser1,ou=People,dc=example,dc=com"

例 A.4. 生成用户密码的目录管理器

Directory Manager 生成用户 uid=tuser2,ou=People,dc=example,dc=com 的密码,通过 TLS。
# ldappasswd -D "cn=Directory Manager" -W -ZZ -p 389 -h server.example.com -x "uid=tuser2,ou=People,dc=example,dc=com"

例 A.5. 用户更改密码

用户 tuser3,通过 TLS 将密码从 old_newpassword 更改为 new_password
# ldappasswd -p 389 -h server.example.com -ZZ -x -D "uid=tuser3,ou=People,dc=example,dc=com" -W -a old_password -s new_password

例 A.6. 使用 DIGEST_MD5 用户验证并更改 His 密码

用户 jsmith 使用 GSS-API 进行身份验证,并将密码更改为 new_password
# ldappasswd -p 389 -h server.example.com -O noplain,minssf=1,maxbufsize=512 -Y GSSAPI -U "dn:uid=jsmith,ou=people,dc=example,dc=com" -R EXAMPLE.COM -W -s new_password

例 A.7. 用户通过 Kerberos 提示验证新密码

已使用 Kerberos 验证的用户提示输入新密码。这不会通过 TLS 执行。
# ldappasswd -p 389 -h server.example.com -O noplain,minssf=1,maxbufsize=512 -I

A.4. 生成 LDAP URL

LDAP URL 在各种不同的配置区域和操作中使用:引用和串联、复制、同步、ACT 和索引,作为开始列表。构建准确的 LDAP URL 至关重要,因为不正确的 URL 可能会连接到错误的服务器,或者只是导致操作失败。另外,所有 OpenLDAP 工具都允许 -H 选项传递 LDAP URL,而不是其他连接信息(如主机名、端口、子树和搜索基础)。
注意
LDAP URL 在 附录 C, LDAP URL 中进行了描述。
ldapurl 命令以两种方式管理 URL:
  • 将给定的 LDAP URL 修正成其 constituent 元素
  • 从给定元素构建一个新的有效的 LDAP URL
使用 URL 的参数列在 表 A.1 “ldapurl 参数” 中;完整的参数列表位于 OpenLDAP manpages 中。

表 A.1. ldapurl 参数

选项 描述
用于声明 URL
-H "URL" 传递 LDAP URL 以划分成元素。
用于构造 URL
-a 属性 提供在搜索结果中特别返回的以逗号分隔的属性。
-b base 为 URL 设置搜索基础或子树。
-f filter 设置要使用的搜索过滤器。
-h hostname 提供目录服务器的主机名。
-p port 提供目录服务器的端口。
-S ldap|ldaps|ldapi 提供用于连接的协议,如 ldapldapsldapi
-s scope 提供搜索范围。

例 A.8. 声明 LDAP URL

ldapurl 使用 -H 选项在现有 LDAP URL 中 source,工具会返回 neat 列表中 URL 元素:
# ldapurl -H "ldap://:389/dc=example,dc=com?cn,sn?sub?(objectclass=inetorgperson)"
scheme: ldap
port: 389
dn: dc=example,dc=com
selector: cn
selector: sn
scope: sub
filter: (objectclass=inetorgperson)

例 A.9. 构建 LDAP URL

ldapurl 最有用的应用程序是手动构建有效的 LDAP URL。使用 ldapurl 确保 URL 有效。
ldapurl 接受所有 LDAP 客户端工具的常规连接参数,以及搜索基础、范围和属性的额外 ldapsearch 参数,但此工具永远不会连接到目录服务器实例,因此不需要任何绑定信息。它接受连接和搜索设置,并将其作为 URL 的元素提供。
ldapurl -a cn,sn -b dc=example,dc=com -s sub -f "(objectclass=inetorgperson)"

ldap://:389/dc=example,dc=com?cn,sn?sub?(objectclass=inetorgperson)

附录 B. LDAP 数据交换格式

Red Hat Directory Server (Directory Server)使用 LDAP 数据交换格式(LDIF)以文本格式描述目录和目录条目。LDIF 通常用于构建初始目录数据库,或者一次向目录添加大量条目。此外,LDIF 也用于描述目录条目的更改。因此,大多数目录服务器的命令行工具依赖于 LDIF 来进行输入或输出。
由于 LDIF 是文本文件格式,所以可以使用任何语言创建 LDIF 文件。所有目录数据都使用 Unicode 的 UTF-8 编码存储。因此,创建的 LDIF 文件还必须采用 UTF-8 编码。
有关使用 LDIF 修改目录条目的详情,请参考 第 3 章 管理目录条目

B.1. 关于 LDIF 文件格式

LDIF 由一个或多个由空白行分开的目录条目组成。每个 LDIF 条目由一个可选条目 ID、所需的区分名称、一个或多个对象类和多个属性定义组成。
LDIF 格式以 RFC 2849 定义,LDAP 数据交换格式(LDIF)。目录服务器符合此标准。
LDIF 中代表的目录条目的基本形式如下:
dn: distinguished_name 
objectClass: object_class 
objectClass: object_class 
...
 attribute_type[;subtype]:attribute_value
...
  • 每个 LDIF 条目都必须有一个 DN 和至少一个对象类定义。
  • 包括为条目定义的对象类所需的任何属性。
  • 所有其他属性和对象类都是可选的。
  • 对象类和属性可以按任何顺序指定。
  • 冒号后面的空格是可选的。
表 B.1 “LDIF 字段” 描述前面定义中显示的 LDIF 字段。

表 B.1. LDIF 字段

字段 定义
[id] 可选。代表条目 ID 的正十进制数字。数据库创建工具会自动生成此 ID。永远不会自行添加或编辑这个值。
dn: distinguished_name 指定条目的可分辨名称。
objectClass: object_class 指定要用于此条目的对象类。对象类标识条目允许和所需的属性类型或 schema。有关自定义模式的信息,请参阅 Red Hat Directory Server 11 Configuration, Command, and File Reference 来获得标准对象类列表和 第 12 章 管理目录架构
attribute_type 指定要与条目一起使用的描述性属性。属性应在架构中定义。有关自定义模式的信息,请参阅 Red Hat Directory Server 11 Configuration, Command, and File Reference 来获得标准属性列表和 第 12 章 管理目录架构
[subtype] 可选。指定子类型、语言、二进制或探测。使用此标签标识代表对应属性值的语言,或者属性值是二进制还是属性值的探测。有关支持的子类型标签的完整列表,请参阅 ???
attribute_value 指定要与属性类型一起使用的属性值。
注意
代表目录中条目的 LDIF 语法与 表 B.1 “LDIF 字段” 中描述的语法不同。有关使用 LDIF 修改目录条目的详情,请参考 第 3 章 管理目录条目

B.2. 在 LDIF 中继续行

在 LDIF 文件中,可以通过用一个空格缩进一行来破坏并继续(称为 Fold ed)行。例如,以下两个语句是相同的:
dn: cn=some_example_user,dc=example,dc=com

dn: cn=some_e
 xample_user,
 dc=example,d
 c=com
不需要中断并继续 LDIF 行。但是,这样做可以提高 LDIF 文件的可读性。通常的惯例是 LDIF 文件不包含超过 78 文本列。

B.3. 代表二进制数据

二进制数据(如 JPEG 镜像)使用两种方法之一(标准 LDIF 表示法或 base-64 编码)在 LDIF 中表示。

B.3.1. 标准 LDIF 表示法

标准 LDIF 表示法使用比(<)符号少的、表示数据是二进制的。例如:
jpegphoto: < file:/path/to/photo
使用这个标准表示法,不需要指定 ldapmodify -b 参数。但是,标准表示法要求将以下行添加到 LDIF 文件的开头或 LDIF 更新语句:
version: 1
例如:
# ldapmodify -x -D userDN -W

version: 1
dn: cn=Barney Fife,ou=People,dc=example,dc=com
changetype: modify
add: usercertificate
usercertificate;binary: < file: BarneysCert

B.3.2. base-64 Encoding

二进制数据可以转换为 base-64,可在 LDIF 文件中用于各种数据,从镜像转换为 TLS 证书。基本 64 编码的数据通过使用 :: 符号来识别。例如:
jpegPhoto::encoded_data 
除了二进制数据外,其他必须采用 base-64 编码的值包括:
  • 以冒号(:)或空格开头的任何值。
  • 包含非 ASCII 数据的任何值,包括新行。
使用带有 -b 参数的 ldif 命令行工具将二进制数据转换为 LDIF 格式:
# ldif -b attribute_name 
attribute_name 是提供二进制数据的属性的名称。二进制数据从标准输入读取,结果会写入标准输出。因此,使用重定向运算符选择输入和输出文件。
ldif 命令行工具将采用任何输入,并使用正确的行延和适当的属性信息对其进行格式化。ldif 工具还会评估输入是否需要 base-64 编码。例如:
# ldif -b jpegPhoto <  mark.jpg > out.ldif
本例使用含有 JPEG 格式的镜像的二进制文件,并将其转换为 jpegPhoto 属性的 LDIF 格式。输出被保存到 out.ldif
-b 选项指定 ldif 工具应将整个输入解释为单个二进制值。如果没有 -b,每行都将被视为单独的输入值。

B.4. 使用 LDIF 指定目录条目

很多类型的条目可以存储在目录中。本节侧重于一个目录中使用的三种最常见的条目:域、组织单元和机构人员条目。
为条目定义的对象类代表条目是否代表域或域组件、组织单元、机构人员或其他类型的条目。有关目录中默认可以使用的对象类的完整列表,以及最常用的属性列表,请参阅 红帽目录服务器 11 配置、命令和文件参考

B.4.1. 指定域条目

目录通常至少有一个域条目。通常这是目录中的第一个或最顶层的条目。域条目通常与目录的 DNS 主机和域名对应。例如,如果目录服务器主机名为 ldap.example.com,则目录的域条目可能命名为 dc=ldap,dc=example,dc=com,或者只是 dc=example,dc=com
用于定义域的 LDIF 条目如下所示:
dn: distinguished_name 
objectClass: top
objectClass: domain
dc: domain_component_name
 list_of_optional_attributes 
...
以下是 LDIF 格式的域条目示例:
dn: dc=example,dc=com
objectclass: top
objectclass: domain
dc: example
description: Fictional example company
LDIF 格式的域条目的每个元素都在 表 B.2 “域条目中的 LDIF 元素” 中定义。

表 B.2. 域条目中的 LDIF 元素

LDIF Element 描述
dn: distinguished_name 必需。指定条目的可分辨名称。
objectClass: top 必需。指定 顶级 对象类。
objectClass: domain 指定 对象类。此行将条目定义为域或域组件。有关可与这个对象类一起使用的属性列表,请参阅 Red Hat Directory Server 11 Configuration, Command, and File Reference。-->
dc: domain_component 指定域名的属性。服务器通常在初始设置过程中配置,并以 dc=hostname,dc=domain,dc=toplevel 的形式具有后缀或命名上下文。例如,dc=ldap,dc=example,dc=com。域条目应使用最旧的 dc 值,如 dc: ldap。如果后缀是 dc=example,dc=com,则 dc 值为 dc: example。除非服务器已配置为使用该后缀,否则不要为 dn: dc=com 创建条目。
list_of_attributes 指定要为该条目维护的可选属性列表。有关可用于此对象类 的属性列表,请参阅 Red Hat Directory Server 11 配置、命令和文件参考

B.4.2. 指定机构单元条目

机构单元条目通常用于表示目录树中的主要分支点或子目录。它们与企业内的主要、合理静态实体对应,如包含人员或包含组的子树的子树。
包含在该条目中的组织单元属性也可能代表了公司内的主要机构,如市场或工程。但是,不建议使用这个风格。红帽强烈建议使用扁平目录树。
通常,在目录树中通常会有多个机构单元或分支点。
定义机构单元条目的 LDIF 必须如下所示:
dn: distinguished_name 
objectClass: top
objectClass: organizationalUnit
ou: organizational_unit_name
 list_of_optional_attributes 
...
以下是 LDIF 格式的机构单元条目示例:
dn: ou=people,dc=example,dc=com
objectclass: top
objectclass: organizationalUnit
ou: people
description: Fictional example organizational unit
表 B.3 “机构单元条目中的 LDIF 元素” 定义 LDIF 格式的组织单元条目的每个元素。

表 B.3. 机构单元条目中的 LDIF 元素

LDIF Element 描述
dn: distinguished_name 指定条目的可分辨名称。需要 DN。如果 DN 中有一个逗号,则必须使用反斜杠(\)转义逗号,如 dn: ou=body,dc=example,dc=com
objectClass: top 必需。指定 顶级 对象类。
objectClass: organizationalUnit 指定 organizationalUnit 对象类。此行将条目定义为 组织单元。有关此对象类可用属性的列表,请参阅 Red Hat Directory Server 11 Configuration, Command, and File Reference
ou: organizational_unit_name 指定机构单元名称的属性。
list_of_attributes 指定要为该条目维护的可选属性列表。有关此对象类可用属性的列表,请参阅 Red Hat Directory Server 11 Configuration, Command, and File Reference

B.4.3. 指定机构人条目

目录中的大多数条目代表组织人员。
在 LDIF 中,组织人员的定义如下:
dn: distinguished_name 
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: common_name 
sn: surname
 list_of_optional_attributes
以下是 LDIF 格式的机构人员条目示例:
dn: uid=bjensen,ou=people,dc=example,dc=com
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Babs Jensen
sn: Jensen
givenname: Babs
uid: bjensen
ou: people
description: Fictional example person
telephoneNumber: 555-5557
userPassword: {SSHA}dkfljlk34r2kljdsfk9
表 B.4 “Person 条目中的 LDIF 元素” 定义 LDIF 人员条目的每个方面。

表 B.4. Person 条目中的 LDIF 元素

LDIF Element 描述
dn: distinguished_name 必需。指定条目的可分辨名称。例如,dn: uid=bjensen,ou=body,dc=example,dc=com。如果 DN 中有一个逗号,则必须使用反斜杠(\)转义逗号。
objectClass: top 必需。指定 顶级 对象类。
objectClass: person 指定 person 对象类。应包含此对象类规格,因为许多 LDAP 客户端在搜索个人或机构人员时需要它。
objectClass: organizationalPerson 指定 organizationalPerson 对象类。应包含此对象类规格,因为有些 LDAP 客户端在搜索机构人员期间需要它。
objectClass: inetOrgPerson 指定 inetOrgPerson 对象类。建议 inetOrgPerson 对象类创建机构人员条目,因为此对象类包含广泛的属性范围。此对象类需要 uid 属性,并且包含此对象类的条目会根据 uid 属性的值命名。有关此对象类可用属性的列表,请参阅 Red Hat Directory Server 11 Configuration, Command, and File Reference
cn: common_name 指定个人的通用名称,这是个人常用的全名。例如: cn: Bill Anderson。至少需要一个通用名称。
sn: surname 指定个人的姓氏或姓氏。例如,s n: Anderson。需要 surname。
list_of_attributes 指定要为该条目维护的可选属性列表。有关此对象类可用属性的列表,请参阅 Red Hat Directory Server 11 Configuration, Command, and File Reference

B.5. 使用 LDIF 定义目录

整个目录的内容可以使用 LDIF 来定义。当有很多条目添加到目录中时,使用 LDIF 是一个高效的目录创建方法。
使用 LDIF 创建目录:
  1. 创建包含以 LDIF 格式添加的条目的 ASCII 文件。
    确保每个条目都通过空行与下一个条目分开。在条目之间仅使用一行,并确保文件的第一行不为空,否则 ldapmodify 实用程序将退出。如需更多信息,请参阅 第 B.4 节 “使用 LDIF 指定目录条目”
  2. 使用数据库中的最顶层或 root 条目开始每个文件。
    根条目必须代表数据库中包含的后缀或子修复。例如,如果数据库具有后缀 dc=example,dc=com,则目录中的第一个条目必须是 dn: dc=example,dc=com
    有关后缀的详情,请查看 红帽目录服务器配置、命令和文件参考 中描述的"Suffix"参数。
  3. 确保一个条目代表 LDIF 文件中的分支点,然后再放置在该分支下创建的条目。
    例如,要将条目放在人员和组子树中,请在在这些子树中创建条目前为这些子树创建分支点。
    注意
    LDIF 文件按顺序读取,因此必须在子条目前列出父条目。
  4. 使用以下方法之一从 LDIF 文件创建目录:
    • 通过 Web 控制台初始化数据库。如果存在一个小的数据库要导入(小于 10,000 条目),则使用此方法。请参阅 第 6.1.3 节 “使用 Web 控制台导入数据”
      警告
      这个方法是破坏性的,将擦除后缀中的任何现有数据。
    • ldif2db 或 ldif2db.pl 命令行工具。如果存在要导入的大型数据库(超过 10,000 个条目),则使用此方法。请参阅 第 6.1.2.2 节 “导入服务器为 Offline 的数据”
      • 如果服务器正在运行,则无法使用 ldif2db
      • ldif2db.pl 只能在服务器运行时使用。
      警告
      这个方法是破坏性的,将擦除后缀中的任何现有数据。
    • 带有 -a 参数的 ldapmodify 命令行工具。如果新子树添加到现有数据库,或者后缀中存在不应删除的数据,则使用此方法。与从 LDIF 文件创建目录的其他方法不同,必须在使用 ldapmodify 添加子树前运行目录服务器。请参阅 第 3.1.3 节 “添加条目”

例 B.1. LDIF 文件示例

此 LDIF 文件包含一个域、两个机构单元和三个机构人员条目:
dn: dc=example,dc=com
objectclass: top
objectclass: domain
dc: example
description: Fictional example domain

dn: ou=People,dc=example,dc=com
objectclass: top
objectclass: organizationalUnit
ou: People
description: Fictional example organizational unit
tel: 555-5559

dn: cn=June Rossi,ou=People,dc=example,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: June Rossi
sn: Rossi
givenName: June
mail: rossi@example.com
userPassword: {sha}KDIE3AL9DK
ou: Accounting
ou: people
telephoneNumber: 2616
roomNumber: 220

dn: cn=Marc Chambers,ou=People,dc=example,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: Marc Chambers
sn: Chambers
givenname: Marc
mail: chambers@example.com
userPassword: {sha}jdl2alem87dlacz1
telephoneNumber: 2652
ou: Manufacturing
ou: People
roomNumber: 167

dn: cn=Robert Wong,ou=People,example.com Corp,dc=example,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: Robert Wong
cn: Bob Wong
sn: Wong
givenname: Robert
givenname: Bob
mail: bwong@example.com
userPassword: {sha}nn2msx761
telephoneNumber: 2881
roomNumber: 211
ou: Manufacturing
ou: people

dn: ou=Groups,dc=example,dc=com
objectclass: top
objectclass: organizationalUnit
ou: groups
description: Fictional example organizational unit

B.6. 以多种语言存储信息

如果目录包含单一语言,则不需要进行任何特殊操作来向该目录添加新条目。但是,如果一个机构是多语言的,则可能需要以多种语言存储信息,以便不同区域的用户可以使用自己的语言查看目录信息。
当目录中的信息以多种语言表示时,服务器会将语言标签与属性值相关联。添加新条目时,在没有语言代码的情况下,必须提供 RDN 中使用的属性值(相对区分名称,即 naming 属性)。
可以为单个属性存储多个语言。在这种情况下,属性类型相同,但每个值都有不同的语言代码。
有关目录服务器支持的语言列表及其关联的语言标签,请参阅 第 D.2 节 “支持的区域设置”
注意
语言标签不影响在目录中存储字符串的方式。所有对象类和属性字符串都使用 UTF-8 存储。用户负责将 LDIF 中使用的数据转换为 UTF-8。大多数操作系统提供的 iconvuconv 命令可用于将数据从原生字符集转换为 UTF-8。
例如,公司在美国和加拿大方面拥有办公室,希望员工能够以其原生语言查看目录信息。添加目录条目时,目录管理员选择在英语和法语中提供属性值。当为新员工添加目录条目 Babs Jensen 时,管理员执行以下操作:
  1. 管理员创建一个文件 street.txt,其带有法语 street 地址值:
    1 rue de l'Université
  2. 然后,文件内容转换为 UTF-8: :
    # iconv -t UTF-8 -o output.txt street.txt
  3. 以下 LDIF 条目是使用 street Address 的 street address 值的 UTF-8 值创建的;lang-fr
    dn: uid=bjensen,ou=people,dc=example,dc=com
    objectclass: top
    objectclass: person
    objectclass: organizationalPerson
    name: Babs Jensen
    cn: Babs Jensen
    sn: Jensen
    uid: bjensen
    streetAddress: 1 University Street
    streetAddress;lang-en: 1 University Street
    streetAddress;lang-fr:: AasljdoaAJASI023909jaASJaonasd0ADS
    preferredLanguage: fr
    属性 name 和 subtype 后双冒号表示该值采用二进制 base-64 编码。
使用设置为 English 的 LDAP 客户端访问此目录条目的用户会看到地址 1 发行者。使用首选语言设置为法语的 LDAP 客户端访问目录的用户会看到地址 1 rue de l'Université

附录 C. LDAP URL

LDAP URL 识别红帽目录服务器实例,类似于站点 URL 识别特定网站或网页的方式。当使用目录服务器实例的 LDAP URL 时,有三个常见的时间:
  • 使用基于 Web 的客户端访问目录服务器时,LDAP URL 用于识别特定的目录服务器实例。
  • LDAP URL 用于配置目录服务器引用。
  • LDAP URL 用于配置访问控制指令。
注意
RFC 4516 中描述了 LDAP URL 格式,该格式位于 http://www.ietf.org/rfc/rfc4516.txt

C.1. LDAP URL 的组件

ldap[s]://hostname:port/base_dn?attributes?scope?filter
也可以使用 IPv4 或 IPv6 地址而不是主机名。
ldap:// 协议用于通过不安全的连接连接到 LDAP 服务器,ldaps:// 协议则用于通过 TLS 连接连接到 LDAP 服务器。表 C.1 “LDAP URL 组件” 列出 LDAP URL 的组件。
注意
RFC 4516 中描述了 LDAP URL 格式,该格式位于 http://www.ietf.org/rfc/rfc4516.txt

表 C.1. LDAP URL 组件

组件 描述
主机名 LDAP 服务器的名称、IPv4、Ir IPv6 地址。例如: ldap.example.com192.0.2.90 或 [2001:db8::1]。
端口 LDAP 服务器的端口号(例如 696)。如果没有指定端口,则使用标准 LDAP 端口(389)或 LDAPS 端口(636)。
base_dn 目录中条目的可分辨名称(DN)。此 DN 标识搜索开始点的条目。如果没有指定基本 DN,搜索将从目录树的根目录开始。
属性 要返回的属性。要指定多个属性,请使用逗号分隔属性;例如 cn,mail,telephoneNumber。如果 URL 中没有指定属性,则返回所有属性。
scope 搜索的范围,可以是以下值之一:
Base 仅检索 URL 中指定的可分辨名称(base_dn)的信息。
一个 检索有关 URL 中指定的可分辨名称(base_dn)下方条目的信息。这个范围中没有包括基础条目。
sub 在 URL 中指定的可分辨名称(base_dn)下方检索有关条目的信息。基本条目包含在此范围内。
如果没有指定范围,服务器会执行基本 搜索
filter 应用到搜索指定范围内的条目的搜索过滤器。如果没有指定过滤器,服务器将使用过滤器 (objectClass=114)
属性、范围和过滤组件由 URL 中的位置标识。即使没有指定属性,仍必须包含问题标记来限制该字段。
例如,要指定一个从 dc=example,dc=com 开始的子树搜索,该搜索返回匹配条目的所有属性 (sn=Jensen),请使用以下 LDAP URL:
ldap://ldap.example.com/dc=example,dc=com??sub?(sn=Jensen)
连续两个问号 ?? 表示没有指定任何属性。由于 URL 中没有识别特定属性,所以搜索中的所有属性都会返回。

C.2. 转义 Unsafe Characters

URL 中的任何 不安全 字符都需要被转义,或使用特殊字符替换。
例如,空格是一个不安全字符,必须在 URL 中以 %20 表示。因此,可区分名称 o=example.com,必须编码为 o=example.com%20
下表列出了在 URL 中被视为不安全字符的字符,并提供相关的转义字符来代替不安全字符:
不安全的 Character 转义 Characters
space %20
< %3c
> %3e
" %22
# %23
% %25
{ %7b
} %7d
| %7c
\ %5c
^ %5e
~ %7e
[ %5b
] %5d
` %60

C.3. LDAP URL 示例

注意
RFC 4516 中描述了 LDAP URL 格式,该格式位于 http://www.ietf.org/rfc/rfc4516.txt

示例 1

以下 LDAP URL 指定用于可分辨名称 dc=example,dc=com 的条目的基本搜索。

ldap://ldap.example.com/dc=example,dc=com
  • 因为没有指定端口号,则会使用标准 LDAP 端口号(389)。
  • 因为没有指定属性,搜索会返回所有属性。
  • 因为没有指定搜索范围,所以搜索仅限于基本条目 dc=example,dc=com
  • 因为没有指定过滤器,目录使用默认的过滤器(objectclass=114)。

示例 2

以下 LDAP URL 使用 DN dc=example,dc=com 检索条目的 postalAddress 属性:

ldap://ldap.example.com/dc=example,dc=com?postalAddress
  • 因为没有指定搜索范围,所以搜索仅限于基本条目 dc=example,dc=com
  • 因为没有指定过滤器,目录使用默认的过滤器(objectclass=114)。

示例 3

以下 LDAP URL 为 Barbara Jensen 获取条目的 cn, mail, 和 telephoneNumber 属性:

ldap://ldap.example.com/cn=Barbara%20Jensen,dc=example,dc=com?cn,mail,telephoneNumber
  • 因为没有指定搜索范围,所以搜索仅限于基础条目 cn=Barbara Jensen,dc=example,dc=com
  • 因为没有指定过滤器,目录使用默认的过滤器 (objectclass=rhacm)

示例 4

以下 LDAP URL 指定搜索具有 surname Jensen 的条目,且位于 dc=example,dc=com 下的任何级别:

ldap://ldap.example.com/dc=example,dc=com??sub?(sn=Jensen)
  • 因为没有指定属性,搜索会返回所有属性。
  • 由于搜索范围是 ,所以搜索将基本条目 dc=example,dc=com 和条目位于基本条目下的所有级别。

5 示例

以下 LDAP URL 为 dc=example,dc=com 下一个级别指定对象类的搜索:

ldap://ldap.example.com/dc=example,dc=com?objectClass?one
  • 由于搜索范围是,所以搜索会将所有条目位于基础条目 dc=example,dc=com 下。搜索范围不包括基本条目。
  • 因为没有指定过滤器,目录使用默认的过滤器(objectclass=114)。
注意
LDAP URL 的语法不包括指定凭证或密码的任何方法。通过 LDAP URL 启动的搜索请求是未经身份验证的,除非支持 LDAP URL 的 LDAP 客户端提供了身份验证机制。

附录 D. 国际化

Red Hat Directory Server 允许用户以多种不同语言存储、管理和搜索条目及其关联的属性。国际目录可以是可靠的企业资源,为员工和商业合作伙伴提供熟悉他们了解的语言信息。
目录服务器默认支持所有国际字符集,因为目录数据存储在 UTF-8 中。此外,Directory 服务器可以根据搜索操作中的语言首选项使用指定的匹配规则和协调顺序。
注意
属性和对象类名称需要 ASCII 字符。

D.1. 关于区域设置

目录服务器通过使用 区域设置 提供对多种语言的支持。区域设置标识有关特定区域、技术或自定义预期数据的用户的信息,包括如何解释给定语言的数据以及如何对数据进行排序或 合并
另外,区域设置信息表示应使用什么代码页面来代表给定语言。代码页面是一个内部表,操作系统用来将键盘键与字符字体屏幕相关联。
更具体地说,一个区域设置定义了四个方面:
  • 校准订购。合并顺序提供关于如何排序给定语言字符的语言和特定于的信息。它可识别字母的字母序列等内容,如何将字母与字母与字母进行比较,而在比较字符串时可以忽略任何字符,以及比较字符串时可以忽略的任何字符。合并顺序也考虑有关语言的特定于语言的信息,例如读取语言的方向(从左到右、左到右、左到左和下线)。
  • 字符类型。字符类型将字母字符与数字或其他字符区分开。例如,在某些语言中,管道(|)字符被视为分页,而在其他语言中,它被视为字母。另外,它还定义大写字母到小写字母的映射。
  • 货币格式。货币格式指定特定区域使用的货币符号、符号是否在其值之前或之后,以及代表货币单位的方式。
  • 时间/日期格式。时间和日期格式指示区域中的时间和日期的自定义格式。时间和日期格式指示日期是以 mm/dd/yy (月、天、年份)或 dd/mm/yy (day、month、year)格式中的自定义日期,并指定给定语言和月的天数。例如,1996 年 1 月 10 日的日期表示为 10。在 zech10 janvier 1996 年 8 月 1996 日表示。
由于区域设置描述了除了机制语言差异外的城市、自定义和地区差异,因此目录数据都可以转换为用户理解的特定语言,并以给定区域中用户展示的方式显示。

D.2. 支持的区域设置

当执行需要指定区域设置的目录操作时,如搜索操作,请使用语言标签或合并顺序对象标识符(OID)。
语言标签 是一个字符串,以双字符小写语言代码开头,用于识别语言,如 ISO 标准 639 中定义的语言。如果需要区分语言中的区域差异,语言标签也可以包含国家代码的双字符字符串,如 ISO 标准 3166 中定义的。语言代码和国家代码通过连字符分隔。例如,用于识别盲体英语区域设置的语言标签是 en-GB
对象标识符 (OID)是一个十进制数字,用于唯一标识对象,如属性或对象类。用于搜索或索引国际化目录的 OID,用于标识目录服务器支持的特定合并顺序。例如,OID 2.16.840.1.113730.3.3.2.17.1 标识 Finnish collation order。
在目录中执行国际搜索时,请使用语言标签或 OID 来识别要使用的合并顺序。但是,在设置国际索引时,必须使用 OID。有关索引的更多信息,请参阅 第 13 章 管理索引
有关目录服务器支持的语言标签和 OID 列表,请查看 /etc/dirsrv/config/slapd-collations.conf 文件。

D.3. 支持的语言子类型

客户端可使用语言子类型来确定要搜索的特定值。有关使用语言子类型的详情,请参考 第 3.1.9 节 “更新国际化目录中的条目”表 D.1 “支持的语言子类型” 列出目录服务器支持的语言子类型。

表 D.1. 支持的语言子类型

语言标签 语言
af Afrikaans
be Belarusian
bg Bulgarian
ca Catalan
CS czech
da Danish
de 德语
el Greek
en English
es 西班牙语
eu Basque
fi Finnish
fo Faroese
fr 法语
GA Irish
gl Galician
HR Croatian
hu Hungarian
id 印度西亚
is Icelandic
it 意大利语
ja 日语
ko 韩语
nl 荷兰语
Norwegian
pl polish
pt 葡萄牙语
ro Romanian
ru 俄语
sk Slovak
sl Slovenian
sq albanian
SR Serbian
sv Swedish
tr Turkish
uk Ukrainian
zh 中文

D.4. 搜索国际目录

在执行搜索操作时,Directory 服务器可以根据服务器具有支持组合顺序的任何语言对结果进行排序。有关目录支持的合并顺序列表,请参阅 第 D.2 节 “支持的区域设置”
注意
执行国际化搜索需要 LDAPv3 搜索。因此,不要对 ldapsearch 的调用设置 LDAPv2 选项。
本节重点介绍使用匹配的规则过滤器返回国际属性值。有关常规 ldapsearch 语法的详情请参考 第 14.3 节 “LDAP 搜索过滤器”

D.4.1. 匹配规则格式

国际化的匹配规则过滤器可以通过以下几种方式表示,使用哪个是首选性:
  • 作为区域整合顺序的 OID,用于基础搜索。
  • 作为与协调顺序关联的语言标签,用于基础搜索。
  • 作为 Collation order 的 OID,以及一个代表关系运算符的后缀。
  • 作为与协调顺序关联的语言标签,以及一个代表关系运算符的后缀。
在以下部分中讨论每个选项的语法:

D.4.1.1. 将 OID 用于匹配规则

Directory 服务器支持的每个区域都有一个关联的合并顺序 OID。有关目录服务器支持的 OID 列表,请查看 /etc/dirsrv/config/slapd-collations.conf 文件。
合并顺序 OID 可以在匹配规则过滤器的匹配规则部分中使用,如下所示:
 attr:OID:=(relational_operator value)
关系运算符包含在字符串的值部分,用单个空格与值分开。例如,要在 Swedish collation 顺序搜索位于 N4709 的所有 departmentNumber 属性,请使用以下过滤器:
departmentNumber:2.16.840.1.113730.3.3.2.46.1:=>= N4709

D.4.1.2. 为匹配规则使用语言标签

目录服务器支持的每个区域设置都有一个关联的语言标签。有关 Directory 服务器支持的语言标签列表,请查看 /etc/dirsrv/config/slapd-collations.conf 文件。
语言标签可用于匹配规则过滤器的匹配规则部分,如下所示:
 attr:language-tag:=(relational_operator value)
关系运算符包含在字符串的值部分,用单个空格与值分开。例如,要使用西班牙语排序搜索所有带有 estudiante 值的 description 属性的目录,请使用以下过滤器:
cn:es:== estudiante

D.4.1.3. 为匹配规则使用 OID 和后缀

作为使用关系运算符值对的替代选择,将代表特定运算符的后缀附加到过滤器匹配规则部分中的 OID 中。将 OID 和后缀组合在一起,如下所示:
 attr: OID+suffix:=value
注意
这个语法仅由 mozldap 工具支持,而不支持 OpenLDAP 工具,如 ldapsearch
例如,要以 German collation 顺序搜索带有值 softwareproduktebusinessCategory 属性,请使用以下过滤器:
businessCategory:2.16.840.1.113730.3.3.2.7.1.3:=softwareprodukte
上例中的 .3 是相等的后缀。
有关目录服务器支持的 OID 列表,请查看 /etc/dirsrv/config/slapd-collations.conf 文件。有关关系运算符及其等效后缀的列表,请参阅 表 D.2 “搜索类型、Operator 和后缀”

D.4.1.4. 为匹配规则使用语言标签和后缀

作为使用关系运算符值对的替代选择,将代表特定运算符的后缀附加到过滤器匹配规则部分中的语言标签。组合语言标签和后缀,如下所示:
 attr: language-tag+suffix:=value
注意
这个语法仅由 mozldap 工具支持,而不支持 OpenLDAP 工具,如 ldapsearch
例如,要以法语排序搜索位于 La Salle 的所有 surnames,请使用以下过滤器:
sn:fr.4:=La Salle
有关 Directory 服务器支持的语言标签列表,请查看 /etc/dirsrv/config/slapd-collations.conf 文件。有关关系运算符及其等效后缀的列表,请参阅 表 D.2 “搜索类型、Operator 和后缀”

D.4.2. 支持的搜索类型

目录服务器支持以下类型的国际搜索:
  • 相等性(=)
  • substring (*)
  • greater-than (>)
  • greater-than 或 equal-to (>=)
  • less-than (<)
  • less-than 或 equal-to (<=)
大约或电话号码和存在搜索仅在英语中被支持。
与常规 ldapsearch 搜索操作一样,国际搜索使用运算符来定义搜索类型。但是,在调用国际搜索时,可以在过滤器的匹配规则部分中使用标准运算符(=、>=、>、<=),或者使用特殊的运算符类型,称为后缀(不与目录后缀混淆),在过滤器的匹配规则部分。表 D.2 “搜索类型、Operator 和后缀” 总结了每种搜索类型、运算符和等同的后缀。

表 D.2. 搜索类型、Operator 和后缀

搜索类型 Operator 后缀
less-than < .1
less-than 或 equal-to <= .2
相等 = .3
greater-than 或 equal-to >= .4
greater-than > .5
子字符串 * .6

D.4.3. 国际搜索示例

以下小节介绍了如何对目录数据执行国际搜索的示例。每个示例都提供了所有可能的匹配规则过滤器格式,以便您可以熟悉格式并选择最适合的匹配规则过滤器格式。

D.4.3.1. less-Than 示例

使用 less-than 运算符(<)或后缀(.1)执行特定于区域的搜索,或以特定 collation 顺序搜索在给定属性之前的所有属性值。
例如,要搜索在西班牙语订购中的 surname Marquez 之前的所有 surnames,以下任何匹配的规则过滤器都可以正常工作:
sn:2.16.840.1.113730.3.3.2.15.1:=< Marquez
...
sn:es:=< Marquez
...
sn:2.16.840.1.113730.3.3.2.15.1.1:=Marquez
...
sn:es.1:=Marquez

D.4.3.2. less-Than 或 Equal-to Example

使用 less-than 或 equal-to 操作符(<=)或后缀(.2)搜索特定区域属性的所有属性值,以特定协调顺序搜索在给定属性下的所有特定于区域的搜索。
例如,要搜索在 Hungarian 合作顺序的 CZ422 空间号或之前的所有空间号,以下匹配规则过滤器可以正常工作:
roomNumber:2.16.840.1.113730.3.3.2.23.1:=<= CZ422
...
roomNumber:hu:=<= CZ422
...
roomNumber:2.16.840.1.113730.3.3.2.23.1.2:=CZ422
...
roomNumber:hu.2:=CZ422

D.4.3.3. 相等示例

使用与运算符(=)相同的区域搜索,或后缀(.3)以特定匹配顺序搜索与给定属性匹配的所有属性值。
例如,要搜索所有带有值为 softwareprodukte 值的 businessCategory 属性(在过期顺序),以下匹配规则过滤器可以正常工作:
businessCategory:2.16.840.1.113730.3.3.2.7.1:==softwareprodukte
...
businessCategory:de:== softwareprodukte
...
businessCategory:2.16.840.1.113730.3.3.2.7.1.3:=softwareprodukte
...
businessCategory:de.3:=softwareprodukte

D.4.3.4. greater-Than 或 Equal-to Example

执行一个特定与本地化的搜索,使用大于或等于运算符 (>=) 或后缀 (.4) 搜索根据一个特定的 collation 顺序位于给定属性或属性后的所有属性值。
例如,要以法语排序顺序搜索 Québec 间或之后的所有本地化,以下任何匹配的规则过滤器都将正常工作:
locality:2.16.840.1.113730.3.3.2.18.1:=>= Québec
...
locality:fr:=>= Québec
...
locality:2.16.840.1.113730.3.3.2.18.1.4:=Québec
...
locality:fr.4:=Québec

D.4.3.5. 更大的示例

使用较大的操作符(>)或后缀(.5)执行特定于区域搜索的搜索,以特定并发顺序搜索给定属性的所有属性值。
例如,要在主机 schranka4 后以 Czech collation 顺序搜索所有邮件主机,以下任何匹配的规则过滤器都将正常工作:
mailHost:2.16.840.1.113730.3.3.2.5.1:=> schranka4
...
mailHost:cs:=> schranka4
...
mailHost:2.16.840.1.113730.3.3.2.5.1.5:=schranka4
...
mailHost:cs.5:=schranka4

D.4.3.6. 子字符串示例

执行国际子字符串搜索,按指定顺序搜索与给定模式匹配的所有值。
例如,要搜索以中文 协调 顺序结束的所有用户 ID,以下任何匹配规则过滤器都可以正常工作:
uid:2.16.840.1.113730.3.3.2.49.1:=* *ming
...
uid:zh:=* *ming
...
uid:2.16.840.1.113730.3.3.2.49.1.6:=* *ming
..
uid:zh.6:=* *ming
使用 DN 值属性(如 modifiersNamememberOf )的子字符串搜索过滤器在过滤器包含一个或多个空格字符时并不总是正确匹配条目。
要临时解决这个问题,请使用过滤器中的整个 DN 而不是子字符串,或者确保过滤器中的 DN 子字符串从 RDN 边界开始;也就是说,请确保它以 DN 的 type= 部分开头。例如,不应使用这个过滤器:
(memberOf=*Domain Administrators*)
但是其中任何一个将正常工作:
(memberOf=cn=Domain Administrators*)
...
(memberOf=cn=Domain Administrators,ou=Groups,dc=example,dc=com)

D.5. 匹配规则故障排除

国际协调顺序匹配规则的行为可能并不一致。某些形式的 match-rule 调用无法正常工作,从而生成不正确的搜索结果。例如,以下规则无法正常工作:
# ldapsearch -x -p 389 -D "uid=userID,ou=people,dc=example,dc=com" -W -b "dc=example,dc=com" "sn:2.16.840.1.113730.3.3.2.7.1:=passin"

ldapsearch -x -p 389 -D "uid=userID,ou=people,dc=example,dc=com" -W -b "dc=example,dc=com" "sn:de:=passin"
但是,以下列出的规则将正常工作(请注意 passin 值前的 .3 ):
# ldapsearch -x -p 389 -D "uid=userID,ou=people,dc=example,dc=com" -W -b "dc=example,dc=com" "sn:2.16.840.1.113730.3.3.2.7.1.3:=passin"

ldapsearch -x -p 389 -D "uid=userID,ou=people,dc=example,dc=com" -W -b "dc=example,dc=com" "sn:de.3:=passin"

附录 E. 修订历史记录

请注意,修订号与该手册版本相关,而不是与 Red Hat Directory Server 的版本号相关。
修订历史
修订 11.5-1Tue May 10 2022Marc Muehlfeld
本指南的 Red Hat Directory Server 11.5 发行版本。
修订 11.4-1Tue Nov 09 2021Marc Muehlfeld
本指南的 Red Hat Directory Server 11.4 发行版本。
修订 11.3-1Tue May 11 2021Marc Muehlfeld
本指南的 Red Hat Directory Server 11.3 发行版本。
修订 11.2-1Tue Nov 03 2020Marc Muehlfeld
本指南的 Red Hat Directory Server 11.2 发行版本。
修订 11.1-1Tue Apr 28 2020Marc Muehlfeld
本指南的 Red Hat Directory Server 11.1 发行版本。
修订 11.0-1Tue Nov 05 2019Marc Muehlfeld
本指南的 Red Hat Directory Server 11.0 发行版本。

法律通告

Copyright © 2021 Red Hat, Inc.
本文档由红帽根据 Creati ve Commons Attribution-ShareAlike 3.0 Unported License 许可。如果您发布本文档或修改的版本,则必须向 Red Hat, Inc. 提供相关内容,并提供到原始链接。如果修改了文档,则必须删除所有红帽商标。
作为本文档的许可者,红帽可能会放弃强制制执行 CC-BY-SA 第4d 条款,且不声明该条款在适用条款允许的最大限度内有效。
Red Hat、Red Hat Enterprise Linux、SVVP 徽标、红帽徽标、JBoss、OpenShift、Fedora、Infinity 商标,Red Hat, Inc. 在美国和其他国家的注册商标。
Linux® 是 Linus Torvalds 在美国和其它国家的注册商标。
Java® 是 Oracle 和/或其关系的注册商标。
XFS® 是 Silicon Graphics International Corp. 或其子公司在美国和/或其他国家的商标。
MySQL® 是 MySQL AB 在美国、美国和其他国家的注册商标。
Node.js® 是 Joyent 的官方商标。红帽与官方 Joyent Node.js 开源社区或商业项目没有正式关联。
OpenStack® Word Mark 和 OpenStack 徽标是 OpenStack Foundation 在美国及其他国家的注册商标/服务标记或商标/服务标记,可根据 OpenStack Foundation 授权使用。我们不附属于 OpenStack Foundation 或 OpenStack 社区。
所有其他商标均由其各自所有者所有。