管理指南


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. 启用插件。请参阅