管理指南
使开源更多包含
红帽承诺替换我们的代码、文档和网页属性中存在问题的语言。我们从这四个术语开始: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 控制台中打开目录服务器:
- 使用浏览器连接到在 Directory Server 主机的端口 9090 上运行的 Web 控制台。例如:
https://server.example.com:9090
- 以
root
用户身份登录,或以具有sudo
权限的用户身份登录。 - 选择
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 控制台启动、停止或重启实例。
要启动、停止或重启目录服务器实例:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 点按钮并选择要执行的操作:
- 启动实例
- 停止实例
- 重启实例
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 控制台删除实例:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 单击 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 属性名称映射:
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 协议的端口号:
- 另外,还可显示实例当前配置的端口号:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config get nsslapd-port nsslapd-secureport nsslapd-port: 389 nsslapd-secureport: 636
- 更改 LDAP 端口:
- 设置 LDAP 协议的端口。例如,将其设置为
1389
:# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-port=1389 Successfully replaced "nsslapd-port"
- 为您在上一步中分配的 LDAP 端口设置
ldap_port_t
类型:# semanage port -a -t ldap_port_t -p tcp 1389
- 更改 LDAPS 端口:
- 设置 LDAPS 协议的端口。例如,将其设置为
1636
:# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-secureport=1636 Successfully replaced "nsslapd-secureport"
- 为您在上一步中分配的 LDAPS 端口设置
ldap_port_t
类型:# semanage port -a -t ldap_port_t -p tcp 1636
- 重启实例:
# dsctl instance_name restart
1.9.2. 使用 Web 控制台更改端口号
使用 Web 控制台更改 LDAP 和 LDAPS 协议的端口号:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 更改 LDAP 端口:
- 打开菜单。
- 在 Server Settings 选项卡中,将新端口号填写到 LDAP Port 字段中。
- 点击。
- 更改 LDAPS 端口:
- 打开菜单。
- 在 General Settings 选项卡中,将新端口号填写到 LDAPS Port 字段中。
- 点击。
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
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 控制台显示所有可用插件:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择菜单。
另外,您可以通过在 Filter Plugins 字段中输入名称来过滤插件。
1.10.2. 启用和禁用插件
1.10.2.1. 使用命令行启用和禁用插件
要使用命令行启用或禁用插件,请使用 dsconf 实用程序。
注意
dsconf 命令要求您提供插件的名称。有关显示所有插件名称的详情,请参考 第 1.10.1.1 节 “使用命令行列出可用的插件”。
例如,要启用自动 成员 插件:
- 启用插件:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin automember enable
- 重启实例:
# dsctl instance_name restart
1.10.2.2. 使用 Web 控制台启用和禁用插件
使用 Web 控制台启用或禁用插件:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择菜单。
- 选择 All Plugins 选项卡。
- 点击您要启用或禁用的插件右侧的按钮。
- 将状态更改为 ON,以启用或设置为 OFF 来禁用插件。
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
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 控制台配置插件:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择菜单。
- 选择 All Plugins 选项卡。
- 选择插件并单击 Show Advanced Settings。
- 打开特定于插件的选项卡。
- 设置适当的设置。
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
1.10.4. 设置插件优先级
插件优先级是其按照插件执行顺序的优先级。对于预和发布插件,这可让在启动下一个插件前执行和完成插件,以便下一个插件利用以前的插件的结果。
优先级可以设置为从 1(最高优先级)到 99(最低优先级)。如果没有设置任何优先级,则默认为 50。
警告
仅在自定义插件中设置优先级值。更新核心插件的值可能会导致 Directory 服务器无法正常工作,不受红帽支持。
1.10.4.1. 使用命令行设置插件优先级
使用命令行更新插件的优先级值:
- 设置插件的优先级。例如,要将
示例
插件的优先级设置为 1 :# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin edit example --precedence 1
- 重启实例:
# dsctl instance_name restart
1.10.4.2. 使用 Web 控制台设置插件优先级
使用 Web 控制台更新插件的优先级值:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择 All Plugins。
- 按您要为其配置优先级值的插件旁边的按钮。
- 更新 Plugin Precedence 字段中的值。
- 点击。
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
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
:设置用于 PLAIN 或 EXTERNAL 的 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 后缀:
- 可选:识别已在使用的后缀和后端数据库:
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list dc=example,dc=com (userroot)
括号中的名称是存储对应后缀数据的后端数据库。在下一步中创建 root 后缀时,您无法使用现有数据库名称。 - 在
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 后缀:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 点。
- 输入后缀 DN 和后端名称。例如:
- 选择 Create The Top Suffix Entry。
- 点。
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 子后缀:
- 可选:识别已在使用的后缀和后端数据库:
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list dc=example,dc=com (userroot)
括号中的名称是存储对应后缀数据的后端数据库。在下一步中创建子命令时,您无法使用现有数据库名称。 - 创建子命令。例如,要创建 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 控制台创建新的子修复:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择您要创建子跟踪的后缀,单击,然后选择 。
- 输入子修复 DN 和后端名称。例如:
- 选择 Create The Top Sub-Suffix Entry。
- 点。
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 后缀:
- 显示后缀及其对应的后端:
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list dc=example,dc=com (userroot) o=test (test_database)
这个命令显示每个后缀旁的后端数据库名称。下一步需要后缀的数据库名称。 - 禁用后缀:
# 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 后缀:
- 显示后缀及其对应的后端:
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list dc=example,dc=com (userroot) o=test (test_database)
这个命令显示每个后缀旁的后端数据库名称。下一步需要后缀的数据库名称。 - 删除后端数据库和对应的后缀:
# 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 控制台删除后缀:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择后缀,单击 Delete Suffix。,然后选择
- 单击以确认。
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 条目中。添加新数据库:
- 运行 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 的数据。 - 创建 root 或子修复,如 第 2.1.1.1.1 节 “使用命令行创建根后缀” 和 第 2.1.1.2.1 节 “使用命令行创建子修复” 所述。DN 属性中给出的数据库名称必须与后缀条目的
nsslapd-backend
属性中的值对应。
2.2.1.2. 为单个后缀添加多个数据库
单个后缀可以在多个数据库之间分布。但是,若要分发后缀,必须创建自定义分发功能来扩展目录。有关创建自定义发布功能的更多信息,请联系红帽咨询。
注意
分发条目后,无法重新分发它们。适用以下限制:
- 部署条目分发后无法更改分发功能。
- 如果将 LDAP modrdn 操作分发到不同的数据库中,则无法使用 LDAP modrdn 操作来重命名条目。
- 无法复制分布式本地数据库。
- 如果将它们分发到不同的数据库中,则无法使用 ldapmodify 操作来更改条目。
违反这些限制可防止目录服务器正确查找和返回条目。
创建自定义分发逻辑插件后,将其添加到目录中。
分发逻辑是后缀中声明的功能。对于到达这个后缀的每个操作都会调用此功能,包括在后缀上面启动的子树搜索操作。可使用 Web 控制台和命令行界面将分发功能插入到后缀中。
在后缀中添加自定义发布功能:
- 运行 ldapmodify。
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
- 在后缀条目本身中添加以下属性,提供有关自定义分发逻辑的信息:
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
后缀的数据库:
- 显示后缀及其对应的后端:
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list dc=example,dc=com (userroot) o=test (test_database)
这个命令显示每个后缀旁的后端数据库名称。下一步需要后缀的数据库名称。 - 以只读模式设置数据库:
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix set --enable-readonly "test_database"
2.2.2.1.2. 使用 Web 控制台在只读模式下设置数据库
以只读模式设置数据库:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择后缀条目。
- 选择 Database Read-Only Mode。
- 单击。
2.2.2.2. 将 Entire 目录服务器置于只读模式
如果目录服务器维护多个数据库,且所有数据库都需要放在只读模式下,则可以在单个操作中完成此操作。
警告
此操作还使目录服务器配置为只读;因此,您无法更新服务器配置、启用或禁用插件,甚至重启目录服务器,即使它处于只读模式。启用只读模式后,除非您手动修改配置文件,否则 无法撤消。
注意
如果目录服务器包含副本,请不要使用 只读模式,因为它将禁用复制。
2.2.2.2.1. 使用命令行将 Entire Directory Server 置于只读模式
为目录服务器启用只读模式:
- 将
nsslapd-readonly
参数设置为 on :# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-readonly=on
- 重启实例:
# dsctl instance_name restart
2.2.2.2.2. 使用 Web 控制台将 Entire Directory Server 置于只读模式
为目录服务器启用只读模式:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开 Server Settings 条目。菜单,然后选择
- 在 Advanced Settings 选项卡中,选择 Server Read-Only。
- 点击 Save。
2.2.2.3. 删除数据库
如果不再需要后缀,您可以删除存储后缀的数据库。
2.2.2.3.1. 使用命令行删除数据库
要删除数据库,可使用 dsconf backend delete 命令。例如,要删除
o=test
后缀的数据库:
- 显示后缀及其对应的后端:
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list dc=example,dc=com (userroot) o=test (test_database)
在下一步中,您需要后端数据库的名称(在后缀旁边显示)。 - 删除数据库:
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend delete "test_database"
2.2.2.3.2. 使用 Web 控制台删除数据库
使用 Web 控制台删除数据库:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择要删除的后缀,单击 Delete Suffix。,然后选择
- 单击以确认。
2.2.2.4. 更改交易日志目录
事务日志可让 Directory 服务器在实例意外关闭后恢复数据库。在某些情况下,管理员想要更改事务日志的路径。例如,要将它们存储在与目录服务器数据库不同的物理磁盘中。
注意
要实现更高的性能,请将一个更快的磁盘挂载到包含事务日志的目录,而不是更改位置。详情请查看 红帽目录服务器性能调优指南 中的相应部分。
更改事务日志目录的位置:
- 停止目录服务器实例:
# dsctl instance_name stop
- 为事务日志创建新位置。例如:
# mkdir -p /srv/dirsrv/instance_name/db/
- 设置权限,使其只启用 Directory 服务器访问该目录:
# chown dirsrv:dirsrv /srv/dirsrv/instance_name/db/ # chmod 770 /srv/dirsrv/instance_name/db/
- 从以前的事务日志目录中删除所有
__db
the 文件。例如:# rm /var/lib/dirsrv/slapd-instance_name/db/__db.*
- 将
所有日志站
文件从之前移到新的事务日志目录中。例如:# mv /var/lib/dirsrv/slapd-instance_name/db/log.* \ /srv/dirsrv/instance_name/db/
- 如果 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/
- 编辑
/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/
- 启动实例:
# dsctl instance_name start
2.3. 创建和维护数据库链接
链 意味着服务器代表客户端应用程序联系其他服务器,然后返回组合结果。链是通过 数据库链接 来实施的,指向远程存储的数据。当客户端应用程序从数据库链接请求数据时,数据库链接会从远程数据库检索数据并将其返回到客户端。
有关链的常规信息,请参阅 红帽目录服务器部署指南中的"Designing Directory Topology"一章。第 21.8 节 “监控数据库链接活动” 描述如何监控数据库链接活动。
2.3.1. 创建新数据库链接
基本数据库链路配置需要以下信息:
- 后缀信息。后缀是在由数据库链接管理的目录树中创建的,而不是常规数据库。这个后缀与包含数据的远程服务器上的后缀对应。
- 绑定凭证。当数据库链接绑定到远程服务器时,它会模拟用户,这指定了用于与远程服务器绑定的每个数据库链接的 DN 和凭证。
- LDAP URL。这提供了数据库链接连接到的远程服务器的 LDAP URL。URL 由协议(ldap 或 ldaps)、服务器的主机名或 IP 地址(IPv4 或 IPv6)组成,以及端口。
- 故障转移服务器列表。这提供了在出现故障时要联系的数据库链接的替代服务器列表。这个配置项是可选的。
注意
如果简单密码验证需要安全绑定(第 20.12.1 节 “需要安全绑定”),则任何串联操作都将失败,除非它们通过安全连接发生。建议使用安全连接(TLS 和 STARTTLS 连接或 SASL 身份验证)。
2.3.1.1. 使用命令行创建新数据库链接
若要创建新数据库链接,可使用 dsconf chaining link-create 命令。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com chaining link-create --suffix="ou=Customers,dc=example,dc=com" --server-url="ldap://remote_server.example.com:389" --bind-mech="" --bind-dn="cn=proxy_user,cn=config" --bind-pw="password" "example_chain_name"
这会为
ou=Customers,dc=example,dc=com
创建名为 example_chain_name
的数据库链接。该链接引用服务器 ldap://remote_server.example.com:389
,并使用指定的绑定 DN 和密码进行验证。由于 --bind-mech 被设置为空,所以链接将使用简单的身份验证。
注意
要为 proxy_user 授予访问数据的权限,您必须在远程服务器上的
dc=example,dc=com
后缀中创建 proxy ACI 条目。如何进行此操作,请参阅该部分 第 2.3.1.4 节 “创建数据库链接时所需设置的附加信息”
要显示创建数据库链接时您可以设置的额外设置,请参阅:
# dsconf -D "cn=Directory Manager" ldap://server.example.com chaining link-create --help
2.3.1.2. 使用 Web 控制台创建新数据库链接
要创建新数据库链接:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 按照 第 2.1.1 节 “创建后缀” 所述创建新后缀。
- 选择后缀,单击 Create Database Link。,然后选择
- 使用与远程服务器连接的详细信息填充字段。例如:
- 单击。
2.3.1.3. 管理新数据库链接的默认配置
使用 dsconf chaining 命令,您可以管理数据库链接的默认配置。
要显示当前的默认值,请参阅:
# dsconf -D "cn=Directory Manager" ldap://server.example.com chaining config-get-def
要更改新的数据库链接配置,请使用 dsconf chaining config-set-def 命令。例如,要将
response-delay
参数设置为 30
,请运行:
# dsconf -D "cn=Directory Manager" ldap://server.example.com chaining config-set-def --response-delay 30
示例命令为所有链连接设置默认响应超时。如果使用 dsconf instance chaining link-set 命令,您可以覆盖特定链链接的响应超时。
要查看您可以设置的所有参数的列表,请运行:
# dsconf -D "cn=Directory Manager" ldap://server.example.com chaining config-set-def --help
2.3.1.4. 创建数据库链接时所需设置的附加信息
后缀信息
后缀定义由数据库链接管理的后缀。
绑定凭证
对于从客户端应用程序链到远程服务器的请求,可以为客户端应用程序提供特殊的绑定凭据。这为远程服务器提供链操作所需的代理授权权限。如果没有绑定凭证,数据库链接将绑定到远程服务器作为 匿名。
例如,客户端应用程序向服务器 A 发送请求。服务器 A 包含一个数据库链接,它将请求链接到 Server B 上的数据库。
服务器 A 上的数据库链接使用特殊用户和密码绑定到服务器 B:
服务器 B 必须包含一个用户条目,并为此用户设置代理身份验证权限。要正确设置代理授权,请将代理 ACI 设置为任何其他 ACI。
警告
启用链以避免对目录受限区域的访问权限时,请仔细检查访问控制。例如,如果在分支上创建默认代理 ACI,使用数据库链接连接的用户可以查看分支下的所有条目。在有些情况下,用户应当查看所有子树。为避免安全漏洞,请创建额外的 ACI 来限制对子树的访问。
有关 ACI 的更多信息,请参阅 第 18 章 管理访问控制。
注意
当客户端应用程序使用数据库链接来创建或修改条目时,属性
creatorsName
和 modifiersName
不会反映条目的实际创建者或修饰符。这些属性包含授予远程数据服务器上的代理授权权限的管理用户的名称。
提供绑定凭证涉及远程服务器中的以下步骤:
- 为数据库链接创建一个管理用户,如
cn=proxy_user,cn=config
。有关添加条目的详情,请参考 第 3 章 管理目录条目。 - 为上一步中创建的管理用户提供代理访问权限,以由数据库链接串联到的子树上。有关配置 ACI 的更多信息,请参阅 第 18 章 管理访问控制例如,以下 ACI 授予对
cn=proxy_admin,cn=config
用户的只读访问权限,以便仅访问设置 ACI 的子树中包含的数据。aci: (targetattr = "*")(version 3.0; acl "Proxied authorization for database links"; allow (proxy) userdn = "ldap:///cn=proxy_admin ,cn=config";)
注意
当用户绑定到数据库链接时,用户的身份将发送到远程服务器。始终在远程服务器上评估访问控制。要让用户成功修改或写入远程服务器,请在远程服务器上设置正确的访问控制。有关如何在串联操作上下文中评估访问控制的更多信息,请参阅 第 2.3.3 节 “数据库链接和访问控制评估”。
LDAP URL
在包含数据库链接的服务器上,识别数据库链接使用 LDAP URL 与之连接的远程服务器。与标准 LDAP URL 格式不同,远程服务器的 URL 没有指定后缀。它的格式是 ldap://host_name:port。
对于使用 TLS 连接到远程服务器的数据库链接,远程服务器的 LDAP URL 使用协议 LDAPS,而不是 URL 中的 LDAP,并指向服务器的安全端口。例如:
ldaps://africa.example.com:636/
注意
TLS 必须在本地目录服务器和远程目录服务器上启用,才能通过 TLS 串联。有关启用 TLS 的更多信息,请参阅 第 9.4 节 “启用 TLS”。
当数据库链接和远程服务器配置为使用 TLS 进行通信时,这并不表示发出操作的客户端应用程序也必须使用 TLS 进行通信。客户端可以使用普通端口绑定。
绑定机制
本地服务器可以使用几种不同的连接类型和身份验证机制连接到远程服务器。
本地服务器可以连接到远程服务器的三种方法:
- 通过标准 LDAP 端口
- 通过专用 LDAPS 端口
- 使用 STARTTLS,这是标准端口的安全连接
注意
如果简单密码验证需要安全绑定(第 20.12.1 节 “需要安全绑定”),则任何串联操作都将失败,除非它们通过安全连接发生。建议使用安全连接(TLS 和 STARTTLS 连接或 SASL 身份验证)。
本地服务器可用于向场服务器进行身份验证有四个不同的方法。
- 空 :如果没有设置绑定机制,则服务器会执行简单的身份验证,并且需要绑定 DN 和密码。
- EXTERNAL :这使用 TLS 证书向远程服务器验证场服务器。场服务器 URL 必须设置为安全 URL (ldaps),或者
nsUseStartTLS
属性必须设置为 on。此外,必须将远程服务器配置为将场服务器的证书映射到其绑定身份,如 Red Hat Directory Server Configuration、命令和文件参考 中的 certmap.conf 部分所述。 - DIGEST-MD5 :这会使用带有 DIGEST-MD5 加密的 SASL 身份验证。与简单的身份验证一样,这需要
nsMultiplexorBindDN
和nsMultiplexorCredentials
属性来提供绑定信息。 - GSSAPI :这通过 SASL 使用基于 Kerberos 的身份验证。场服务器必须配置有 Kerberos keytab,而远程服务器必须具有为场服务器的绑定身份定义的 SASL 映射。第 9.10 节 “设置 SASL 身份映射” 中描述了设置 Kerberos keytab 和 SASL 映射。
注意
SASL 连接可以通过标准连接或 TLS 连接建立。
注意
如果使用 SASL,则必须将本地服务器配置为串联 SASL 和密码策略组件。为数据库链路配置添加组件,如 第 2.3.2 节 “配置链策略” 所述。
2.3.2. 配置链策略
这些步骤描述了配置客户端应用程序向包含数据库链接的目录服务器发出的 Directory 服务器链请求。这个链策略适用于 Directory 服务器上创建的所有数据库链接。
2.3.2.1. 链组件操作
组件是使用内部操作的服务器中任何功能单元。例如,插件被视为组件,如前端中的功能一样。但是,插件可能实际上由多个组件组成(如 ACI 插件)。
有些组件向服务器发送内部 LDAP 请求,预期仅访问本地数据。对于这样的组件,控制链策略,以便组件可以成功完成其操作。一个例子是证书验证功能。串联由函数发出的 LDAP 请求,以检查证书意味着远程服务器可以被信任。如果远程服务器不被信任,则存在安全问题。
默认情况下,所有内部操作都不会被串联,但不允许组件链,尽管这可以被覆盖。
另外,必须在远程服务器上创建一个 ACI,以允许指定的插件在远程服务器上执行其操作。ACI 必须存在于分配给 数据库链接的后缀 中。
以下列表列出了组件名称、允许它们串联内部操作的潜在副作用,以及它们在远程服务器上的 ACI 中所需的权限:
- ACI 插件
- 此插件实现访问控制。用于检索和更新 ACI 属性的操作不会被串联,因为它无法安全地混合本地和远程 ACI 属性。但是,通过设置 chaining components 属性可以串联用于检索用户条目的请求:
nsActiveChainingComponents: cn=ACI Plugin,cn=plugins,cn=config
权限:读、搜索和比较 - 资源限制组件
- 此组件根据用户绑定 DN 设置服务器限制。如果允许限制组件链,则可以在远程用户上应用资源限值。要串联资源限制组件操作,请添加 chaining component 属性:
nsActiveChainingComponents: cn=resource limits,cn=components,cn=config
权限:读、搜索和比较 - 基于证书的验证检查组件
- 使用外部绑定方法时使用此组件。它从远程服务器上的数据库检索用户证书。允许此组件链意味着基于证书的身份验证可以使用数据库链接。要串联此组件的操作,请添加 chaining component 属性:
nsActiveChainingComponents: cn=certificate-based authentication,cn=components,cn=config
权限:读、搜索和比较 - 密码策略组件
- 此组件用于允许 SASL 绑定到远程服务器。某些形式的 SASL 身份验证需要使用用户名和密码进行身份验证。启用密码策略允许服务器验证并实施请求的特定身份验证方法,并应用适当的密码策略。要串联此组件的操作,请添加 chaining component 属性:
nsActiveChainingComponents: cn=password policy,cn=components,cn=config
权限:读、搜索和比较 - SASL 组件
- 此组件用于允许 SASL 绑定到远程服务器。要串联此组件的操作,请添加 chaining component 属性:
nsActiveChainingComponents: cn=password policy,cn=components,cn=config
权限:读、搜索和比较 - 参考完整性插件
- 此插件可确保对包含 DN 的属性的更新传播到包含属性指针的所有条目。例如,当删除属于组成员的条目时,该条目会自动从组中删除。将这个插件与链搭配使用有助于简化在组成员远程到静态组定义时管理静态组。要串联此组件的操作,请添加 chaining component 属性:
nsActiveChainingComponents: cn=referential integrity postoperation,cn=plugins,cn=config
权限:读、搜索和比较 - 属性唯一插件
- 此插件检查指定属性的所有值是否都是唯一的(无重复)。如果串联了此插件,它将确认属性值是唯一的,即使通过数据库链接更改的属性也是如此。要串联此组件的操作,请添加 chaining component 属性:
nsActiveChainingComponents: cn=attribute uniqueness,cn=plugins,cn=config
权限:读、搜索和比较 - 角色组件
- 此组件串联了数据库中条目的角色和角色分配。串联此组件即使在串联的数据库中维护角色。要串联此组件的操作,请添加 chaining component 属性:
nsActiveChainingComponents: cn=roles,cn=components,cn=config
权限:读、搜索和比较
注意
无法串联以下组件:
- 角色插件
- 密码策略组件
- 复制插件
- 参考完整性插件
在发出链请求的服务器上启用引用完整性插件时,请确保分析性能、资源和时间需求,以及完整性需求。完整性检查可能需要耗时,并在内存和 CPU 上排空。有关 ACI 和链的限制的更多信息,请参阅 第 18.5 节 “ACI 的限制”。
2.3.2.1.1. 使用命令行串联组件操作
添加允许链的组件:
- 指定要包含在链中的组件。例如,要配置引用完整性组件可以链操作:
# dsconf -D "cn=Directory Manager" ldap://server.example.com chaining config-set \ --add-comp="cn=referential integrity postoperation,cn=components,cn=config"
如需了解可串联的组件列表,请参阅 第 2.3.2.1 节 “链组件操作”。 - 重启实例:
# dsctl instance_name restart
- 在远程服务器的后缀中创建一个 ACI,它将会被串联。例如,要为参考完整性插件创建 ACI:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h remoteserver.example.com -x dn: ou=People,dc=example,dc=com changetype: modify add: aci aci: (targetattr = "*")(target="ldap:///ou=customers,l=us,dc=example,dc=com") (version 3.0; acl "RefInt Access for chaining"; allow (read,write,search,compare) userdn = "ldap:///cn=referential integrity postoperation,cn=plugins,cn=config";)
2.3.2.1.2. 使用 Web 控制台串联组件操作
添加允许链的组件:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开选项卡。
- 在左侧的导航中,选择条目。
- 单击 Components to Chain 字段下的 按钮。
- 选择组件,然后点。
- 在远程服务器的后缀中创建一个 ACI,它将会被串联。例如,要为参考完整性插件创建 ACI:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h remoteserver.example.com -x dn: ou=People,dc=example,dc=com changetype: modify add: aci aci: (targetattr = "*")(target="ldap:///ou=customers,l=us,dc=example,dc=com") (version 3.0; acl "RefInt Access for chaining"; allow (read,write,search,compare) userdn = "ldap:///cn=referential integrity postoperation,cn=plugins,cn=config";)
2.3.2.2. 链 LDAP 控制
无法串联 LDAP 控制发出的操作请求。默认情况下,由以下控制发出的请求由数据库链接转发到远程服务器:
- 虚拟列表视图(VLV)。此控制提供了部分条目列表,而不是返回所有条目信息。
- 服务器端排序。此控制根据其属性值对条目进行排序,通常使用特定的匹配规则。
- 解引用。此控制从引用的条目中拉取指定的属性信息,并使用其余的搜索结果返回此信息。
- 管理的 DSA。这个控制将智能引用返回为条目,而不是遵循引用,因此可以更改或删除智能引用。
- 循环检测。此控制可跟踪服务器链与其他服务器链的次数。当计数达到配置的数量时,会检测到循环,并通知客户端应用程序。有关使用这个控制的详情请参考 第 2.4.3 节 “检测循环”。
注意
只有在向单个数据库发出客户端应用程序请求时,才支持服务器端排序和 VLV 控制。当客户端应用程序向多个数据库发出请求时,数据库链接无法支持这些控制。
下表中列出了可以串联的 LDAP 控制及其 OID:
控制名称 | OID |
---|---|
虚拟列表视图(VLV) | 2.16.840.1.113730.3.4.9 |
服务器端排序 | 1.2.840.113556.1.4.473 |
管理的 DSA | 2.16.840.1.113730.3.4.2 |
循环检测 | 1.3.6.1.4.1.1466.29539.12 |
解引用搜索 | 1.3.6.1.4.1.4203.666.5.16 |
2.3.2.2.1. 使用命令行串联 LDAP 控制
要 串联 LDAP 控制,请使用 dsconf 链 config-set --add-control 命令。例如,要转发虚拟列表视图控制:
# dsconf -D "cn=Directory Manager" ldap://server.example.com chaining \ config-set --add-control="2.16.840.1.113730.3.4.9"
如果目录服务器的客户端创建自己的控制,并且其操作应串联到远程服务器,请添加自定义控制的对象标识符(OID)。
有关可以串联及其 OID 的 LDAP 控制列表,请参阅 表 2.1 “LDAP 控制和过期 OID”。
2.3.2.2.2. 使用 Web 控制台串联 LDAP 控制
使用 Web 控制台串联 LDAP 控制:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择条目。
- 单击 Forwarded LDAP Controls 字段下的 按钮。
- 选择 LDAP 控制并点击。如果目录服务器的客户端创建自己的控制,并且其操作应串联到远程服务器,请添加自定义控制的对象标识符(OID)。有关可以串联及其 OID 的 LDAP 控制列表,请参阅 表 2.1 “LDAP 控制和过期 OID”。
- 点击。
2.3.3. 数据库链接和访问控制评估
当用户绑定到包含数据库链接的服务器时,数据库链接会将用户的身份发送到远程服务器。始终在远程服务器上评估访问控制。远程服务器上评估的每个 LDAP 操作都使用代理授权控制传递的客户端应用的原始身份。只有当用户在远程服务器中包含的子树上具有正确的访问控制时,才能在远程服务器上成功操作。这需要将常见的访问控制添加到远程服务器中,但有一些限制:
- 并非所有类型的访问控制均可使用。例如,基于角色的访问控制的 ACI 需要访问用户条目。由于数据可以通过数据库链接访问,因此只能验证代理控制中的数据。考虑以确保用户条目位于与用户数据相同的数据库中设计目录。
- 基于客户端的 IP 地址或 DNS 域的所有访问控制可能无法正常工作,因为客户端的原始域在串联过程中会丢失。远程服务器将客户端应用程序视为位于同一 IP 地址,并在与数据库链接相同的 DNS 域中查看。注意目录服务器支持 IPv4 和 IPv6 IP 地址。
以下限制适用于与数据库链接一起使用的 ACI:
- ACI 必须位于它们使用的任何组。如果组是动态的,则组中的所有用户都必须位于 ACI 和组中。如果组是静态的,它会链接到远程用户。
- ACI 必须位于他们使用的任何角色定义中,以及希望具有这些角色的任何用户。
- 如果用户是远程,则链接到用户条目值(如 userattr 主题规则)的值的 ACI 将可以正常工作。
虽然远程服务器上始终评估访问控制,但也可以在包含数据库链接和远程服务器的服务器上评估它们。这会产生几个限制:
- 在访问控制评估过程中,用户条目的内容不一定可用(例如,如果在包含数据库链接的服务器上评估访问控制,且条目位于远程服务器上)。出于性能原因,客户端无法进行远程参与和评估访问控制。
- 数据库链接不一定能够访问客户端应用程序修改的条目。在执行修改操作时,数据库链接无法访问远程服务器上存储的完整条目。如果执行删除操作,数据库链接仅了解条目的 DN。如果访问控制指定了特定属性,则通过数据库链接执行时删除操作将失败。
注意
默认情况下,不会评估包含数据库链接的服务器上的访问控制。要覆盖此默认值,请使用 cn=database_link, cn=chaining database,cn=plugins,cn=config 条目中的
nsCheckLocalACI
属性。但是,不建议评估包含数据库链接的服务器上的访问控制,但级联链除外。
2.4. 配置 Cascading 链
数据库链接可以配置为指向另一个数据库链接,从而创建一个级联链操作。每当需要多个跃点才能访问目录树中的所有数据时,就会发生级联链。
2.4.1. Cascading Chaining 概述
当目录需要多个跃点来处理客户端应用程序的请求时,会发生级联链。
客户端应用程序向服务器 1 发送修改请求。服务器包含一个数据库链接,它将操作转发到 Server 2,其中包含另一个数据库链接。Server 2 上的数据库链接将操作转发到服务器 3,其中包含客户端要在数据库中修改的数据。需要两个跃点来访问客户端要修改的数据的片段。
在正常操作请求中,客户端绑定到服务器,然后评估应用到该客户端的任何 ACI。使用级联链时,客户端绑定请求会在 Server 1 上评估,但应用到客户端的 ACI 仅在请求链到目标服务器(在上例中是 Server 2)后进行评估。
例如,在 Server A 上,目录树被分割:
root 后缀 dc=example,dc=com 和 ou=people 和 ou=groups 自后缀存储在 Server A 中。ou=europe,dc=example,dc=com 和 ou=groups 后缀存储在 Server B 中,ou=europe,dc=example,dc=com 后缀的ou=people 分支存储在 Server C 中。
在服务器 A、B 和 C 上配置级联,即 ou=body ,ou=europe,dc=example,dc=com 条目的目标客户端请求将按如下方式路由:
首先,客户端绑定到 Server A 并通过 Database Link 1 链到 Server B。然后,使用 Database Link 2 连接到 Server C 上的目标数据库,以访问 ou=body ,ou=europe,dc=example,dc=com 分支中的数据。由于目录至少需要两个跃点来提供客户端请求,这被视为级联链。
2.4.2. 使用命令行配置 Cascading Chaining
本节提供了如何使用三个服务器配置级联链的示例,如下图所示:
服务器 1 中的配置步骤
- 创建后缀 c=africa,ou=body,dc=example,dc=com :
# dsconf -D "cn=Directory Manager" ldap://server1.example.com backend create --parent-suffix="ou=people,dc=example,dc=com" --suffix="c=africa,ou=people,dc=example,dc=com"
- 创建 DBLink1 数据库链接:
# dsconf -D "cn=Directory Manager" ldap://server1.example.com chaining link-create --suffix="c=africa,ou=people,dc=example,dc=com" --server-url="ldap://africa.example.com:389/" --bind-mech="" --bind-dn="cn=server1 proxy admin,cn=config" --bind-pw="password" --check-aci="off" "DBLink1"
- 启用循环检测:
# dsconf -D "cn=Directory Manager" ldap://server1.example.com chaining config-set --add-control="1.3.6.1.4.1.1466.29539.12"
服务器 2 中的配置步骤
- 在服务器 2 中为服务器 1 创建代理管理用户,以用于代理授权:
# ldapadd -D "cn=Directory Manager" -W -p 389 -h server2.example.com -x dn: cn=server1 proxy admin,cn=config objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson cn: server1 proxy admin sn: server1 proxy admin userPassword: password description: Entry for use by database links
重要出于安全考虑,请不要使用cn=Directory Manager
帐户。 - 创建后缀 ou=Zanzibar,c=africa,ou=body,dc=example,dc=com :
# dsconf -D "cn=Directory Manager" ldap://server2.example.com backend create --parent-suffix="c=africaou=people,dc=example,dc=com" --suffix="ou=Zanzibar,c=africa,ou=people,dc=example,dc=com"
- 创建 DBLink2 数据库链接:
# dsconf -D "cn=Directory Manager" ldap://server2.example.com chaining link-create --suffix="ou=Zanzibar,c=africa,ou=people,dc=example,dc=com" --server-url="ldap://zanz.africa.example.com:389/" --bind-mech="" --bind-dn="server2 proxy admin,cn=config" --bind-pw="password" --check-aci="on "DBLink2"
由于DBLink2
链接是级联链配置中的中间数据库链接,所以启用 ACL 检查以允许服务器检查是否允许客户端和服务器访问数据库链接。 - 启用循环检测:
# dsconf -D "cn=Directory Manager" ldap://server2.example.com chaining config-set --add-control="1.3.6.1.4.1.1466.29539.12"
- 启用代理授权控制:
# dsconf -D "cn=Directory Manager" ldap://server2.example.com chaining config-set --add-control="2.16.840.1.113730.3.4.12"
- 添加本地代理授权 ACI:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server2.example.com -x dn: c=africa,ou=people,dc=example,dc=com changetype: modify add: aci aci:(targetattr="*")(target="lou=Zanzibar,c=africa,ou=people,dc=example,dc=com") (version 3.0; acl "Proxied authorization for database links"; allow (proxy) userdn = "ldap:///cn=server1 proxy admin,cn=config";)
- 添加一个 ACI,在 server 1 上启用 c=us,ou=body,dc=example,dc=com 中的带有
uid
属性设置的用户,以便在服务器 3 的 ou=Zanzibar,c=africa,ou=people,dc=example,dc=com 后缀数中执行任何类型的操作:# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server2.example.com -x dn: c=africa,ou=people,dc=example,dc=com changetype: modify add: aci aci:(targetattr="*")(target="ou=Zanzibar,c=africa,ou=people,dc=example,dc=com") (version 3.0; acl "Client authorization for database links"; allow (all) userdn = "ldap:///uid=*,c=us,ou=people,dc=example,dc=com";)
如果服务器 3 上的用户在不同的后缀下,则需要在服务器 3 上添加额外的权限,则需要在服务器 2 上添加额外的客户端 ACI。
服务器 3 中的配置步骤
- 在服务器 3 上为服务器 2 创建代理管理用户,以用于代理授权:
# ldapadd -D "cn=Directory Manager" -W -p 389 -h server3.example.com -x dn: cn=server2 proxy admin,cn=config objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson cn: server2 proxy admin sn: server2 proxy admin userPassword: password description: Entry for use by database links
重要出于安全考虑,请不要使用cn=Directory Manager
帐户。 - 添加本地代理授权 ACI:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server3.example.com -x dn: ou=Zanzibar,ou=people,dc=example,dc=com changetype: modify add: aci aci: (targetattr = "*")(version 3.0; acl "Proxied authorization for database links"; allow (proxy) userdn = "ldap:///cn=server2 proxy admin,cn=config";)
- 添加一个 ACI,在 server 1 上启用 c=us,ou=body,dc=example,dc=com 中的带有
uid
属性设置的用户,以便在服务器 3 的 ou=Zanzibar,c=africa,ou=people,dc=example,dc=com 后缀数中执行任何类型的操作:# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server3.example.com -x dn: ou=Zanzibar,ou=people,dc=example,dc=com changetype: modify add: aci aci: (targetattr ="*")(target="ou=Zanzibar,c=africa,ou=people,dc=example,dc=com") (version 3.0; acl "Client authentication for database link users"; allow (all) userdn = "ldap:///uid=*,c=us,ou=people,dc=example,dc=com";)
如果服务器 3 上的用户在不同的后缀下,则需要在服务器 3 上添加额外的权限,则需要在服务器 2 上添加额外的客户端 ACI。
现在设置了级联链配置。此级联配置可让用户绑定到服务器 1,并修改服务器 3 上的 ou=Zanzibar,c=africa,ou=body,dc=example,dc=com 分支中的信息。根据您的安全需求,可能需要提供更详细的访问控制。
2.4.3. 检测循环
目录服务器中包含的 LDAP 控制可防止循环。当第一次尝试链时,服务器会将这个控制设置为允许的最大跃点数或链连接数。每个后续服务器都会减少计数。如果服务器收到 0 计数,它会确定是否已检测到循环并通知客户端应用程序。
要使用控制,请添加 1.3.6.1.4.1.1466.29539.12 OID。有关添加 LDAP 控制的详情,请参考 第 2.3.2.2 节 “链 LDAP 控制”。如果每个数据库链接的配置文件中没有控制,则不会实施循环检测。
允许的跃点数量使用
nsHopLimit
参数定义。默认情况下,该参数设为 10。例如,要将 example
链的跃点限制设置为 5 :
# dsconf -D "cn=Directory Manager" ldap://server.example.com chaining link-set --hop-limit 5 example
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. 使用命令行创建后缀引用
创建后缀引用:
- (可选)创建 root 或子修复(如果尚不存在)。详情请查看 第 2.1.1 节 “创建后缀”。
- 将引用添加到后缀。例如:
# 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 控制台创建后缀引用
创建后缀引用:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- (可选)创建 root 或子修复(如果尚不存在)。详情请查看 第 2.1.1 节 “创建后缀”。
- 选择列表中的后缀,并打开 referrals 选项卡。
- 点。
- 填写字段以创建引用 URL。
- 点。
2.6. 验证后端数据库的完整性
dsctl dbverify 命令可让管理员验证后端数据库的完整性。例如,验证
userroot
数据库:
- 另外,还可列出实例的后端数据库:
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend suffix list dc=example,dc=com (userroot)
稍后的步骤需要数据库的名称。 - 停止 Directory 服务器实例:
# dsctl instance_name stop
- 验证数据库:
# 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
- 如果验证过程报告任何问题,请手动修复或恢复备份。
- 启动 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. 使用互动模式提供输入
在交互模式中,ldapadd、ldapmodify 和 ldapdelete 工具会从命令行读取输入。要退出互动模式,请按 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 文件提供输入
在交互模式中,ldapadd、ldapmodify 和 ldapdelete 工具从文件中读取 LDIF 语句。使用此模式向目录服务器发送大量 LDIF 语句。
例 3.3. 将带有 LDIF 声明的文件传递给 ldapmodify
- 使用 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 条目。 - 使用
-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
选项传给 ldapadd 和 ldapmodify。例如:
# ldpamodify -c -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
3.1.3. 添加条目
要在目录中添加新条目,请使用 ldapadd 或 ldapmodify 工具。请注意,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-1234567 的
telephoneNumber
属性:
# 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-1234567 的
telephoneNumber
属性:
# 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
有关
deleteOldRDN
的详情,请参考 第 3.1.6.3 节 “使用 LDIF 声明重命名条目时 deleteOldRDN
参数”。
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
有关
deleteOldRDN
的详情,请参考 第 3.1.6.3 节 “使用 LDIF 声明重命名条目时 deleteOldRDN
参数”。
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
重要
请注意,:和 < ; 之间 没有空格。
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
。
流程
- 在 Web 控制台中,打开菜单,以显示现有后缀的列表。
- 使用或 视图,展开您要创建用户的父条目
ou=body,dc=example,dc=com
。 - 点并选择 以打开向导窗口。
- 选择选项,再点 。
- 对于用户条目,选择type,然后单击 。
- 可选: 选择附加属性,如
userPassword
,然后点 。您可以通过在步骤名称旁扩展下拉列表来查看所有选择的属性。 - 为每个属性设置一个值:
- 点属性的铅笔图标并添加值。请注意,当您设置
userPassword
值时,会打开一个单独的菜单。该值用星号填充,以隐藏纯文本。 - 单击检查按钮以保存更改。
- 可选:点→ 来设置附加属性值。
- 设置所有值后,点。
- 验证所有条目详细信息是否正确,然后单击。目录服务器为 POSIX 用户创建具有强制属性的条目,并将密码设置为它。您可以点击 来修改条目设置,或者点击 来取消创建条目。
- 查看,然后点 。
验证
- 导航到→ 。
- 选择包含该条目的数据库后缀,如
dc=example,cd=com
。 - 在字段中输入您的搜索条件,如
John
,然后按 键。 - 在条目列表中找到您最近创建的条目。
3.2.2. 使用 Web 控制台编辑 LDAP 条目
您可以使用 Web 控制台修改目录条目。这个示例修改用户条目
cn=John Smith,ou=body,dc=example,dc=com
:
- 添加电话号码
556778987
和556897445
。 - adding email
jsmith@example.com
. - 更改密码。
先决条件
已登陆到 Directory Server web 控制台。
流程
- 在 Web 控制台中,打开菜单,以显示现有后缀的列表。
- 使用或 视图,展开您要编辑的条目,如
cn=John Smith,ou=body,dc=example,dc=com
。 - 点并选择 以打开向导窗口。
- 可选:在步骤中,为该条目添加或删除对象类。点 。
- 在步骤中,将
telephoneNumber
和mail
属性添加到该条目,然后单击 。如果您没有看到您要添加到条目的属性,这意味着您没有在上一步中添加对应的对象类。注意在这一步中,您无法删除所选对象类的强制属性。 - 在步骤中,将
telephoneNumber
设置为556778987
和556897445
,mail
改为jsmith@example.com
并更改userPassword
值:- 单击属性的铅笔图标,并添加或更改新值。
- 单击检查按钮以保存更改。
- 可选:点→ 来为属性设置额外的值。本例中的
telephoneNumber
属性有两个值。设置所有值时,点 。
- 检查您的更改并点击。
- 若要编辑该条目,请单击。您可以点击 来修改条目设置,或者点击 来取消条目编辑。
- 查看然后单击 。
验证
- 展开条目详情,并查看新更改会出现在条目属性中。
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 控制台。
流程
- 在 Web 控制台中,打开菜单,以显示现有后缀的列表。
- 使用或 视图,展开您要修改的条目,如
cn=John Smith,ou=body,dc=example,dc=com
。 - 点并选择 来打开向导窗口。
- 在步骤中:
- 为命名属性
cn
设置一个新的值Tom Smith
,然后单击 。 - 可选:从下拉菜单中选择另一个命名属性。
- 可选:在您要删除旧条目并使用新 RDN 创建新条目时,选择。
- 在步骤中,选择新位置的父条目,然后单击 。
- 检查您对条目所做的更改,然后点。
- 如果条目详情正确,点。您可以点击 对条目进行其他更改,或者点击 来取消条目修改。
- 检查并点 。
验证
- 展开条目详情并查看更新的条目。
3.2.4. 使用 Web 控制台删除 LDAP 条目
您可以使用 Web 控制台删除目录条目或子树。这个示例删除条目
cn=Tom Smith,ou=clients,dc=example,dc=com
。
先决条件
已登陆到 Directory Server web 控制台。
流程
- 在 Web 控制台中,打开菜单,以显示现有后缀的列表。
- 使用或 视图,展开您要删除的条目,如
cn=Tom Smith,ou=clients,dc=example,dc=com
。 - 点并选择 以打开向导窗口。
- 在查看您要删除的条目的数据后,点。
- 在步骤中,将开关切换到 position,然后单击 。您可以点击 来取消删除条目。
- 查看,然后单击 。
验证
- 导航到→ 。
- 选择之前存在条目的后缀,如
dc=example,cd=com
。 - 在字段中输入您的搜索条件,如
Tom
,然后按 键。 - 验证删除的条目不再存在。
第 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 插件:
- 使用
dsconf
工具启用插件:# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin usn enable
- 重启实例:
# dsctl instance_name restart
4.1.2.2. 使用 Web 控制台启用 USN 插件
使用 Web 控制台启用 USN 插件:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择菜单。
- 选择 USN 插件。
- 将状态更改为 ON 以启用插件。
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
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 功能的当前状态:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择菜单。
- 选择 USN 插件。
- 验证 On。开关是否已设置为
4.1.3.2. 启用全球美国
4.1.3.2.1. 使用命令行启用全局 USN
使用命令行启用全局 USN :
- 启用全局 USN:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin usn global on
- 重启实例:
# dsctl instance_name restart
4.1.3.2.2. 使用 Web 控制台启用全局 USN
使用 Web 控制台启用全局 USN:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择 USN 插件。
- 将插件的状态更改为 On。
- 将 USN Global 状态更改为 On。
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
4.1.4. 清理 USN Tombstone 条目
当删除该条目时,USN 插件会将条目移到 tombstone 条目。如果启用了复制,则 USN 和 Replication 插件都会保留单独的 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 条目:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择 USN 插件。
- 按按钮。
- 填写字段,然后按。
4.2. 通过过期属性跟踪条目修改
使用默认设置,Directory 服务器会为每个条目跟踪以下操作属性:
creatorsName
:最初创建该条目的用户的可分辨名称(DN)。createTimestamp
:创建条目时,Greenwich Mean Time (GMT)格式的时间戳。modifiersName
:上次修改条目的用户的可分辨名称。modifyTimestamp
:最后一次修改条目时 GMT 格式的时间戳。
请注意,操作属性不会在默认搜索中返回。您必须在查询中明确请求这些属性。详情请查看 第 14.4.7 节 “搜索过期属性”。
重要
红帽建议不要禁用跟踪这些操作属性。如果禁用,条目不会获得在
nsUniqueID
属性中分配的唯一 ID,且复制不起作用。
4.2.1. 数据库链接修改或创建的条目
当通过数据库链接创建或修改条目时,Creatings
Name
和 modifiersName
属性包含在远程服务器上授予代理授权权限的用户的名称。在这种情况下,属性不显示条目的原始创建者或最新的修饰符。但是,访问日志会显示代理用户(dn)和原始用户(authzid)。例如:
[23/May/2018:18:13:56.145747965 +051800] conn=1175 op=0 BIND dn="cn=proxy admin,ou=People,dc=example,dc=com" method=128 version=3 [23/May/2018:18:13:56.575439751 +051800] conn=1175 op=0 RESULT err=0 tag=97 nentries=0 etime=0 dn="cn=proxy admin,ou=people,dc=example,dc=com" [23/May/2018:18:13:56.744359706 +051800] conn=1175 op=1 SRCH base="dc=example,dc=com" scope=2 filter="(objectClass=*)" attrs=ALL authzid="uid=user_name,ou=People,dc=example,dc=com"
4.2.2. 启用修改的跟踪
默认情况下,Directory 服务器跟踪操作属性中的修改。
注意
红帽建议不要禁用此功能。
这部分论述了如何在禁用该功能时重新启用修改跟踪。
4.2.2.1. 使用命令行启用跟踪修改
使用命令行重新启用条目修改的跟踪:
- 将
nsslapd-lastmod
参数设置为 on :# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-lastmod=on
- (可选)要重新生成缺少的
nsUniqueID
属性:- 将数据库导出到 LDAP 数据交换格式(LDIF)文件中。请参阅 第 6.2.1 节 “使用命令行将数据导出到 LDIF 文件中”。
- 从 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
参数可让服务器跟踪哪个用户源自更新操作,以及实际执行它的内部插件。绑定的用户显示在 修饰符
和 创建者
操作属性中,而执行它的插件则显示在 internalModifiersname
和 internalCreatorsname
操作属性中。例如:
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
参数跟踪和维护绑定用户与为该连接执行的任何更新之间的关系。
注意
internalModifiersname
和 internalCreatorsname
属性始终以身份的形式显示插件。此插件可以是额外的插件,如 MemberOf 插件。如果更改由核心目录服务器完成,则插件是数据库插件 cn=ldbm database,cn=plugins,cn=config。
4.3.1. 使用命令行为插件发起的更新启用跟踪 DN
使用命令行为插件发起的更新启用跟踪绑定 DN:
- 将
nsslapd-plugin-binddn-tracking
参数设置为 on :# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-plugin-binddn-tracking=on
- 重启实例:
# dsctl instance_name restart
4.3.2. 使用 Web 控制台为插件初始更新启用跟踪 DN
使用 Web 控制台为插件更新启用跟踪绑定 DN:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开 Server Settings 条目。菜单,然后选择
- 在 Advanced Settings 选项卡中,选择 Enable Plugin Bind DN Tracking。
- 点击。
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
4.4. 跟踪密码更改时间
密码更改操作通常被视为对条目的任何其他修改,因此更新时间记录在
最后
修改的操作属性中。但是,有时可能需要单独记录上次密码更改的时间,以便更轻松地在 Active Directory 同步中更新密码或与其他 LDAP 客户端连接。
密码策略中的
passwordTrackUpdateTime
属性告知服务器最后一次为条目更新密码的时间戳。密码更改时间本身作为操作属性存储在用户条目 pwdUpdateTime
上(与 modifyTimestamp
或 lastModified
ified 操作属性分开)。
passwordTrackUpdateTime
属性可以设置为全局密码策略的一部分或子树或用户级别策略,具体取决于客户端需要访问密码更改时间。第 20.4 节 “管理密码策略” 中描述了设置密码策略。
第 5 章 维护参考完整性
参考完整性 是一种数据库机制,可确保维护相关条目之间的关系。在目录服务器中,可以使用引用完整性来确保对目录中一个条目的更新正确反映在引用更新条目的任何其他条目中。
例如,如果从目录中删除了用户条目,并且启用了引用完整性,服务器也会从该用户所属的任何组中删除该用户。如果没有启用引用完整性,则用户会保持组成员,直到管理员手动删除为止。如果要将目录服务器与其他依赖目录进行用户和组管理的产品集成,则这是一个重要功能。
5.1. 参考完整性的工作方式
启用 参考完整性后插件后,它会在删除或重命名操作 后立即对指定属性执行完整性更新。默认情况下,参考完整性后 插件被禁用。
注意
您必须在多层次复制环境中在所有供应商上启用 参考完整性后 插件。
当您删除、重命名或移动目录中的用户或组条目时,操作将记录到参考完整性日志文件。对于日志文件中的可分辨名称(DN),目录服务器会按照插件配置中设置的属性搜索和更新:
- 对于条目,在日志文件中标记为已删除,会删除目录中的对应属性。
- 对于条目,在日志文件中标记为重命名或移动,目录中对应的属性值将被重命名。
默认情况下,当启用 referential Integrity Postoperation 插件时,它会在 delete 或 rename 操作后,立即对
member
, uniquemember
, owner
, and seeAlso
属性执行完整性更新。但是,您可以配置引用 完整性后 插件的行为,以几种不同的方式满足目录的需求:
- 记录在复制更改日志中引用完整性更新。
- 修改更新间隔。
- 选择要将引用完整性应用到的属性。
- 禁用参考完整性。
对于存在、相等和子字符串,必须 索引引用完整性中的所有属性;不索引这些属性导致修改和删除操作的服务器性能不佳。
nsIndexType: pres nsIndexType: eq nsIndexType: sub有关检查和创建索引的更多信息,请参阅 第 13.2 节 “创建标准索引”。
5.2. 在复制中使用参考完整性
在复制环境中使用 引用完整性后 插件时有一些限制:
- 永远不会 在专用消费者服务器上启用它(仅包含只读副本的服务器)。
- 永远不会 在包含读写副本和只读副本组合的服务器上启用它。
- 在 仅包含 读写副本的供应商服务器上启用它。
- 在多层次复制拓扑中为每个供应商服务器启用插件。插件配置在所有供应商服务器上必须相同。
注意
由于供应商服务器向消费者服务器发送了 参考完整性后 插件所做的任何更改,因此需要在消费者和 hub 服务器上运行 参考完整性后 插件。
5.3. 启用参考完整性
这部分论述了如何启用 参考完整性后 插件。
5.3.1. 使用命令行启用参考完整性
使用命令行 启用参考完整性后 插件:
- 使用
dsconf
工具启用插件:# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin referential-integrity enable
- 重启实例:
# dsctl instance_name restart
5.3.2. 使用 Web 控制台启用参考完整性
使用 Web 控制台启用参考完整性 插件:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择 Plugins 菜单。
- 选择" 参考完整性 "插件,然后单击 Show Advanced Settings。
- 将状态更改为 ON 以启用插件。
5.4. 参考完整性更新间隔
默认情况下,服务器会在 delete 或 rename 操作后立即执行引用完整性更新。根据操作量,这可能导致性能影响。要降低性能影响,您可以增加更新之间的时间。
您可以设置更新间隔(以秒为单位)。另外,您可以设置以下值:
- 0 :立即执行引用完整性的检查。
- -1 :不检查引用完整性。
重要
在多层次复制环境中,红帽建议在所有供应商中将 更新间隔设置为 0。
注意
在一个供应商中,如果将间隔设置为一个大于 0 的值(例如 5),则可能会出现在它清理到目标条目引用前,供应商会接收到一个直接的 delete 或 rename 操作,复制这个操作并进入离线状态的情况。在这种情况下,拓扑的其余部分仍然包含对目标条目的引用,直到服务器再次启动(可能超过 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 控制台显示更新间隔:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择 参考完整性 插件。
- 如需更新间隔,请参阅 Update Delay 字段。
5.4.3. 使用命令行修改更新间隔
要使用命令行设置更新间隔,例如立即更新:
- 将更新间隔设置为 0 :
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin referential-integrity set --update-delay=0
- 重启实例:
# dsctl instance_name restart
5.4.4. 使用 Web 控制台修改 Update Interval
要使用 Web 控制台设置更新间隔,例如立即更新:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择 参考完整性 插件。
- 在 Update Delay 字段中设置间隔。
- 按。
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
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 控制台显示属性列表:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择 参考完整性 插件。
- 有关属性列表,请参阅 Membership Attribute 字段。
5.5.3. 使用命令行配置属性列表
使用命令行更新属性列表:
- (可选)显示当前的属性列表。请参阅 第 5.5.1 节 “使用命令行显示属性列表”。
- 更新属性列表:
- 设置应由插件检查和更新的属性列表:
# 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
- 重启实例:
# dsctl instance_name restart
5.5.4. 使用 Web 控制台配置属性列表
使用 Web 控制台更新属性列表:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择 参考完整性 插件。
- 更新 Membership Attribute 字段,以设置属性。
- 要添加属性,请在 Membership Attribute 字段中输入名称。
- 要删除属性,请在 Membership Attribute 字段中按属性名称右边的 按钮。
- 按。
5.6. 为参考完整性配置范围
如果删除了条目,则会删除或修改对其的引用以反映更改。当这个更新适用于所有条目和所有组时,它可能会影响性能,并防止对所选子树限制引用完整性的灵活性。定义 范围 可以解决这个问题。
例如,可能有一个后缀
dc=example,dc=com
,包含两个子树: ou=active users,dc=example,dc=com
和 ou=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 控制台显示范围设置:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择 参考完整性 插件。
- 有关当前配置的范围,请参阅 Entry Scope、Exclude Entry Scope、和 Container Scope 字段。
5.6.4. 使用命令行配置参考完整性范围
使用命令行配置引用完整性范围:
- 另外,还可显示范围设置。请参阅 第 5.6.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
- 重启实例:
# dsctl instance_name restart
5.6.5. 使用 Web 控制台配置参考完整性范围
使用 Web 控制台配置引用完整性范围:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择菜单。
- 选择 参考完整性 插件。
- 在 Entry Scope、Exclude Entry Scope 和 Container Scope 字段中设置范围。
- 单击。
第 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)
手册页。 - 为复制初始化数据库
下表描述了导入和初始化数据库之间的区别:
操作 | 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
,并且用于初始化副本,则导入条目的所有条目都以零开始 - 即使 Supplier1
和 Supplier2
在它们之间都有多层次复制协议。
6.1.2. 使用命令行导入
目录服务器支持在实例正在运行或实例离线时导入数据:
- 如果实例正在运行,请使用以下方法之一:
- 使用 dsconf backend import 命令。请参阅 第 6.1.2.1.1 节 “使用 dsconf backend 导入命令导入”。
- 创建 cn=tasks 条目。请参阅 第 6.1.2.1.2 节 “使用 cn=tasks 条目导入数据”。
- 如果实例离线,请使用 dsctl ldif2db 命令。请参阅 第 6.1.2.2 节 “导入服务器为 Offline 的数据”。
警告
当您启动导入操作时,目录服务器首先从数据库中删除所有现有的数据,然后从 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
数据库中:
- 如果后缀不存在,请创建后缀。详情请查看 第 2.1.1 节 “创建后缀”。
- 如果您要导入的 LDIF 不包含添加后缀条目的声明,请手动创建此条目,如 第 3.1.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
数据库中:
- 如果后缀不存在,请创建后缀。详情请查看 第 2.1.1 节 “创建后缀”。
- 如果您要导入的 LDIF 不包含添加后缀条目的声明,请手动创建此条目,如 第 3.1.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 命令:
- 如果后缀不存在,请创建后缀。详情请查看 第 2.1.1 节 “创建后缀”。
- 如果您要导入的 LDIF 不包含添加后缀条目的声明,请手动创建此条目,如 第 3.1.3.3 节 “创建根条目” 所述。
- 停止实例:
# dsctl instance_name stop
- 从 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 文件中包含的后缀不对应,数据库中包含的所有数据都会被删除,导入会失败。 - 启动实例:
# dsctl instance_name start
6.1.3. 使用 Web 控制台导入数据
使用 Web 控制台从 LDIF 文件中导入数据:
- 如果后缀不存在,请创建后缀。详情请查看 第 2.1.1 节 “创建后缀”。
- 如果您要导入的 LDIF 不包含添加后缀条目的声明,请手动创建此条目,如 第 3.1.3.3 节 “创建根条目” 所述。
- 将您要导入的 LDIF 文件存储在
/var/lib/dirsrv/slapd-instance_name/ldif/
目录中。 - 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择后缀条目。
- 单击 Initialize Suffix。,然后选择
- 选择要导入的 LDIF 文件,或输入到该文件的完整路径。
- 选择 Yes, I am sure.,然后单击 进行确认。
6.2. 导出数据
LDAP 数据交换格式(LDIF)文件用于从目录服务器数据库导出数据库条目。LDIF 是 RFC 2849 中描述的标准格式。
注意
导出操作不导出配置信息(cn=config)、模式信息(cn=schema)或监控信息(cn=monitor)。
导出数据对以下内容很有用:
- 备份数据库中的数据。
- 将数据复制到另一个目录服务器。
- 将数据导出到另一个应用程序。
- 在更改目录拓扑后重新填充数据库。例如,如果目录包含一个数据库,并且其内容应分成两个数据库,则两个新数据库应通过导出旧数据库的内容并将其导入到两个新数据库,如 图 6.1 “将数据库内容分成两个数据库” 所示。
图 6.1. 将数据库内容分成两个数据库
警告
不要在导出操作期间停止服务器。
目录服务器以
dirsrv
用户身份运行导出操作。因此,目标目录的权限必须允许此用户写入该文件。
6.2.1. 使用命令行将数据导出到 LDIF 文件中
目录服务器支持在实例正在运行或实例离线时导出数据:
- 如果实例正在运行,请使用以下方法之一:
- 使用 dsconf backend export 命令。请参阅 第 6.2.1.1.1 节 “使用 dsconf backend export 命令导出数据库”。
- 创建 cn=tasks 条目。请参阅 第 6.2.1.1.2 节 “使用 cn=tasks 条目导出数据库”。
- 如果实例离线,请使用 dsctl db2ldif 命令。请参阅 第 6.2.1.2 节 “导出服务器为 Offline 的数据库”。
重要
不要因为以下原因,将 LDIF 文件导出到
/tmp
或 /var
/tmp/ 目录:
- 目录服务器默认使用
systemd
的PrivateTmp
功能。如果您将 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 命令:
- 停止实例:
# dsctl instance_name stop
- 将数据库导出到 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
- 启动实例:
# dsctl instance_name start
6.2.2. 使用 Web 控制台将后缀导出到 LDIF 文件
使用 Web 控制台导出后缀:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择后缀条目。
- 点 Export Suffix。,并选择
- 输入您要存储导出的 LDIF 文件的名称。目录服务器将使用指定的文件名将文件存储在
/var/lib/dirsrv/slapd-instance_name/ldif/
目录中。 - 单击。
6.2.3. 启用组成员导出数据,并将导出作为其中一个组成员执行
您可以配置组的成员具有导出数据的权限。这会提高安全性,因为您不再需要在脚本中设置
cn=Directory Manager
的凭证。另外,您可以通过修改组来轻松地授予和撤销导出权限。
6.2.3.1. 启用组导出数据
使用这个流程添加
cn=export_users,ou=groups,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 create --cn export_users
- 添加访问控制指令(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";)
- 创建用户:
- 创建用户帐户:
# 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"
- 在用户帐户中设置密码:
# 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"
- 将
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. 使用命令行备份所有数据库
目录服务器支持在实例正在运行或实例离线时备份数据库:
- 如果实例正在运行,请使用以下方法之一:
- 使用 dsconf backup create 命令。请参阅 第 6.3.1.1.1 节 “使用 dsconf backup create 命令备份所有数据库”。
- 创建 cn=tasks 条目。请参阅 第 6.3.1.1.2 节 “使用 cn=tasks 条目备份所有数据库”。
- 如果实例离线,请使用 dsctl db2bak 命令。请参阅 第 6.3.1.2 节 “备份所有数据库,但服务器为 Offline”。
重要
这些方法仅备份数据库。有关备份其他重要文件的详情,如配置,请参阅 第 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 命令:
- 停止实例:
# dsctl instance_name stop
- 备份数据库:
# dsctl instance_name db2bak db2bak successful
注意dsctl db2bak 命令以dirsrv
用户身份运行备份。因此,目标目录的权限必须允许此用户创建文件和目录。如果您没有将目标目录附加到命令,服务器会将备份存储在/var/lib/dirsrv/slapd-instance_name/bak/
目录中的名为instance_name-time_stamp
的子目录中。 - 启动实例:
# dsctl instance_name start
6.3.2. 使用 Web 控制台备份所有数据库
使用 Web 控制台,您可以在线备份。
重要
当数据库从在线备份中恢复时,目录服务器会清理 changelog。因此,使用在线备份需要在数据库恢复后重新初始化副本。要避免重新初始化,请使用离线备份。
使用 Web 控制台备份实例的所有数据库:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 单击 Manage 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
组成员,并启用此组的成员创建备份任务。
流程
- 创建
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
- 添加访问控制指令(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";)
- 创建用户:
- 创建用户帐户:
# 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"
- 在用户帐户中设置密码:
# 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"
- 将
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
执行备份。
先决条件
- 您已启用了
cn=backup_users,ou=groups,dc=example,dc=com
组的成员来执行备份。请参阅 第 6.3.4.1 节 “启用组备份目录服务器”。 - 用于执行备份的用户是
cn=backup_users,ou=groups,dc=example,dc=com
组的成员。
流程
- 使用以下方法之一创建备份任务:
- 使用 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. 使用命令行恢复所有数据库
目录服务器支持在实例正在运行或实例离线时恢复数据库:
- 如果实例正在运行,请使用以下方法之一:
- 使用 dsconf backup restore 命令。请参阅 第 6.4.1.1.1 节 “使用 dsconf 备份恢复命令恢复 所有数据库”。
- 创建 cn=tasks 条目。请参阅 第 6.4.1.1.2 节 “使用 cn=tasks 条目恢复所有数据库”。
- 如果实例离线,请使用 dsctl bak2db 命令。请参阅 第 6.4.1.2 节 “恢复服务器的所有数据库为 Offline”。
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 命令:
- 停止实例:
# dsctl instance_name stop
- 恢复数据库。例如,添加一个任务来从存储在
/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
用户身份运行。因此,源目录的权限必须允许此用户读取文件和目录。 - 启动实例:
# dsctl instance_name start
6.4.2. 使用 Web 控制台恢复所有数据库
使用 Web 控制台恢复所有数据库:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 单击 Manage Backups。按钮,然后选择显示的窗口列出了
/var/lib/dirsrv/slapd-instance_name/bak/
目录中的可用备份。 - 打开您要恢复的备份旁边的 Actions 菜单,然后选择 。
- 单击以确认。
6.4.3. 恢复包含复制条目的数据库
恢复供应商服务器时可能会出现一些情况:
- 消费者服务器也会恢复。对于不太可能的情况,所有数据库都会从备份中恢复(因此数据保持同步),用户仍然与供应商同步,因此不需要做其他操作。复制可在不中断的情况下恢复。
- 仅恢复供应商。如果只恢复供应商,或者消费者从不同时间进行的备份中恢复,请重新初始化供应商的用户以更新数据库中的数据。如果只恢复供应商,或者消费者从不同时间进行的备份中恢复,请重新初始化供应商的用户以更新数据库中的数据。
- 在供应商服务器上,changelog 条目还没有过期。如果自进行数据库备份以来供应商的 changelog 尚未过期,则恢复本地消费者并继续正常操作。只有在 cn=changelog5,cn=config 条目中的最大更改期限属性
nsslapd-changelogmaxage
设定的值短时,才会发生这种情况。有关这个选项的更多信息,请参阅 红帽目录服务器配置、命令和文件参考。目录服务器自动检测副本及其更改日志之间的兼容性。如果检测到不匹配,服务器会删除旧的 changelog 文件,并创建一个新的空 changelog 文件。 - 由于本地备份的时间,changelog 条目已在供应商服务器上过期。如果 changelog 条目已过期,请重新初始化消费者。有关重新初始化消费者的详情,请参考 第 15.8.3 节 “初始化消费者”。
例 6.3. 恢复目录服务器复制拓扑
例如,要恢复复制环境中所有服务器,由两个供应商和两个消费者服务器组成:
- 恢复第一个供应商。使用 dsconf backend import 命令导入数据。请参阅 第 6.1.2 节 “使用命令行导入”。
- 使用复制在线重新初始化剩余的服务器:
- 从第一个供应商初始化第二个供应商。
- 初始化来自供应商的用户。
详情请查看 第 15.8.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 属性中的值是唯一的:
- 启用插件配置记录:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin attr-uniq enable "mail Attribute Uniqueness"
- 配置存储在
邮件
属性中的值必须在内唯一,例如 ou=Engineering,dc=example,dc=com 和 ou=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
- 另外,要选择性地配置此插件配置记录中配置的所有子树的唯一性:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin attr-uniq set "mail Attribute Uniqueness" --across--all-subtrees=on
- 重启实例:
# dsctl instance_name restart
7.1.2.2. 使用 Web 控制台通过后缀或子树配置属性唯一性
要配置,例如,存储在 mail 属性中的值是唯一的:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择 Attribute Uniqueness 插件。
- 单击。
- 填写字段并启用配置。例如:
图 7.1. 添加属性唯一配置
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
7.1.3. 配置对象类的属性唯一性
您可以配置 Attribute Uniqueness 插件,以确保属性值在包含特定对象类的子树条目中是唯一的。目录服务器在更新对象的父条目中搜索此对象类。如果目录服务器找不到对象类,搜索将继续在目录树的根目录的下一个更高级别的条目中。如果找到对象类,Directory 服务器会验证
uniqueness-attribute-name
中设置的属性值在此子树中是唯一的。
要配置,例如,存储在 mail 属性中的值在包含 nsContainer 对象类的条目下是唯一的:
- 启用插件配置记录:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin attr-uniq enable "mail Attribute Uniqueness"
- 在包含 nsContainer 对象类的条目下,配置存储在
mail
属性中的值必须是唯一的:# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin attr-uniq set "mail Attribute Uniqueness" --top-entry-oc=nsContainer
- 另外,您还可以限制正在检查的对象范围。如果您希望服务器只检查包含 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
- 重启实例:
# 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 示例
在本例中,模板条目由 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 示例
在本例中,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 示例
在本例中,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-schemes 和 override 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 设置的值的属性都不会通过搜索返回。例如:
如果 ldapsearch 命令使用过滤器 (postalCode=*),则会返回 Barbara Jensen 条目,而 Ted Morris 的条目没有被返回。
- Ted Morris 的
postalCode
属性由 CoS 定义。 - Barbara Jensen 的
postalCode
属性在她条目中设置。 postalCode
属性被索引。
如果没有 索引 CoS-defined 属性,则搜索中每个匹配的条目都会返回,无论属性值是本地设置的还是使用 CoS。例如:
如果 ldapsearch 命令使用过滤器 (postalCode=*),则返回 Barbara Jensen 和 Ted Morris 的条目。
- Ted Morris 的
postalCode
属性由 CoS 定义。 - Barbara Jensen 的
postalCode
属性在她条目中设置。 postalCode
属性 没有 索引。
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_stringcosSpecifier
: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 树中的所有条目共享一个通用后代码。
- 使用 ldapmodify 在 dc=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
- 创建模板条目:
# 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 模板条目,它因属性的不同值而异。
- 使用 ldapmodify 在 dc=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
属性中指定的属性自动生成后代码。
- 使用 ldapmodify 在 dc=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
- 为销售和销售部门创建模板条目。将 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
的值可能会随机地重叠其目标树。
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.3.3. 配置属性链接
- 如果还没有启用,请启用 Linked Attributes 插件。详情请查看 第 1.10.2 节 “启用和禁用插件”.f
- 创建插件实例。需要
--managed-type
和--link-type
参数。以下示例显示了使用 dsconf 创建的插件实例:# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin linked-attr config "Manager Link" add --link-type=directReport --managed-type=manager
- 重启实例:
# dsctl instance_name restart
7.3.4. 清理属性链接
受管链接的属性可以不同步。例如,链接的属性可以被导入或复制到服务器,但对应的 managed 属性不是,因为 link 属性没有正确配置。受管链接的属性对可以通过运行 dsconf 插件 link-attr fixup 命令或启动修复任务来解决。
Fixup 任务会删除任何在引用条目上没有对应的 link 属性(由管理员管理的受管属性)的受管属性(属性)。相反,如果条目中存在 link 属性,任务会添加任何缺少的受管属性。
7.3.4.1. 重新生成链接属性
dsconf 插件 linked-attr fixup 命令启动一个特殊任务,以重新生成目录条目上的所有 managed-link 属性对。在某些情况下,一个或多个可能会丢失。如果条目中存在 link 属性,任务会在 available 属性中跟踪跨引用的 DN,并在引用的条目上创建对应的配置的 managed 属性。如果存在没有对应的 link 属性的 managed 属性,则会删除 managed 属性值。
要修复插件整个范围的所有配置的 link 属性对,请以 Directory Manager 的身份运行命令:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin linked-attr fixup
通过将基本 DN 传递给命令,也可以将修复任务限制为单个链接管理的属性对。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin linked-attr fixup "cn=Manager Link,cn=Linked Attributes,cn=plugins,cn=config"
7.3.4.2. 使用 ldapmodify 重新生成链接的属性
修复链接的属性是可通过特殊任务配置条目来管理的任务之一。任务条目在
dse.ldif
文件中的 cn=tasks 配置条目下发生,因此也可以使用 ldapmodify 添加条目来启动任务。任务完成后,条目会从目录中删除。
此任务与 dsconf plugin linked-attr fixup 命令自动创建的相同。
要启动链接的属性修复任务,请在 cn=fixup 链接的属性下添加一个条目cn=tasks,cn=config 条目。唯一的必需属性是特定任务的
cn
,但它还允许 ttl
属性设置超时周期。使用 ldapmodify :
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=example,cn=fixup linked attributes,cn=tasks,cn=config changetype: add cn:example ttl: 5
任务完成后,条目会从
dse.ldif
配置中删除,因此可以持续重复使用相同的任务条目。
配置、命令和文件参考包括了 cn=fixup 链接的属性 任务配置的详细信息。
7.4. 分配和管理唯一属性值
有些条目属性需要有一个唯一的数字,如
uidNumber
和 gidNumber
。目录服务器可以使用分布式数字分配(DNA)插件为指定属性自动生成并提供唯一数字。
注意
在 DNA 插件中,属性一致性不一定会保留。该插件只分配非重叠范围,但它允许为受管属性手动分配数字,而且不会验证或要求手动分配的数字是唯一的。
分配唯一数字的问题不会生成数字,而是有效地避免复制冲突。DNA 插件 在单个 后端之间分配唯一数字。对于多层次复制,当每个供应商都运行本地 DNA 插件实例时,必须有一种方法来确保每个实例都使用一组实际唯一的数字。这可以通过为每个服务器分配不同的 数字范围 来完成。
7.4.1. 关于动态数字分配
服务器的 DNA 插件分配了实例可能会发布的一系列可用数字。范围定义非常简单,由两个属性设置:服务器的下一个可用数字(范围的低端)和其最大值(范围顶部)。配置插件实例时,会设置初始底部范围。之后,底部值由插件更新。通过将可用数字分成每个副本上的独立范围,服务器可以持续分配数字,而不会相互重叠。
7.4.1.1. 过滤器、搜索和目标条目
服务器在内部执行排序的搜索来查看是否已执行下一个指定范围,要求 managed 属性具有具有正确排序匹配规则(如 第 13.2 节 “创建标准索引”所述)的相等索引。
DNA 插件将始终应用于目录树的特定区域(scope)以及该子树中的特定条目类型( filter)。
重要
DNA 插件仅适用于单一后端;无法管理多个数据库的数字分配。当检查值是否在 DNA 插件之外手动分配时,DNA 插件会使用 sort 控制。此验证使用排序控制,仅适用于单个后端。
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
。
然而,在有些情况下,从相同数量分配唯一数字到多个属性可能很有用。例如,当将
uidNumber
和 gidNumber
分配给 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 插件同时管理 uidNumber
和 gidNumber
,那么当创建 posixGroup 条目时,从 uidNumber
和 gidNumber
属性分配唯一的 gidNumber
号。对插件管理的所有属性使用相同的池可保持分配唯一数字,并防止不同条目上的 uidNumber
和 gidNumber
从不同范围分配,并导致相同的 唯一数字。
如果多个属性由 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 和唯一过期帐户号
人员希望客户
primaryAccount
和 customerID
属性使用相同的唯一数字。Example the administrator 配置 DNA 插件,以从同一范围内为这两个属性分配唯一值。
公司还希望从与客户 ID 和主帐户号相同的范围为次要帐户分配数字,但这些数字不能与主帐户号相同。Example Bank 管理员配置 DNA 插件也会管理
secondaryAccount
属性,但仅在条目被创建、primaryAccount
和 customerID
被分配后,才会将 secondaryAccount
属性添加到条目中。这样可确保 primaryAccount
和 customerID
共享相同的唯一数字,任何 次要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 控制台编辑设置。
创建并启用插件的新实例:
- 例如,要创建插件的新实例:
# 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
- 启用 DNA 插件。详情请查看 第 1.10.2 节 “启用和禁用插件”。
7.4.3.2. 使用命令行配置唯一数字分配
注意
任何分配了唯一数字的属性都必须为其设置相等索引。服务器必须在内部执行排序的搜索,以查看是否已经使用了
dnaNextvalue
,这需要整数属性上的相等索引,具有正确的排序匹配规则。
第 13.2 节 “创建标准索引” 中描述了创建索引。
注意
在每个供应商服务器上设置 DNA 插件,并且小心不要重叠数字范围值。
- 创建插件的新实例。请参阅 第 7.4.3.1 节 “创建 DNA 插件的新实例”。
- 在复制的子树中创建共享容器条目:
# 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
- 重启实例:
# dsctl instance_name restart
7.4.3.3. 使用 Web 控制台配置唯一数字分配
使用 Web 控制台启用和配置 DNA 插件:
- 创建插件的新实例。请参阅 第 7.4.3.1 节 “创建 DNA 插件的新实例”。
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择 DNA 插件。
- 将状态更改为 ON 以启用插件。
- 单击。
- 填写字段并启用配置。
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
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 列表来过滤和生成其成员资格列表。任何动态组都需要此对象类,并可与 groupOfNames 和 groupOfUniqueNames 一起使用。
- groupOfCertificates 与 groupOfURLs 类似,它使用 LDAP 过滤器搜索和识别证书(或实际、证书名称)来识别组成员。这对基于组的访问控制非常有用,因为可以授予组的特殊访问权限。用于确定此成员的属性是
memberCertificate
。
下表显示了组的默认属性:
组类型 | 组对象类 | 成员属性 |
---|---|---|
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
插件。在这种情况下,您必须在所有复制协议中排除memberOf
属性。有关排除属性的详情,请参考 第 15.1.7 节 “使用 DNATactional Replication 复制子属性集”。 - 仅在拓扑中的所有供应商服务器上启用
memberOf
插件。为此:- 您必须将
memberOf
属性的复制禁用到复制协议中所有启用了写的供应商。有关排除属性的详情,请参考 第 15.1.7 节 “使用 DNATactional Replication 复制子属性集”。 - 您需要在其复制协议中的所有只读副本中启用
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
属性。此对象类可以安全地添加到任何对象,且不需要进一步的操作才能使此插件正常工作。或者,您可以创建包含 inetUser 或 inetAdmin 对象类的用户对象。这两个对象类也支持 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: extensibleObjectcn: MemberOf Plugin
nsslapd-pluginPath: libmemberof-plugin
nsslapd-pluginInitfunc: memberof_postop_init
nsslapd-pluginType: postoperationnsslapd-pluginEnabled: on
nsslapd-plugin-depends-on-type: databasememberOfGroupAttr: 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 插件:
- 使用
dsconf
工具启用插件:# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof enable
- 重启实例:
# dsctl instance_name restart
8.1.4.4.2. 使用 Web 控制台启用 MemberOf 插件
使用 Web 控制台启用 MemberOf 插件:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择菜单。
- 选择 MemberOf 插件。
- 将状态更改为 ON 以启用插件。
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
8.1.4.5. 在每个服务器上配置 MemberOf 插件
如果您不想复制 MemberOf 插件的配置,请在每台服务器中手动配置插件。
8.1.4.5.1. 使用命令行在每个服务器上配置 MemberOf 插件
使用命令行配置 MemberOf 插件: