管理指南
使开源更多包含
第 1 章 常规目录服务器管理任务
1.1. 系统要求
1.2. 文件位置
1.3. 配置目录服务器的支持方法
- 目录服务器提供的命令行工具
- Web 控制台
1.4. 使用 Web 控制台登录到目录服务器
- 使用浏览器连接到在 Directory Server 主机的端口 9090 上运行的 Web 控制台。例如:
https://server.example.com:9090
- 以
root
用户身份登录,或以具有sudo
权限的用户身份登录。 - 选择
Red Hat Directory Server
条目。
1.5. 启动和停止目录服务器实例
1.5.1. 使用命令行启动和停止目录服务器实例
- 启动实例:
# dsctl instance_name start
- 停止实例:
# dsctl instance_name stop
- 重启实例:
# dsctl instance_name restart
- 对于单个实例:
# systemctl enable dirsrv@instance_name
- 对于服务器中的所有实例:
# systemctl enable dirsrv.target
1.5.2. 使用 Web 控制台启动和停止目录服务器实例
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 点按钮并选择要执行的操作:
- 启动实例
- 停止实例
- 重启实例
1.6. 创建新目录服务器实例
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 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 单击 Remove instance。按钮,然后选择
1.8. 设置目录服务器配置参数
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 服务器存储其配置
/etc/dirsrv/slapd-instance_name/dse.ldif
文件中。服务器仅存储您在此文件中修改的参数。未列出的属性,使用它们的默认值。这可让您通过显示 /etc/dirsrv/slapd-instance_name/dse.ldif
文件来识别在这个实例中设置的所有配置参数。
/etc/dirsrv/slapd-instance_name/dse.ldif
文件。
1.8.3. 使用默认值的好处
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 端口号
1.9.1. 使用命令行更改端口号
nsslapd-port
:存储实例用于 LDAP 协议的端口号。nsslapd-secureport
:存储实例用于 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 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 更改 LDAP 端口:
- 打开菜单。
- 在 Server Settings 选项卡中,将新端口号填写到 LDAP Port 字段中。
- 点击。
- 更改 LDAPS 端口:
- 打开菜单。
- 在 General Settings 选项卡中,将新端口号填写到 LDAPS Port 字段中。
- 点击。
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
1.10. 使用目录服务器插件
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 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择菜单。
1.10.2. 启用和禁用插件
1.10.2.1. 使用命令行启用和禁用插件
- 启用插件:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin automember enable
- 重启实例:
# dsctl instance_name restart
1.10.2.2. 使用 Web 控制台启用和禁用插件
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择菜单。
- 选择 All Plugins 选项卡。
- 点击您要启用或禁用的插件右侧的按钮。
- 将状态更改为 ON,以启用或设置为 OFF 来禁用插件。
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
1.10.3. 配置插件
1.10.3.1. 使用命令行配置插件
# 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 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择菜单。
- 选择 All Plugins 选项卡。
- 选择插件并单击 Show Advanced Settings。
- 打开特定于插件的选项卡。
- 设置适当的设置。
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
1.10.4. 设置插件优先级
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 控制台中打开 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. 使用目录服务器工具时的远程和本地连接解析
/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. 创建后缀
2.1.1.1. 创建根后缀
example.com
,另一个用于 redhat.com
。在这种情况下,需要两个 root 后缀。与 dc=example,dc=com
命名上下文对应,另一个对应于 dc=redhat,dc=com
命名上下文,如下图所示:
图 2.2. 具有两个根后缀的目录
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 -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 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 点。
- 输入后缀 DN 和后端名称。例如:
- 选择 Create The Top Suffix Entry。
- 点。
2.1.1.2. 创建子修复
图 2.4. 带有子后缀的目录树
2.1.1.2.1. 使用命令行创建子修复
- 可选:识别已在使用的后缀和后端数据库:
# 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 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择您要创建子跟踪的后缀,单击,然后选择 。
- 输入子修复 DN 和后端名称。例如:
- 选择 Create The Top Sub-Suffix Entry。
- 点。
2.1.2. 维护后缀
2.1.2.1. 查看默认命名上下文
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 -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 -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 控制台中打开 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 操作来更改条目。
- 运行 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. 在只读模式下设置数据库
2.2.2.1.1. 使用命令行在只读模式下设置数据库
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. 使用命令行删除数据库
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 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择要删除的后缀,单击 Delete Suffix。,然后选择
- 单击以确认。
2.2.2.4. 更改交易日志目录
- 停止目录服务器实例:
# 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. 创建和维护数据库链接
2.3.1. 创建新数据库链接
- 后缀信息。后缀是在由数据库链接管理的目录树中创建的,而不是常规数据库。这个后缀与包含数据的远程服务器上的后缀对应。
- 绑定凭证。当数据库链接绑定到远程服务器时,它会模拟用户,这指定了用于与远程服务器绑定的每个数据库链接的 DN 和凭证。
- LDAP URL。这提供了数据库链接连接到的远程服务器的 LDAP URL。URL 由协议(ldap 或 ldaps)、服务器的主机名或 IP 地址(IPv4 或 IPv6)组成,以及端口。
- 故障转移服务器列表。这提供了在出现故障时要联系的数据库链接的替代服务器列表。这个配置项是可选的。
2.3.1.1. 使用命令行创建新数据库链接
# 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 被设置为空,所以链接将使用简单的身份验证。
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 -D "cn=Directory Manager" ldap://server.example.com chaining config-get-def
response-delay
参数设置为 30
,请运行:
# dsconf -D "cn=Directory Manager" ldap://server.example.com chaining config-set-def --response-delay 30
# dsconf -D "cn=Directory Manager" ldap://server.example.com chaining config-set-def --help
2.3.1.4. 创建数据库链接时所需设置的附加信息
后缀信息
绑定凭证
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";)
LDAP URL
ldaps://africa.example.com:636/
绑定机制
- 通过标准 LDAP 端口
- 通过专用 LDAPS 端口
- 使用 STARTTLS,这是标准端口的安全连接
- 空 :如果没有设置绑定机制,则服务器会执行简单的身份验证,并且需要绑定 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 映射。
2.3.2. 配置链策略
2.3.2.1. 链组件操作
- 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
权限:读、搜索和比较
- 角色插件
- 密码策略组件
- 复制插件
- 参考完整性插件
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 控制
- 虚拟列表视图(VLV)。此控制提供了部分条目列表,而不是返回所有条目信息。
- 服务器端排序。此控制根据其属性值对条目进行排序,通常使用特定的匹配规则。
- 解引用。此控制从引用的条目中拉取指定的属性信息,并使用其余的搜索结果返回此信息。
- 管理的 DSA。这个控制将智能引用返回为条目,而不是遵循引用,因此可以更改或删除智能引用。
- 循环检测。此控制可跟踪服务器链与其他服务器链的次数。当计数达到配置的数量时,会检测到循环,并通知客户端应用程序。有关使用这个控制的详情请参考 第 2.4.3 节 “检测循环”。
控制名称 | 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 控制
# dsconf -D "cn=Directory Manager" ldap://server.example.com chaining \ config-set --add-control="2.16.840.1.113730.3.4.9"
2.3.2.2.2. 使用 Web 控制台串联 LDAP 控制
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择条目。
- 单击 Forwarded LDAP Controls 字段下的 按钮。
- 选择 LDAP 控制并点击。如果目录服务器的客户端创建自己的控制,并且其操作应串联到远程服务器,请添加自定义控制的对象标识符(OID)。有关可以串联及其 OID 的 LDAP 控制列表,请参阅 表 2.1 “LDAP 控制和过期 OID”。
- 点击。
2.3.3. 数据库链接和访问控制评估
- 并非所有类型的访问控制均可使用。例如,基于角色的访问控制的 ACI 需要访问用户条目。由于数据可以通过数据库链接访问,因此只能验证代理控制中的数据。考虑以确保用户条目位于与用户数据相同的数据库中设计目录。
- 基于客户端的 IP 地址或 DNS 域的所有访问控制可能无法正常工作,因为客户端的原始域在串联过程中会丢失。远程服务器将客户端应用程序视为位于同一 IP 地址,并在与数据库链接相同的 DNS 域中查看。注意目录服务器支持 IPv4 和 IPv6 IP 地址。
- ACI 必须位于它们使用的任何组。如果组是动态的,则组中的所有用户都必须位于 ACI 和组中。如果组是静态的,它会链接到远程用户。
- ACI 必须位于他们使用的任何角色定义中,以及希望具有这些角色的任何用户。
- 如果用户是远程,则链接到用户条目值(如 userattr 主题规则)的值的 ACI 将可以正常工作。
- 在访问控制评估过程中,用户条目的内容不一定可用(例如,如果在包含数据库链接的服务器上评估访问控制,且条目位于远程服务器上)。出于性能原因,客户端无法进行远程参与和评估访问控制。
- 数据库链接不一定能够访问客户端应用程序修改的条目。在执行修改操作时,数据库链接无法访问远程服务器上存储的完整条目。如果执行删除操作,数据库链接仅了解条目的 DN。如果访问控制指定了特定属性,则通过数据库链接执行时删除操作将失败。
nsCheckLocalACI
属性。但是,不建议评估包含数据库链接的服务器上的访问控制,但级联链除外。
2.4. 配置 Cascading 链
2.4.1. Cascading Chaining 概述
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。
2.4.3. 检测循环
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. 以引用模式启动服务器
# 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. 设置默认引用
2.5.2.1. 使用命令行设置默认引用
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. 创建智能引用
2.5.3.1. 使用命令行创建智能引用
ref
属性设置为引用 LDAP URL。
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
-M
选项与 ldapadd 一起使用。有关智能引用的更多信息,请参阅 目录服务器部署指南。
2.5.4. 创建后缀引用
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. 验证后端数据库的完整性
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 章 管理目录条目
3.1. 使用命令行管理目录条目
- 添加新条目
- 在现有条目中添加新属性
- 更新现有条目和属性
- 从条目中删除条目和属性
- 执行批量操作
# yum install openldap-clients
3.1.1. 为 ldapadd,ldapmodify, 和 ldapdelete 工具提供输入
3.1.1.1. 使用互动模式提供输入
- 在不创建文件的情况下输入 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 文件提供输入
例 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. 持续操作模式
-c
选项传给 ldapadd 和 ldapmodify。例如:
# ldpamodify -c -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
3.1.3. 添加条目
/bin/ldapmodify
的符号链接。因此,ldapadd 执行与 ldapmodify -a 相同的操作。
3.1.3.1. 使用 ldapadd添加条目
# 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
3.1.3.2. 使用 ldapmodify 添加一个条目
# 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。
3.1.3.3. 创建根条目
cn=Directory Manager
用户绑定并添加该条目。
# 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
-n back_end
选项的 ldif2db 工具来设置保存新条目的数据库。详情请查看 第 6.1.2 节 “使用命令行导入”。
3.1.4. 更新目录条目
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
3.1.4.1. 在条目中添加属性
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. 更新属性的值
更新单值属性
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
更新多值属性的特定值
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. 从条目中删除属性
删除属性
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
删除多值属性的特定值
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. 删除条目
3.1.5.1. 使用 ldapdelete 删除一个条目
# 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"
3.1.5.2. 使用 ldapmodify 删除一个条目
# 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. 重命名和移动条目
- 重命名条目
- 如果您重命名条目,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 声明重命名条目或子树
newrdn
属性中设置新的 RDN。
# 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 声明将条目移动到新父条目
newrdn
- 设置移动条目的 RDN。您必须设置此条目,即使 RDN 保持不变。
Eopuperior
- 设置新父条目的 DN。
# 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
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 -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 控制台管理目录条目
3.2.1. 使用 Web 控制台添加 LDAP 条目
- users
- groups
- roles
- 机构单元(OU)
- 自定义条目
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 条目
cn=John Smith,ou=body,dc=example,dc=com
:
- 添加电话号码
556778987
和556897445
。 - adding email
jsmith@example.com
. - 更改密码。
先决条件
流程
- 在 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
cn=John Smith,ou=people,dc=example,dc=com
重新命名并重新定位到 cn=Tom Smith,ou=clients,dc=example,dc=com
。
先决条件
流程
- 在 Web 控制台中,打开菜单,以显示现有后缀的列表。
- 使用或 视图,展开您要修改的条目,如
cn=John Smith,ou=body,dc=example,dc=com
。 - 点并选择 来打开向导窗口。
- 在步骤中:
- 为命名属性
cn
设置一个新的值Tom Smith
,然后单击 。 - 可选:从下拉菜单中选择另一个命名属性。
- 可选:在您要删除旧条目并使用新 RDN 创建新条目时,选择。
- 在步骤中,选择新位置的父条目,然后单击 。
- 检查您对条目所做的更改,然后点。
- 如果条目详情正确,点。您可以点击 对条目进行其他更改,或者点击 来取消条目修改。
- 检查并点 。
验证
- 展开条目详情并查看更新的条目。
3.2.4. 使用 Web 控制台删除 LDAP 条目
cn=Tom Smith,ou=clients,dc=example,dc=com
。
先决条件
流程
- 在 Web 控制台中,打开菜单,以显示现有后缀的列表。
- 使用或 视图,展开您要删除的条目,如
cn=Tom Smith,ou=clients,dc=example,dc=com
。 - 点并选择 以打开向导窗口。
- 在查看您要删除的条目的数据后,点。
- 在步骤中,将开关切换到 position,然后单击 。您可以点击 来取消删除条目。
- 查看,然后单击 。
验证
- 导航到→ 。
- 选择之前存在条目的后缀,如
dc=example,cd=com
。 - 在字段中输入您的搜索条件,如
Tom
,然后按 键。 - 验证删除的条目不再存在。
第 4 章 跟踪对目录条目的修改
- 使用更改序列号来跟踪对数据库的更改。这与修改复制和同步中使用的序列号操作类似。每个普通目录操作都会触发序列号。
- 分配创建或修改信息。这些属性记录了创建和最近修改条目的用户的名称,以及创建和修改的时间戳。
4.1. 通过更新序列号跟踪数据库修改
4.1.1. 条目序列号概述
4.1.1.1. 本地和全球美国
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 计数器。
lastusn
属性中数据库中任何条目的最新 USN。当 USN 插件被设置为 local 模式时,因此每个数据库都有自己的本地 USN 计数器,最后一个USN
会显示分配 USN 和 USN 的数据库:
lastusn;database_name:USN
lastusn;example1: 2130 lastusn;example2: 2070
最后一个USN
属性仅显示最新的 USN :
lastusn: 4200
4.1.1.2. 导入 USN 条目
nsslapd-entryusn-import-initval
属性来检查条目是否分配了 USN。如果 nsslapd-entryusn-import-initval
的值为 number,导入的条目将使用这个数字值作为条目的 USN。如果 nsslapd-entryusn-import-initval
的值不是数字,则 USN 插件将使用 lastUSN
属性的值,并将它递增为导入条目的 USN。
4.1.2. 启用 USN 插件
4.1.2.1. 使用命令行启用 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 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择菜单。
- 选择 USN 插件。
- 将状态更改为 ON 以启用插件。
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
4.1.3. Global USNs
4.1.3.1. 确定是否启用全球美国
4.1.3.1.1. 使用命令行识别是否启用全局美国
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin usn global USN global mode is disabled
4.1.3.1.2. 确定是否通过 Web 控制台启用全局美国
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择菜单。
- 选择 USN 插件。
- 验证 On。开关是否已设置为
4.1.3.2. 启用全球美国
4.1.3.2.1. 使用命令行启用全局 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 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择 USN 插件。
- 将插件的状态更改为 On。
- 将 USN Global 状态更改为 On。
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
4.1.4. 清理 USN Tombstone 条目
- 在将服务器转换为副本前
- 为服务器可用内存
4.1.4.1. 使用命令行清理 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 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择 USN 插件。
- 按按钮。
- 填写字段,然后按。
4.2. 通过过期属性跟踪条目修改
creatorsName
:最初创建该条目的用户的可分辨名称(DN)。createTimestamp
:创建条目时,Greenwich Mean Time (GMT)格式的时间戳。modifiersName
:上次修改条目的用户的可分辨名称。modifyTimestamp
:最后一次修改条目时 GMT 格式的时间戳。
nsUniqueID
属性中分配的唯一 ID,且复制不起作用。
4.2.1. 数据库链接修改或创建的条目
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. 启用修改的跟踪
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
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
- 将
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 控制台中打开 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. 参考完整性的工作方式
- 对于条目,在日志文件中标记为已删除,会删除目录中的对应属性。
- 对于条目,在日志文件中标记为重命名或移动,目录中对应的属性值将被重命名。
member
, uniquemember
, owner
, and seeAlso
属性执行完整性更新。但是,您可以配置引用 完整性后 插件的行为,以几种不同的方式满足目录的需求:
- 记录在复制更改日志中引用完整性更新。
- 修改更新间隔。
- 选择要将引用完整性应用到的属性。
- 禁用参考完整性。
nsIndexType: pres nsIndexType: eq nsIndexType: sub有关检查和创建索引的更多信息,请参阅 第 13.2 节 “创建标准索引”。
5.2. 在复制中使用参考完整性
- 永远不会 在专用消费者服务器上启用它(仅包含只读副本的服务器)。
- 永远不会 在包含读写副本和只读副本组合的服务器上启用它。
- 在 仅包含 读写副本的供应商服务器上启用它。
- 在多层次复制拓扑中为每个供应商服务器启用插件。插件配置在所有供应商服务器上必须相同。
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 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择 Plugins 菜单。
- 选择" 参考完整性 "插件,然后单击 Show Advanced Settings。
- 将状态更改为 ON 以启用插件。
5.4. 参考完整性更新间隔
- 0 :立即执行引用完整性的检查。
- -1 :不检查引用完整性。
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 控制台中打开 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 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择 参考完整性 插件。
- 在 Update Delay 字段中设置间隔。
- 按。
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
5.5. 显示和修改属性列表
成员
、唯一的成员
、所有者和
seeAlso
属性。您可以使用命令行或 Web 控制台来添加或删除要更新的属性。
5.5.1. 使用命令行显示属性列表
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin referential-integrity show
5.5.2. 使用 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 控制台中打开 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 控制台中打开 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 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择菜单。
- 选择 参考完整性 插件。
- 在 Entry Scope、Exclude Entry Scope 和 Container Scope 字段中设置范围。
- 单击。
第 6 章 填充目录数据库
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 值
nsslapd-entryusn-import-initval
参数来实现,该参数为所有导入的条目设置开始 USN。
nsslapd-entryusn-import-initval
有两个可能的值:
- 整数,这是用于每个导入条目的显式开始号。
- 接下来,这意味着每个导入的条目都会在导入操作前在服务器上使用最高条目 USN 值的任何值,由一递增。
nsslapd-entryusn-import-initval
,则所有条目 USNs 从零开始。
例 6.1. nsslapd-entryusn-import-initval
参数的工作方式
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 ...
nsslapd-entryusn-import-initval
参数添加到要导入数据的服务器或要执行初始化的供应商服务器中。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-entryusn-import-initval=next
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 的数据”。
UTF-8
字符集编码。导入操作不会将数据从本地字符集编码转换为 UTF-8
。另外,所有导入的 LDIF 文件必须包含 root 后缀条目。
dirsrv
用户身份运行导入操作。因此,LDIF 文件的权限必须允许此用户读取该文件。
6.1.2.1. 导入服务器正在运行的数据
6.1.2.1.1. 使用 dsconf backend 导入命令导入
/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 条目导入数据
cn
:设置任务的唯一名称。nsFilename
:设置要导入的 LDIF 文件的名称。nsInstance
:设置应导入该文件的数据库的名称。
/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 的数据
- 如果后缀不存在,请创建后缀。详情请查看 第 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 控制台导入数据
- 如果后缀不存在,请创建后缀。详情请查看 第 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. 导出数据
- 备份数据库中的数据。
- 将数据复制到另一个目录服务器。
- 将数据导出到另一个应用程序。
- 在更改目录拓扑后重新填充数据库。例如,如果目录包含一个数据库,并且其内容应分成两个数据库,则两个新数据库应通过导出旧数据库的内容并将其导入到两个新数据库,如 图 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 的数据库”。
/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 命令导出数据库
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 ldap://server.example.com backend export --help
6.2.1.1.2. 使用 cn=tasks 条目导出数据库
cn
:设置任务的唯一名称。nsInstance
:将数据库的名称设置为导出。nsFilename
:设置应存储导出的文件的名称。
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 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 控制台中打开 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
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.1.1. 备份服务器的所有数据库正在运行
6.3.1.1.1. 使用 dsconf backup create 命令备份所有数据库
# 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 条目备份所有数据库
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 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 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 单击 Manage Backup。按钮,然后选择
- 点。
- 输入备份的名称,如指示备份的创建日期和时间的时间戳。
- 点。
/var/lib/dirsrv/slapd-instance_name/bak/
目录中的名称的子目录。
6.3.3. 备份配置文件、证书数据库和自定义架构文件
/etc/dirsrv/slapd-instance_name/
目录中存储了额外的文件,例如,在硬件故障后恢复不同服务器上的实例。
例 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. 启用组的成员来备份目录服务器,并以一个组成员身份执行备份
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 备份恢复命令恢复 所有数据库
/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 条目恢复所有数据库
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 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 控制台中打开 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 节 “显示特定复制协议的状态”。
第 7 章 管理属性和值
7.1. 强制属性唯一性
7.1.1. 创建 属性唯一插件的新配置 记录
dsconf -D "cn=Directory Manager" ldap://server.example.com plugin attr-uniq add "Example" --attr-name uid
7.1.2. 通过后缀或子树配置属性唯一性
7.1.2.1. 使用命令行通过后缀或子树配置属性唯一性
- 启用插件配置记录:
# 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 控制台通过后缀或子树配置属性唯一性
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择 Attribute Uniqueness 插件。
- 单击。
- 填写字段并启用配置。例如:
图 7.1. 添加属性唯一配置
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
7.1.3. 配置对象类的属性唯一性
uniqueness-attribute-name
中设置的属性值在此子树中是唯一的。
- 启用插件配置记录:
# 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. 属性唯一插件配置参数
例 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
7.2. 分配服务类
- COS 定义条目。CoS 定义条目标识使用的 CoS 类型。与角色定义条目一样,它继承自 LDAP 子条目 对象类。CoS 定义条目低于其有效的分支。
- 模板条目。CoS 模板条目包含共享属性值的列表。对模板条目属性值的更改会自动应用到 CoS 范围内的所有条目。单个 CoS 可能会有多个与它关联的模板条目。
7.2.1. 关于 CoS 定义条目
- 指针 CoS。指针 CoS 仅使用模板 DN 识别模板条目。
- 间接 CoS。间接 CoS 使用其中一个目标条目属性的值来识别模板条目。例如,间接 CoS 可能会指定目标条目的
manager
属性。然后,使用manager
属性的值来标识模板条目。目标条目的属性必须是单值,并包含一个 DN。 - 经典 CoS。经典 CoS 使用模板条目的基本 DN 和其中一个目标条目的属性的组合来识别模板条目。
7.2.2. 关于 CoS 模板条目
- 仅模板条目的 DN。这种类型的模板与指针 CoS 定义关联。
- 目标条目的属性之一的值。用于向模板条目提供相对 DN 的属性使用
cosIndirectSpecifier
属性在 CoS 定义条目中指定。这种类型的模板与间接 CoS 定义关联。 - 通过组合使用 CoS 对模板执行一个级别的搜索,以及其中一个目标条目属性的值。这种类型的模板与经典 CoS 定义关联。
7.2.3. A Pointer CoS Works
图 7.2. Pointer CoS 示例
postalCode
属性时,条目 cn=wholiday,ou=body,dc=example,dc=com 都会返回模板条目 cn=exampleUS,cn=data 中可用的值。
7.2.4. 间接 CoS 工作方式
manager
属性来识别模板条目。三个 CoS 条目如 图 7.3 “Indirect CoS 示例” 所示。
图 7.3. Indirect CoS 示例
manager
属性)。William 的管理器是 Applela Fuentes,因此 管理器
属性包含指向模板条目的 DN cn=Carla Fuentes,ou=body,dc=example,dc=com 的指针。然后,模板条目提供了 departmentNumber
属性值 318842。
7.2.5. 经典 CoS 工作方式
图 7.4. Classic 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 :只有在没有与条目存储的对应属性值且搜索中明确请求时,才会返回生成的值。
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
7.2.7. 使用 CoS 处理多值属性
- 创建一个规则,将多个 CoS 生成的属性合并到目标条目中。这会在目标条目中生成多个值。
- 设置 priority 以从竞争 CoS 定义中选择一个 CoS 值。这会为目标条目生成一个值。
cosPriority
属性。
cosAttribute: attribute override merge-schemes
cosAttribute
中设置相同的 merge-schemes 和 override qualifiers。否则,会从所有可能的 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
cosSpecifier
属性。使用 cosPriority
属性设置模板优先级。此属性代表特定模板的全局优先级。优先级为零是最高优先级。
dn: cn=data,dc=example,dc=com objectclass: top objectclass: extensibleObject objectclass: cosTemplate departmentNumber: 71776 cosPriority: 0
departmentNumber
属性的值。它的优先级为零,这意味着此模板优先于定义不同的 departmentNumber
值的任何其他冲突模板。
cosPriority
属性的模板被视为最低优先级。其中两个或更多模板被认为提供属性值,并且它们具有相同的(或无)优先级,则会随机选择值。
cosPriority
值的行为,因此不要输入负值。
7.2.8. 搜索 CoS-Specified 属性
postalCode
属性。但是,搜索这些 CoS 定义的属性并不像对常规条目的搜索一样。
- Ted Morris 的
postalCode
属性由 CoS 定义。 - Barbara Jensen 的
postalCode
属性在她条目中设置。 postalCode
属性被索引。
- Ted Morris 的
postalCode
属性由 CoS 定义。 - Barbara Jensen 的
postalCode
属性在她条目中设置。 postalCode
属性 没有 索引。
cosAttribute
属性给出的标识符,这意味着属性的本地值可以覆盖 CoS 值。如果在 CoS 上设置了覆盖,则 ldapsearch 操作会返回一个条目的值,即使属性被索引,只要条目有一个本地值。具有 CoS 但没有本地值的其他条目仍会在 ldapsearch 操作中返回。
7.2.9. 访问控制和 CoS
7.2.10. 从命令行管理 CoS
7.2.10.1. 从命令行创建 CoS 定义条目
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
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
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
cosAttribute
。CoS 的目的是在多个条目间提供属性值;cos Attribute 属性定义
CoS 为哪个属性生成值。
7.2.10.2. 从命令行创建 CoS 模板条目
cosAttribute
属性生成的属性,以及该属性的值。
postalCode
属性提供值的 CoS 模板条目如下:
dn:cn=exampleUS,ou=data,dc=example,dc=com objectclass: top objectclass: extensibleObject objectclass: cosTemplate postalCode: 44438
7.2.10.3. Pointer CoS 示例
- 使用 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
postalCode
属性中的值到 dc=example,dc=com 后缀下的任何条目。这些条目是目标条目。
7.2.10.4. Indirect 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 示例
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
businessCategory
属性和 cosTemplateDn
的组合,它可以到达两个模板之一。销售模板( Sales 模板)提供了一个特定于销售部门员工的发布代码。市场模板提供了一个特定于市场部门员工的发布代码。
7.2.10.6. 搜索 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))"
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. 创建基于角色的属性
nsRole
属性作为经典 CoS 的 CoS 定义条目中的 cosSpecifier
。因为 nsRole
属性可以是多值,所以可以定义 CoS 方案,它们具有多个可能的模板条目。要解决要使用的模板条目的不确定性,请在 CoS 模板条目中包含 cosPriority
属性。
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
属性无法接受虚拟属性值。
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
属性值。
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 提供值。
7.3. 链接属性以管理属性值
7.3.1. 关于链接属性
linkType
),以及一个由插件自动维护的属性(managedType
)。
图 7.5. 基本链接的属性配置
图 7.6. 将链接的属性插件限制为特定子树
- managed 属性和链接的属性都必须在其属性定义中需要 Distinguished Name 语法。链接的属性本质上是跨引用管理的,插件处理这些跨引用的方式是从属性值中提取条目的 DN。有关规划自定义架构元素的详情,请参考 第 12 章 管理目录架构。
- 每个链接的属性插件实例都必须是本地的,并且 所有受管 属性都必须禁止使用部分复制进行复制。在一个供应商上所做的任何更改都将自动触发插件,以管理对应目录条目上的值,因此数据可以在服务器间保持一致。但是,受管属性必须由插件实例维护,才能在链接条目之间保持一致。这意味着,受管属性值应仅由插件进程(而不是复制过程)单独维护,即使在多层次复制环境中也是如此。有关使用部分复制的详情,请参考 第 15.1.7 节 “使用 DNATactional Replication 复制子属性集”。
7.3.2. 查看链接属性插件语法
- 由管理员手动管理的属性在
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
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. 清理属性链接
7.3.4.1. 重新生成链接属性
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin linked-attr fixup
# 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 添加条目来启动任务。任务完成后,条目会从目录中删除。
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
配置中删除,因此可以持续重复使用相同的任务条目。
7.4. 分配和管理唯一属性值
uidNumber
和 gidNumber
。目录服务器可以使用分布式数字分配(DNA)插件为指定属性自动生成并提供唯一数字。
7.4.1. 关于动态数字分配
7.4.1.1. 过滤器、搜索和目标条目
7.4.1.2. 范围和分配号
- 在最简单的情形中,用户条目添加到具有对象类的目录中,该对象类需要 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. 相同范围内的多个属性
- 从单一唯一数字范围内分配给单个属性类型的单个数字。
- 对于一个条目,分配给两个属性的唯一数字相同。
- 分配了两个不同的属性,与相同范围的唯一数字不同。
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
uidNumber
属性,但它允许 gidNumber
。如果 DNA 插件同时管理 uidNumber
和 gidNumber
,那么当创建 posixGroup 条目时,从 uidNumber
和 gidNumber
属性分配唯一的 gidNumber
号。对插件管理的所有属性使用相同的池可保持分配唯一数字,并防止不同条目上的 uidNumber
和 gidNumber
从不同范围分配,并导致相同的 唯一数字。
# 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
例 7.6. DNA 和唯一过期帐户号
primaryAccount
和 customerID
属性使用相同的唯一数字。Example the administrator 配置 DNA 插件,以从同一范围内为这两个属性分配唯一值。
secondaryAccount
属性,但仅在条目被创建、primaryAccount
和 customerID
被分配后,才会将 secondaryAccount
属性添加到条目中。这样可确保 primaryAccount
和 customerID
共享相同的唯一数字,任何 次要Account
号都完全是唯一的,但仍然来自相同的数字。
7.4.2. 查看 DNA 插件语法
- 正在管理的属性,在
dnaType
属性中设置 - 用作基础的条目 DN 搜索条目,在
dnaScope
属性中设置 - 用于识别要管理的条目的搜索过滤器,在
dnaFilter
属性中设置 - 要分配的下一个可用值,在
dnaNextValue
属性中设置(在创建条目后,这由插件处理)
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. 配置唯一数字分配
7.4.3.1. 创建 DNA 插件的新实例
- 例如,要创建插件的新实例:
# 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
,这需要整数属性上的相等索引,具有正确的排序匹配规则。
- 创建插件的新实例。请参阅 第 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 控制台配置唯一数字分配
- 创建插件的新实例。请参阅 第 7.4.3.1 节 “创建 DNA 插件的新实例”。
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择 DNA 插件。
- 将状态更改为 ON 以启用插件。
- 单击。
- 填写字段并启用配置。
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
7.4.4. 分布式数字分配插件性能备注
第 8 章 整理和分组条目
8.1. 使用组
nsRoleDN
属性中。如果您使用组,则属于此组成员的用户的 DN 存储在组对象的 成员属性
中。如果启用了 memberOf 插件,则该用户所属的组也存储在用户对象的 memberOf
属性中。启用此插件后,组也具有角色的好处,您可以列出用户的组成员资格,类似于使用角色时类似。另外,组比角色更快。
8.1.1. 组的不同类型
- 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. 动态组条目
objectClass: top objectClass: groupOfUniqueNames objectClass: groupOfURLs cn: dynamic group description: Example dynamic group. memberURL: ldap:///dc=example,dc=com??sub?(&(objectclass=person)(cn=*sen*))
memberURL
属性而不是列出属性中的组成员,则 memberOf 插件不会将 memberOf
属性添加到与过滤器匹配的用户对象。
8.1.2. 创建静态组
8.1.2.1. 使用命令行创建静态组
使用 groupOfNames 对象类创建静态组
dsidm
实用程序在指定的基本 DN 的 cn=Groups 条目中创建静态组。
example_group
组
# dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" group create --cn "example_group"
使用 groupOfUniqueNames 对象类创建静态组
ldapmodify
工具来添加该条目。
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. 使用命令行创建动态组
使用 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 对象类创建动态组
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
属性。(默认情况下,这将检查 member
属性,但可使用多个属性实例来支持多个不同的组类型。)
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
属性。
LDAP: error code 65 - Object Class Violation
8.1.4.3. MemberOf 插件语法
memberOfGroupAttr
),另一个用于在成员用户条目中创建和管理的属性(memberOfAttr
)。
memberOfGroupAttr
属性是多值。由于不同类型的组使用不同的成员属性,因此使用多个 memberOfGroupAttr
属性允许插件管理多种类型的组。
例 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
成员
),可能需要包含 成员
组属性或之前使用的任何成员属性,除了插件配置中使用的任何新成员属性。
memberOfGroupAttr: member
memberOfGroupAttr: uniqueMember
8.1.4.4. 启用 MemberOf 插件
8.1.4.4.1. 使用命令行启用 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 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择菜单。
- 选择 MemberOf 插件。
- 将状态更改为 ON 以启用插件。
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
8.1.4.5. 在每个服务器上配置 MemberOf 插件
8.1.4.5.1. 使用命令行在每个服务器上配置 MemberOf 插件
- 启用插件。请参阅 第 8.1.4.4.1 节 “使用命令行启用 MemberOf 插件”。
- 要从与成员不同的属性(这是默认值)检索
组的成员
,请将memberOfGroupAttr
参数设置为对应的属性名称。例如,要从uniqueMember
属性读取组成员,请替换memberOfGroupAttr
的当前值:- 另外,还可显示当前配置的属性:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof show ... memberofgroupattr: member ...
命令显示目前只有member
属性配置为检索组的成员。 - 从当前设置的配置中删除所有属性:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof set --groupattr delete Successfully changed the cn=MemberOf Plugin,cn=plugins,cn=config
注意无法删除特定的组属性。 - 在配置中添加
uniqueMember
属性:# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof set --groupattr uniqueMember successfully added memberOfGroupAttr value "uniqueMember"
要设置多个属性,请将全部传递到--groupattr
参数。例如:# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof set --groupattr member uniqueMember ...
- 默认情况下,MemberOf 插件将
memberOf
属性添加到用户条目中。要使用其他属性,请在memberOfAttr
参数中设置属性的名称。例如,要将customMemberOf
属性添加到用户记录中,请替换memberOfAttr
的当前值:- 另外,还可显示当前配置的属性:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof show ... memberofattr: memberOf ...
- 配置 MemberOf 插件,将
customMemberOf
属性添加到用户条目中:# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof set --attr customMemberOf memberOfAttr set to "customMemberOf"
注意您只能将此参数设置为支持 DN 语法的属性。
- 在使用分布式数据库的环境中,您可以将插件配置为在所有数据库中搜索用户条目,而不是只搜索本地数据库:
dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof set --allbackends on memberOfAllBackends enabled successfully
- 重启实例:
# dsctl instance_name restart
8.1.4.5.2. 使用 Web 控制台在每个服务器上配置 MemberOf 插件
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择 memberOf 插件。
- 将状态更改为 ON 以启用插件。
- 填写字段来配置插件。例如,如果将
uniqueMember
属性添加到组中,配置插件会将customMemberOf
属性添加到用户条目中: - 点击。
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
8.1.4.7. 设置 MemberOf 插件的范围
memberOfEntryScope
和 memberOfEntryScopeExcludeSubtree
参数来设置 MemberOf
插件在哪些后缀。
MemberOf
插件仅当用户和组都位于插件范围内时,才会将 memberOf
属性添加到组中。例如,要将 MemberOf
插件配置为在 dc=example,dc=com
中的所有条目上工作,但要排除 ou=private,dc=example,dc=com
中的条目:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof set --scope "dc=example,com" # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof set --exclude "dc=group,dc=example,com"
--scope DN
参数将用户条目从范围移出:
- 组成员属性(如
成员
)在组条目中更新,以删除用户 DN 值。 memberOf
属性在用户条目中更新,以删除组 DN 值。
--exclude
参数中设置的值的优先级高于 --scope
中设置的值。如果两个参数中设置的范围都重叠,则 MemberOf
插件仅适用于非重叠的目录条目。
8.1.4.8. 重新生成 memberOf
值
memberOf
属性。但是,可以在用户条目中手动编辑 memberOf
属性,或者新条目可以被导入或复制到已设置了 memberOf
属性的服务器。这些情况会在由服务器插件管理的 memberOf
配置和条目中定义的实际成员资格之间造成不一致的情况。
memberOf
值:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin memberof fixup -f "(|(objectclass=inetuser)(objectclass=inetadmin)(objectclass=nsmemberof))" "dc=example,dc=com" Attempting to add task entry... Successfully added task entry
-f filter
选项是可选的。使用过滤器在与过滤器匹配的用户条目中重新生成 memberOf
属性。如果没有指定过滤器,任务会在包含 inetUser、inetAdmin 或 nsMemberOf 对象类的所有条目中重新生成属性。
memberOf
属性不会更新。
8.1.5. 自动添加条目来指定组
autoMemberProcessModifyOps
参数设置为 on。使用这个设置时,当管理员通过编辑用户条目将用户移到其他组时,自动成员插件也会更新组成员资格。
autoMemberProcessModifyOps
设置为 off,则目录服务器仅在向用户添加组条目时调用插件,您必须手动运行修复任务来更新组成员资格。
8.1.5.1. 查看自动成员规则的结构
8.1.5.1.1. 自动成员配置条目
- 用于识别条目的 LDAP 搜索,包括搜索范围和搜索过滤器(
autoMemberScope
和autoMemberFilter
) - 要添加成员条目的默认组(
autoMemberDefaultGroup
) - 成员条目格式,即组条目中的属性,如
member
和属性值,如dn
(自动MemberGroupingAttr
)
dn: cn=Windows Users,cn=Auto Membership Plugin,cn=plugins,cn=config objectclass: autoMemberDefinition autoMemberScope: ou=People,dc=example,dc=com autoMemberFilter: objectclass=ntUser autoMemberDefaultGroup: cn=windows-group,cn=groups,dc=example,dc=com autoMemberGroupingAttr: member:dn
8.1.5.1.2. 其他正则表达式条目
例 8.4. 主机组的自动定义
dn: cn=Hostgroups,cn=Auto Membership Plugin,cn=plugins,cn=config objectclass: autoMemberDefinition cn: Hostgroups autoMemberScope: dc=example,dc=com autoMemberFilter: objectclass=ipHost autoMemberDefaultGroup: cn=systems,cn=hostgroups,dc=example,dc=com autoMemberGroupingAttr: member:dn
例 8.5. Web 服务器组的正则表达式条件
dn: cn=webservers,cn=Hostgroups,cn=Auto Membership Plugin,cn=plugins,cn=config objectclass: autoMemberRegexRule description: Group for webservers cn: webservers autoMemberTargetGroup: cn=webservers,cn=hostgroups,dc=example,dc=com autoMemberInclusiveRegex: fqdn=^www\.web[0-9]+\.example\.com
图 8.1. 正则表达式条件
属性 | 描述 |
---|---|
autoMemberRegexRule (必需对象类) | 将条目标识为正则表达式规则。此条目必须是自动成员定义的子项(对象类:autoMemberDefinition)。 |
autoMemberInclusiveRegex | 设置用于标识要包含的条目的正则表达式。只有匹配的条目才会添加到组中。可以使用多个正则表达式,如果条目与其中任何一个表达式匹配,它将包含在组中。
表达式的格式是一个 Perl 兼容的正则表达式(PCRE)。有关 PCRE 模式的更多信息,请参阅 pcresyntax(3) man page。
这是一个多值属性。
|
autoMemberExclusiveRegex | 设置正则表达式,用于识别要排除的条目。如果条目与排除条件匹配,则 不会包含在 组中。可以使用多个正则表达式,如果条目与其中任何一个表达式匹配,它将包含在组中。
表达式的格式是一个 Perl 兼容的正则表达式(PCRE)。有关 PCRE 模式的更多信息,请参阅 pcresyntax(3) man page。
这是一个多值属性。
注意
排除条件会首先评估,优先于 include 条件。
|
autoMemberTargetGroup | 如果满足正则表达式条件,则设置要将条目添加到成员的组。 |
8.1.5.2. 配置自动成员资格 定义
8.1.5.2.1. 使用命令行配置 自动成员资格定义
- 启用 Auto Membership 插件:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin automember enable Enabled Auto Membership Plugin
- 创建 Auto Membership 定义。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin automember definition definition_name add --default-group "cn=windows-group,cn=groups,dc=example,dc=com" --scope "ou=People,dc=example,dc=com" --filter "objectclass=ntUser" --grouping-attr "member:dn" Automember definition created successfully!
- 另外,您可以在 Auto Membership 定义中设置更多参数,例如,使用正则表达式来识别条目包含。使用
ldapmodify
工具在 cn=definition_name,cn=Auto Membership Plugin,cn=plugins,cn=config 条目中添加或更新这些参数。有关您可以设置的参数,请参阅 Red Hat Directory Server Configuration, Command, and File Reference 中的 cn=Auto Membership Plugin,cn=plugins,cn=config 条目描述。 - 重启实例:
# dsctl instance_name restart
8.1.5.2.2. 使用 Web 控制台配置自动成员资格定义
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择 Auto Membership 插件。
- 将状态更改为 ON 以启用插件。
- 点。
- 填写字段。例如:
- (可选)添加正则表达式过滤器。
- 点击。
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
8.1.5.3. 更新现有条目以应用自动成员资格定义
autoMemberProcessModifyOps
参数被启用。使用这个设置时,当管理员通过编辑用户条目将用户移到其他组时,自动成员 插件也会更新组成员资格。但是,如果您将 autoMemberProcessModifyOps
设置为 off,您必须在向目录添加新条目或更改现有条目时手动运行修复任务。
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin automember fixup -f "filter" -s scope
8.1.5.4. 自动成员规则示例
- 基于 IP 地址的不同主机组
- Windows 用户组
- 基于员工 ID 的不同用户组
例 8.6. 按 IP 地址的主机组
configuration entry dn: cn=Hostgroups,cn=Auto Membership Plugin,cn=plugins,cn=config objectclass: autoMemberDefinition cn: Hostgroups autoMemberScope: dc=example,dc=com autoMemberFilter: objectclass=bootableDevice autoMemberDefaultGroup: cn=orphans,cn=hostgroups,dc=example,dc=com autoMemberGroupingAttr: member:dn regex entry #1 dn: cn=webservers,cn=Hostgroups,cn=Auto Membership Plugin,cn=plugins,cn=config objectclass: autoMemberRegexRule description: Group placement for webservers cn: webservers autoMemberTargetGroup: cn=webservers,cn=hostgroups,dc=example,dc=com autoMemberInclusiveRegex: fqdn=^www[0-9]+\.example\.com autoMemberInclusiveRegex: fqdn=^web[0-9]+\.example\.com autoMemberExclusiveRegex: fqdn=^www13\.example\.com autoMemberExclusiveRegex: fqdn=^web13\.example\.com regex entry #2 dn: cn=mailservers,cn=Hostgroups,cn=Auto Membership Plugin,cn=plugins,cn=config objectclass: autoMemberRegexRule description: Group placement for mailservers cn: mailservers autoMemberTargetGroup: cn=mailservers,cn=hostgroups,dc=example,dc=com autoMemberInclusiveRegex: fqdn=^mail[0-9]+\.example\.com autoMemberInclusiveRegex: fqdn=^smtp[0-9]+\.example\.com autoMemberExclusiveRegex: fqdn=^mail13\.example\.com autoMemberExclusiveRegex: fqdn=^smtp13\.example\.com
例 8.7. Windows 用户组
posixAccount
属性来识别所有新用户。目录服务器内创建的所有新用户都使用 posixAccount
属性创建,因此对于新的目录服务器用户而言,它是安全捕获的。但是,当用户帐户从 Windows 域同步到目录服务器时,会创建 Windows 用户帐户,但没有 posixAccount
属性。
ntUser
属性标识。可将所有用户组规则修改为专门用于目标 Windows 用户,然后可以添加到默认的 all-users 组或特定于 Windows 的组中。
dn: cn=Windows Users,cn=Auto Membership Plugin,cn=plugins,cn=config objectclass: autoMemberDefinition autoMemberScope: dc=example,dc=com autoMemberFilter: objectclass=ntUser autoMemberDefaultGroup: cn=Windows Users,cn=groups,dc=example,dc=com autoMemberGroupingAttr: member:dn
例 8.8. 按 Employee Type 组成用户组
employeeType
属性中根据员工类型创建然后引用用户。
configuration entry dn: cn=Employee groups,cn=Auto Membership Plugin,cn=plugins,cn=config objectclass: autoMemberDefinition cn: Hostgroups autoMemberScope: ou=employees,ou=people,dc=example,dc=com autoMemberFilter: objectclass=inetorgperson autoMemberDefaultGroup: cn=general,cn=employee groups,ou=groups,dc=example,dc=com autoMemberGroupingAttr: member:dn regex entry #1 dn: cn=full time,cn=Employee groups,cn=Auto Membership Plugin,cn=plugins,cn=config objectclass: autoMemberRegexRule description: Group for full time employees cn: full time autoMemberTargetGroup: cn=full time,cn=employee groups,ou=groups,dc=example,dc=com autoMemberInclusiveRegex: employeeType=full regex entry #2 dn: cn=temporary,cn=Employee groups,cn=Auto Membership Plugin,cn=plugins,cn=config objectclass: autoMemberRegexRule description: Group placement for interns, contractors, and seasonal employees cn: temporary autoMemberTargetGroup: cn=temporary,cn=employee groups,ou=groups,dc=example,dc=com autoMemberInclusiveRegex: employeeType=intern autoMemberInclusiveRegex: employeeType=contractor autoMemberInclusiveRegex: employeeType=seasonal
8.1.5.5. 测试自动成员定义
使用现有条目进行测试
cn=automember export updates 针对目录中现存的条目运行,并基于规则导出哪些用户被加入到哪些组的信息。这可用于针对现有用户测试现有规则,以查看您的实际部署方式。
# ldapadd -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=test_export,cn=automember export updates,cn=tasks,cn=config objectClass: top objectClass: extensibleObject cn: test_export basedn: dc=example,dc=com filter: (uid=*) scope: sub ldif: /tmp/automember-updates.ldif
使用导入 LDIF 测试
cn=automember 映射更新 取新用户的 导入 LDIF,然后根据当前的自动成员规则 运行新用户。在将新规则应用到新或现有用户条目之前,这对测试新规则非常有用。
# ldapadd -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=test_mapping, cn=automember map updates,cn=tasks,cn=config objectClass: top objectClass: extensibleObject cn: test_mapping ldif_in: /tmp/entries.ldif ldif_out: /tmp/automember-updates.ldif
8.1.5.6. 取消 Auto Membership 插件任务
流程
- 要取消 Auto Membership 插件任务,请输入:
# dsconf server.example.com plugin automember abort-fixup
验证
- 要查看所有 Auto Membership 插件任务列表,包括取消的任务,请输入:
# dsconf server.example.com plugin automember fixup-status
8.2. 使用角色
8.2.1. 关于角色
- Managed roles 具有明确枚举的成员列表。
- Filtered roles 是分配给角色的条目,取决于每个条目包括的属性,在 LDAP filter 中指定。与过滤器匹配的条目具有角色。
- 嵌套角色是包含其他角色的角色。
nsRole
属性来检查角色成员资格。nsRole
属性是一个计算属性,它标识条目所属的角色; nsRole
属性不存储在条目本身中。从客户端应用程序视图中,检查成员资格的方法统一并在服务器端执行。
8.2.2. 使用命令行管理角色
8.2.2.1. 创建受管角色
nsRoleDN
属性,将受管角色添加到条目中。
8.2.2.1.1. 使用命令行创建受管角色
- nsSimpleRoleDefinition
- nsManagedRoleDefinition
description
属性。
nsRoleDN
属性。
- 使用带有
-a
选项的 ldapmodify 来添加受管角色条目。新条目必须包含 nsManagedRoleDefinition 对象类,后者从 LdapSubEntry、nsRoleDefinition 和 nsSimpleRoleDefinition 对象类继承。dn: cn=Marketing,ou=people,dc=example,dc=com objectclass: top objectclass: LdapSubEntry objectclass: nsRoleDefinition objectclass: nsSimpleRoleDefinition objectclass: nsManagedRoleDefinition cn: Marketing description: managed role for marketing staff
- 使用 ldapmodify 为市场员工成员分配角色:
dn: cn=Bob,ou=people,dc=example,dc=com changetype: modify add: nsRoleDN nsRoleDN: cn=Marketing,ou=people,dc=example,dc=com
条目的nsRoleDN
属性表示该条目是受管角色 cn=Marketing,ou=body,dc=example,dc=com 的成员。
8.2.2.2. 创建过滤的角色
8.2.2.2.1. 使用命令行创建过滤的角色
- nsComplexRoleDefinition
- nsFilteredRoleDefinition
nsRoleFilter
属性来定义 LDAP 过滤器来确定角色成员。(可选)角色可以获取 description
属性。
nsRoleFilter
属性中指定的过滤器匹配的条目。
- 运行带有
-a
选项的 ldapmodify 来添加新条目。 - 创建过滤的角色条目。角色条目具有 nsFilteredRoleDefinition 对象类,它继承 LdapSubEntry、nsRoleDefinition 和 nsComplexRoleDefinition 对象类。nsRoleFilter 属性为包含 Sales manager 值的
o
(organization)属性设置过滤器。dn: cn=SalesManagerFilter,ou=people,dc=example,dc=com changetype: add objectclass: top objectclass: LDAPsubentry objectclass: nsRoleDefinition objectclass: nsComplexRoleDefinition objectclass: nsFilteredRoleDefinition cn: SalesManagerFilter nsRoleFilter: o=sales managers Description: filtered role for sales managers
o
属性与值 Sales manager匹配),因此它会自动是这个过滤角色的成员:
dn: cn=Pat Smith,ou=people,dc=example,dc=com objectclass: person cn: Pat sn: Smith userPassword: secret o: sales managers
8.2.2.3. 创建嵌套角色
nsRoleDN
属性来指定。
8.2.2.3.1. 使用命令行创建嵌套角色
- nsComplexRoleDefinition
- nsNestedRoleDefinition
nsRoleDN
属性来识别容器角色内嵌套的角色。(可选)角色可以获取 description
属性。
nsRoleDN
属性中指定的角色的成员。
- 运行带有
-a
选项的 ldapmodify 来添加新条目。 - 创建嵌套角色条目。嵌套角色有四个对象类:
- nsNestedRoleDefinition
- ldapsubentry (inherited)
- nsRoleDefinition (inherited)
- nsComplexRoleDefinition (inherited)
nsRoleDN
属性包含市场管理角色和销售管理器过滤角色的 DN。dn: cn=MarketingSales,ou=people,dc=example,dc=com objectclass: top objectclass: LDAPsubentry objectclass: nsRoleDefinition objectclass: nsComplexRoleDefinition objectclass: nsNestedRoleDefinition cn: MarketingSales nsRoleDN: cn=SalesManagerFilter,ou=people,dc=example,dc=com nsRoleDN: cn=Marketing,ou=people,dc=example,dc=com
8.2.2.4. 使用命令行查看条目的角色
+
输出结果对象的所有操作属性来明确请求它们。例如,除了条目的常规属性外,这个 ldapsearch 命令会返回哪些 uid=user_name 是成员的角色列表:
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -b "dc=example,dc=com" -s sub -x "(uid=user_name)"” \* nsRole dn: uid=user_name,ou=people,dc=example,dc=com ... nsRole: cn=Role for Managers,dc=example,dc=com nsRole: cn=Role for Accounting,dc=example,dc=com
8.2.2.5. 关于删除角色
nsRoleDN
属性。要删除每个角色成员的 nsRoleDN
属性,请启用 referential Integrity 插件,并将其配置为管理 nsRoleDN
属性。有关参考完整性插件的详情,请参考 第 5 章 维护参考完整性。
8.2.3. 使用 LDAP 浏览器管理目录服务器中的角色
8.2.3.1. 在 LDAP 浏览器中创建角色
先决条件
- 访问 Web 控制台。
- Red Hat Directory Server 中存在父条目。
流程
- 登录 Web 控制台并点击。
- Web 控制台加载界面后,单击 。
- 选择一个 LDAP 条目并点击 Options 菜单。
- 从下拉菜单中,选择并点 。
- 按照向导中的步骤,在完成每个步骤后点按钮。
- 要创建角色,请查看步骤中的角色设置,再单击 。您可以点击 按钮来修改角色设置,或者点击 按钮取消角色创建。
- 要关闭向导窗口,请点击按钮。
验证
- 展开 LDAP 条目,并验证新角色出现在条目参数中。
8.2.3.2. 在 LDAP 浏览器中修改角色
先决条件
- 访问 Web 控制台。
- Red Hat Directory Server 中存在父条目。
流程
- 登录 Web 控制台并点击。
- Web 控制台加载界面后,单击 。
- 展开 LDAP 条目,再选择您要修改的角色。
- 点 Options 菜单,选择来修改角色的参数或 来重命名角色。
- 在向导窗口中,修改必要的参数,并在每个步骤后点,直到您观察 步骤。
- 检查更新的参数并点击或 。
- 要关闭向导窗口,请点击按钮。
验证
- 展开 LDAP 条目,并验证为角色列出了更新的参数。
8.2.3.3. 在 LDAP 浏览器中删除角色
先决条件
- 访问 Web 控制台。
- Red Hat Directory Server 中存在父条目。
流程
- 登录 Web 控制台并点击。
- Web 控制台加载界面后,单击 。
- 展开 LDAP 条目,再选择您要删除的角色。
- 打开 Options 菜单并选择。
- 验证您要删除的角色的数据,然后单击按钮,直到您到达 步骤。
- 将开关切换到location,再单击 按钮。
- 要关闭向导窗口,请点击按钮。
验证
- 展开 LDAP 条目,并验证角色不再是条目详细信息的一部分。
8.2.4. 安全地使用角色
nsAccountLock
属性被计算为该用户的 true。但是,如果用户 A 已绑定到目录服务器,并注意到他现在通过 MR 角色锁定,用户可以从其条目中删除 nsRoleDN
属性,并在没有 ACI 阻止了 ACI 时解锁自己。
nsRoleDN
属性,请根据所使用的角色类型,使用以下 ACI。
- 受管角色。对于作为受管角色成员的条目,请使用以下 ACI 通过删除适当的
nsRoleDN
来防止用户解锁其自身:aci: (targetattr="nsRoleDN") (targattrfilters= add=nsRoleDN:(!(nsRoleDN=cn=AdministratorRole,dc=example,dc=com)), del=nsRoleDN:(!(nsRoleDN=cn=nsManagedDisabledRole,dc=example,dc=com))) (version3.0;acl "allow mod of nsRoleDN by self but not to critical values"; allow(write) userdn=ldap:///self;)
- 过滤的角色。作为过滤器一部分的属性应该受到保护,以便用户无法通过修改属性来重新简化过滤的角色。不应该允许用户添加、删除或修改过滤角色使用的属性。如果计算了 filter 属性的值,则所有可以修改 filter 属性的值的属性都应以同样的方式进行保护。
- 嵌套角色。嵌套角色由过滤和受管角色组成,因此两个 ACI 都应考虑修改组成嵌套角色的角色的属性(
nsRoleDN
或其他)。
8.3. 自动创建双条目
8.3.1. 关于受管条目
- 定义条目,用于标识插件实例和要使用的模板的范围
- 模板条目,它建模最终受管条目是什么
8.3.1.1. 关于实例定义条目
- 用于标识原始条目的搜索条件(使用搜索范围和搜索过滤器)
- 在其中创建受管条目(新条目位置)的子树
- 用于受管条目的模板条目
图 8.2. 定义受管条目
dn: cn=Posix User-Group,cn=Managed Entries,cn=plugins,cn=config objectclass: extensibleObject cn: Posix User-Group originScope: ou=people,dc=example,dc=com originFilter: objectclass=posixAccount managedBase: ou=groups,dc=example,dc=com managedTemplate: cn=Posix User-Group Template,ou=Templates,dc=example,dc=com
8.3.1.2. 关于模板条目
图 8.3. 模板、受管条目和原始条目
dn: cn=Posix User-Group Template,ou=Templates,dc=example,dc=com objectclass: mepTemplateEntry cn: Posix User-Group Template mepRDNAttr: cn mepStaticAttr: objectclass: posixGroup mepMappedAttr: cn: $cn Group Entry mepMappedAttr: gidNumber: $gidNumber mepMappedAttr: memberUid: $uid
8.3.1.3. 由受管条目插件编写的条目属性
dn: uid=jsmith,ou=people,dc=example,dc=com objectclass: mepOriginEntry objectclass: posixAccount ... sn: Smith mail: jsmith@example.com mepManagedEntry: cn=jsmith Posix Group,ou=groups,dc=example,dc=com
dn: cn=jsmith Posix Group,ou=groups,dc=example,dc=com objectclass: mepManagedEntry objectclass: posixGroup ... mepManagedBy: uid=jsmith,ou=people,dc=example,dc=com
8.3.1.4. 受管条目插件和目录服务器操作
操作 | 受管条目插件的影响 |
---|---|
添加 | 对于每个添加操作,服务器会检查新条目是否在任何受管条目插件实例范围内。如果达到原始条目的条件,则会创建一个受管条目,并将受管条目相关属性添加到原始和受管条目中。 |
修改 |
如果修改了原始条目,它会触发插件来更新受管条目。但是,更改 模板 条目不会自动更新受管条目。对模板条目的任何更改都不会反映在受管条目中,直到下次修改原始条目后。
在受管条目中映射的受管属性无法手动修改,只有通过 Managed Entry 插件进行修改。受管条目中的其他属性(包括由 Managed Entry 插件添加的静态属性)可以手动修改。
|
删除 | 如果删除了原始条目,则 Managed Entries 插件也会删除与该条目关联的任何受管条目。对可以删除的条目有一些限制。
|
rename | 如果重命名了原始条目,则插件会更新对应的受管条目。如果条目从插件范围 移出,则删除受管条目;而如果某个条目 移至 插件范围,它将被视为 add 操作,并且创建新的受管条目。与删除操作一样,可以重命名或移动条目的限制。
|
复制 | Managed Entries 插件操作 由复制更新启动。如果插件范围中某个条目的添加或修改操作被复制到另一个副本,则该操作不会触发副本上的 Managed Entries 插件实例来创建或更新条目。要复制受管条目的更新的唯一方法是将最终受管条目复制到副本。 |
8.3.2. 创建受管条目模板条目
mepStaticAttr: attribute: specific_value mepMappedAttr: attribute: $token_value
mepMappedAttr: cn: Managed Group for $cn
- 映射的值使用令牌(动态值)和静态值的组合,但只能使用每个映射 的属性使用一个令牌。
- 模板中映射的属性使用令牌(以分号符号($)开头)从原始条目中提取值并在受管条目中使用它。(如果实际是 managed 属性值中的符号,则可以通过在一行中使用两个数字符号来转义该符号。)
- 映射的属性定义可以使用大括号括起来,如 Attr: ${cn}test。如果令牌名称不紧接在属性名称中有效的字符,则不需要引用令牌值,如空格或逗号。例如,$cn test 在属性定义中可以接受,因为空格字符会立即遵循属性名称,但 $cntest 无效,因为 Managed Entries 插件尝试在原始条目中查找名为 cntest 的属性。使用大括号标识属性令牌名称。
- 确保为静态和映射的属性赋予的值符合所需的属性语法。
gidNumber
,则映射的值应该是整数。
属性 | 描述 |
---|---|
mepTemplateEntry (对象类) | 将条目标识为模板。 |
cn | 提供条目的通用名称。 |
mepMappedAttr | 包含 attribute-token 对,插件用来在受管条目中创建属性,以及从原始条目获取的值。 |
mepRDNAttr | 指定用作受管条目中的 naming 属性的属性。用作 RDN 的属性 必须是 配置有效的映射属性。 |
mepStaticAttr | 包含一个属性-值对,它将在受管条目中使用指定值。 |
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin managed-entries template "cn=Posix User Template,ou=templates,dc=example,dc=com" add --rdn-attr "cn" --static-attr "objectclass: posixGroup" --mapped-attr "cn: $cn Group Entry" "gidNumber: $gidNumber" "memberUid: $uid"
8.3.3. 创建受管条目实例定义
属性名称 | 描述 |
---|---|
originFilter | 用于搜索和识别需要受管条目的子树中的条目的搜索过滤器。语法与常规搜索过滤器相同。 |
originScope | 包含要监控的插件的潜在原始条目的基本子树。 |
managedTemplate | 标识用于创建受管条目的模板条目。此条目可以位于目录树中的任何位置。 |
managedBase | 要创建受管条目的子树。 |
- 在 cn=Managed Entries,cn=plugins,cn=config 容器条目下创建新插件实例。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin managed-entries config "cn=instance,cn=Managed Entries,cn=plugins,cn=config" add --scope="ou=people,dc=example,dc=com" --filter="objectclass=posixAccount" --managed-base="ou=groups,dc=example,dc=com" --managed-template="cn=Posix User-Group Template,ou=Templates,dc=example,dc=com"
此命令设置原始条目搜索的范围和过滤器、新受管条目的位置以及要使用的模板条目。 - 如果目录服务器没有配置为启用动态插件,重启服务器以载入修改后的新插件实例:
# dsctl instance_name restart
8.3.4. 将受管条目插件配置放入复制数据库中
nsslapd-pluginConfigArea
属性。此属性到另一个容器条目,位于主数据库区域中,其中包含插件实例条目。此容器条目可以在复制数据库中,允许复制插件配置。
- 创建容器条目。例如,要创建一个指向容器条目的条目,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin managed-entries set --config-area="cn=managed entries container,ou=containers,dc=example,dc=com"
- 在新容器条目下移动或创建定义(第 8.3.3 节 “创建受管条目实例定义”)和模板(第 8.3.2 节 “创建受管条目模板条目”)条目。
8.4. 使用视图
8.4.1. 关于视图
nsview
)和一个过滤器属性(nsviewfilter
),用于为属于该视图中的条目设置过滤器。添加 view 容器条目后,与 view 过滤器匹配的所有条目都会立即填充视图。在视图中仅显示目标条目,目标条目的真正位置永远不会更改。例如,可以将视图创建为 ou=Location Views,并为 l=Mountain View 设置过滤器。每个条目(如 cn=Jane Smith,l=Mountain View,ou=People,dc=example,dc=com )都立即列在 ou=Location Views 条目下,但实际 cn=Jane Smith 条目保留在 ou=People,dc=example,dc=com 子树中。
图 8.4. 带有虚拟 DIT 视图层次结构的目录树
Example-views.ldif
,与 Directory Server 一起安装。此文件位于 /usr/share/dirsrv/data/
目录中。本章的章节假定 Example-views.ldif
导入到服务器。
8.4.2. 从命令行创建视图
- 使用 ldapmodify 实用程序绑定到服务器,并准备好将其添加新视图条目到配置文件中。
- 假设
Example-views.ldif
文件中的 view container ou=Location Views,dc=example,dc=com 位于 Directory 服务器中,在本例中为 dc=example,dc=com root 后缀下添加新的视图容器条目。此条目必须具有 nsview 对象类和nsViewFilter
属性。nsViewFilter
属性设置 attribute-value,用于标识属于视图中的条目。dn: ou=Mountain View,ou=Location Views,dc=example,dc=com changetype: add objectClass: top objectClass: organizationalUnit objectClass: nsview ou: Mountain View nsViewFilter: l=Mountain View description: views categorized by location
8.4.3. 提高视图性能
nsViewFilter
属性中定义的属性;过滤器的其余部分基于条目层次结构,查找视图中包含的实际条目的 entryid
和 parentid
。
(|(parentid=search_base_id)(entryid=search_base_id)
entryid
、parentid
或 nsViewFilter
中设置的属性没有索引,则视图搜索将变为不索引的搜索,因为 view 操作搜索整个树以获取匹配的条目。
entryid
、parentid
和 nsViewFilter
中设置的属性创建相等的索引。
8.5. 管理机构单元
- 要创建 OU,请输入:
# dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" organizationalunit create --ou OU_name
- 要列出条目中的 OUs,请输入:
# dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" organizationalunit list People ...
- 要重命名 OU,请输入:
# dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" organizationalunit rename old_name new_name
- 要删除 OU,请输入:
# dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" organizationalunit delete OU_name
第 9 章 配置安全连接
9.1. 需要安全连接
- LDAPS
- 当您使用 LDAPS 协议时,连接开始使用加密,并成功或失败。但是,不会通过网络发送未加密的数据。因此,首选 LDAPS 而不是通过未加密的 LDAP 使用 STARTTLS。
- LDAP 的 STARTTLS
- 客户端通过 LDAP 协议建立未加密的连接,然后发送 STARTTLS 命令。如果命令成功,则所有进一步的通信都会被加密。警告如果 STARTTLS 命令失败,且客户端没有取消连接,则所有进一步的数据(包括身份验证信息)都通过网络发送未加密的数据。
- SASL
- 简单的身份验证和安全层(SASL)可让您使用外部身份验证方法(如 Kerberos)验证用户。详情请查看 第 9.10 节 “设置 SASL 身份映射”。
9.2. 设置最小的 Strength Factor
nsslapd-minssf
配置属性。当强制最小 SSF 时,Directory 服务器会查找操作的每种可用加密类型 - TLS 或 SASL - 并决定哪个 SSF 值较高,然后将更高的值与最小 SSF 进行比较。可以同时为某些服务器到服务器连接(如复制)配置 SASL 身份验证和 TLS。
nsslapd-minssf-exclude-rootdse
配置属性。这为所有到目录服务器的连接设置 SSF 设置,但查询根 DSE 除外。在启动操作前,客户端可能需要获取有关服务器配置的信息,如其默认命名上下文。nsslapd-minssf-exclude-rootdse
属性允许客户端获取该信息,而无需首先建立安全连接。
nsslapd-minssf
属性值为 0,这意味着服务器连接没有最小 SSF。该值可以设置为任何合理的正整数。该值代表任何安全连接所需的密钥强度。
nsslapd-minssf
参数设置为 128 :
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-minssf=128 Successfully replaced "nsslapd-minssf"
nsslapd-require-secure-binds
属性,如 第 20.12.1 节 “需要安全绑定” 中所示,绑定操作可能需要安全连接。
9.3. 管理目录服务器使用的 NSS 数据库
dscreate
实用程序会在 /etc/dirsrv/slapd-instance_name/
目录中自动创建此数据库,并使用强大的密码保护。实用程序将密码存储在 /etc/dirsrv/slapd-instance_name/pwdfile.txt
文件中。请注意,Directory 服务器不使用此文件。dscreate
实用程序仅创建此文件来为管理员提供密码。有关更改密码的详情,请参考 第 9.3.10 节 “更改 NSS 数据库的密码”。
9.3.1. 创建证书签名请求
certutil
工具直接在 NSS 数据库中创建私钥和 CSR。
9.3.1.1. 使用命令行创建证书签名请求
# dsctl instance_name tls generate-server-cert-csr -s "certificate_subject"
/etc/dirsrv/slapd-instance_name/Server-Cert.csr
文件中,以及目录服务器的网络安全服务(NSS)数据库中的私钥。
例 9.1. 为单一主机名创建私钥和 CSR
server.example.com
主机生成位私钥:
# dsctl instance_name tls generate-server-cert-csr -s "CN=server.example.com,O=example_organization,OU=IT,ST=North Carolina,C=US"
例 9.2. 为多主目录主机创建私钥和 CSR
server.example.com
和 server.example.net
主机名生成位私钥和 CSR:
# dsctl instance_name tls generate-server-cert-csr -s "CN=server.example.com,O=example_organization,OU=IT,ST=North Carolina,C=US" server.example.com server.example.net
-s
参数中指定的字符串必须是根据 RFC 1485 的有效主题名称。CN
字段是必需的,您必须将其设置为服务器的 FQDN 之一。其他字段都是可选的。
9.3.2. 安装 CA 证书
Web 控制台选项 | dsconf 和 certutil 选项 | 描述 |
---|---|---|
(C)受信任的 CA | C,, | 服务器验证用于建立与复制合作伙伴的加密连接的证书是否已由可信 CA 发布。 |
(T)受信任的 CA 客户端身份验证 | T, | 服务器信任此 CA 证书来发布适合 TLS EXTERNAL 绑定的客户端证书。 |
certutil
时,将 -T "CT,"
参数传给实用程序。
9.3.2.1. 使用命令行安装 CA 证书
- 导入 CA 证书。例如,要导入存储在
/root/ca.crt
文件中的 CA 证书,并使用Example CA
nick 名称将其存储在数据库中:# dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate add --file /root/ca.crt --name "Example CA"
- 设置信任选项。例如,要设置 CT, 信任标志:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate set-trust-flags "Example CA" --flags "CT,,"
9.3.2.2. 使用 Web 控制台安装 CA 证书
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开 Security 条目。菜单,然后选择
- 打开 证书管理 选项卡,然后选择 受信任的证书颁发机构 子选项卡。
- 点。
- 输入 CA 证书文件的路径以及证书的别名。
图 9.1. 添加 CA 证书
注意CA 证书必须存储在本地目录服务器主机上,且必须由dirsrv
用户读取。 - 单击。
- 单击导入的 CA 证书旁边的 Edit Trust Flags。,然后选择
- 在 SSL 列中选择 (C) - Trusted CA 和 (T) - Trusted CA Client Auth。
图 9.2. 添加 CA 证书的信任标记
9.3.3. 导入私钥和服务器证书
/root/server.crt
和 /root/server.key
文件中的私钥导入证书,请输入:
# dsctl instance_name tls import-server-key-cert /root/server.crt /root/server.key
- 服务器证书的路径。
- 私钥文件的路径。
9.3.4. 安装服务器证书
9.3.4.1. 使用命令行安装服务器证书
certutil
工具。例如:
- 安装 CA 证书。请参阅 第 9.3.2 节 “安装 CA 证书”。
- 导入服务器证书。例如,要导入存储在
/root/instance_name.crt
文件中的证书,并将其设置为实例使用的主证书:# dsconf -D "cn=Directory Manager" ldap://server.example.com security certificate add --file /root/instance_name.crt --name "Server-Cert" --primary-cert
9.3.4.2. 使用 Web 控制台安装服务器证书
- 安装 CA 证书。请参阅 第 9.3.2 节 “安装 CA 证书”。
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开 Security 条目。菜单,然后选择
- 打开 证书管理 选项卡,然后选择 TLS 证书 子选项卡。
- 单击。
- 输入服务器证书文件的路径以及证书的别名。
图 9.3. 添加服务器证书
注意服务器证书必须存储在本地目录服务器主机上,且必须由dirsrv
用户读取。 - 单击。
9.3.5. 生成并安装自签名证书
dscreate
实用程序创建启用了 TLS 的实例时,dscreate
会自动创建并安装自签名证书。但是,如果您在实例创建过程中没有启用 TLS,您可以手动创建并安装自签名证书。
- 使用随机数据生成 noise 文件。例如,要生成大小为 4096 位的文件:
# openssl rand -out /tmp/noise.bin 4096
- 创建自签名证书并将其添加到 NSS 数据库中:
# certutil -S -x -d /etc/dirsrv/slapd-instance_name/ -z /tmp/noise.bin \ -n "Server-Cert" -s "CN=$HOSTNAME" -t "CT,C,C" -m $RANDOM \ --keyUsage digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment
Red Hat Enterprise Linux 会自动将$HOSTNAME
变量替换为完全限定域名(FQDN),将$RANDOM
替换为随机生成的数字。有关上一命令中使用的参数的详情,请查看 certutil(1) man page。 - (可选)验证生成的证书是自签名的:
# certutil -L -d /etc/dirsrv/slapd-instance_name/ -n "Server-Cert" | egrep "Issuer|Subject" Issuer: "CN=server.example.com" Subject: "CN=server.example.com"
此命令的输出必须同时显示证书的签发者和主题的目录服务器主机的 FQDN。
9.3.6. 续订证书
9.3.6.1. 使用命令行续订证书
- 如果不使用属性加密:
- 创建一个新的证书签名请求(CSR),其选项相同,如密钥大小、主机名和主题。有关创建 CSR 的详情,请参考 第 9.3.1.1 节 “使用命令行创建证书签名请求”
- 从 CA 收到发布的证书后,使用相同的 nickname 在数据库中安装证书。请参阅 第 9.3.2.1 节 “使用命令行安装 CA 证书”。
- 停止实例:
# dsctl instance_name stop
- 编辑
/etc/dirsrv/slapd-instance_name/dse.ldif
文件并删除以下条目,包括其属性:- cn=AES,cn=encrypted 属性 key,cn=database_name,cn=ldbm database,cn=plugins,cn=config
- cn=3DES,cn=encrypted 属性键,cn=database_name,cn=ldbm database,cn=plugins,cn=config
重要删除所有数据库的条目。如果包含nsSymmetricKey
属性的任何条目保留在/etc/dirsrv/slapd-instance_name/dse.ldif
文件中,则目录服务器将无法启动。 - 启动实例:
# dsctl instance_name start
目录服务器将自动使用较新的发布的证书。 - 如果使用属性加密,请参阅 第 10.5 节 “更新用于属性加密的 TLS 证书”。
9.3.7. 删除证书
9.3.7.1. 使用命令行删除证书
- 另外,还可在数据库中显示证书:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security certificate list Certificate Name: Server-Cert Subject DN: CN=server.example.com Issuer DN: CN=Example CA Expires: 2022-07-29 11:10:14 Trust Flags: ,,
- 删除证书。例如,使用 Server-Cert nickname 删除证书:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security certificate del Server-Cert
9.3.7.2. 使用 Web 控制台删除证书
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开 Security 条目。菜单,然后选择
- 打开 证书管理 选项卡,然后选择 TLS 证书 子选项卡。
- 单击证书旁边的 Delete Certificate。,然后选择
- 单击。
9.3.8. 删除私钥
9.3.8.1. 使用命令行删除私钥
- 根据您要删除的密钥删除所有证书。请参阅 第 9.3.7 节 “删除证书”。
- 另外,还可在数据库中显示密钥:
# certutil -d /etc/dirsrv/slapd-instance_name/ -K certutil: Checking token "NSS Certificate DB" in slot "NSS User Private Key and Certificate Services" Enter Password or Pin for "NSS Certificate DB": < 0> rsa 7a2fb6c269d83c4036eac7e4edb6aaf2ed08bc4a Server-Cert < 1> rsa 662b826aa3dd4ca7fd7e6883558cf3866c42f4e2 example-cert
- 删除私钥。例如,使用 example-cert 别名删除私钥:
# certutil -d /etc/dirsrv/slapd-instance_name/ -F -n "example-cert"
9.3.9. 更改 CA Trust Options
9.3.9.1. 使用命令行更改 CA 信任选项
--flags
参数中的新选项传给 dsconf 安全 ca-certificate set-trust-flags 命令。
example-CA
的 CA 发布的客户端身份验证证书:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate set-trust-flags "example-CA" --flags "T,,"
--flags trust_options
参数设置 CA 发布的证书应被信任。请参阅 表 9.1 “CA Trust Options”。
9.3.9.2. 使用 Web 控制台更改 CA 信任选项
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开 Security 条目。菜单,然后选择
- 打开 证书管理 选项卡。
- 在 受信任的证书颁发机构 子选项卡上,单击导入的 CA 证书旁边的 ,然后选择 Edit Trust Flags。
- 选择 trust 标记。例如:
图 9.4. 设置 CA 证书的信任标记
- 点击。
9.3.10. 更改 NSS 数据库的密码
9.3.10.1. 使用命令行更改 NSS 数据库的密码
# certutil -d /etc/dirsrv/slapd-instance_name -W Enter Password or Pin for "NSS Certificate DB": Enter a password which will be used to encrypt your keys. The password should be at least 8 characters long, and should contain at least one non-alphabetic character. Enter new password: Re-enter password: Password changed successfully.
9.4. 启用 TLS
- LDAPS 协议:在建立连接后直接使用 TLS 加密。
- 通过 LDAP 协议的 STARTTLS 命令:连接是未加密的,直到客户端发送 STARTTLS 命令。
9.4.1. 在目录服务器中启用 TLS
9.4.1.1. 使用命令行在目录服务器中启用 TLS
- 请求并安装证书:
- 对于证书颁发机构(CA)发布的证书:
- 创建证书签名请求(CSR)。请查看 第 9.3.1.1 节 “使用命令行创建证书签名请求”
- 导入 CA 证书。请参阅 第 9.3.2.1 节 “使用命令行安装 CA 证书”。
- 导入 CA 发布的服务器证书。请参阅 第 9.3.4.1 节 “使用命令行安装服务器证书”。
- 有关自签名证书,请参阅 第 9.3.5 节 “生成并安装自签名证书”。
- 启用 TLS 并设置 LDAPS 端口:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-securePort=636 nsslapd-security=on Successfully replaced "nsslapd-securePort" Successfully replaced "nsslapd-security"
- 在 NSS 数据库中显示服务器证书的名称:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security certificate list Certificate Name: Server-Cert Subject DN: CN=server.example.com Issuer DN: CN=Example CA Expires: 2022-07-29 11:10:14 Trust Flags: ,,
下一步需要 nickname。 - 要启用 RSA 密码系列,设置 NSS 数据库安全设备以及服务器证书名称:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security rsa set --tls-allow-rsa-certificates on --nss-token "internal (software)" --nss-cert-name Server-Cert
注意默认情况下,NSS 数据库中的安全设备名称是 内部(软件)。 - (可选)更新目录服务器支持的密码列表。详情请查看 第 9.4.1.3.2 节 “使用命令行显示和设置目录服务器使用的加密”。
- (可选)启用基于证书的身份验证。详情请查看 第 9.9 节 “使用基于证书的客户端身份验证”。
- (可选)创建一个密码文件,以便目录服务器在不提示输入 NSS 数据库的密码的情况下启动。详情请查看 第 9.4.1.5 节 “为目录服务器创建密码文件”。
- 重启 Directory 服务器实例:
# dsctl instance_name restart
如果您在 NSS 数据库上设置密码且没有创建密码文件,目录服务器会提示输入 NSS 数据库的密码。详情请查看 第 9.4.1.4 节 “启动目录服务器没有密码文件”。
9.4.1.2. 使用 Web 控制台在目录服务器中启用 TLS
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 创建 CSR。请参阅 第 9.3.1 节 “创建证书签名请求”。
- 导入证书颁发机构(CA)证书。请参阅 第 9.3.2.2 节 “使用 Web 控制台安装 CA 证书”。
- 导入 CA 发布的服务器证书。请参阅 第 9.3.4.2 节 “使用 Web 控制台安装服务器证书”。
- 打开 Security 条目。菜单,然后选择
- 在 Security Configuration 选项卡中:
- 单击 Security Enabled。
- 在 Server Certificate Name 字段中选择证书的 nickname。
- (可选)更改服务器应该支持的最小和最大 TLS 版本的设置。
- (可选)配置客户端身份验证,以便用户使用证书进行身份验证。详情请查看 第 9.9 节 “使用基于证书的客户端身份验证”。
- 单击。
- (可选)创建一个密码文件,以便目录服务器在不提示输入 NSS 数据库的密码的情况下启动。详情请查看 第 9.4.1.5 节 “为目录服务器创建密码文件”。
- 重启 Directory 服务器实例。请查看 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”如果您在 NSS 数据库上设置密码且没有创建密码文件,目录服务器会提示输入 NSS 数据库的密码。详情请查看 第 9.4.1.4 节 “启动目录服务器没有密码文件”。
9.4.1.3. 设置加密加密
9.4.1.3.1. 显示默认加密
nsSSL3Ciphers
参数,目录服务器将使用网络安全服务(NSS)的默认密码。显示默认密码:
# /usr/lib64/nss/unsupported-tools/listsuites | grep -B1 --no-group-separator "Enabled" TLS_AES_128_GCM_SHA256: 0x1301 TLS 1.3 TLS 1.3 AES-GCM 128 AEAD Enabled FIPS Domestic TLS_CHACHA20_POLY1305_SHA256: 0x1303 TLS 1.3 TLS 1.3 CHACHA20POLY1305 256 AEAD Enabled Domestic ...
9.4.1.3.2. 使用命令行显示和设置目录服务器使用的加密
显示所有可用的加密
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ciphers list --supported TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ...
显示加密目录服务器使用
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ciphers list --enabled TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 ...
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ciphers list default +tls_rsa_aes_128_sha +tls_rsa_aes_256_sha ...
default
关键字引用 NSS 提供的首选默认密码。请参阅 第 9.4.1.3.1 节 “显示默认加密”。
nsSSL3Ciphers
属性中的设置来生成实际使用的密码列表。但是,如果您在 nsSSL3Ciphers
中启用了弱密码,但将 allowWeakCiphers
参数设置为 off,则目录服务器只使用强大的密码,并在 nsSSLSupportedCiphers
read-only 属性中显示它们。
更新已启用的加密列表
- 显示当前启用的密码列表。请参阅 “显示加密目录服务器使用”一节。
- 要只启用特定的密码,请更新
nsSSL3Ciphers
属性。例如,只启用TLS_RSA_WITH_AES_128_GCM_SHA256
密码:# dsconf -D "cn=Directory Manager" ldap://server.example.com security ciphers set "-all,+TLS_RSA_WITH_AES_128_GCM_SHA256"
- 重启 Directory 服务器实例:
# dsctl instance_name restart
- (可选)显示已启用的密码列表以验证结果。请参阅 “显示加密目录服务器使用”一节。
9.4.1.3.3. 使用 Web 控制台显示和设置目录服务器使用的加密
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开 Security 条目。菜单,然后选择
- 在 Cipher Preferences 选项卡中,Directory 服务器显示当前启用的密码。
- 或者,您可以将 Ciphers Suite 设置为:
- 所有 Ciphers 启用所有密码。另外,还可在 Deny Specific Ciphers 字段中禁用特定的密码。
- 没有 Ciphers 禁用所有密码。另外,还可在 Allow Specific Ciphers 字段中启用特定的密码。
- 单击。
- 如果您更新了密码列表,请重新启动 Directory 服务器实例。请查看 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”
9.4.1.4. 启动目录服务器没有密码文件
- 如果 systemctl 命令启动 ns-slapd Directory Server 进程,
systemd
会提示输入密码,并自动将输入传递给 systemd-tty-ask-password-agent 工具。例如:# systemctl start dirsrv@instance_name Enter PIN for Internal (Software) Token:
- 在个别情况下,当 ns-slapd Directory Server 进程不是由 systemctl 工具启动且从终端分离时,会使用 wall 命令向所有终端发送一条消息。例如:
Broadcast message from root@server (Fri 2017-01-01 06:00:00 CET): Password entry required for 'Enter PIN for Internal (Software) Token:' (PID 1234). Please enter password with the systemd-tty-ask-password-agent tool!
要输入密码,请运行:# systemd-tty-ask-password-agent Enter PIN for Internal (Software) Token:
9.4.1.5. 为目录服务器创建密码文件
/etc/dirsrv/slapd-instance_name/pin.txt
文件中存储 NSS 数据库密码。这可让目录服务器在不提示输入这个密码的情况下,自动启动。
- 使用以下内容创建
/etc/dirsrv/slapd-instance_name/pin.txt
文件:- 如果您使用 NSS 软件加密模块,这是默认设置:
Internal (Software) Token:password
- 如果您使用硬件安全模块(HSM):
name_of_the_token:password
- 设置权限:
# chown dirsrv:dirsrv /etc/dirsrv/slapd-instance_name/pin.txt # chmod 400 /etc/dirsrv/slapd-instance_name/pin.txt
9.4.1.6. 管理目录服务器在证书过期时如何获得
nsslapd-validate-cert
参数。您可以将其设置为以下值:
- 警告 :目录服务器实例启动并记录有关过期证书的警告到
/var/log/dirsrv/slapd-instance_name/error
日志文件。这是默认的设置。 - 在 上 :目录服务器验证证书,如果证书已过期,实例无法启动。
- off :目录服务器不会验证证书过期日期。实例启动且没有记录警告。
例 9.3. 如果证书已过期,防止目录服务器启动
- 将
nsslapd-validate-cert
参数设置为 on :# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-validate-cert=on Successfully replaced "nsslapd-validate-cert"
- 重启 Directory 服务器实例:
# dsctl instance_name restart
9.4.2. 将目录服务器使用的 CA 证书添加到 Red Hat Enterprise Linux 的信任存储中
例 9.4. 如果客户端工具不使用 CA 证书,则可能的连接错误
- dsconf
# dsconf -D "cn=Directory Manager" ldaps://server.example.com:636 config get Error: {'desc': "Can't contact LDAP server", 'info': 'error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed (self signed certificate in certificate chain)'}
- ldapsearch
# ldapsearch -H ldaps://server.example.com:636 -D "cn=Directory Manager" -W -b "dc=example,dc=com" -x Enter LDAP Password: ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)
- 如果您没有目录服务器使用的 CA 证书的本地副本:
- 列出服务器的 NSS 数据库中的证书:
# certutil -d /etc/dirsrv/slapd-instance_name/ -L Certificate Nickname Trust Attributes SSL,S/MIME,JAR/XPI Example CA C,, Server-Cert u,u,u
- 使用 NSS 数据库中 CA 证书的别名导出 CA 证书:
# certutil -d /etc/dirsrv/slapd-instance_name/ -L -n "Example CA" -a > /tmp/ds-ca.crt
- 将 CA 证书复制到
/etc/pki/ca-trust/source/anchors/
目录中。例如:# cp /tmp/ds-ca.crt /etc/pki/ca-trust/source/anchors/
- 重建 CA 信任数据库:
# update-ca-trust
9.5. 显示在目录服务器中启用的加密协议
# dsconf -D "cn=Directory Manager" ldap://server.example.com security get ... sslversionmin: TLS1.2 sslversionmax: TLS1.3
sslVersionMin
和 sslVersionMax
参数控制哪些加密协议版本目录服务器使用。默认 sslVersionMin
取决于您使用的系统范围的加密策略。
9.6. 设置最小 TLS 加密协议版本
sslVersionMin
参数。下表提供了 sslVersionMin
目录服务器中基于系统范围的加密策略配置集使用的 TLS 版本概述:
profile | 最低 TLS 版本 |
---|---|
DEFAULT | TLS 1.2 |
FUTURE | TLS 1.2 |
FIPS | TLS 1.2 |
LEGACY | TLS 1.0 |
sslVersionMin
设置为高于加密策略配置集中定义的值:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security set --tls-protocol-min="TLS1.3"
9.7. 设置最高 TLS 加密协议版本
# dsconf -D "cn=Directory Manager" ldap://server.example.com security set --tls-protocol-max="protocol_version"
sslVersionMin
低的值,那么目录服务器会将 sslVersionMax
设置为与 sslVersionMin
相同的值。
sslVersionMax
参数中使用最强支持的加密协议版本,请不要设置此参数。
9.8. 使用硬件安全模块
key4.db
和 cert9.db
来存储服务器使用的密钥和证书。
9.9. 使用基于证书的客户端身份验证
userCertificate
属性中的可辨识规则(DER)格式证书匹配。
- 提高效率。当使用提示一次证书数据库密码的应用程序,然后将该证书用于所有后续绑定或身份验证操作时,它比持续提供绑定 DN 和密码效率更高。
- 提高了安全性。使用基于证书的身份验证比非证书绑定操作更安全,因为基于证书的身份验证使用公钥加密。绑定凭证无法在网络间截获。如果证书或设备丢失,则无用时没有 PIN,因此第三方会干扰攻击。
9.9.1. 设置基于证书的身份验证
- 启用加密的连接。详情请查看 第 9.4 节 “启用 TLS”。
- 安装 CA 证书并为客户端和服务器连接设置信任选项。请参阅 第 9.3.2 节 “安装 CA 证书”。
- 另外,还可验证 是否为 CA 证书设置了客户端和服务器的信任选项:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security ca-certificate get "Example-CA" Certificate Name: Example-CA Subject DN: CN=server.example.com,ST=Queensland,C=AU Issuer DN: CN=server.example.com,,ST=Queensland,C=AU Expires: 2021-05-09 10:57:54 Trust Flags: CT,,
- 创建
/etc/dirsrv/slapd-instance_name/certmap.conf
文件,将信息从证书映射到目录服务器用户。例如:certmap default default default:DNComps dc default:FilterComps mail,cn default:VerifyCert on certmap example o=Example Inc.,c=US example:DNComps
这将配置为身份验证使用具有 o=Example Inc.,c=US issuer Distinguished Name (DN)的证书的用户,目录服务器不会从证书的主题生成基本 DN,因为DNComps
参数为此签发者设置为空。另外,FilterComps
和VerifyCert
的设置从默认条目继承。带有与指定的不同的签发者 DN 证书将使用来自默认条目的设置,并根据证书主题中的cn
属性生成基本 DN。这可让 Directory 服务器在特定 DN 下启动搜索,而无需搜索整个目录。对于所有证书,Directory 服务器使用证书主题中的mail
和cn
属性生成搜索过滤器。但是,如果主题中不存在邮件
,Directory 服务器将自动使用主题中的证书的e
属性的值。有关可用参数的详情和描述,请参阅 Red Hat Directory Server Configuration、命令和文件参考 中的certmap.conf
文件的描述。 - 启用客户端身份验证。例如,配置客户端身份验证是可选的:
# dsconf -D "cn=Directory Manager" ldap://server.example.com security set --tls-client-auth="allowed"
或者,将--tls-client-auth
参数设置为 required 来配置该客户端必须使用证书进行身份验证。 - 如果您启用了,身份验证证书必须与用户的
userCertificate
属性中存储的证书匹配,在/etc/dirsrv/slapd-instance_name/certmap.conf
文件中设置 alias_name:VerifyCert on,将证书添加到用户条目中。请参阅 第 9.9.2 节 “向用户添加证书”。
9.9.2. 向用户添加证书
userCertificate
binary 属性中存储的证书匹配。如果您启用了这个功能,在 /etc/dirsrv/slapd-instance_name/certmap.conf
文件中设置了 alias_name:VerifyCert on,您必须将受影响用户的证书添加到其目录条目中。
userCertificate
属性中。
userCertificate
属性中:
- 如果证书不是 DER 格式,请将其转换。例如:
# openssl x509 -in /root/certificate.pem -out /root/certificate.der -outform DER
- 将证书添加到用户的
userCertificate
属性中。例如:# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: uid=user_name,ou=People,dc=example,dc=com changetype: modify add: userCertificate userCertificate:< file:///root/example.der
9.9.3. 强制 EXTERNAL SASL 机制进行绑定请求
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-force-sasl-external=on Successfully replaced "nsslapd-force-sasl-external"
9.9.4. 使用证书进行身份验证
- 将以下环境变量设置为 CA 证书、用户密钥和用户证书的对应路径。例如:
LDAPTLS_CACERT=/home/user_name/CA.crt LDAPTLS_KEY=/home/user_name/user.key LDAPTLS_CERT=/home/user_name/user.crt
或者,在~/.ldaprc
文件中设置TLS_CACERT
、TLS_KEY
和TLS_CERT
参数。详情请查看 ldap.conf(5) man page 中的 TLS OPTIONS 部分。 - 连接到服务器。例如:
# ldapwhoami -H ldaps://server.example.com:636
9.10. 设置 SASL 身份映射
9.10.1. 关于 SASL 身份映射
dn: cn=sasl,cn=config objectClass: top objectClass: nsContainer cn: sasl
dn: cn=mapping,cn=sasl,cn=config objectClass: top objectClass: nsContainer cn: mapping
nsSaslMapRegexString
:用于映射提供的authid
元素的正则表达式。nsSaslMapFilterTemplate
:应用nsSaslMapRegexString
元素的模板来创建 DN。nsSaslMapBaseDNTemplate
:提供搜索基础或特定条目 DN,以匹配构建的 DN。- 可选:
nsSaslMapPriority
: 设置此 SASL 映射的优先级。如果使用优先级值,如果cn=config
中启用了nsslapd-sasl-mapping-fallback
。详情请查看 第 9.10.4.1 节 “设置 SASL 映射优先级”。
dn: cn=mymap,cn=mapping,cn=sasl,cn=config objectclass:top objectclass:nsSaslMapping cn: mymap nsSaslMapRegexString: \(.*\)@\(.*\)\.\(.*\) nsSaslMapFilterTemplate: (objectclass=inetOrgPerson) nsSaslMapBaseDNTemplate: uid=\1,ou=people,dc=\2,dc=\3
nsSaslMapRegexString
属性设置形式 \1、\2、\3 用于绑定 ID 的变量,用于在搜索过程中填充到模板属性的绑定 ID。本例为 ou=People,dc=example,dc=com 子树中的任何用户设置 SASL 身份映射,它们属于 inetOrgPerson 对象类。
authid
),正则表达式会填充基本 DN 模板,带有 uid=mconnors,ou=people,dc=EXAMPLE,dc=COM 作为用户 ID,并从此进行身份验证。
dn: cn=example map,cn=mapping,cn=sasl,cn=config objectclass: top objectclass: nsSaslMapping cn: example map nsSaslMapRegexString: \(.*\) nsSaslMapBaseDNTemplate: ou=People,dc=example,dc=com nsSaslMapFilterTemplate: (cn=\1)
nsSaslMapRegexString
属性中指定域,可以将映射限制为单个域。例如:
dn: cn=example map,cn=mapping,cn=sasl,cn=config
objectclass: top
objectclass: nsSaslMapping
cn: example map
nsSaslMapRegexString: \(.*\)@US.EXAMPLE.COM
nsSaslMapBaseDNTemplate: ou=People,dc=example,dc=com
nsSaslMapFilterTemplate: (cn=\1)
dn: cn=z,cn=mapping,cn=sasl,cn=config objectclass: top objectclass: nsSaslMapping cn: z nsSaslMapRegexString: ldap/ldap1.example.com@EXAMPLE.COM nsSaslMapBaseDNTemplate: cn=replication manager,cn=config nsSaslMapFilterTemplate: (objectclass=*)
dn: cn=y,cn=mapping,cn=sasl,cn=config objectclass: top objectclass: nsSaslMapping cn: y nsSaslMapRegexString: ldap/ldap1.example.com nsSaslMapBaseDNTemplate: cn=replication manager,cn=config nsSaslMapFilterTemplate: (objectclass=*)
nsSaslMapPriority
参数为 SASL 映射设置优先级,则无法指定处理映射的顺序。但是,可以控制如何处理 SASL 映射:名称。目录服务器以反向 ASCII 顺序处理 SASL 映射。在过去两个示例中,首先处理 cn=z 映射(第一个示例)。如果没有匹配项,服务器会处理 cn=y 映射(第二个示例)。
9.10.2. 目录服务器的默认 SASL 映射
Kerberos UID 映射
这匹配使用两个部分域的 Kerberos 主体,如用户@example.com。然后 realm 用于定义搜索基础,并且用户 ID (authid
)定义过滤器。搜索基础为 dc=example,dc=com,以及 (uid=user) 的过滤器。
dn: cn=Kerberos uid mapping,cn=mapping,cn=sasl,cn=config objectClass: top objectClass: nsSaslMapping cn: Kerberos uid mapping nsSaslMapRegexString: \(.*\)@\(.*\)\.\(.*\) nsSaslMapBaseDNTemplate: dc=\2,dc=\3 nsSaslMapFilterTemplate: (uid=\1)
RFC 2829 DN Syntax
此映射与作为有效 DN (在 RFC 2829 中定义)的 authid
匹配,前缀为 dn:。authid
直接映射到指定的 DN。
dn: cn=rfc 2829 dn syntax,cn=mapping,cn=sasl,cn=config objectClass: top objectClass: nsSaslMapping cn: rfc 2829 dn syntax nsSaslMapRegexString: ^dn:\(.*\) nsSaslMapBaseDNTemplate: \1 nsSaslMapFilterTemplate: (objectclass=*)
RFC 2829 U Syntax
映射会匹配 UID 前缀为 u: 的 authid
。前缀后指定的值定义了 (uid=value) 的过滤器。搜索基础被硬编码为 默认用户Root 数据库的后缀。
dn: cn=rfc 2829 u syntax,cn=mapping,cn=sasl,cn=config objectClass: top objectClass: nsSaslMapping cn: rfc 2829 u syntax nsSaslMapRegexString: ^u:\(.*\) nsSaslMapBaseDNTemplate: dc=example,dc=com nsSaslMapFilterTemplate: (uid=\1)
UID 映射
此映射与 authid
匹配,这是不匹配其他默认映射规则的普通字符串。它使用这个值来定义 (uid=value) 的过滤器。搜索基础被硬编码为 默认用户Root 数据库的后缀。
dn: cn=uid mapping,cn=mapping,cn=sasl,cn=config objectClass: top objectClass: nsSaslMapping cn: uid mapping nsSaslMapRegexString: ^[^:@]+$ nsSaslMapBaseDNTemplate: dc=example,dc=com nsSaslMapFilterTemplate: (uid=&)
9.10.3. 配置 SASL 身份映射
9.10.3.1. 使用命令行配置 SASL 身份映射
- 添加身份映射方案。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com sasl create --cn "example_map" --nsSaslMapRegexString "\(.*\)" --nsSaslMapBaseDNTemplate "ou=People,dc=example,dc=com" --nsSaslMapFilterTemplate "(cn=\1)" --nsSaslMapPriority 50 Successfully created example_map
这与任何用户的通用名称匹配,并根据过滤器 cn=userId 将其映射到带有 base ou=People,dc=example,dc=com 的子树搜索结果。 - 重启实例:
# dsctl instance_name restart
9.10.3.2. 使用 Web 控制台配置 SASL 身份映射
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开 SASL Settings & Mappings。菜单,然后选择
- 单击。
- 填写表单。例如:
- 点击。
9.10.4. 启用 SASL 映射 Fallback
nsslapd-sasl-mapping-fallback
参数,将目录服务器配置为验证所有匹配的映射:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-sasl-mapping-fallback=on Successfully replaced "nsslapd-sasl-mapping-fallback"
9.10.4.1. 设置 SASL 映射优先级
nsslapd-sasl-mapping-fallback
属性启用了 SASL 映射回退,您可以选择在映射配置中设置 nsSaslMapPriority
属性来优先排序它们。nsSaslMapPriority
属性支持从 1 (最高优先级) 到 100 (最低优先级) 的值。默认值为 100。
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=Kerberos uid mapping,cn=mapping,cn=sasl,cn=config changetype: modify replace: nsSaslMapPriority nsSaslMapPriority: 1
9.11. 使用带有 SASL 的 Kerberos GSS-API
9.11.1. 目录服务器中 SASL 的身份验证机制
- PLAIN。PLAIN 为简单基于密码的身份验证发送明文密码。
- EXTERNAL。与 TLS 一样,EXTERNAL 会执行基于证书的身份验证。此方法使用公钥进行强大的身份验证。
- CRAM-MD5.CRAM-MD5 是一种弱的、简单的质询响应身份验证方法。它不会建立任何安全层。警告红帽建议不要使用不安全的 CRAM-MD5 机制。
- DIGEST-MD5。DIGEST-MD5 是 LDAPv3 服务器的弱身份验证方法。警告红帽建议不要使用不安全的 DIGGEST-MD5 机制。
- 通用安全服务(GSS-API)。通用安全服务(GSS)是一种安全 API,这是基于 UNIX 的操作系统访问和验证 Kerberos 服务的本地方法。GSS-API 还支持会话加密,类似于 TLS。这允许 LDAP 客户端使用 Kerberos 版本 5 凭证(ticket)并使用网络会话加密与服务器进行身份验证。要使目录服务器使用 GSS-API,必须在主机上配置 Kerberos。请参阅 第 9.11 节 “使用带有 SASL 的 Kerberos GSS-API”。注意因此,只有具有 GSS-API 支持的平台上支持 Kerberos-API。要使用 GSS-API,可能需要安装 Kerberos 客户端库;任何所需的 Kerberos 库都通过操作系统厂商提供。
9.11.2. 关于目录服务器中的 Kerberos
9.11.2.1. 关于主体和 Realms
uid=user_name/[server_instance],cn=realm,cn=mechanism,cn=auth
uid=mconnors/cn=Europe.example.com,cn=engineering,cn=gssapi,cn=auth
uid=bjensen,cn=accounting,cn=gssapi,cn=auth
9.11.2.2. 关于 KDC 服务器和密钥选项卡
ldap/server.example.com@EXAMPLE.COM
9.11.3. 在目录服务器启动中配置 SASL 身份验证
/etc/sysconfig/dirsrv
文件中。
dirsrv-
instance 的 /etc/sysconfig/
目录中创建特定于实例的配置文件。例如,dirsrv-example
。如果主机上只有一个实例,则可以使用默认 dirsrv
文件。
/etc/sysconfig/dirsrv
(或特定于实例)文件中的 KRB5_KTNAME 行,并为 KRB5_KTNAME 变量设置 keytab 位置。例如:
# In order to use SASL/GSSAPI the directory
# server needs to know where to find its keytab
# file - uncomment the following line and set
# the path and filename appropriately
KRB5_KTNAME=/etc/dirsrv/krb5.keytab
9.12. 设置 SASL 机制
supportedSASLMechanisms
参数中。要启用特定的 SASL 机制,请在 cn=config 条目中设置 nsslapd-allowed-sasl-mechanisms
属性。例如,要只启用 GSSAPI 和 DIGEST-MD5 机制,请运行:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-allowed-sasl-mechanisms="GSSAPI, DIGEST-MD5" Successfully replaced "nsslapd-allowed-sasl-mechanisms"
nsslapd-allowed-sasl-mechanisms
参数中,也始终启用此机制。
9.13. 使用带有 LDAP 客户端的 SASL
ldapsearch
)搭配使用,请将 -Y SASL_mechanism
传给命令。例如:
- 通过 LDAP 协议使用 GSSAPI SASL 机制:
# ldapsearch -Y GSSAPI -U "dn:uid=user_name,ou=people,dc=example,dc=com" -R EXAMPLE.COM -H ldap://server.example.com -b "dc=example,dc=com"
- 通过 LDAPS 协议使用 PLAIN SASL 机制:
# ldapsearch -Y PLAIN -D "uid=user_name,ou=people,dc=example,dc=com" -W -H ldaps://server.example.com -b "dc=example,dc=com"
第 10 章 配置属性加密
uid
属性是加密的,则该值会在条目中加密,但显示在 DN 中:
dn: uid=jsmith1234,ou=People,dc=example,dc=com ... uid:: Sf04P9nJWGU1qiW9JJCGRg==
10.1. 加密密钥
10.2. 加密加密
- 高级加密标准(AES)
- 三数据加密标准(3DES)
10.3. 配置属性加密
10.3.1. 使用命令行启用属性加密
userRoot
数据库 AES 加密中的 telephoneNumber
属性:
- 另外,要加密现有的
telephoneNumber
属性,请导出数据库。请参阅 第 10.4.1 节 “导出加密的数据库”。 - 为
userRoot
数据库中的telephoneNumber
属性启用 AES 加密:# dsconf -D "cn=Directory Manager" ldap://server.example.com backend attr-encrypt --add-attr telephoneNumber userRoot
- 如果您导出数据库来加密现有属性,请重新导入数据库。请参阅 第 10.4.2 节 “将 LDIF 文件导入到加密的数据库中”。
10.3.2. 使用 Web 控制台启用属性加密
telephoneNumber
属性:
- 另外,要加密现有的
telephoneNumber
属性,请导出数据库。请参阅 第 10.4.1 节 “导出加密的数据库”。 - 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择后缀条目。
- 打开 Encrypted Attributes 选项卡。
- 输入要加密的属性的名称。
- 单击。
- 如果您导出数据库来加密现有属性,请重新导入数据库。请参阅 第 10.4.2 节 “将 LDIF 文件导入到加密的数据库中”。
10.3.3. 使用命令行为属性禁用加密
userRoot
数据库中加密的 telephoneNumber
属性:
- (可选)要解密现有的
telephoneNumber
属性,请导出数据库。请参阅 第 10.4.1 节 “导出加密的数据库”。 - 为
userRoot
数据库中的telephoneNumber
属性禁用加密:# dsconf -D "cn=Directory Manager" ldap://server.example.com backend attr-encrypt --del-attr telephoneNumber userRoot
- 如果您导出数据库来解密现有属性,请重新导入数据库。请参阅 第 10.4.2 节 “将 LDIF 文件导入到加密的数据库中”。
10.3.4. 使用 Web 控制台禁用属性加密
telephoneNumber
属性:
- 另外,要加密现有的
telephoneNumber
属性,请导出数据库。请参阅 第 10.4.1 节 “导出加密的数据库”。 - 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择后缀条目。
- 打开 Encrypted Attributes 选项卡。
- 单击
telephoneNumber
属性右侧的 按钮。 - 单击以确认。
- 如果您导出数据库来解密现有属性,请重新导入数据库。请参阅 第 10.4.2 节 “将 LDIF 文件导入到加密的数据库中”。
10.3.5. 启用属性加密后的常规注意事项
- 未加密的数据可以保留在服务器的数据库页面池后备文件中。删除这个数据:
- 停止实例:
# dsctl instance_name stop
- 删除
/var/lib/dirsrv/slapd-instance_name/db/guardian
文件:# rm /var/lib/dirsrv/slapd-instance_name/db/guardian
- 启动实例:
# dsctl instance_name start
- 启用加密并成功导入数据后,使用未加密的数据删除 LDIF 文件。
- 启用加密后,目录服务器会在重新导入数据时删除并创建新数据库。
- 复制日志文件没有加密。要保护这些数据,请将其存储在加密的磁盘上。
- 服务器内存(RAM)中的数据是未加密的,可以临时存储在交换分区中。要保护这些数据,请设置加密的交换空间。
10.4. 导出和导入加密的数据库
10.4.1. 导出加密的数据库
-E
参数传给 dsconf 命令。
用户Root
数据库:
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend export -E userRoot
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend export -E -s "ou=People,dc=example,dc=com" userRoot
dsconf
导出数据的详情,请参考 第 6.2.1.1.1 节 “使用 dsconf backend export 命令导出数据库”。
10.4.2. 将 LDIF 文件导入到加密的数据库中
- 停止 Directory 服务器实例:
# dsctl instance_name stop
- 如果您在上次导出和此导入之间替换了证书数据库,请编辑
/etc/dirsrv/slapd-instance_name/dse.ldif
文件,并删除以下条目,包括其属性:- cn=AES,cn=encrypted 属性 key,cn=database_name,cn=ldbm database,cn=plugins,cn=config
- cn=3DES,cn=encrypted attribute keys,cn=database_name,cn=ldbm database,cn=plugins,cn=config
重要删除所有数据库的条目。如果包含nsSymmetricKey
属性的任何条目保留在/etc/dirsrv/slapd-instance_name/dse.ldif
文件中,则目录服务器将无法启动。 - 导入 LDIF 文件。例如,要将
/tmp/example.ldif
导入到用户Root
数据库中:# dsctl instance_name ldif2db --encrypted userRoot /tmp/example.ldif
--encrypted
参数可让脚本加密在导入过程中为加密配置的属性。 - 启动实例:
# dsctl instance_name start
10.5. 更新用于属性加密的 TLS 证书
- 使用解密的属性导出数据库。请参阅 第 10.4.1 节 “导出加密的数据库”。
- 创建新的证书签名请求(CSR)。请参阅 第 9.3.1 节 “创建证书签名请求”。
- 安装新证书。请参阅 第 9.3.4 节 “安装服务器证书”。
- 停止 Directory 服务器实例:
# dsctl instance_name stop
- 编辑
/etc/dirsrv/slapd-instance_name/dse.ldif
文件并删除以下条目,包括其属性:- cn=AES,cn=encrypted 属性 key,cn=database_name,cn=ldbm database,cn=plugins,cn=config
- cn=3DES,cn=encrypted attribute keys,cn=database_name,cn=ldbm database,cn=plugins,cn=config
重要删除所有数据库的条目。如果包含nsSymmetricKey
属性的任何条目保留在/etc/dirsrv/slapd-instance_name/dse.ldif
文件中,则目录服务器将无法启动。 - 导入数据库。请参阅 第 10.4.2 节 “将 LDIF 文件导入到加密的数据库中”。
- 启动实例:
# dsctl instance_name start
第 11 章 管理 FIPS 模式支持
启用 FIPS 模式支持
- 另外,还可在 Red Hat Enterprise Linux 中启用 FIPS 模式。详情请查看 Red Hat Enterprise Linux 8 安全强化文档中的相应部分。
- 为网络安全服务(NSS)数据库启用 FIPS 模式:
# modutil -dbdir /etc/dirsrv/slapd-instance_name/ -fips true
- 重启 Directory 服务器实例:
# dsctl instance_name restart
禁用 FIPS 模式支持
- 为网络安全服务(NSS)数据库禁用 FIPS 模式:
# modutil -dbdir /etc/dirsrv/slapd-instance_name/ -fips false
- 重启 Directory 服务器实例:
# dsctl instance_name restart
第 12 章 管理目录架构
12.1. 架构概述
12.1.1. 默认架构文件
/usr/share/dirsrv/schema/
目录中。此目录中的文件用作新目录服务器实例的模板。在此目录中添加新架构,使其可供任何新实例使用。
12.1.2. 对象类
对象类
行标识,后跟其 OID、名称、描述、其直接高级对象类(需要与对象类一起使用的对象类),并在此对象类共享其属性,以及允许(MUST)属性以及允许(MAY)属性。
例 12.1. 人员对象类条目
objectClasses: ( 2.5.6.6 NAME 'person' DESC 'Standard LDAP objectclass' SUP top MUST ( sn $ cn ) MAY ( description $ seeAlso $ telephoneNumber $ userPassword ) X-ORIGIN 'RFC 4519' )
cn
、sn
和 objectClass
属性,并允许 description
,seeAlso
,telephoneNumber
, 和 userPassword
属性。
objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson
对象类
属性。objectclasses
属性的格式如下:
objectclasses: ( definition )
- OID,通常是以点分开的数字
- 唯一名称,格式为 NAME name
- 描述,格式为 DESC 描述
- 此对象类的正式或父对象类,格式为 SUP object_class; 如果没有相关的父项,请使用 SUP top
- AUXILIARY 一词,它提供了对象类应用到的条目的类型; UXILILIARY 表示它可以应用到任何条目
- 在 MUST; 之前包括所需属性的列表,若要包含多个属性,用括号括起组,并使用带有符号($)的属性分隔。
- 允许的属性列表,前面带有 MAY; 以包含多个属性,用括号括起组,并使用符号($)分隔属性。
/etc/dirsrv/slapd-instance_name/schema/99user.ldif
中。
12.1.3. 属性
cn
属性用于存储个人的完整名称,如 cn: John Smith。
givenname: John surname: Smith mail: jsmith@example.com
- OID
- name
- 语法匹配规则(可选)
- 子字符串匹配规则(可选)
- 排序规则(可选)
- 描述(可选)
- 语法
- 单值或多值属性
- 有关定义属性的位置的详情
uid
属性架构条目” 中显示。
例 12.2. uid
属性架构条目
( 0.9.2342.19200300.100.1.1 NAME ( 'uid' 'userid' ) EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'RFC 4519' )
12.1.3.1. 目录服务器属性语法
12.1.4. 扩展架构
99user.ldif
。也可以创建新的独立架构文件,并将其包含在默认架构文件中。
- 为新架构规划和定义 OID。服务器 OID 可以识别架构元素,因此 OID 是唯一的和组织非常重要。目录服务器本身不管理 OID,但 第 12.2 节 “管理对象标识符” 中描述了一些最佳实践。
- 创建新属性。属性定义需要名称、语法(允许的值格式)、OID 以及每个条目是否可以使用属性的描述。
- 创建一个对象类以包含新属性。对象类列出了该条目 type 和允许(可能)属性所需的属性。由于默认架构不应更改,如果创建了任何新属性,则应将它们添加到自定义对象类中。
/usr/share/dirsrv/schema/
中的 schema 文件中查看。熟悉可用的模式;然后规划缺少哪些信息属性,以及如何用自定义属性填充这些差距。部署指南 中涵盖了规划架构。
- 使架构尽可能简单。
- 尽可能重复使用现有架构元素。
- 尽可能减少为每个对象类定义的必要属性数量。
- 不要为相同的目的定义多个对象类或属性。
- 不要修改属性或对象类的任何现有定义。
12.1.5. 模式复制
/etc/dirsrv/slapd-instance_name/schema/99user.ldif
文件中,包括更改状态号(CSN)。更新的模式不会自动复制到其他副本。在复制树中更新目录的内容时,模式复制将开始。例如,如果您在修改 schema 后更新用户或组条目,供应商会将存储在 nsSchemaCSN
属性中的 CSN 与消费者上的 CSN 进行比较。如果远程 CSN 低于供应商中的一个,则 schema 将复制到消费者中。要成功复制,供应商上的所有对象类和属性类型都必须是消费者定义的超集。
例 12.3. 模式子集和超集
- 在
server1
上,demo 对象类允许a1、
a2
和a3
属性。 - 在
server2
上,demo 对象类允许a1
和a3
属性。
server1
上 demo 对象类的 schema 定义是 server2
上对象类的超集。在验证阶段,当复制或接受架构时,Directory 服务器会检索超级用户定义。例如,如果消费者检测到本地模式中的对象类允许比供应商模式中的对象类少属性,则更新本地架构。
nsSchemaCSN
属性在两个服务器上都相同,且在复制会话开始时不再比较。
- 一个主机上的 schema 是另一主机的 schema 的子集。例如,在 例 12.3 “模式子集和超集” 中,
server2
上的 demo 对象类的架构定义是server1
上对象类的子集。属性也可以发生子集(单值属性是多值属性的子集),属性语法(IA5
是Octet_string
的子集)。 - 当供应商模式和消费者模式中的定义需要合并时。目录服务器不支持合并模式。例如,如果在一个服务器上的一个对象类允许
a1
,a2
, 和a3
属性,在其他服务器上允许a1
,a3
, 和a4
,schemas 不是子集且不能合并。 /etc/dirsrv/slapd-instance_name/schema/99user.ldif
以外的 Schema 文件被使用。目录服务器允许您在/etc/dirsrv/slapd-instance_name/schema/
目录中添加额外的模式文件。但是,只有99user.ldif
文件中的 CSN 被更新。因此,其他架构文件仅在本地使用,不会自动传送到复制合作伙伴。手动将更新的模式文件复制到消费者并重新载入 schema。详情请查看 第 12.10 节 “动态重新加载架构”。为了避免重复的架构定义并启用自动复制,请将所有自定义模式存储在/etc/dirsrv/slapd-instance_name/schema/99user.ldif
文件中。有关创建自定义模式文件的详情,请参考 第 12.9 节 “创建自定义架构文件”。
12.2. 管理对象标识符
12.3. 创建对象类
12.3.1. 使用命令行创建对象类
ldapmodify
工具来创建新的对象类条目。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com schema objectclasses add examplePerson --oid="2.16.840.1133730.2.123" --desc="Example Person Object Class" --sup="inetOrgPerson" --kind="AUXILIARY" --must="cn" --may exampleDateOfBirth examplePreferredOS
12.3.2. 使用 Web 控制台创建对象类
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择→ 。
- 点。
- 选择父对象类。
- 输入对象类名称,并选择性地设置对象标识符(OID)。
- 选择对象类类型。
- 在对应字段中输入所需的和允许的属性:
- 点击。
12.4. 更新对象类
12.4.1. 使用命令行更新对象类
dsconf
实用程序更新对象类条目。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com schema objectclasses replace examplePerson --oid="2.16.840.1133730.2.123" --desc="Example Person Object Class" --sup="inetOrgPerson" --kind="AUXILIARY" --must="cn" --may exampleDisplayName exampleAlias
12.4.2. 使用 Web 控制台更新对象类
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择→ 。
- 单击您要编辑的对象类条目右侧的按钮。
- 选择。
- 更新参数。
- 点击。
12.5. 删除对象类
12.5.1. 使用命令行删除对象类
ldapmodify
实用程序删除对象类条目。例如,要删除 examplePerson
对象类:
- 从使用它们的任何条目中删除不需要的属性。详情请查看 第 12.8 节 “删除属性”。
- 删除对象类条目:
# dsconf -D "cn=Directory Manager" ldap://server.example.com schema objectclasses delete examplePerson
12.5.2. 使用 Web 控制台删除对象类
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择→ 。
- 单击您要删除的对象类条目旁边的按钮。
- 选择。
- 单击以确认。
12.6. 创建属性
12.6.1. 使用命令行创建属性
ldapmodify
工具来创建新属性。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com schema attributetypes add dateofbirth --desc="For employee birthdays" --syntax="1.3.6.1.4.1.1466.115.121.1.15" --single-value --x-origin="Example defined"
12.6.2. 使用 Web 控制台创建属性
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择→ 。
- 单击。
- 填写参数。
- 点击。
12.7. 更新属性
12.7.1. 使用命令行更新属性
dsconf
实用程序更新属性条目。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com schema attributetypes replace dateofbirth --desc="Employee birthday" --syntax="1.3.6.1.4.1.1466.115.121.1.15" --single-value --x-origin="Example defined"
12.7.2. 使用 Web 控制台更新属性
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择→ 。
- 点您要编辑的属性旁边的按钮。
- 选择。
- 更新参数。
- 点击。
12.8. 删除属性
12.8.1. 使用命令行删除属性
ldapmodify
实用程序删除属性。例如:
- 从任何使用它们的条目中删除不需要的属性。
- 删除属性:
# dsconf -D "cn=Directory Manager" ldap://server.example.com schema attributetypes remove dateofbirth
12.8.2. 使用 Web 控制台删除属性
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择→ 。
- 点您要删除的属性旁边的按钮。
- 选择。
- 单击以确认。
12.9. 创建自定义架构文件
- 第一行必须是 dn: cn=schema。
- 模式文件可以同时包含属性和对象类,但它只能包括一个或多个属性。
- 如果属性和对象类都以样式定义,则必须首先列出所有属性,然后对象类。
- 对象类可以使用其他架构文件中定义的属性。
- 该文件的格式必须命名为 [1-9][0-9]text.ldif。该文件必须以两个数字开头。数字上,核心配置模式之前无法加载架构文件(以 00 和 01开头)。另外,Directory 服务器始终将其自定义模式写入 schema 目录中的数字和字母顺序,并按字母顺序排列。它要求此文件是
99user.ldif
。如果此文件不是99user.ldif
,则服务器可能会遇到问题。因此,请始终确保自定义架构文件至少小于99user.ldif
。名称99alpha.ldif
是 okay,名称99zzz.ldif
不是。
attributetypes
属性,其中五个组件:
- OID,通常是以点分开的数字
- 唯一名称,格式为 NAME name
- 描述,格式为 DESC 描述
- (可选)定义属性的源
attributetypes: ( 1.2.3.4.5.6.1 NAME 'dateofbirth' DESC 'For employee birthdays' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUED X-ORIGIN 'Example defined')
对象类
属性的值,虽然定义对象类的方式略有更大的灵活性。唯一需要的配置是对象类的名称和 OID;所有其他配置都取决于对象类的需求:
- OID,通常是以点分开的数字
- 唯一名称,格式为 NAME name
- 描述,格式为 DESC 描述
- 此对象类的正式或父对象类,格式为 SUP object_class; 如果没有相关的父项,请使用 SUP top
- AUXILIARY 一词,它提供了对象类应用到的条目的类型; UXILILIARY 表示它可以应用到任何条目
- 在 MUST; 之前包括所需属性的列表,若要包含多个属性,用括号括起组,并使用带有符号($)的属性分隔。
- 允许的属性列表,前面带有 MAY; 以包含多个属性,用括号括起组,并使用符号($)分隔属性。
objectclasses: ( 2.16.840.1133730.2.123 NAME 'examplePerson' DESC 'Example Person Object Class' SUP inetOrgPerson AUXILIARY MUST cn MAY (exampleDateOfBirth $ examplePreferredOS) )
例 12.4. Schema 文件示例
dn: cn=schema attributetypes: ( 2.16.840.1133730.1.123 NAME 'dateofbirth' DESC 'For employee birthdays' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Example defined') objectclasses: ( 2.16.840.1133730.2.123 NAME 'examplePerson' DESC 'Example Person Object Class' SUP inetOrgPerson AUXILIARY MAY (dateofbirth) )
/etc/dirsrv/slapd-instance/schema
。除非服务器重启或运行动态重新加载任务,否则这些文件中的 schema 不会加载并可供服务器使用。
/usr/share/data/
目录中的标准模式,请将 schema 文件复制到 /usr/share/dirsrv/schema/
目录中。如果您要求标准模式仅对特定实例使用,请将架构文件复制到 /etc/dirsrv/slapd-instance_name/schema/
目录中,但使用目标目录中的不同文件名。否则,Directory 服务器在升级过程中重命名文件,并附加 .bak
后缀。
12.10. 动态重新加载架构
- dsconf schema reload 命令。请查看 第 12.10.1 节 “使用 dsconf 模式重新加载命令动态重新加载架构”
- cn=tasks 条目。请查看 第 12.10.2 节 “使用 cn=tasks Entry 动态重新加载 Schema”
/usr/share/dirsrv/schema/
目录中的所有模式文件。
12.10.1. 使用 dsconf 模式重新加载命令动态重新加载架构
# dsconf -D "cn=Directory Manager" ldap://server.example.com schema reload Attempting to add task entry... This will fail if Schema Reload plug-in is not enabled. Successfully added task entry cn=schema_reload_2018-08-28T09:45:48.027962,cn=schema reload task,cn=tasks,cn=config To verify that the schema reload operation was successful, please check the error logs
nsslapd-schemadir
参数中设置的架构文件。(可选)将 -d 目录
选项传给命令,以重新加载存储在不同目录中的模式。
12.10.2. 使用 cn=tasks Entry 动态重新加载 Schema
nsslapd-schemadir
参数中设置的架构文件。例如,要重新载入存储在此参数中设置的目录中的模式文件:
# ldapadd -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=example_schema_reload,cn=schema reload task,cn=tasks,cn=config objectclass: extensibleObject cn: cn=example_schema_reload
schemadir
参数,以重新加载存储在不同目录中的模式。例如:
# ldapadd -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=example_schema_reload,cn=schema reload task,cn=tasks,cn=config objectclass: extensibleObject cn: cn=example_schema_reload schemadir: /example/schema/
12.10.3. 重新加载复制拓扑中的 Schema
- 停止复制。请参阅 第 15.9 节 “禁用和重新启用复制”。
- 复制新的架构文件,并为每个供应商和副本服务器运行 schema 重新加载任务。请参阅:
- 重启复制。请参阅 第 15.9 节 “禁用和重新启用复制”。
12.10.4. 模式重新加载错误
[06/Jan/2009:17:52:04.001214874 -0500] schemareload - Schema reload task starts (schema dir: default) ... [06/Jan/2009:17:52:04.754335904 -0500] schemareload - Schema validation passed. [06/Jan/2009:17:52:04.894255328 -0500] schemareload - Schema reload task finished.
[..] schemareload - Schema reload task starts (schema dir: /bogus) ... [..] schema - No schema files were found in the directory /bogus [..] schema_reload - schema file validation failed [..] schemareload - Schema validation failed.
12.11. 打开 Schema 检查和关闭
- 使用 的对象类和属性在目录 schema 中定义。
- 对象类所需的属性包含在条目中。
- 只有对象类允许的属性才会包含在条目中。
12.11.1. 使用命令行打开 Schema 检查和关闭
nsslapd-schemacheck
参数的值。例如,禁用架构检查:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-schemacheck=off Successfully replaced "nsslapd-schemacheck"
nsslapd-schemacheck
参数的详情,请查看 红帽目录服务器配置、命令和文件参考中的参数描述。
12.11.2. 使用 Web 控制台打开 Schema 检查和关闭
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开,然后选择 条目。
- 打开 Advanced Settings 选项卡。
- 要启用架构检查,请选中 Enable Schema Checking 复选框。要禁用该功能,请清除复选框。
- 点击。
12.12. 使用语法验证
telephoneNumber
属性实际上具有其值的有效电话号码。
12.12.1. 关于语法验证
12.12.2. 语法验证和其他目录服务器操作
数据库加密
对于普通 LDAP 操作,属性仅在将值写入数据库之前加密。这意味着,加密会在验证属性语法后进行。
-E
标志进行这些导出和导入操作,这样就能对导入操作进行正常验证。但是,如果加密数据库在没有使用 -E
标志(不支持)的情况下导出,那么会创建一个带有加密值的 LDIF。当导入此 LDIF 后,无法验证加密的属性,则会记录警告,并在导入的条目中跳过属性验证。
同步
对于 Windows Active Directory 条目和 Red Hat Directory Server 条目中的属性,允许或强制的语法可能会有区别。在这种情况下,Active Directory 值无法正确同步,因为语法验证在 Directory Server 条目中强制实施 RFC 标准。
复制
如果 Directory Server 11 实例是将其更改复制到消费者的供应商,则无法使用语法验证没有问题。但是,如果复制中的供应商是旧版本的目录服务器或禁用语法验证,则不应在消费者上使用语法验证,因为 Directory Server 11 使用者可能会拒绝供应商允许的属性值。
12.12.2.1. 使用命令行打开语法验证和关闭
nsslapd-Syntaxcheck 参数的值
。例如,禁用语法验证:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-syntaxcheck=off Successfully replaced "nsslapd-syntaxcheck"
nsslapd-Syntaxcheck
参数的详情,请查看 红帽目录服务器配置、命令和文件参考中的参数描述。
12.12.2.2. 使用 Web 控制台打开语法验证开启和关闭
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开,然后选择 条目。
- 打开 Advanced Settings 选项卡。
- 要启用属性语法检查,请选中 Enable Attribute Syntax Checking 复选框。要禁用该功能,请清除复选框。
- 点击。
12.12.3. 为 DN 启用或禁用严格语法验证
12.12.3.1. 使用命令行为 DN 启用或禁用严格语法验证
nsslapd-dn-validate-strict
参数的值。例如,为 DN 禁用严格的语法验证:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-dn-validate-strict=off Successfully replaced "nsslapd-dn-validate-strict"
nsslapd-Syntaxcheck
参数的详情,请查看 红帽目录服务器配置、命令和文件参考中的参数描述。
12.12.3.2. 使用 Web 控制台为 DN 启用或禁用严格语法验证
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开,然后选择 条目。
- 打开 Advanced Settings 选项卡。
- 根据您要启用或禁用该功能,选择或取消选择 Strict DN 语法验证 选项。
- 点击。
12.12.4. 启用语法验证日志记录
nsslapd-Syntaxlogging
属性为任何语法违反启用错误日志记录。
nsslapd-Syntaxlogging
和 nsslapd-Syntaxcheck
参数,则任何无效的属性修改都会被拒绝,并将消息写入日志。如果启用了 nsslapd-Syntaxlogging
,但禁用了 nsslapd-Syntaxcheck
,则允许操作成功,但警告消息仍然被写入错误日志中。
12.12.4.1. 使用命令行启用语法验证日志记录
nsslapd-Syntaxlogging
参数的值设置为 on。
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-syntaxlogging=on Successfully replaced "nsslapd-syntaxlogging"
nsslapd-Syntaxlogging
参数的详情,请查看 红帽目录服务器配置、命令和文件参考中的参数描述。
12.12.4.2. 使用 Web 控制台启用语法验证日志记录
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开,然后选择 条目。
- 打开 Advanced Settings 选项卡。
- 选择 Enable Attribute Syntax Logging 选项。
- 点击。
12.12.5. 验证现有属性值的语法
- 如果在
nsslapd-Syntaxcheck
参数中禁用了语法验证。详情请查看 第 12.12.2 节 “语法验证和其他目录服务器操作”。重要红帽建议不要禁用语法验证。 - 如果您从没有或禁用的语法验证的服务器迁移数据。
/var/log/dirsrv/slapd-instance_name/errors
文件中。例如:
- 如果所有验证的值都有效:
[28/Jun/2017:12:52:43.669867966 +0200] - ERR - syntax-plugin - syntax_validate_task_thread - Starting (base: "dc=example,dc=com", filter: "(objectclass=*)") ... [28/Jun/2017:12:52:43.696850129 +0200] - ERR - syntax-plugin - syntax_validate_task_thread - Complete. Found 0 invalid entries.
- 如果找到无效的条目:
[28/Jun/2017:12:54:05.736087520 +0200] - ERR - syntax-plugin - syntax_validate_task_thread - Starting (base: "dc=example,dc=com", filter: "(objectclass=*)") ... [28/Jun/2017:12:54:05.754195607 +0200] - ERR - syntax-plugin - syntax_validate_task_callback - Entry "cn=user,ou=People,dc=example,dc=com" violates syntax. description: value #0 invalid per syntax [28/Jun/2017:12:54:05.759905671 +0200] - ERR - syntax-plugin - syntax_validate_task_thread - Complete. Found 1 invalid entries.
注意语法验证任务仅识别语法违反情况。您必须手动修复不正确的值。
12.12.5.1. 使用 dsconf schema validate-Syntax 命令创建语法验证任务
# dsconf -D "cn=Directory Manager" ldap://server.example.com schema validate-syntax -f '(objectclass=inetorgperson)' ou=People,dc=example,dc=com
12.12.5.2. 使用 cn=tasks Entry 创建语法验证任务
# ldapadd -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=example_syntax_validate,cn=syntax validate,cn=tasks,cn=config objectclass: extensibleObject cn: cn=example_syntax_validate basedn: ou=People,dc=example,dc=com filter: (objectclass=inetorgperson)
第 13 章 管理索引
13.1. 关于索引
13.1.1. 关于索引类型
cn.db
文件中。
- 存在索引(pres) 包含包含特定属性的条目列表,这对于搜索非常有用。例如,它可以轻松地检查包含访问控制信息的任何条目。生成包含存在索引的
aci.db
文件会有效地执行 ACI = the 搜索,以便为服务器生成访问控制列表。 - 平等索引(eq) 改进了对包含特定属性值的条目的搜索。例如,
cn
属性上的相等索引允许用户更有效地执行 cn=Babs Jensen 的搜索。 - 大约索引(approx) 用于 高效的类似声音或声音 的搜索。例如,条目可能包含属性值 cn=Firstname M Lastname。大约搜索将返回针对 cn~=Firstname Lastname, cn~=Firstname, or cn~=Lastname 进行搜索的值。同样,对 l~=San Fransisco 的搜索会返回包括 l=San the 的条目。
- 子字符串 索引(sub) 是维护的成本索引,但它可以有效地搜索条目中的子字符串。子字符串索引仅限于每个条目至少有三个字符。例如,搜索 cn=*derson ,它会匹配包括如 Bill Anderson, Jill Henderson, 或 Steve Sanderson 字符串的常规名称。同样,搜索 telephoneNumber= *555* 会返回目录中包含 555 的电话号码的所有条目。
- 国际索引 加快了搜索国际目录中的信息。创建国际索引的过程与创建常规索引的过程类似,不同之处是它会应用一个匹配规则,它将一个 对象标识符 (OID) 与要索引的属性关联。附录 D, 国际化 中列出了支持的区域设置及其关联的 OID。如果需要配置目录服务器以接受其他匹配规则,请联系红帽咨询。
13.1.2. 关于默认和数据库索引
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com \ -b "cn=default indexes,cn=config,cn=ldbm database,cn=plugins,cn=config" \ '(objectClass=nsindex)'
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend index list database_name
13.1.3. 搜索算法概述
cn
、通用名称、属性)以及包含索引属性值的条目的 ID 列表:
- LDAP 客户端应用程序向目录发送搜索请求。
- 目录检查传入请求,以确保指定的基本 DN 与一个或多个数据库或数据库链接中包含的后缀匹配。
- 如果匹配,目录会处理请求。
- 如果不匹配,目录会向客户端返回错误,表示后缀不匹配。如果在 cn=config 下的 nsslapd-referral 属性中指定引用,则目录也会返回 LDAP URL,客户端可以尝试识别请求。
- 目录服务器检查搜索过滤器,以查看要应用的索引,它会尝试从满足过滤器的每个索引中加载条目 ID 列表。ID 列表会根据使用的 AND 或 OR joins 的组合。每个过滤器组件都可以独立处理并返回 ID 列表。
- 如果条目 ID 列表大于配置的 ID 列表扫描限制,或者没有为属性定义索引,那么目录服务器会将 此过滤器组件 的结果设置为 所有辅助。如果将逻辑操作应用到单个搜索组件的结果后,列表仍然为 ALLIDs,它会搜索数据库中的每个条目。这是一个 未索引的 搜索。
- 目录服务器从
id2entry.db
数据库或 ID 列表中每个条目 ID (或整个数据库进行未索引搜索)读取每个条目。然后,服务器会检查条目以查看它们是否与搜索过滤器匹配。每个匹配项都会在找到时返回。服务器将继续通过 ID 列表,直到它搜索所有候选条目,或直至达到其中一个配置的资源限值。(资源限值在 第 14.5.3 节 “使用命令行设置用户和全局资源限值” 中列出。)注意可以使用简单的页面结果控制为搜索设置单独的资源限值。例如,管理员可以通过页面搜索设置高或无限的大小,但对非页面搜索使用较低默认限制。
13.1.4. 大约搜索
- 所有查询字符串代码都与条目字符串中生成的代码匹配。
- 所有查询字符串代码都与条目字符串代码相同。
目录中的名称(图形代码) | 查询字符串(复合代码) | 匹配注释 |
---|---|---|
alice B Sarette (ALS B SRT) | alice Sarette (ALS SRT) | 匹配。代码以正确顺序指定。 |
alice Sarrette (ALS SRT) | 匹配。代码以正确顺序指定,尽管出现拼写错误。 | |
Surette (SRT) | 匹配。生成的代码存在于原始名称中,尽管出现拼写错误。 | |
Bertha Sarette (BR0 SRT) | 无匹配项。原始名称中不存在代码 BR0。 | |
Sarette、SRT (SRT ALS) | 无匹配项。代码不会以正确顺序指定。 |
13.1.5. 平衡索引性
- 大约索引对于通常包含数字的属性(如电话号码)效率不有效。
- 子字符串索引不适用于二进制属性。
- 如果值较大(如旨在包含黄金数据或密码包含加密数据的属性),则应该避免平等索引。
- 为搜索中常用的属性维护索引会增加开销,而不会提高全局搜索性能。
- 未索引的属性仍可在搜索请求中指定,但搜索性能可能会显著降级,具体取决于搜索的类型。
- 您维护的更多索引,需要更多磁盘空间。
- 目录服务器收到添加或修改操作。
- 目录服务器检查索引属性,以确定是否为属性值维护索引。
- 如果索引了创建的属性值,则 Directory 服务器会从索引中添加或删除新属性值。
- 实际的属性值在条目中创建。
dn: cn=John Doe,ou=People,dc=example,dc=com objectclass: top objectClass: person objectClass: orgperson objectClass: inetorgperson cn: John Doe cn: John sn: Doe ou: Manufacturing ou: people telephoneNumber: 408 555 8834 description: Manufacturing lead for the Z238 line of widgets.
cn
(通用名称)和sn
(surname)属性的等同性、大约和子字符串索引。- 电话号码属性的相等和子字符串索引。
- description 属性的子字符串索引。
- 为 John 和 John Doe 创建
cn
相等索引条目。 - 为 John 和 John Doe 创建适当的
cn
大约索引条目。 - 为 John 和 John Doe 创建适当的
cn
子字符串索引条目。 - 为 Doe 创建
sn
相等索引条目。 - 为 Doe 创建适当的
sn
大约索引条目。 - 为 Doe 创建适当的
sn
子字符串索引条目。 - 为 408 555 8834 创建电话号码相等的索引条目。
- 为 408 555 8834 创建适当的电话号码子字符串索引条目。
- 为 Manufacturing 创建适当的描述子字符串索引条目,导致小部件的 Z238 行。为此字符串生成了大量子字符串条目。
13.1.6. 索引限制
nsrole
和 cos_attribute
。虚拟属性包含计算的值。如果您索引这些属性,Directory 服务器可以返回一组无效的条目来直接和内部搜索。
13.2. 创建标准索引
13.2.1. 使用命令行创建索引
- 要创建新索引,其将成为默认索引之一,请将新的索引属性添加到 cn=default index,cn=config,cn=ldbm database,cn=plugins,cn=config 条目。
- 要为特定数据库创建新索引,将其添加到 cn=index,cn=database_name,cn=ldbm database,cn=plugins,cn=config 条目,其中 cn=database_name 对应于数据库的名称。
dse.ldif
文件中创建 cn=config 下的条目。dse.ldif
配置文件中的 cn=config 条目不存储在与常规条目相同的高度可扩展数据库中。因此,如果很多条目,特别是可能经常更新的条目存储在 cn=config 下,性能将会受到影响。虽然因为性能的原因,我们建议不要存储 cn=config 下的简单用户条目,但在 cn=config 下存储特殊用户条目(如 Directory Manager 条目或复制管理器 (supplier bind DN)条目)条目会很有用,。
sn
(surname)属性创建存在、相等和子字符串索引:
- 运行 ldapmodify 并为新索引添加 LDIF 条目:
# ldapmodify
-a
-D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=sn,cn=index,cn=Example1,cn=ldbm database,cn=plugins,cn=config changetype: add objectClass:top objectClass:nsIndex cn:sn nsSystemIndex:false nsIndexType:pres nsIndexType:eq nsIndexType:sub nsMatchingRule:2.16.840.1.113730.3.3.2.3.1cn
属性包含要索引的属性的名称,在本例中为sn
属性。条目是 nsIndex 对象类的成员。nsSystemIndex 属性为 false,表示索引对目录服务器操作并不重要。多值的 nsIndexType 属性指定 presence (pres), equality (eq) 和 substring (sub) 索引。每个关键字都必须在单独的行中输入。示例中的 nsMatchingRule 属性指定 Bulgarian 协调顺序的 OID;匹配规则可以指示任何可能的值匹配,如语言或其他格式,如日期或整数。您可以使用 nsIndexType 属性中的关键字 none 指定没有为属性维护索引。这个示例通过将 nsIndexType 更改为 none 来禁用 Example1 数据库上的sn
索引:dn: cn=sn,cn=index,cn=Example1,cn=ldbm database,cn=plugins,cn=config objectClass:top objectClass:nsIndex cn:sn nsSystemIndex:false nsIndexType:none
13.2.2. 使用 Web 控制台创建索引
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择后缀条目。
- 打开 Indexes 选项卡。
- 点按钮。
- 选择要索引的属性、索引类型以及可选匹配的规则。
- 点。
13.3. 为现有数据库创建新索引
13.3.1. 创建一个索引实例正在运行
13.3.1.1. 使用 dsconf backend index reindex 命令创建索引
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend index reindex database_name
13.3.1.2. 使用 cn=tasks 条目创建索引
ldapadd
工具添加新的索引任务。例如,要添加一个任务,为 userRoot
数据库中 cn
属性创建存在索引:
# ldapadd -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=example_presence_index,cn=index,cn=tasks,cn=config objectclass: top objectclass: extensibleObject cn: example presence index nsInstance: userRoot nsIndexAttribute: "cn:pres"
13.3.2. 创建一个索引,即实例离线
- 关闭实例:
# dsctl instance_name stop
- 重新创建索引:
# dsctl instance_name db2index userRoot [13/Aug/2019:15:25:37.277426483 +0200] - INFO - ldbm_instance_config_cachememsize_set - force a minimal value 512000 [13/Aug/2019:15:25:37.289257996 +0200] - INFO - check_and_set_import_cache - pagesize: 4096, available bytes 1704378368, process usage 22212608 [13/Aug/2019:15:25:37.291738104 +0200] - INFO - check_and_set_import_cache - Import allocates 665772KB import cache. ... db2index successful
- 启动实例:
# dsctl instance_name start
13.4. 使用虚拟列表视图控制来请求大型搜索结果的连续子集
13.4.1. VLV 控制如何在 ldapsearch 命令中工作
ldapsearch
工具来请求部分结果。
sss
(服务器端排序)和 vlv
搜索扩展指定 -E
选项:
# ldapsearch ... -E 'sss=attribute_list' -E 'vlv=query_options'
sss
搜索扩展使用以下语法:
[!]sss=[-]<attr[:OID]>[/[-]<attr[:OID]>...]
vlv
搜索扩展使用以下语法:
[!]vlv=<before>/<after>(/<offset>/<count>|:<value>)
- before 设置在目标前返回的条目数。
- 后 设置目标后返回的条目数。
- 索引、计数 和值 有助于确定目标条目。如果设置 value,则目标条目是第一个带有第一个排序属性从值开头的属性。否则,您将 count 设置为 0, 目标条目由 索引 值决定(从 1 开始)。如果 计数 值大于 0, 则目标条目由 条目/计数的比例索引站号 决定。
例 13.1. 带有 VLV 搜索扩展的 ldapsearch 命令的输出
cn
属性对结果进行排序,并返回 70 条目的 uid
属性,并在偏移前一个条目和两个条目。
# ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com -b "ou=People,dc=example,dc=com" -s one -x -E 'sss=cn' -E 'vlv=1/2/70/0' uid # user069, People, example.com dn: uid=user069,ou=People,dc=example,dc=com uid: user069 # user070, People, example.com dn: uid=user070,ou=People,dc=example,dc=com uid: user070 # user071, People, example.com dn: uid=user071,ou=People,dc=example,dc=com uid: user071 # user072, People, example.com dn: uid=user072,ou=People,dc=example,dc=com uid: user072 # search result search: 2 result: 0 Success control: 1.2.840.113556.1.4.474 false MIQAAAADCgEA sortResult: (0) Success control: 2.16.840.1.113730.3.4.10 false MIQAAAALAgFGAgMAnaQKAQA= vlvResult: pos=70 count=40356 context= (0) Success # numResponses: 5 # numEntries: 4 Press [before/after(/offset/count|:value)] Enter for the next window.
-E
参数描述。
13.4.2. 启用未经身份验证的用户使用 VLV 控制
流程
- 更新 oid=2.16.840.1.113730.3.4.9,cn=features,cn=config 中的 ACI:
# ldapmodify -D "cn=Directory Manager" -W -H ldap://server.example.com -x dn: oid=2.16.840.1.113730.3.4.9,cn=features,cn=config changetype: modify replace: aci aci: (targetattr != "aci")(version 3.0; acl "VLV Request Control"; allow( read, search, compare, proxy ) userdn = "ldap:///anyone";)
验证
- 使用 VLV 控制执行查询,而不指定绑定用户:
# ldapsearch -H ldap://server.example.com -b "ou=People,dc=example,dc=com" -s one -x -E 'sss=cn' -E 'vlv=1/2/70/0' uid
此命令要求服务器允许匿名绑定。如果命令成功,但没有返回条目,则使用绑定用户再次运行查询,以确保在使用身份验证时查询可以正常工作。
13.4.3. 使用命令行创建 VLV 索引,以提高 VLV 查询的速度
mail
属性,且 objectClass
属性被设置为 person 的 ou=People,dc=example,dc=com 中的条目。
先决条件
- 您的客户端应用程序使用 VLV 控制。
- 客户端应用程序需要查询大型搜索结果的连续子集。
- 目录包含大量条目。
流程
- 创建 VLV 搜索条目:
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend vlv-index add-search --name "VLV People" --search-base "ou=People,dc=example,dc=com" --search-filter "(&(objectClass=person)(mail=*))" --search-scope 2 userRoot
这个命令使用以下选项:--name
设置搜索条目的名称。这可以是任何名称。--search-base
为 VLV 索引设置基本 DN。目录服务器在此条目上创建 VLV 索引。--search-scope
设置为 VLV 索引中的条目运行的搜索范围。您可以将这个选项设置为 0 ( 基础搜索)、1 ( 单向搜索)或 2 ( 子树搜索)。--search-filter
在创建 VLV 索引时设置过滤器目录服务器应用。只有与此过滤器匹配的条目成为索引的一部分。userroot
是数据库的名称,在其中创建该条目。
- 创建索引条目:
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend vlv-index add-index --index-name "VLV People - cn sn" --parent-name "VLV People" --sort "cn sn" --index-it dc=example,dc=com
这个命令使用以下选项:--index-name
设置索引条目的名称。这可以是任何名称。--parent-name
设置 VLV 搜索条目的名称,且必须与您在上一步中设置的名称匹配。--sort
设置属性名称及其排序顺序。按空格分隔属性。--index-it
会导致 Directory 服务器在创建条目后自动启动索引任务。dc=example,dc=com
是数据库的后缀,用于创建该条目。
验证
- 验证
/var/log/dirsrv/slapd-instance_name/errors
文件中是否成功创建了 VLV 索引:[26/Nov/2021:11:32:59.001988040 +0100] - INFO - bdb_db2index - userroot: Indexing VLV: VLV People - cn sn [26/Nov/2021:11:32:59.507092414 +0100] - INFO - bdb_db2index - userroot: Indexed 1000 entries (2%). ... [26/Nov/2021:11:33:21.450916820 +0100] - INFO - bdb_db2index - userroot: Indexed 40000 entries (98%). [26/Nov/2021:11:33:21.671564324 +0100] - INFO - bdb_db2index - userroot: Finished indexing.
- 在 ldapsearch 命令中使用 VLV 控制只查询目录中的特定记录:
# ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com -b "ou=People,dc=example,dc=com" -s one -x -E 'sss=cn' -E 'vlv=1/2/70/0' uid # user069, People, example.com dn: uid=user069,ou=People,dc=example,dc=com cn: user069 # user070, People, example.com dn: uid=user070,ou=People,dc=example,dc=com cn: user070 # user071, People, example.com dn: uid=user071,ou=People,dc=example,dc=com cn: user071 # user072, People, example.com dn: uid=user072,ou=People,dc=example,dc=com cn: user072
本例假设您在 ou=People,dc=example,dc=com 中至少将uid=user001
命名为uid=user072
。
-E
参数描述。
13.4.4. 使用 Web 控制台创建 VLV 索引以提高 VLV 查询的速度
mail
属性,且 objectClass
属性被设置为 person 的 ou=People,dc=example,dc=com 中的条目。
先决条件
- 您的客户端应用程序使用 VLV 控制。
- 客户端应用程序需要查询大型搜索结果的连续子集。
- 目录包含大量条目。
流程
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 导航到→ → →
- 点并填写字段:
图 13.1. 使用 Web 控制台创建 VLV 索引
- 输入属性名称,然后点。
- 选择 Index VLV on Save。
- 点。
验证
- 进入→ →
[26/Nov/2021:11:32:59.001988040 +0100] - INFO - bdb_db2index - userroot: Indexing VLV: VLV People - cn sn [26/Nov/2021:11:32:59.507092414 +0100] - INFO - bdb_db2index - userroot: Indexed 1000 entries (2%). ... [26/Nov/2021:11:33:21.450916820 +0100] - INFO - bdb_db2index - userroot: Indexed 40000 entries (98%). [26/Nov/2021:11:33:21.671564324 +0100] - INFO - bdb_db2index - userroot: Finished indexing.
- 在 ldapsearch 命令中使用 VLV 控制只查询目录中的特定记录:
# ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com -b "ou=People,dc=example,dc=com" -s one -x -E 'sss=cn' -E 'vlv=1/2/70/0' uid # user069, People, example.com dn: uid=user069,ou=People,dc=example,dc=com cn: user069 # user070, People, example.com dn: uid=user070,ou=People,dc=example,dc=com cn: user070 # user071, People, example.com dn: uid=user071,ou=People,dc=example,dc=com cn: user071 # user072, People, example.com dn: uid=user072,ou=People,dc=example,dc=com cn: user072
本例假设您在 ou=People,dc=example,dc=com 中至少将uid=user001
命名为uid=user072
。
-E
参数描述。
13.5. 更改索引排序顺序
13.5.1. 使用命令行更改 Sort 顺序
nsMatchingRule
。例如:
# ldapmodify -D "cn=Directory Manager" -W -x dn: cn=sn,cn=index,cn=Example1,cn=ldbm database,cn=plugins,cn=config changetype:modify replace:nsMatchingRule nsMatchingRule: integerOrderingMatch
13.6. 更改索引子字符串搜索的 Width
nsSubStrBegin
属性在通配符前为索引搜索设置所需的字符数。abc*
nsSubStrMiddle
属性为索引搜索设置所需的字符数,其中在搜索字符串的中间使用通配符。例如:*abc*
nsSubStrEnd
属性在通配符后为索引搜索设置所需的字符数。例如:*xyz
- 设置特定属性索引的新密钥长度。这需要添加 Scalable Object 对象类,然后根据需要添加
nsSubStrBegin
、nsSubStrEnd
或nsSubStrMiddle
属性。例如:# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: attribute_name,cn=index,cn=database_name,cn=ldbm database,cn=plugins,cn=config changetype: modify add: objectclass objectclass: extensibleObject - add: nsSubStrBegin nsSubStrBegin: 2 - add: nsSubStrMiddle nsSubStrMiddle: 2 - add: nsSubStrEnd nsSubStrEnd: 2
13.7. 删除索引
13.7.1. 从默认索引条目中删除属性
sn
)会被索引。以下属性是默认索引的一部分:
aci
|
cn
|
entryusn
|
givenName
|
mail
|
mailAlternateAddress
|
mailHost
|
成员
|
memberOf
|
nsUniqueId
|
ntUniqueId
|
ntUserDomainId
|
numsubordinates
|
objectClass
|
owner
|
parentid
|
seeAlso
|
sn
|
telephoneNumber
|
uid
|
uniqueMember
|
sn
属性:
- 从
cn=default index,cn=config,cn=ldbm database,cn=plugins,cn=config
条目中删除属性:# ldapdelete -D "cn=Directory Manager" -W -p 389 -h server.example.com -x cn=sn,cn=default indexes,cn=config,cn=ldbm database,cn=plugins,cn=config
如果您没有从此条目中删除属性,则sn
属性的索引会在服务器重启后自动重新创建并损坏。 - 删除
cn=attribute_name,cn=index,cn=userRoot,cn=ldbm database,cn=plugins,cn=config
条目。详情请查看 第 13.7.2 节 “从索引中删除属性”
13.7.2. 从索引中删除属性
13.7.2.1. 使用命令行从索引中删除属性
- 如果要删除的属性列在
cn=default index,cn=config,cn=ldbm database,cn=plugins,cn=config
默认索引条目中,请先将其从此条目中删除。详情请查看 第 13.7.1 节 “从默认索引条目中删除属性”。 - 从索引中删除属性。例如:
# ldapdelete -D "cn=Directory Manager" -W -p 389 -h server.example.com -x cn=sn,cn=index,cn=database_name,cn=ldbm database,cn=plugins,cn=config
删除条目后,Directory 服务器不再为属性维护索引。 - 重新创建属性索引。请参阅 第 13.3 节 “为现有数据库创建新索引”。
13.7.2.2. 使用 Web 控制台从索引中删除属性
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 选择后缀条目。
- 打开 Indexes 选项卡。
- 单击您要删除索引的属性旁边的 Delete Index。按钮,然后选择
- 单击以确认。
13.7.3. 使用命令行删除索引类型
sn
属性 的子 索引类型:
- 删除索引类型:
# ldapmodify -D "cn=Directory Manager" -W -x dn: cn=sn,cn=index,cn=database_name,cn=ldbm database,cn=plugins,cn=config changetype: modify delete: nsIndexType nsIndexType: sub
删除索引条目后,Directory 服务器不再为属性维护子字符串索引。 - 重新创建属性索引。请参阅 第 13.3 节 “为现有数据库创建新索引”。
13.7.4. 删除浏览器索引
13.7.4.1. 使用命令行删除浏览器索引
- 从 cn=index ,cn=database_name,cn=ldbm database,cn=plugins,cn=config 条目中删除浏览索引条目。例如:
# ldapdelete -D "cn=Directory Manager" -W -p 389 -h server.example.com -x "cn=MCC ou=People dc=example dc=com,cn=userRoot,cn=ldbm database,cn=plugins,cn=config" "cn=by MCC ou=People dc=example dc=com,cn=MCC ou=People dc=example dc=com,cn=userRoot,cn=ldbm database,cn=plugins,cn=config"
删除两个浏览索引条目后,Directory 服务器不再维护这些索引。 - 重新创建属性索引。请参阅 第 13.3 节 “为现有数据库创建新索引”。
第 14 章 查找目录条目
14.1. 使用命令行查找目录条目
- 单个条目(
-s base
) - 条目即时子条目(
-s one
) - 整个树或子树(
-s 子
)
14.1.1. ldapsearch 命令行格式
# ldapsearch [-x | -Y mechanism] [options] [search_filter] [list_of_attributes]
-x
(使用简单绑定)或-Y
(用于设置 SASL 机制)都必须用于配置连接类型。- 选项 是一系列命令行选项。如果使用任何操作,则必须在搜索过滤器前指定它们。
- list_of_attributes 是用空格分开的属性列表。指定属性列表可减少搜索结果中返回的属性数量。此属性列表必须在搜索过滤器后显示。例如,请参阅 第 14.4.6 节 “显示属性的子组”。如果没有指定属性列表,搜索会返回目录中访问控制集允许的所有属性的值,但操作属性除外。要使操作属性因为搜索操作而返回,必须在 search 命令中明确指定它们。要返回对象的所有操作属性,请指定
+
。要检索除明确指定的操作属性外的常规属性,请在 ldapsearch 命令中的属性列表中使用星号。要仅检索匹配的 DN 列表,请使用特殊属性 1.1。例如:# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com \ -b "dc=example,dc=com" -x "(objectclass=inetorgperson)" 1.1
14.1.2. 常用的 ldapsearch 选项
-x
参数来禁用 SASL 并允许其他连接方法。
选项 | 描述 | |||
---|---|---|---|---|
-b | 指定搜索的起点。此处指定的值必须是当前存在于数据库中的可分辨名称。如果 LDAP_BASEDN 环境变量已设置为基本 DN,则这是可选的。此选项中指定的值应该以单引号或双引号形式提供。例如:
-b "cn=user,ou=Product Development,dc=example,dc=com"要搜索根 DSE 条目,请在此处指定一个空字符串,如 -b "" 。 | |||
-D | 指定要向服务器进行身份验证的可分辨名称。如果服务器支持匿名访问,则这是可选的。如果指定,这个值必须是目录服务器可识别的 DN,还必须有相应的授权才能搜索条目。例如,-D "uid=user_name,dc=example,dc=com"。 | |||
-H |
指定用于连接服务器的 LDAP URL。对于传统的 LDAP URL,其格式如下:
ldap[s]://hostname[:port]端口 是可选的;如果未指定端口,它将使用默认的 389 或 LDAPS 端口 636。
这也可以使用 LDAPI URL,每个元素都由 HTML 十六进制代码 %2F 分隔,而不是正斜杠(/):
ldapi://%2Ffull%2Fpath%2Fto%2Fslapd-example.socket对于 LDAPI,请指定服务器正在侦听的 LDAPI 套接字的完整路径和文件名。由于这个值解释为 LDAP URL,因此路径中的正斜杠字符(/)必须转义为 URL 转义值 %2F。
使用
-H 选项而不是 -h 和 -p 。
| |||
-h | 指定安装目录服务器的机器的主机名或 IP 地址。例如,-h server.example.com。如果没有指定主机,则 ldapsearch 将使用 localhost。
注意
目录服务器支持 IPv4 和 IPv6 地址。
| |||
-l | 指定等待搜索请求完成的最大秒数。例如,-l 300。nsslapd-timelimit 属性的默认值为 3600 秒。无论指定的值如何,volume sync 都不会等待的时间超过服务器的 nsslapd-timelimit 属性所允许的时间。 | |||
-p | 指定 Directory 服务器使用的 TCP 端口号。例如,-p 1049。默认值为 389。
如果指定了
-h ,还必须指定 -p ,即使它给出了默认值。
| |||
-s scope | 指定搜索的范围。范围可以是以下范围之一:
| |||
-W |
提示输入密码。如果没有设置这个选项,则使用匿名访问。
或者,使用
-w 选项将密码传递给实用程序。请注意,可以在用户的进程列表中看到密码,并保存在 shell 的历史记录中。
| |||
-x | 禁用默认 SASL 连接以允许简单的绑定。 | |||
-Y SASL_mechanism |
设置用于身份验证的 SASL 机制。如果没有设置机制,则
ldapsearch 会选择服务器支持的最佳机制。
如果没有使用
-x ,则必须使用 -Y 选项。
| |||
-z number | 设置在响应搜索请求时返回的最大条目数。在使用 root DN 绑定时,这个值会覆盖 server-side nsslapd-sizelimit 参数。 |
14.1.3. 使用特殊 Characters
-D "cn=user_name,ou=Product Development,dc=example,dc=com"
14.2. 使用 Web 控制台查找条目
uid=user_name,ou=People,dc=example,dc=com
DN,则在搜索 dc=example
时仅会在 dc:example
属性存在于这个条目中时才匹配条目。
先决条件
- 已登陆到 Directory Server web 控制台。
- 您有 root 权限。
流程
- 在 Web 控制台中,导航到→ 。
- 展开并选择过滤条目的搜索条件:
表 14.1. 默认索引属性 搜索参数 描述 搜索基础 指定搜索的起点。它是当前存在于数据库中的可分辨名称(DN)。注意当您在或 中打开条目详细信息时,会打开带有预定义的搜索基础的 Search 标签页,点 并选择 。搜索范围 选择Subtree
来搜索整个子树中的条目,从搜索基础开始,并包含所有子条目。从搜索基础开始选择一个级别
来搜索条目,仅包含第一个子条目级别。选择Base
来仅在指定为搜索基础的条目中搜索属性值。大小限制 设置一个搜索操作可以返回的最大条目数。时间限制 设置搜索引擎可以查找条目的时间(以秒为单位)。显示锁定 切换到 on 以查看找到条目的锁定状态。搜索属性 选择搜索中部分的属性。您可以从预定义的属性中选择并添加自定义属性。 - 在搜索文本字段中输入属性值,然后按键。注意目录服务器将所有搜索请求记录到访问日志文件,您可以在→ → 中查看。
- 可选: 要进一步重新定义搜索,请使用选项卡中的搜索过滤器来搜索条目。
14.3. LDAP 搜索过滤器
attribute operator value
buildingname>=alpha
name
是属性,& gt;= 是 operator,alpha 是值。也可以定义过滤器,将不同的属性与布尔值运算符结合使用。
businessCategory
属性值为 Example*Net product line 的员工,在搜索过滤器中输入以下值:
Example\5c2a*Net product line
dc
属性,并将其设置为 example。
14.3.1. 使用搜索过滤器中的属性
manager
属性的每个条目:
"(manager=*)"
"(cn=example)"
cn: example cn;lang-fr: example
"(description=*X.500*)" "(sn=*nderson)" "(givenname=car*)"
14.3.2. 在搜索过滤器中使用 Operator
"(employeeNumber>=500)" "(sn~=suret)" "(salary<=150000)"
搜索类型 | Operator | 描述 |
---|---|---|
相等 | = | 返回包含与指定的值完全匹配的条目。例如,cn=example |
子字符串 | =string* string | 返回包含包含指定子字符串的属性的条目。例如,cn=exa*l。星号 (*) 表示零 (0) 或多个字符。 |
大于或等于 | >= | 返回包含大于或等于指定的值的属性的条目。例如,uidNumber >= 5000。 |
小于或等于 | <= | 返回包含小于或等于指定的值的属性的条目。例如,uidNumber <= 5000。 |
存在 | =* | 返回包含指定属性的一个或多个值的条目。例如: cn= the。 |
大约 | ~= | 返回包含指定属性的条目,其值大约等于搜索过滤器中指定的值。例如,l~=san fransico 可以返回 l=san francisco。 |
14.3.3. 使用复合搜索过滤器
(Boolean-operator(filter)(filter)(filter)...)
(!(objectClass=person))
(Boolean-operator(filter)((Boolean-operator(filter)(filter)))
description
属性不包含子字符串 X.500 的所有条目:
(&(ou=Marketing)(!(description=*X.500*)))
manager
的条目:
(&(ou=Marketing)(!(description=*X.500*))(|(manager=cn=example,ou=Marketing,dc=example,dc=com)(manager=cn=demo,ou=Marketing,dc=example,dc=com)))
(&(!(objectClass=person))(cn~=printer3b))
Operator | 符号 | 描述 |
---|---|---|
和 | & | 所有指定的过滤器都必须为 true,才能为 true。例如,(& (filter) (filter) (filter)...)。 |
或者 | | | 至少一个指定的过滤器必须为 true,声明必须为 true。例如,(|(filter) (filter) (filter)...)。 |
非 | ! | 对于该语句,指定语句不能为 true。只有一个过滤器会受到 not 运算符 的影响。例如,(!(filter)). |
- 首先,Innerest to outerest 父项表达式。
- 从左到右的所有表达式。
14.3.4. 使用匹配规则
- EQUALITY 指定如何比较相等匹配项的两个值。例如,如何处理 "Fred" 和 "FRED" 等字符串。测试相等性(例如 attribute=value)的搜索过滤器使用 EQUALITY 规则。相等(eq)索引使用 EQUALITY 规则来生成索引密钥。更新操作使用 EQUALITY 规则将要更新的值与条目中已存在的值进行比较。
- ORDERING 指定如何比较两个值来查看一个值是否大于另一个值。搜索过滤器,使用 ORDERING 规则设置一个范围(例如 attribute<=value 或 attribute>=value)。具有 ORDERING 规则顺序的属性的索引对相等的值进行排序。
- SUBSTR 指定如何进行子字符串匹配。子字符串搜索过滤器(例如,attribute=rhcspartial_string )或 attribute= theend_string)使用 SUBSTR 规则。子字符串(sub)索引使用 SUBSTR 规则来生成索引密钥。
例 14.1. 匹配规则和自定义属性
MyFirstName
的自定义属性类型,以及 caseExactIA5Match 的 EQUALITY 匹配规则。带有 Fred 的值为 MyFirstName
的条目会在带有 (MyFirstName=Fred) 过滤器的搜索中返回,但在如 (MyFirstName=FRED) 和 (MyFirstName=fred) Fred, FRED 过滤器的搜索中不会返回,fred 时所有有效的 IA5 字符串值,但它们不匹配使用 caseExactIA5Match 规则。
MyFirstName
以使用 caseIgnoreIA5Match 匹配规则。
(MyFirstName:caseIgnoreIA5Match:
=fred)
nsMatchingRule
属性配置用于索引的其他匹配规则,如 第 13.2.1 节 “使用命令行创建索引” 中所示。
attr:matchingRule:=value
- attr 是属于正在搜索的条目的属性,如
cn
或mail
。 - matchingRule 是一个字符串,其中包含规则的名称或 OID,用于根据所需语法匹配属性值。
- value 是要搜索的属性值,也可以是要搜索的属性值。过滤器值的语法取决于使用的匹配规则格式。
- 位 AND 匹配
- 执行位 AND 匹配。OID: 1.2.840.113556.1.4.803兼容语法:与
整数
和数字字符串一起使用。目录服务器自动将数字字符串转换为整数。 - 位 OR 匹配
- 执行位 OR 匹配。OID: 1.2.840.113556.1.4.804兼容语法:与
整数
和数字字符串一起使用。目录服务器自动将数字字符串转换为整数。 - booleanMatch
- 评估要匹配的值是 TRUE 还是 FALSEOID: 2.5.13.13兼容语法:布尔值
- caseExactIA5Match
- 对值进行区分大小写的比较。OID: 1.3.6.1.4.1.1466.109.114.1兼容语法:
IA5
语法、URI - caseExactMatch
- 对值进行区分大小写的比较。OID: 2.5.13.5兼容语法:目录字符串、可打印字符串、OID
- caseExactOrderingMatch
- 允许区分大小写的搜索(小于和大于)。OID: 2.5.13.6兼容语法:目录字符串、可打印字符串、OID
- caseExactSubstringsMatch
- 执行区分大小写的子字符串和索引搜索。OID: 2.5.13.7兼容语法:目录字符串、可打印字符串、OID
- caseIgnoreIA5Match
- 执行不区分大小写的值比较。OID: 1.3.6.1.4.1.1466.109.114.2兼容语法:
IA5
语法、URI - caseIgnoreIA5SubstringsMatch
- 对子字符串和索引执行不区分大小写的搜索。OID: 1.3.6.1.4.1.1466.109.114.3兼容语法:
IA5
语法、URI - caseIgnoreListMatch
- 执行不区分大小写的值比较。OID: 2.5.13.11兼容语法:后地址
- caseIgnoreListSubstringsMatch
- 对子字符串和索引执行不区分大小写的搜索。OID: 2.5.13.12兼容语法:后地址
- caseIgnoreMatch
- 执行不区分大小写的值比较。OID: 2.5.13.2兼容语法:目录字符串、可打印字符串、OID
- caseIgnoreOrderingMatch
- 允许区分大小写的搜索(小于和大于)。OID: 2.5.13.3兼容语法:目录字符串、可打印字符串、OID
- caseIgnoreSubstringsMatch
- 对子字符串和索引执行不区分大小写的搜索。OID: 2.5.13.4兼容语法:目录字符串、可打印字符串、OID
- distinguishedNameMatch
- 比较可分辨名称值。OID: 2.5.13.1兼容语法:区分名称(DN)
- generalizedTimeMatch
- 以 Generalized Time 格式的比较值。OID: 2.5.13.27兼容语法:常规化时间
- generalizedTimeOrderingMatch
- 对于处于 Generalized Time 格式的值,允许范围搜索(无或大于)。OID: 2.5.13.28兼容语法:常规化时间
- integerMatch
- 评估整数值。OID: 2.5.13.14兼容语法:整数
- integerOrderingMatch
- 在整数值上允许范围搜索(无和大于)的搜索。OID: 2.5.13.15兼容语法:整数
- keywordMatch
- 将给定的搜索值与属性值中的字符串进行比较。OID: 2.5.13.33兼容语法:目录字符串
- numericStringMatch
- 比较更多常规数字值。OID: 2.5.13.8兼容语法:Numeric String
- numericStringOrderingMatch
- 在更常规的数字值上允许范围搜索(无或大于)OID: 2.5.13.9兼容语法:Numeric String
- numericStringSubstringMatch
- 比较更多常规数字值。OID: 2.5.13.10兼容语法:Numeric String
- objectIdentifierMatch
- 比较对象标识符(OID)值。OID: 2.5.13.0兼容语法:OID
- octetStringMatch
- 评估 octet 字符串值。OID: 2.5.13.17兼容语法:Octet 字符串
- octetStringOrderingMatch
- 在一系列 octet 字符串值上支持范围搜索(无或大于)。OID: 2.5.13.18兼容语法:Octet 字符串
- telephoneNumberMatch
- 评估电话号码值。OID: 2.5.13.20兼容语法:全球电话号码
- telephoneNumberSubstringsMatch
- 对电话号码值执行子字符串和索引搜索。OID: 2.5.13.21兼容语法:全球电话号码
- uniqueMemberMatch
- 比较 name 和 UID 值。OID: 2.5.13.23兼容语法:名称和可选 UID
- wordMatch
- 将给定的搜索值与属性值中的字符串进行比较。这个匹配规则不区分大小写。OID: 2.5.13.32兼容语法:目录字符串
匹配规则 | 对象标识符(OID) |
---|---|
英语(Case Exact Ordering Match) | 2.16.840.1.113730.3.3.2.11.3 |
Albanian (Case Insensitiveing Match) | 2.16.840.1.113730.3.3.2.44.1 |
Arabic (Case Insensitiveing Match) | 2.16.840.1.113730.3.3.2.1.1 |
Belorussian (Case Insensitive Ordering Match) | 2.16.840.1.113730.3.3.2.2.1 |
Bulgarian (覆盖顺序匹配) | 2.16.840.1.113730.3.3.2.3.1 |
Catalan (Case Insensitive Ordering Match) | 2.16.840.1.113730.3.3.2.4.1 |
中文 - 简体(敏感顺序匹配) | 2.16.840.1.113730.3.3.2.49.1 |
中文 - 繁体(覆盖顺序匹配) | 2.16.840.1.113730.3.3.2.50.1 |
Croatian (覆盖顺序匹配) | 2.16.840.1.113730.3.3.2.22.1 |
Czech (覆盖顺序匹配) | 2.16.840.1.113730.3.3.2.5.1 |
Danish (覆盖顺序匹配) | 2.16.840.1.113730.3.3.2.6.1 |
Dutch (Case Insensitiveing Match) | 2.16.840.1.113730.3.3.2.33.1 |
Dutch - Belgian (Case Insensitive Ordering Match) | 2.16.840.1.113730.3.3.2.34.1 |
英语 - 美国(敏感顺序匹配) | 2.16.840.1.113730.3.3.2.11.1 |
English - Canadian (Case Insensitiveing Match) | 2.16.840.1.113730.3.3.2.12.1 |
英语 - Irish (覆盖顺序匹配) | 2.16.840.1.113730.3.3.2.14.1 |
Estonian (Case Insensitiveing Match) | 2.16.840.1.113730.3.3.2.16.1 |
Finnish (Case Insensitiveing Match) | 2.16.840.1.113730.3.3.2.17.1 |
法语(覆盖顺序匹配) | 2.16.840.1.113730.3.3.2.18.1 |
法语 - Belgian (Case Insensitive Ordering Match) | 2.16.840.1.113730.3.3.2.19.1 |
法语 - Canadian (覆盖顺序匹配) | 2.16.840.1.113730.3.3.2.20.1 |
法语 - Swiss (Case Insensitive Ordering Match) | 2.16.840.1.113730.3.3.2.21.1 |
法国(覆盖顺序匹配) | 2.16.840.1.113730.3.3.2.7.1 |
俄罗斯 - Austrian (Case Insensitive Ordering Match) | 2.16.840.1.113730.3.3.2.8.1 |
德语 - Swiss (覆盖顺序匹配) | 2.16.840.1.113730.3.3.2.9.1 |
Greek (敏感顺序匹配) | 2.16.840.1.113730.3.3.2.10.1 |
Hebrew (Case Insensitiveing Match) | 2.16.840.1.113730.3.3.2.27.1 |
Hungarian (Case Insensitiveing Match) | 2.16.840.1.113730.3.3.2.23.1 |
Icelandic (Case Insensitive Ordering Match) | 2.16.840.1.113730.3.3.2.24.1 |
意大利语(覆盖顺序匹配) | 2.16.840.1.113730.3.3.2.25.1 |
意大利语 - Swiss (敏感顺序匹配) | 2.16.840.1.113730.3.3.2.26.1 |
日语(覆盖顺序匹配) | 2.16.840.1.113730.3.3.2.28.1 |
韩语(覆盖顺序匹配) | 2.16.840.1.113730.3.3.2.29.1 |
Latvian, Lettish (Case Insensitive Ordering Match) | 2.16.840.1.113730.3.3.2.31.1 |
Lithuanian (覆盖顺序匹配) | 2.16.840.1.113730.3.3.2.30.1 |
Macedonian (Case Insensitiveing Match) | 2.16.840.1.113730.3.3.2.32.1 |
Norwegian (Case Insensitiveing Match) | 2.16.840.1.113730.3.3.2.35.1 |
Norwegian - Bokmul (Case Insensitive Ordering Match) | 2.16.840.1.113730.3.3.2.36.1 |
Norwegian - Nynorsk (Case Insensitive Ordering Match) | 2.16.840.1.113730.3.3.2.37.1 |
polish (覆盖顺序匹配) | 2.16.840.1.113730.3.3.2.38.1 |
Romanian (Case Insensitiveing Match) | 2.16.840.1.113730.3.3.2.39.1 |
俄罗斯(覆盖顺序匹配) | 2.16.840.1.113730.3.3.2.40.1 |
Serbian - Cyrillic (Case Insensitive Ordering Match) | 2.16.840.1.113730.3.3.2.45.1 |
Serbian - 英语(覆盖顺序匹配) | 2.16.840.1.113730.3.3.2.41.1 |
Slovak (覆盖顺序匹配) | 2.16.840.1.113730.3.3.2.42.1 |
Slovenian (覆盖顺序匹配) | 2.16.840.1.113730.3.3.2.43.1 |
西班牙语(覆盖顺序匹配) | 2.16.840.1.113730.3.3.2.15.1 |
Swedish (Case Insensitiveing Match) | 2.16.840.1.113730.3.3.2.46.1 |
Turkish (覆盖顺序匹配) | 2.16.840.1.113730.3.3.2.47.1 |
Ukrainian (Case Insensitiveing Match) | 2.16.840.1.113730.3.3.2.48.1 |
匹配规则 | 对象标识符(OID) |
---|---|
英语(Case Exact Substring 匹配) | 2.16.840.1.113730.3.3.2.11.3.6 |
Albanian (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.44.1.6 |
Arabic (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.1.1.6 |
Belorussian (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.2.1.6 |
Bulgarian (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.3.1.6 |
Catalan (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.4.1.6 |
中文 - 简体(敏感子字符串匹配) | 2.16.840.1.113730.3.3.2.49.1.6 |
中文 - 繁体(覆盖子字符串匹配) | 2.16.840.1.113730.3.3.2.50.1.6 |
Croatian (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.22.1.6 |
Czech (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.5.1.6 |
Danish (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.6.1.6 |
Dutch (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.33.1.6 |
Dutch - Belgian (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.34.1.6 |
英语 - 美国(敏感子字符串匹配) | 2.16.840.1.113730.3.3.2.11.1.6 |
English - Canadian (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.12.1.6 |
英语 - Irish (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.14.1.6 |
Estonian (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.16.1.6 |
Finnish (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.17.1.6 |
法语(敏感子字符串匹配) | 2.16.840.1.113730.3.3.2.18.1.6 |
法语 - Belgian (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.19.1.6 |
法语 - Canadian (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.20.1.6 |
法语 - Swiss (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.21.1.6 |
德语(敏感子字符串匹配) | 2.16.840.1.113730.3.3.2.7.1.6 |
俄罗斯 - Austrian (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.8.1.6 |
Swis - Swiss (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.9.1.6 |
Greek (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.10.1.6 |
Hebrew (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.27.1.6 |
Hungarian (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.23.1.6 |
Icelandic (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.24.1.6 |
意大利语(Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.25.1.6 |
意大利语 - Swiss (敏感子字符串匹配) | 2.16.840.1.113730.3.3.2.26.1.6 |
日语(覆盖子字符串匹配) | 2.16.840.1.113730.3.3.2.28.1.6 |
韩语(敏感子字符串匹配) | 2.16.840.1.113730.3.3.2.29.1.6 |
Latvian, Lettish (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.31.1.6 |
Lithuanian (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.30.1.6 |
Macedonian (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.32.1.6 |
Norwegian (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.35.1.6 |
Norwegian - Bokmul (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.36.1.6 |
Norwegian - Nynorsk (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.37.1.6 |
polish (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.38.1.6 |
Romanian (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.39.1.6 |
俄罗斯(敏感子字符串匹配) | 2.16.840.1.113730.3.3.2.40.1.6 |
Serbian - Cyrillic (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.45.1.6 |
Serbian - 英语(覆盖子字符串匹配) | 2.16.840.1.113730.3.3.2.41.1.6 |
Slovak (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.42.1.6 |
Slovenian (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.43.1.6 |
西班牙语(敏感子字符串匹配) | 2.16.840.1.113730.3.3.2.15.1.6 |
Swedish (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.46.1.6 |
Turkish (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.47.1.6 |
Ukrainian (Case Insensitive Substring Match) | 2.16.840.1.113730.3.3.2.48.1.6 |
14.4. Common ldapsearches 示例
- 搜索是目录中所有条目的搜索。
- 目录被配置为支持匿名搜索和读取。这意味着,不需要提供绑定信息才能执行搜索。有关匿名访问的详情,请参考 第 18.11.1.1.3 节 “授予匿名访问权限”。
- 服务器位于名为 server.example.com 的主机上。
- 服务器使用端口号 389。由于这是默认端口,因此不必在搜索请求中发送端口号。
- 为端口 636 上的服务器启用 TLS (默认的 LDAPS 端口号)。
- 存储所有数据的后缀都是 dc=example,dc=com。
14.4.1. 返回所有条目
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -b "dc=example,dc=com" -s sub -x "(objectclass=*)"
objectclass
属性始终被索引,因此这是一个有用的搜索过滤器,用于返回每个条目。
14.4.2. 在命令行中指定搜索过滤器
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -b "dc=example,dc=com" -s sub -x "cn=babs jensen"
14.4.3. 搜索根 DSE 条目
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -x -b "" -s base "objectclass=*"
14.4.4. 搜索 Schema 条目
# ldapsearch -o ldif-wrap=no -D "cn=Directory Manager" -W -b "cn=schema" \ '(objectClass=subSchema)' -s sub objectClasses attributeTypes matchingRules \ matchingRuleUse dITStructureRules nameForms ITContentRules ldapSyntaxes
14.4.5. 使用 LDAP_BASEDN
# export LDAP_BASEDN="dc=example,dc=com" # ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -x "cn=babs jensen"
14.4.6. 显示属性的子组
+
返回所有操作属性。
cn
和 sn
属性,请使用以下命令行调用:
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -b "dc=example,dc=com" -s sub -x "(objectclass=*)" sn cn
14.4.7. 搜索过期属性
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -b "dc=example,dc=com" -s sub -x "(objectclass=*)" '+'
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -b "dc=example,dc=com" -s sub -x "(objectclass=*)" creatorsName createTimestamp modifiersName modifyTimestamp
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -b "dc=example,dc=com" -s sub -x "(objectclass=*)" "*" aci
14.4.8. 使用文件指定搜索过滤器
sn=example givenname=user
givenname
设置为 user 的所有条目。如果找到与两个搜索条件匹配的条目,则返回两次。
searchdb
的文件中指定:
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -x -f searchdb
givenname
和 sn
属性:
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -x -f searchdb sn givenname
14.4.9. 指定在搜索过滤器中包含 Commas 的 DN
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -x -s base -b "l=Bolivia\,S.A.,dc=example,dc=com" "objectclass=*"
14.4.10. 使用客户端证书绑定到目录服务器
14.4.11. 使用语言匹配规则搜索
attr:matchingRule:=value
departmentNumber:2.16.840.1.113730.3.3.2.46.1:=>= N4709
14.4.12. 使用 Bit 字段值搜索属性
"(UserAccountControl:1.2.840.113556.1.4.803:=2)"
"(UserAccountControl:1.2.840.113556.1.4.803:=6)”
"(UserAccountControl:1.2.840.113556.1.4.804:=6)"
14.5. 通过资源限制提高搜索性能
- 查看限制。指定可以为搜索操作检查多少条目。
- 大小限制。指定服务器返回到客户端应用程序的最大条目数,以响应搜索操作。
- 时间限制。指定服务器处理搜索操作的最大时间。
- 闲置超时。指定在连接被丢弃前与服务器的连接闲置的时间。
- 范围超时。指定一个单独的查找限制,专门用于使用范围进行搜索。
14.5.1. 搜索性能和资源限制
14.5.2. 精细 ID 列表大小
14.5.3. 使用命令行设置用户和全局资源限值
- 备用限制
- 指定搜索操作检查多少条目。为此属性指定 -1 表示没有限制。
- 用户级属性:
nsLookThroughLimit
- 全局配置:
- attribute:
nsslapd-certificationthroughlimit
- entry: cn=config,cn=ldbm database,cn=plugins,cn=config
- 页面查找限制
- 与查找限制一样,指定要检查多少条目,但专门用于简单的页面搜索操作。为此属性指定 -1 表示没有限制。
- User-level 属性:
nsPagedLookThroughLimit
- 全局配置:
- attribute:
nsslapd-pagedCONTROLLERthroughlimit
- entry: cn=config,cn=ldbm database,cn=plugins,cn=config
- 大小限制
- 指定服务器返回到客户端应用程序的最大条目数,以响应搜索操作。为此属性指定 -1 表示没有限制。
- user-level attribute:
nsSizeLimit
- 全局配置:
- attribute:
nsslapd-sizelimit
- entry: cn=config
- 页面大小限制
- 与大小限制一样,指定服务器返回到客户端应用程序但仅适用于简单页面搜索操作的最大条目数。为此属性指定 -1 表示没有限制。
- user-level 属性:
nsPagedSizeLimit
- 全局配置:
- attribute:
nsslapd-pagedsizelimit
- entry: cn=config
- 时间限制
- 指定服务器处理搜索操作的最大时间。为此属性指定 -1 表示没有时间限制。
- user-level 属性:
nsTimeLimit
- 全局配置:
- attribute:
nsslapd-timelimit
- entry: cn=config
- 闲置超时
- 指定在连接被丢弃前与服务器的连接闲置的时间。该值以秒为单位。为此属性指定 -1 表示没有限制。
- user-level 属性:
nsidletimeout
- 全局配置:
- attribute:
nsslapd-idletimeout
- entry: cn=config
- ID 列表扫描限制
- 指定从索引文件中载入的最大条目 ID 数,用于搜索结果。如果 ID 列表大小大于这个值,搜索将不会使用索引列表,而是将搜索视为未索引的搜索并查找整个数据库。
- 用户级属性:
nsIDListScanLimit
- 全局配置:
- attribute:
nsslapd-idlistscanlimit
- entry: cn=config,cn=ldbm database,cn=plugins,cn=config
- 页面 ID 列表扫描限制
- 与 ID 列表扫描限制一样,指定从索引文件中载入的最大条目 ID 数,但特别是针对页面搜索操作。
- user-level 属性:
nsPagedIDListScanLimit
- 全局配置:
- attribute:
nsslapd-pagedidlistscanlimit
- entry: cn=config,cn=ldbm database,cn=plugins,cn=config
- 范围查找限制
- 指定为范围搜索操作检查多少条目(使用 greater-than, equal-to-or-greater-than, less-than, 或 equal-to-less-than 运算符)。为此属性指定 -1 表示没有限制。
- 用户级别属性:不可用
- 全局配置:
- attribute:
nsslapd-rangelocatedthroughlimit
- entry: cn=config,cn=ldbm database,cn=plugins,cn=config
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: uid=user_name,ou=People,dc=example,dc=com changetype: modify add: nsSizeLimit nsSizeLimit: 500
nsSizeLimit
属性添加到用户条目中,并为它指定搜索返回大小限制 500 条目。
14.5.4. 在匿名绑定上设置资源限值
- 创建模板条目并设置您要应用到匿名绑定的任何资源限值。注意出于性能原因,模板应位于普通后端,而不是在 cn=config 后缀中,该后缀不使用条目缓存。例如:
# ldapadd -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=anonymous_template,ou=people,dc=example,dc=com objectclass: nsContainer objectclass: top cn: anonymous_template nsSizeLimit: 250 nsLookThroughLimit: 1000 nsTimeLimit: 60
- 在复制拓扑中的所有供应商上,将
nsslapd-anonlimitsdn
参数添加到服务器配置,指向模板条目的 DN。可以设置 第 14.5.3 节 “使用命令行设置用户和全局资源限值” 中的任何资源限值。例如:# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-anonlimitsdn="cn=anonymous_template,ou=people,dc=example,dc=com"
14.5.5. 提高范围搜索的性能
(modifyTimestamp>=20210101010101Z)
nsslapd-rangelocatedthroughlimit
属性中配置。默认值为 5000,与默认的 nsslapd-CONTROLLERthroughlimit 属性值
相同。
# ldapmodify -a
-D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: cn=config,cn=ldbm database,cn=plugins,cn=config
changetype: add
add: nsslapd-rangelookthroughlimit
nsslapd-rangelookthroughlimit: 7500
14.6. 使用持久性搜索
- 保持一致和当前的本地缓存。任何客户端都会在尝试连接和查询目录前查询本地缓存。持久性搜索提供了提高这些客户端性能所需的本地缓存。
- 自动启动目录操作。持久性缓存可以在修改条目时自动更新,持久性搜索结果可显示在条目上执行哪些修改类型。另一个应用可以使用该输出自动更新条目,例如为新用户在邮件服务器上自动创建电子邮件帐户或生成唯一用户 ID 号。
- 当客户端断开连接时,ldapsearch 不会发送通知,在搜索断开连接时,不会发送针对任何更改的更改通知。这意味着,如果客户端缓存断开连接,且没有使用任何新的、修改或删除条目进行更新缓存,则不会更新它。
- 攻击者可以打开大量持久性搜索来启动拒绝服务攻击。
- 持久性搜索需要在 Directory 服务器和客户端之间打开 TCP 连接。只有在服务器被配置为允许许多客户端连接且有关闭闲置连接时,才应这样做。
[12/Jan/2009:12:51:54.899423510 -0500] conn=19636710736396323 op=0 SRCH base="dc=example,dc=com" scope=2 filter="(objectClass=person)" attrs=ALL options=persistent
14.7. 使用指定控制进行搜索
supportedControls
属性中定义了控制。其中一些定义了复制等服务器操作;其他允许扩展操作,如获得有效权限或解引用控制哪些客户端可以通过 LDAP 操作传递给服务器。
-E
选项指定,方法是提供控制 OID、其 ldapsearch 的关键程度以及控制操作所需的信息。
-E '[!]control_OID:control_information'
14.7.1. 检索受影响的用户右边
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -b "dc=example,dc=com" -s sub -x -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=jsmith,ou=people,dc=example,dc=com' "(objectclass=*)"
14.7.2. 使用服务器端排序
-E
标志和 sss
控制别名。操作的结构设置属性,用于对结果进行排序,以及可选的排序顺序和排序规则。
-E sss=[-]attribute_name:[ordering_rule_OID]
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -b "dc=example,dc=com" -s sub -x -E sss=-uidNumber:2.5.13.15 "(objectclass=*)"
14.7.3. 执行引用搜索
-E 'deref=deref_attribute:list_of_attributes'
图 14.1. 简单引用搜索命令
member
属性作为 deref_attribute。然后,它会返回每个成员的 locality 属性。
# ldapsearch -x -D "cn=Directory Manager" -W -b "cn=Example,ou=Groups,dc=example,dc=com" -E 'deref=member:mail,cn' "(objectclass=*)" # Engineers, Groups, example.com dn: cn=Engineers,ou=Groups,dc=example,dc=com control: 1.3.6.1.4.1.4203.666.5.16 false MIQAAADNMIQAAAA1BAZtZW1iZXIEK2NuPURld mVsb3BlcnMsIG91PUdyb3VwcywgZGM9ZXhhbXBsZSxkYz1jb20whAAAADIEBm1lbWJlcgQoY249VG VzdGVycywgb3U9R3JvdXBzLCBkYz1leGFtcGxlLGRjPWNvbTCEAAAAVAQGbWVtYmVyBCp1aWQ9ZW5 nLCBvdT1lbmdpbmVlcmluZywgZGM9ZXhhbXBsZSxkYz1jb22ghAAAABowhAAAABQEAWwxhAAAAAsE CUNhbWJyaWRnZQ== # member: <mail=jsmith@example.com><cn=John Smith>;uid=jsmith,ou=people,dc=example,dc=com objectClass: top objectClass: inetuser objectClass: groupofnames cn: Engineers member: uid=jsmith,ou=people,dc=example,dc=com
14.7.4. 使用简单页面结果
简单页面结果的工作方式
当您启动一个简单的页面结果搜索时:
- 客户端将搜索发送到服务器,以及页面结果控制以及第一个页面中要返回多少记录。
- 在目录服务器开始返回数据前,服务器会生成估算总可返回多少条记录。记录的估计不是确切的数字。返回的记录总数可以小于估计的值。此类情况的原因包括
- 搜索过滤器中使用的属性在索引中不存在。因此,必须索引所有查询的属性。
- 在向客户端发送条目前,验证访问控制列表(ACL)。权限不足可能会阻止条目返回。
生成估算后,服务器会发送第一个结果集合、cookies 和估计记录数。 - 返回的记录显示在客户端中。用户现在可以输入下一次请求中应返回多少记录。现在,请求的数量会和 Cookie 发送到服务器。
- 服务器从数据库检索请求的记录数量,并将它们与 Cookie 一起发送到客户端。
- 前两个步骤会重复,直到发送所有记录或取消搜索。
简单页面结果和 OpenLDAP 工具
带有 ldapsearch 的简单页面结果搜索选项的格式是:
-E pg=size
ldapsearch -x -D "cn=Directory Manager" -W -b "ou=Engineers,ou=People,dc=example,dc=com" -E pg=3 "(objectclass=*)" cn dn: uid=jsmith,ou=Engineers,ou=People,dc=example,dc=com cn: John Smith dn: uid=bjensen,ou=Engineers,ou=People,dc=example,dc=com cn: Barbara Jensen dn: uid=hmartin,ou=Engineers,ou=People,dc=example,dc=com cn: Henry Martin Results are sorted. next page size (3): 5
简单页面结果和服务器端排序
简单的页面结果可与服务器端使用。服务器端排序是一个控制,它在服务器上执行排序过程,而不是在客户端上执行;这通常是针对使用特定匹配规则的搜索完成。(此行为在 RFC 2891 中定义。) OpenLDAP 客户端工具不支持使用简单页面结果控制的服务器端排序,但其他 LDAP 工具(如 Perl Net::LDAP )支持两者。
单一连接上的多个简单页面结果请求
有些客户端可能会打开与 Directory 服务器的单一连接,但发送多个操作请求,包括使用简单页面结果扩展的多个搜索请求。
简单页面结果,与 VLV 索引进行比较
VLV 索引与简单的页面类似,结果也会返回可用的浏览结果列表。主要区别在于如何生成该列表。每个搜索都会计算简单的页面结果,而 VLV 索引是永久列表。总体而言,VLV 索引对于搜索速度更快,但需要一些服务器端配置和开销才能使服务器维护。
14.7.5. 预读取条目响应控制
description
属性,并在修改前和之后显示值:
#ldapmodify -D "cn=Directory Manager" -W -x \
-e \!preread=description -e \!postread=description
dn: uid=user,ou=People,dc=example,dc=com changetype: modify replace: description description: new description modifying entry "uid=user,ou=People,dc=example,dc=com" control: 1.3.6.1.1.13.1 false ZCkEJXVpZD1qdXNlcixvdT1QZW9wbGUsZGM9ZXhhbXBsZSxk Yz1jb20wAA== # ==> preread dn: uid=user,ou=People,dc=example,dc=com description: old description # <== preread control: 1.3.6.1.1.13.2 false ZEsEJXVpZD1qdXNlcixvdT1QZW9wbGUsZGM9ZXhhbXBsZSxk Yz1jb20wIjAgBAtkZXNjcmlwdGlvbjERBA9uZXcgZGVzY3JpcHRpb24= # ==> postread dn: uid=user,ou=People,dc=example,dc=com description: new description # <== postread
第 15 章 管理复制
15.1. 复制概述
15.1.1. 复制的目录单元
15.1.2. 读写和只读副本
15.1.3. Vendor 和 Consumers
- 对于级联复制,hub 服务器会包含它为消费者提供的只读副本。第 15.4 节 “级联复制” 包含更多信息。
- 对于多层次复制,供应商和消费者 均用于相同的信息。如需更多信息,请参阅 第 15.3 节 “多层复制”。
15.1.4. 变更日志
15.1.5. 复制身份
- 它在 cn=config 条目中的消费者服务器上创建。
- 在每个 从另一个服务器接收更新的服务器上创建此条目,这意味着每个 hub 或专用消费者。
- 当副本配置为消费者或 hub 时,必须将此条目指定为执行复制更新的授权。
- 复制协议是在供应商服务器上创建的,此条目的 DN 必须在复制协议中指定。
- 在复制上下文中,此条目具有其特殊用户配置文件,绕过消费者服务器上针对参与该复制协议的数据库定义的访问控制规则。请注意,在复制上下文之外,复制管理器在执行常规操作时可能会受到 ACI 的影响。
15.1.6. 复制协议
- 要复制的数据库。
- 将数据推送到的消费者服务器。
- 复制可能发生的天数和时间。
- 供应商服务器必须用来绑定的 DN 和凭证(复制管理器条目或供应商绑定 DN)。
- 连接是如何保护的(TLS、客户端身份验证)。
- 任何不复制的属性(强制复制)。
15.1.7. 使用 DNATactional Replication 复制子属性集
nsDS5ReplicatedAttributeList
)必须始终设置为启用部分复制;如果这是唯一属性集,则它将应用到增量和总体更新。可选的 nsDS5ReplicatedAttributeListTotal
属性为总更新设置额外的部分复制列表。这在 第 15.11.1 节 “为总和增量更新设置不同的复制属性” 中进行了描述。
nsds5ReplicaStripAttrs
属性添加一个无法在空复制事件中发送的属性列表,并从更新序列中分离。这个逻辑上包括操作特定点,如 修饰符名称
。
15.1.8. 通过 TLS 复制
先决条件
- 将供应商和消费者服务器配置为使用 TLS。请参阅 第 9.4.1 节 “在目录服务器中启用 TLS”。
- 配置消费者服务器,将供应商服务器的证书识别为供应商 DN。仅执行此操作来使用 TLS 客户端身份验证,而不是简单的身份验证。请参阅 第 9.9 节 “使用基于证书的客户端身份验证”。重要如果供应商的证书只能作为服务器证书,而不是作为 TLS 握手期间的客户端,则通过 TLS 身份验证配置的复制会失败。使用基于证书的身份验证复制使用目录服务器的服务器证书向远程服务器进行身份验证。如果您使用
certutil
生成证书签名请求(CSR),请将--nsCertType=sslClientType=sslServer
选项传给命令,以设置所需的证书类型。
通过 TLS 配置复制
- 使用用户名和密码验证时:
- 使用基于证书的身份验证时,请参阅 第 15.6 节 “配置复制合作伙伴以使用基于证书的身份验证”。
15.2. 单层次复制
图 15.1. 单层次复制
15.2.1. 使用命令行设置单层次复制
example.com 的主机上运行了一个现有的 Directory 服务器实例
,它将充当复制拓扑中的供应商来设置。以下流程描述了如何将名为 consumer.example.com
的只读消费者添加到拓扑中,以及如何为 dc=example,dc=com
后缀配置单层次复制。
在 Consumer 上执行的步骤
consumer.example.com
主机上:
- 安装目录服务器并创建实例。详情请查看 红帽目录服务器 安装指南。
- 如果您在没有数据库的情况下创建实例,请为后缀创建数据库。例如,要为 dc=example,dc=com 后缀创建一个名为
userRoot
的数据库:# dsconf -D "cn=Directory Manager" ldap://consumer.example.com backend \ create --suffix="dc=example,dc=com" --be-name="userRoot"
有关为后缀创建数据库的详情,请参考 第 2.1.1 节 “创建后缀”。 - 为后缀启用复制,并创建复制管理器帐户:
# dsconf -D "cn=Directory Manager" ldap://consumer.example.com replication \ enable --suffix="dc=example,dc=com" --role="consumer" \ --bind-dn="cn=replication manager,cn=config" --bind-passwd="password"
此命令将consumer.example.com
主机配置为 dc=example,dc=com 后缀的消费者。另外,服务器使用指定密码创建cn=replication manager,cn=config
用户,并允许此帐户将后缀的更改复制到此主机上。
在独立上执行的步骤
.example.com
主机上:
- 为 dc=example,dc=com 后缀启用复制:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com replication \ enable --suffix="dc=example,dc=com" --role="supplier" --replica-id=1
此命令将 provider.example.com
主机配置为 dc=example,dc=com 后缀的供应商,并将此条目的副本 ID 设置为 1。重要对于拓扑中的所有供应商,副本 ID 必须是 1 到 65534 之间的唯一整数。 - 添加复制协议,并初始化消费者。例如:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt \ create --suffix="dc=example,dc=com" --host="consumer.example.com" --port=636 \ --conn-protocol=LDAPS --bind-dn="cn=replication manager,cn=config" \ --bind-passwd="password" --bind-method=SIMPLE --init \ example-agreement
此命令创建一个名为example-agreement
的复制协议。复制协议定义了设置,如消费者的主机名、协议和身份验证信息,这些设置供应商将数据连接到消费者时使用。创建协议后,目录服务器会初始化消费者。要稍后初始化使用者,请省略--init
选项。请注意,在初始化消费者前复制不会启动。有关初始化消费者的详情,请参考 第 15.8.3 节 “初始化消费者”。有关命令中使用的选项的详情,请输入:# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt --help
- 验证初始化是否成功:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt \ init-status --suffix="dc=example,dc=com" example-agreement Agreement successfully initialized.
根据要复制的数据量,初始化可能会非常耗时。
15.2.2. 使用 Web 控制台设置单层次复制
example.com 的主机上运行了一个现有的 Directory 服务器实例
,它将充当复制拓扑中的供应商来设置。以下流程描述了如何将名为 consumer.example.com
的只读消费者添加到拓扑中,以及如何为 dc=example,dc=com
后缀配置单层次复制。
在 Consumer 上执行的步骤
consumer.example.com
主机上:
- 安装目录服务器并创建实例。详情请查看 红帽目录服务器 安装指南。
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 如果您在没有数据库的情况下创建实例,请为后缀创建数据库。有关为后缀创建数据库的详情,请参考 第 2.1.1 节 “创建后缀”。
- 为后缀启用复制:
- 打开菜单。
- 选择 dc=example,dc=com 后缀,然后单击 。
- 在 Replication Role 字段中选择 Consumer,并输入要创建的复制管理器帐户的 DN 和密码。例如:这些设置将主机配置为 dc=example,dc=com 后缀的消费者。另外,服务器使用指定密码创建
cn=replication manager,cn=config
用户,并允许此帐户将后缀的更改复制到此主机上。 - 点。
在独立上执行的步骤
.example.com
主机上:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 为 dc=example,dc=com 后缀启用复制:
- 打开菜单。
- 选择 dc=example,dc=com 后缀,然后单击 。
- 在 Replication Role 字段中选择 Supplier,输入副本 ID,并将 Replication Authentication 区域中的字段留空。例如:这会将主机配置为 dc=example,dc=com 后缀的供应商,并将此条目的副本 ID 设置为 1。重要对于拓扑中的所有供应商,副本 ID 必须是 1 到 65534 之间的唯一整数。
- 点。
- 添加复制协议,并初始化消费者:
- 打开 dc=example,dc=com 后缀。菜单,然后选择
- 在选项卡中,点 ,并填写字段。例如:这些设置会创建一个名为
example-agreement
的复制协议。复制协议定义了设置,如消费者的主机名、协议和身份验证信息,这些设置供应商将数据连接到消费者时使用。 - 在 Consumer Initialization 字段中选择 Do Online Initialization,以在保存协议后自动初始化消费者。要稍后初始化消费者,请选择 Do Not Initialize。请注意,在初始化消费者前复制不会启动。有关初始化消费者的详情,请参考 第 15.8.3 节 “初始化消费者”。
- 点。
- 验证初始化是否成功:
- 打开菜单。
- 选择条目。对于成功完成的初始化,Web 控制台会在 Last Update Status 列中显示 Error (0) Replica obtained: Incremental update successful 信息。根据要复制的数据量,初始化可能会非常耗时。
15.3. 多层复制
图 15.2. 带有两层线的多层次复制
图 15.3. 带有 Four Suppliers 和 Eight Consumers 的复杂复制场景
- 网络的速度。
- 传出和传入复制协议的数量。
15.3.1. 使用命令行设置多层次复制
1.example.com
的主机上运行现有的 Directory 服务器实例。以下流程描述了如何将名为 provider 2.example.com
的另一个读写副本添加到拓扑中,以及如何为 dc=example,dc=com
后缀配置多层次复制。
准备要加入的远程服务器
2.example.com
主机上:
- 安装目录服务器并创建实例。详情请查看 红帽目录服务器 安装指南。
- 如果您在没有数据库的情况下创建实例,请为后缀创建数据库。例如,要为 dc=example,dc=com 后缀创建一个名为
userRoot
的数据库:# dsconf -D "cn=Directory Manager" ldap://supplier2.example.com backend \ create --suffix="dc=example,dc=com" --be-name="userRoot"
有关为后缀创建数据库的详情,请参考 第 2.1.1 节 “创建后缀”。 - 为后缀启用复制,并创建复制管理器帐户:
# dsconf -D "cn=Directory Manager" ldap://supplier2.example.com replication \ enable --suffix="dc=example,dc=com" --role="supplier" --replica-id=1 \ --bind-dn="cn=replication manager,cn=config" --bind-passwd="password"
此命令将 provider2.example.com
主机配置为 dc=example,dc=com 后缀的供应商,并将此条目的副本 ID 设置为 1。另外,服务器使用指定密码创建cn=replication manager,cn=config
用户,并允许此帐户将后缀的更改复制到此主机上。重要对于拓扑中的所有供应商,副本 ID 必须是 1 到 65534 之间的唯一整数。
将现有服务器配置为独立服务器
1.example.com
主机上:
- 与您在新服务器上运行的命令类似,为 dc=example,dc=com 后缀启用复制,并创建复制管理器帐户:
# dsconf -D "cn=Directory Manager" ldap://supplier1.example.com replication \ enable --suffix="dc=example,dc=com" --role="supplier" --replica-id=2 \ --bind-dn="cn=replication manager,cn=config" --bind-passwd="password"
副本 ID 必须与 “准备要加入的远程服务器”一节 中创建的副本 ID 不同,但复制管理器帐户可以使用相同的 DN。 - 添加复制协议,并初始化新的服务器。例如:
# dsconf -D "cn=Directory Manager" ldap://supplier1.example.com repl-agmt \ create --suffix="dc=example,dc=com" --host="supplier2.example.com" --port=636 \ --conn-protocol=LDAPS --bind-dn="cn=replication manager,cn=config" \ --bind-passwd="password" --bind-method=SIMPLE --init \ example-agreement-supplier1-to-supplier2
此命令创建一个名为example-agreement-supplier1-to-supplier2
的复制协议。复制协议定义了设置,如消费者的主机名、协议和身份验证信息,这些设置供应商将数据连接到消费者时使用。创建协议后,目录服务器会初始化消费者。要稍后初始化使用者,请省略--init
选项。请注意,在初始化消费者前复制不会启动。有关初始化消费者的详情,请参考 第 15.8.3 节 “初始化消费者”。有关命令中使用的选项的详情,请输入:# dsconf -D "cn=Directory Manager" ldap://supplier1.example.com repl-agmt --help
- 验证初始化是否成功:
# dsconf -D "cn=Directory Manager" ldap://supplier1.example.com repl-agmt \ init-status --suffix="dc=example,dc=com" example-agreement-supplier1-to-supplier2 Agreement successfully initialized.
根据要复制的数据量,初始化可能需要非常耗时。
将新服务器配置为叶
2.example.com
主机上:
- 添加复制协议,以将信息从供应商
2
复制到供应商 1
。例如:# dsconf -D "cn=Directory Manager" ldap://supplier2.example.com repl-agmt \ create --suffix="dc=example,dc=com" --host="supplier1.example.com" --port=636 \ --conn-protocol=LDAPS --bind-dn="cn=replication manager,cn=config" \ --bind-passwd="password" --bind-method=SIMPLE \ example-agreement-supplier2-to-supplier1
此命令创建一个名为example-agreement-supplier2-to-supplier1
的复制协议。复制协议定义了设置,如消费者的主机名、协议和身份验证信息,这些设置供应商将数据连接到消费者时使用。
15.3.2. 使用 Web 控制台设置多层次复制
1.example.com
的主机上运行现有的 Directory 服务器实例。以下流程描述了如何将名为 provider 2.example.com
的另一个读写副本添加到拓扑中,以及如何为 dc=example,dc=com
后缀配置多层次复制。
准备要加入的远程服务器
2.example.com
主机上:
- 安装目录服务器并创建实例。详情请查看 红帽目录服务器 安装指南。
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 如果您在没有数据库的情况下创建实例,请从后缀创建数据库。有关为后缀创建数据库的详情,请参考 第 2.1.1 节 “创建后缀”。
- 为后缀启用复制:
- 打开菜单。
- 选择 dc=example,dc=com 后缀,然后单击 。
- 在 Replication Role 字段中选择 Supplier,输入副本 ID,以及要创建的复制管理器帐户的 DN 和密码。例如:这些设置将 provider
2.example.com
主机配置为 dc=example,dc=com 后缀的供应商,并将此条目的副本 ID 设置为 1。另外,服务器使用指定密码创建cn=replication manager,cn=config
用户,并允许此帐户将后缀的更改复制到此主机上。重要对于拓扑中的所有供应商,副本 ID 必须是 1 到 65534 之间的唯一整数。 - 点。
将现有服务器配置为独立服务器
1.example.com
主机上:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 与新服务器上的设置类似,为 dc=example,dc=com 后缀启用复制,并创建一个复制管理器帐户:
- 打开菜单。
- 选择 dc=example,dc=com 后缀,然后单击 。
- 在 Replication Role 字段中选择 Supplier,输入副本 ID,以及要创建的复制管理器帐户的 DN 和密码。例如:副本 ID 必须与 “准备要加入的远程服务器”一节 中创建的副本 ID 不同,但复制管理器帐户可以使用相同的 DN。
- 点。
- 添加复制协议并初始化消费者:
- 打开菜单,然后选择 Agreements 。
- 点,并填写字段。例如:这些设置会创建一个名为
example-agreement-supplier1-to-supplier2
的复制协议。复制协议定义了设置,如消费者的主机名、协议和身份验证信息,这些设置供应商将数据连接到消费者时使用。 - 在 Consumer Initialization 字段中选择 Do Online Initialization,以在保存协议后自动初始化消费者。要稍后初始化消费者,请选择 Do Not Initialize。请注意,在初始化消费者前复制不会启动。有关初始化消费者的详情,请参考 第 15.8.3 节 “初始化消费者”。
- 点。
- 验证初始化是否成功:
- 打开菜单。
- 选择条目。对于成功完成的初始化,Web 控制台会在 Last Update Status 列中显示 Error (0) Replica obtained: Incremental update successful 信息。根据要复制的数据量,初始化可能会非常耗时。
将新服务器配置为叶
2.example.com
主机上:
- 添加复制协议,并初始化消费者:
- 打开菜单,然后选择 Agreements 。
- 点,并填写字段。例如:这些设置会创建一个名为
example-agreement-supplier2-to-supplier1
的复制协议。 - 在 Consumer Initialization 字段中选择 Do Online Initialization,以在保存协议后自动初始化消费者。要稍后初始化消费者,请选择 Do Not Initialize。请注意,在初始化消费者前复制不会启动。有关初始化消费者的详情,请参考 第 15.8.3 节 “初始化消费者”。
- 点。
- 验证初始化是否成功:
- 打开菜单。
- 选择条目。如果初始化成功完成,Web 控制台会在 Last Update Status 列中显示 Error (0) Replica obtained: Incremental update successful 信息。根据要复制的数据量,初始化非常耗时。
15.3.3. 防止在多层复制中移动消费者
nsds5ReplicaBusyWaitTime
- 设置供应商在消费者发回忙碌响应后等待的时间(以秒为单位),然后再尝试获取访问权限。例如,要配置供应商在进行另一个获取尝试前等待 5 秒:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt \ set --suffix="suffix" --busy-wait-time=5 agreement_name
nsds5ReplicaSessionPauseTime
- 设置供应商在两个更新会话之间等待的时间(以秒为单位)。如果您设置的值低于
nsds5ReplicaBusyWaitTime
指定的值,则目录服务器会自动使用nsds5ReplicaSessionPauseTime
参数的值,它比nsds5ReplicaBusyWaitTime
中设置的值高。例如,配置供应商在两个更新会话之间等待 10 秒:# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt \ set --suffix="suffix" --session-pause-time=10 agreement_name
nsds5ReplicaReleaseTimeout
- 设置供应商发布副本的超时时间,无论是完成发送其更新。这可防止单个供应商货币化副本。例如,在大量复制环境中将供应商配置为在 90 秒后发布副本:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com replication \ set --suffix="suffix" --repl-release-timeout=90
15.4. 级联复制
图 15.4. 级联复制
15.4.1. 使用命令行设置 Cascading 复制
example.com
的主机上运行现有的 Directory 服务器实例。以下流程描述了如何将名为 hub. example.com 的 hub
添加到从 dc=example,dc=com
后缀的供应商接收更新的拓扑中。因此,该流程描述了添加名为 consumer.example.com
的消费者,该消费者从 hub 服务器接收后缀的更新。
准备新的 Hub 服务器以加入
hub.example.com
主机上:
- 安装目录服务器并创建实例。详情请查看 红帽目录服务器 安装指南。
- 如果您在没有数据库的情况下创建实例,请为后缀创建数据库。例如,要为 dc=example,dc=com 后缀创建一个名为
userRoot
的数据库:# dsconf -D "cn=Directory Manager" ldap://hub.example.com backend \ create --suffix="dc=example,dc=com" --be-name="userRoot"
有关为后缀创建数据库的详情,请参考 第 2.1.1 节 “创建后缀”。 - 为后缀启用复制并创建复制管理器帐户:
# dsconf -D "cn=Directory Manager" ldap://hub.example.com replication \ enable --suffix="dc=example,dc=com" --role="hub" \ --bind-dn="cn=replication manager,cn=config" --bind-passwd="password"
此命令将hub.example.com
主机配置为 dc=example,dc=com 后缀的中心。另外,服务器使用指定密码创建cn=replication managercn=config
用户,并允许此帐户将后缀的更改复制到此主机上。
将现有服务器配置为独立服务器
.example.com
主机上:
- 与您在新 hub 服务器中运行的命令类似,加入 “准备新的 Hub 服务器以加入”一节,为 dc=example,dc=com 后缀启用复制,并创建复制管理器帐户:
# dsconf -D "cn=Directory Manager" ldap://supplier1.example.com replication \ enable --suffix="dc=example,dc=com" --role="supplier" --replica-id=1 \ --bind-dn="cn=replication manager,cn=config" --bind-passwd="password"
重要对于拓扑中的所有供应商,副本 ID 必须是 1 到 65534 之间的唯一整数。复制管理器帐户可以使用与 hub 上创建相同的 DN。 - 添加复制协议并初始化 hub。例如:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt \ create --suffix="dc=example,dc=com" --host="hub.example.com" --port=636 \ --conn-protocol=LDAPS --bind-dn="cn=replication manager,cn=config" \ --bind-passwd="password" --bind-method=SIMPLE --init \ example-agreement-supplier-to-hub
此命令创建一个名为example-agreement-supplier-to-hub
的复制协议。复制协议定义了设置,如 hub 的主机名、协议和身份验证信息,这些设置在将数据连接到 hub 时使用的供应商。创建协议后,Directory 服务器会初始化 hub。要稍后初始化 hub,请省略--init
选项。请注意,在初始化消费者前复制不会启动。有关初始化消费者的详情,请参考 第 15.8.3 节 “初始化消费者”。有关命令中使用的选项的详情,请输入:# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt --help
- 验证初始化是否成功:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt \ init-status --suffix="dc=example,dc=com" example-agreement-supplier-to-hub Agreement successfully initialized.
根据要复制的数据量,初始化可能会非常耗时。
准备新的消费者以加入
consumer.example.com
主机上:
- 安装目录服务器并创建实例。详情请查看 红帽目录服务器 安装指南。
- 如果您在没有数据库的情况下创建实例,请为后缀创建数据库。例如,要为 dc=example,dc=com 后缀创建一个名为
userRoot
的数据库:# dsconf -D "cn=Directory Manager" ldap://hub.example.com backend \ create --suffix="dc=example,dc=com" --be-name="userRoot"
有关为后缀创建数据库的详情,请参考 第 2.1.1 节 “创建后缀”。 - 为后缀启用复制并创建复制管理器帐户:
# dsconf -D "cn=Directory Manager" ldap://consumer.example.com replication \ enable --suffix="dc=example,dc=com" --role="consumer" \ --bind-dn="cn=replication manager,cn=config" --bind-passwd="password"
此命令将consumer.example.com
主机配置为 dc=example,dc=com 后缀的消费者。另外,服务器使用指定密码创建cn=replication managercn=config
用户,并允许此帐户将后缀的更改复制到此主机上。
将 Hub 配置为 Consumer 的叶
hub.example.com
主机上:
- 添加复制协议并初始化服务器。例如:
# dsconf -D "cn=Directory Manager" ldap://hub.example.com repl-agmt \ create --suffix="dc=example,dc=com" --host="consumer.example.com" --port=636 \ --conn-protocol=LDAPS --bind-dn="cn=replication manager,cn=config" \ --bind-passwd="password" --bind-method=SIMPLE --init \ example-agreement-hub-to-consumer
创建协议后,目录服务器会初始化消费者。要稍后初始化使用者,请省略--init
选项。 - 验证初始化是否成功:
# dsconf -D "cn=Directory Manager" ldap://hub.example.com repl-agmt \ init-status --suffix="dc=example,dc=com" example-agreement-hub-to-consumer Agreement successfully initialized.
根据要复制的数据量,初始化可能会非常耗时。
15.4.2. 使用 Web 控制台设置 Cascading 复制
example.com
的主机上运行现有的 Directory 服务器实例。以下流程描述了如何将名为 hub. example.com 的 hub
添加到从 dc=example,dc=com
后缀的供应商接收更新的拓扑中。因此,该流程描述了添加名为 consumer.example.com
的消费者,该消费者从 hub 服务器接收后缀的更新。
准备新的 Hub 服务器以加入
hub.example.com
主机上:
- 安装目录服务器并创建实例。详情请查看 红帽目录服务器 安装指南。
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 如果您在没有数据库的情况下创建实例,请为后缀创建数据库。有关为后缀创建数据库的详情,请参考 第 2.1.1 节 “创建后缀”。
- 为后缀启用复制:
- 打开菜单。
- 选择 dc=example,dc=com 后缀,再点 。
- 在 Replication Role 字段中选择 Hub,并输入要创建的复制管理器帐户的 DN 和密码。例如:这些设置将
hub.example.com
主机配置为 dc=example,dc=com 后缀的中心。另外,服务器使用指定密码创建cn=replication managercn=config
用户,并允许此帐户将后缀的更改复制到此主机上。 - 点。
将现有服务器配置为独立服务器
.example.com
主机上:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 与新 hub 服务器上的设置加入 “准备新的 Hub 服务器以加入”一节 类似,为 dc=example,dc=com 后缀启用复制,并创建一个复制管理器帐户:
- 打开菜单。
- 选择 dc=example,dc=com 后缀,再点 。
- 在 Replication Role 字段中选择 Supplier,输入副本 ID,以及要创建的复制管理器帐户的 DN 和密码。例如:重要对于拓扑中的所有供应商,副本 ID 必须是 1 到 65534 之间的唯一整数。复制管理器帐户可以使用与 hub 上创建相同的 DN。
- 点。
- 添加复制协议并初始化 hub:
- 打开菜单,然后选择后缀。
- 在选项卡中,点 ,并填写字段。例如:这些设置会创建一个名为
example-agreement-supplier-to-hub
的复制协议。复制协议定义了设置,如 hub 的主机名、协议和身份验证信息,供应商在将数据连接到 hub 时使用。 - 在 Consumer Initialization 字段中选择 Do Online Initialization,以在保存协议后自动初始化消费者。要稍后初始化 hub,请选择 Do Not Initialize。请注意,在初始化消费者前复制不会启动。有关初始化消费者的详情,请参考 第 15.8.3 节 “初始化消费者”。
- 点。
- 验证初始化是否成功:
- 打开菜单。
- 选择条目。如果初始化成功完成,Web 控制台会在 Last Update Status 列中显示 Error (0) Replica obtained: Incremental update successful 信息。根据要复制的数据量,初始化可能会非常耗时。
将新消费者配置为加入
consumer.example.com
主机上:
- 安装目录服务器并创建实例。详情请查看 红帽目录服务器 安装指南。
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 如果您在没有数据库的情况下创建实例,请为后缀创建数据库。有关为后缀创建数据库的详情,请参考 第 2.1.1 节 “创建后缀”。
- 为后缀启用复制:
- 打开菜单。
- 选择 dc=example,dc=com 后缀,再点 。
- 在 Replication Role 字段中选择 Consumer,并输入要创建的复制管理器帐户的 DN 和密码。例如:这些设置将
consumer.example.com
主机配置为 dc=example,dc=com 后缀的消费者。另外,服务器使用指定密码创建cn=replication managercn=config
用户,并允许此帐户将后缀的更改复制到此主机上。 - 点。
将 Hub 配置为 Consumer 的叶
consumer.example.com
主机上:
- 添加复制协议并初始化消费者:
- 打开菜单,然后选择后缀。
- 在选项卡中,点 ,并填写字段。例如:这些设置会创建一个名为
example-agreement-hub-to-consumer
的复制协议。 - 在 Consumer Initialization 字段中选择 Do Online Initialization,以在保存协议后自动初始化消费者。要稍后初始化消费者,请选择 Do Not Initialize。请注意,在初始化消费者前复制不会启动。有关初始化消费者的详情,请参考 第 15.8.3 节 “初始化消费者”。
- 点。
- 验证初始化是否成功:
- 打开菜单。
- 选择条目。如果初始化成功完成,Web 控制台会在 Last Update Status 列中显示 Error (0) Replica obtained: Incremental update successful 信息。根据要复制的数据量,初始化可能会非常耗时。
15.5. 配置 Bootstrap 凭证
- 在在线初始化过程中,您必须在数据库初始化前对副本进行身份验证
- 当您使用 GSSAPI 作为身份验证方法并更改 Kerberos 凭证时
- LDAP_INVALID_CREDENTIALS (err=49)
- LDAP_INAPPROPRIATE_AUTH (err=48)
- LDAP_NO_SUCH_OBJECT (err=32)
流程
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt create ... --bootstrap-bind-dn "bind_DN" --bootstrap-bind-passwd "password" --bootstrap-bind-method bind_method --bootstrap-conn-protocol connection protocol ...
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt set --suffix="suffix" --bootstrap-bind-dn "bind_DN" --bootstrap-bind-passwd "password" --bootstrap-bind-method bind_method --bootstrap-conn-protocol connection protocol agreement_name
15.6. 配置复制合作伙伴以使用基于证书的身份验证
server2.example.com
的新服务器添加到复制协议中,以及如何使用基于证书的身份验证在新主机和现有 server1.example.com
之间设置复制协议:
- 在两个主机上,设置基于证书的身份验证。详情请查看 第 9.9.1 节 “设置基于证书的身份验证”。
- 在
server1.example.com
主机上:- 为两个服务器(如
cn=server1、example、dc=com
和cn=server2、dc=example、dc=com
)创建帐户,并将客户端证书添加到对应的帐户。详情请查看:稍后两个服务器都使用这些帐户和证书在建立复制连接时进行身份验证。 - 创建组,如
cn=repl_server,ou=Groups,dc=example,dc=com
,并添加两个服务器帐户。请参阅 第 8.1 节 “使用组”。 - 创建副本条目,并将
nsds5ReplicaBindDNGroup
属性设置为上一步中创建的组的 DN:# dsconf -D "cn=Directory Manager" ldap://server1.example.com replication \ enable --suffix="dc=example,dc=com" --role="supplier" --replica-id="7" \ --bind-group-dn="cn=repl_server,ou=Groups,dc=example,dc=com"
- 设置副本条目的间隔,Directory 服务器在其中检查组是否已更改为 0 :
# dsconf -D "cn=Directory Manager" ldap://server1.example.com replication \ set --suffix="dc=example,dc=com" --repl-bind-group-interval=0
- 初始化新的服务器:
- 在
server2.example.com
上创建临时复制管理器帐户,如cn=Replication Manager,cn=config
。 - 在
server1.example.com
上,创建一个临时复制协议,它使用上一步中的帐户进行身份验证:# dsconf -D "cn=Directory Manager" ldap://server2.example.com repl-agmt \ create --suffix="dc=example,dc=com" --host="server1.example.com" --port=636 \ --conn-protocol=LDAPS --bind-dn="cn=Replication Manager,cn=config" \ --bind-passwd="password" --bind-method=SIMPLE --init \ temporary_agreement
此协议使用之前创建的复制管理器帐户来初始化数据库。在此初始化前,server2.example.com
上的数据库为空,具有相关证书的帐户不存在。因此,在初始化数据库前无法使用证书复制。
- 初始化新的服务器后:
- 从
server1.example.com
中删除临时复制协议:# dsconf -D "cn=Directory Manager" ldap://server1.example.com repl-agmt \ delete --suffix="dc=example,dc=com" temporary_agreement
- 从
server2.example.com
中删除临时复制管理器帐户:# dsconf -D "cn=Directory Manager" ldap://server2.example.com replication \ delete-manager --suffix="dc=example,dc=com" --name="Replication Manager"
- 在使用基于证书的身份验证的两个服务器上创建复制协议:
- 在
server1.example.com
上:# dsconf -D "cn=Directory Manager" ldap://server1.example.com repl-agmt \ create --suffix="dc=example,dc=com" --host="server2.example.com" --port=636 \ --conn-protocol=LDAPS --bind-method="SSLCLIENTAUTH" \ --init example_agreement
- 在
server2.example.com
上:# dsconf -D "cn=Directory Manager" ldap://server2.example.com repl-agmt \ create --suffix="dc=example,dc=com" --host="server1.example.com" --port=636 \ --conn-protocol=LDAPS --bind-method="SSLCLIENTAUTH" \ --init example_agreement
- 要验证复制是否正常工作,请在复制协议中显示
nsds5replicaLastUpdateStatus
属性:# dsconf -D "cn=Directory Manager" ldap://server1.example.com repl-agmt status --suffix="dc=example,dc=com" example_agreement
有关可能的状态的详情,请查看 红帽目录服务器配置、命令和文件参考 中的 复制协议状态 附录。
15.7. 将 Consumer 或 Hub 提升到一个厂商
15.7.1. 使用命令行将 Consumer 或 Hub 提升到孤立
server.example.com
主机提升到 dc=example,dc=com 后缀的供应商:
# dsconf -D "cn=Directory Manager" ldap://server.example.com replication \ promote --suffix="dc=example,dc=com" --newrole="supplier" --replica-id=2
15.7.2. 使用 Web 控制台将 Consumer 或 Hub 提升到单例
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单,再选择 条目。
- 选择 dc=example,dc=com 后缀。
- 单击。
- 在 Replication Role 字段中选择 Supplier,并输入副本 ID。重要对于拓扑中的所有供应商,副本 ID 必须是 1 到 65534 之间的唯一整数。
- 选择。
- 单击以确认新角色。
15.8. 关于初始化消费者
15.8.1. 何时初始化消费者
15.8.2. 设置初始化超时
- cn=config 条目中的
nsslapd-idletimeout
配置参数为服务器上所有复制协议设置超时。例如,要全局禁用超时:# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-idletimeout=0
- 复制管理器 DN 中的
nsIdleTimeout
参数为使用此复制管理器条目的所有协议设置超时。例如,禁用cn=replication manager,cn=config
条目的超时:# ldapmodify -D "cn=Directory Manager" -w -h server.example.com -p 389 -x dn: cn=replication manager,cn=config changetype: modify add: nsIdleTimeout nsIdleTimeout: 0
15.8.3. 初始化消费者
15.8.3.1. 使用命令行初始化消费者
15.8.3.1.1. 初始化消费者在线
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt \ init --suffix="suffix" agreement_name
15.8.3.1.2. 初始化 Consumer Offline
- 在供应商中:
- 关闭供应商中的实例:
# dsctl instance_name stop
- 使用复制信息将包含要复制到
/tmp/example.ldif
文件中的后缀的用户Root
数据库导出:# dsctl instance_name db2ldif --replication userRoot /tmp/example.ldif
- 在供应商上启动实例:
# dsctl instance_name start
- 将导出的文件复制到消费者。
- 导入消费者上的数据。详情请查看 第 6.1.2.2 节 “导入服务器为 Offline 的数据”。
15.8.4. 使用 Web 控制台初始化消费者
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单,然后选择后缀。
- 在 Choose Action 菜单,然后选择 Initialize Agreement。选项卡上,打开后缀复制协议旁边的如果初始化成功完成,Web 控制台会在 Last Update Status 列中显示 Error (0) Replica obtained: Incremental update successful 信息。根据要复制的数据量,初始化可能会非常耗时。
15.9. 禁用和重新启用复制
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt disable --suffix="dc=example,dc=com" agreement_name
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt enable --suffix="dc=example,dc=com" agreement_name
15.10. 从复制拓扑中删除目录服务器实例
15.10.1. 从 Replication Topology 中删除 Consumer 或 Hub
- 如果要删除的主机是 hub,以及拓扑中其他服务器的供应商,请配置其他供应商或 hubs 以将数据复制到这些服务器。如果这些服务器没有配置其他供应商,并且删除了 hub,则这些服务器会与复制拓扑隔离。有关配置复制的详情,请参考:
- 在要删除的主机上,将数据库设置为只读模式以防止任何更新:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h host-to-remove.example.com -x dn: cn=userRoot,cn=ldbm database,cn=plugins,cn=config changetype: modify replace: nsslapd-readonly nsslapd-readonly: on
- 在所有与主机有复制协议的供应商上,删除复制协议。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt \ delete --suffix="dc=example,dc=com" agreement_name
- 在消费者或 hub 上,删除所有后缀的复制。例如:
# dsconf -D "cn=Directory Manager" ldap://host-to-remove.example.com replication \ disable --suffix="dc=example,dc=com"
禁用复制可自动删除此服务器上此后缀的所有复制协议。
15.10.2. 从复制拓扑中删除叶
- 如果要删除的副本也是拓扑中其他服务器的供应商,请配置其他供应商或 hubs 以将数据复制到这些服务器。如果这些服务器没有配置其他供应商,并且删除了供应商,则这些服务器会与复制拓扑隔离。有关配置复制的详情,请参考:
- 在要删除的供应商中:
- 将数据库设置为只读模式,以防止任何更新。详情请查看 第 2.2.2.1 节 “在只读模式下设置数据库”。
- 等待拓扑中的所有其他服务器收到此供应商中的所有数据。要验证,请确保其他服务器上的 CSN 等于或大于要删除供应商的 CSN。例如:
# ds-replcheck online -D "cn=Directory Manager" -w password -m ldap://replica-to-remove.example.com:389 -r ldap://server.example.com:389 -b dc=example,dc=com ================================================================================ Replication Synchronization Report (Tue Mar 5 09:46:20 2019) ================================================================================ Database RUV's ===================================================== Supplier RUV: {replica 1 ldap://replica-to-remove.example.com:389} 5c7e8927000100010000 5c7e89a0000100010000 {replicageneration} 5c7e8927000000010000 Replica RUV: {replica 1 ldap://replica-to-remove.example.com:389} 5c7e8927000100010000 5c7e8927000400010000 {replica 2 ldap://server.example.com:389} {replicageneration} 5c7e8927000000010000
- 显示副本 ID:
# dsconf -D "cn=Directory Manager" ldap://replica-to-remove.example.com replication get --suffix="dc=example,dc=com" | grep -i "nsds5replicaid" nsDS5ReplicaId: 1
在本例中,副本 ID 是 1。请记住此步骤的最后一步的副本 ID。
- 在所有具有与副本的复制协议的供应商上,删除复制协议。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt \ delete --suffix="dc=example,dc=com" agreement_name
- 在要删除的副本上,禁用所有后缀的复制。例如:
# dsconf -D "cn=Directory Manager" ldap://replica-to-remove.example.com replication \ disable --suffix="dc=example,dc=com"
禁用复制可自动删除此服务器上此后缀的所有复制协议。 - 在拓扑中剩余的供应商中,清理副本 ID 的 RUV。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-tasks \ cleanallruv --suffix="dc=example,dc=com" --replica-id=1
该命令需要指定此流程前面步骤中显示的副本 ID。
15.11. 管理带有过期复制的属性
memberOf
计算)的次数。
nsDS5ReplicatedAttributeList
属性中定义。此属性是复制协议的一部分,可以在 web 控制台的复制协议向导中配置,也可以在创建复制协议时通过命令行进行配置。
nsDS5ReplicatedAttributeList: (objectclass=*) $ EXCLUDE memberof authorityRevocationList accountUnlockTime
nsDS5ReplicatedAttributeList
属性的值中的 EXCLUDE 部分。如果直接编辑属性,例如使用 ldapmodify
工具,您必须将此部分与属性列表一起指定,如上例中所示。但是,dsconf
和 Web 控制台会自动添加 (objectclass= the)$ EXCLUDE 部分,您必须只指定属性。
15.11.1. 为总和增量更新设置不同的复制属性
nsDS5ReplicatedAttributeListTotal
。
nsDS5ReplicatedAttributeList
是主要部分复制属性。如果只设置了 nsDS5ReplicatedAttributeList
,则它将适用于增量更新和总更新。如果设置了 nsDS5ReplicatedAttributeList
和 nsDS5ReplicatedAttributeListTotal
,则 nsDS5ReplicatedAttributeList
仅适用于增量更新。
memberOf
属性添加到条目时,都会运行 memberOf 修复任务来解决组成员资格。如果每次进行复制时都运行该任务,这可能会导致服务器开销。由于数据库的总更新仅针对被新添加到复制或长时间离线的数据库发生,因此在整个更新是一个可接受的选项后运行 memberOf 修复任务。在这种情况下,nsDS5ReplicatedAttributeList
属性列出了 memberOf
,因此它不包括在增量更新中,但 nsDS5ReplicatedAttributeListTotal
不会列出 memberOf
,使其包含在总更新中。
nsDS5ReplicatedAttributeList
属性中设置。例如:
nsds5replicatedattributelist: (objectclass=*) $ EXCLUDE authorityRevocationList accountUnlockTime memberof
nsDS5ReplicatedAttributeList
属性,请使用 dsconf repl-agmt set 命令。例如:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt set \ --suffix="suffix" --frac-list="authorityRevocationList accountUnlockTime memberof" \ agreement_name
nsDS5ReplicatedAttributeList
是唯一属性集,则该列表适用于增量和总更新。要为总更新设置单独的列表,请将 nsDS5ReplicatedAttributeListTotal
属性添加到复制协议中:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt set \ --suffix="suffix" --frac-list-total="accountUnlockTime" \ agreement_name
nsDS5ReplicatedAttributeList
属性,然后才能为总更新设置 nsDS5ReplicatedAttributeListTotal
。
15.11.2. Replication Keep-alive Entry
keepalivetimestamp
属性会在供应商上更新并复制到消费者。因为 keepalivetimestamp
属性没有包括在复制中,所以会复制 keep-alive 条目的更新,所以消费者上的 CSN 会被更新,然后等于供应商上的 CSN。下次供应商连接到消费者时,只会搜索比消费者上的 CSN 更新。这可减少供应商搜索要发送的新更新所需的时间。
# ldapsearch -D "cn=Directory Manager" -b "dc=example,dc=com" -W -p 389 -h server.example.com -x 'objectClass=ldapsubentry' dn: cn=repl keep alive 1,dc=example,dc=com objectclass: top objectclass: ldapsubentry objectclass: extensibleObject cn: repl keep alive 1 keepalivetimestamp: 20181112150654Z
- 当部分复制协议跳过超过 100 个更新时,在结束复制会话前不会发送任何更新。
- 当供应商初始化消费者时,最初它会创建自己的 keep-alive 条目。也是供应商的消费者不会创建自己的 keep-alive 条目,除非它也初始化另一个消费者。
15.11.3. 防止 "Empty" 更新进行复制
nsDS5ReplicatedAttributeList
)。但是,对 exclude 属性的更改仍然会触发修改事件并生成空的复制更新。
nsds5ReplicaStripAttrs
属性添加一个无法在空复制事件中发送的属性列表,并从更新序列中分离。这个逻辑上包括操作特定点,如 修饰符名称
。
accountUnlockTime
属性被排除。John Smith 的用户帐户被锁定,然后过期时间,并自动解锁。只有 accountUnlockTime
属性已更改,且该属性不包括在复制中。但是,操作属性 internalmodifytimestamp
也 改变。触发复制事件,因为 John Smith 的用户帐户被修改 - 但是唯一要发送的数据是新的修改时间戳,否则更新是 emtpy。如果有大量与登录时间或密码过期时间相关的属性(例如,这可能会造成大量空复制更新,这会影响服务器性能或对关联的应用程序有影响。
nsds5ReplicaStripAttrs
属性,以帮助调整部分复制行为:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com repl-agmt set \ --suffix="suffix" \ --strip-list="modifiersname modifytimestamp internalmodifiersname" \ agreement_name
15.12. 使用复制管理已删除条目
nsDS5ReplicaTombstonePurgeInterval
属性;清除会删除旧的 tombstone 条目。在给定时间内保存 tombstone 条目(在 nsDS5ReplicaPurgeDelay
属性中设置);当 tombstone 条目早于延迟周期后,它会在下一次清除作业处获取。
- 清除操作非常耗时,特别是当服务器处理大量删除操作时。不要设置清除间隔太低,或者可能会消耗太多的服务器资源并影响性能。
- 供应商使用更改信息(包括 tombstone 条目)在初始化后进行主复制。应有足够的更改来有效地重新初始化消费者,并解决复制冲突。不要设置清除延迟(tombstone 条目的年龄)太低,或者可能会丢失解决复制冲突所需的信息。设置清除延迟,使其比复制拓扑中复制的最大调度稍长。例如,如果复制间隔最多为 24 小时,则大约 25 小时保留 tombstone 条目。这样可确保有足够的更改历史记录来初始化消费者,并防止不同供应商中存储的数据分离。
--repl-tombstone-purge-interval=seconds选项会
设置 nsDS5ReplicaTombstonePurgeInterval
属性和 --repl-purge-delay=秒
选项,s nsDS5ReplicaPurgeDelay
属性。
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com replication set \ --repl-tombstone-purge-interval=43200 --repl-purge-delay=90000
nsDS5ReplicaTombstonePurgeInterval
和 nsDS5ReplicaPurgeDelay
属性设置一个非常小的值。两个属性都有设置的值(以秒为单位),因此几乎可以立即启动清除操作。
15.13. 配置更改日志加密
先决条件
流程
- 除了您要启用 changelog 加密的服务器外,请输入以下命令停止复制拓扑中的所有实例:
# dsctl instance_name stop
- 在您要启用 changelog 加密的服务器中:
- 将更改日志(如 /tmp/changelog.ldif 文件)导出到
/tmp/changelog.ldif
文件中:# dsconf -D "cn=Directory Manager" ldap://server.example.com replication dump-changelog -o /tmp/changelog.ldif
- 停止实例:
# dsctl instance_name stop
- 在
/etc/dirsrv/slapd-instance_name/dse.ldif
文件中的 dn: cn=changelog5,cn=config 条目中添加以下设置:nsslapd-encryptionalgorithm: AES
- 启动实例:
# dsctl instance_name start
- 从
/tmp/changelog.ldif
文件中导入更改日志:# dsconf -D "cn=Directory Manager" ldap://server.example.com replication restore-changelog from-ldif /tmp/changelog.ldif
- 使用以下命令,启动复制拓扑中的其他服务器中的所有实例:
# dsctl instance_name start
验证
- 在 LDAP 目录中进行更改,如更新条目。
- 停止实例:
# dsctl stop instance_name
- 输入以下命令显示 changelog 的部分内容:
# dbscan -f /var/lib/dirsrv/slapd-instance_name/changelogdb/replica_name_replGen.db | tail -50
如果更改日志加密,您只会看到加密的数据。 - 启动实例:
# dsctl start instance_name
其它资源
15.14. 删除更改日志
15.14.1. 使用命令行删除更改日志
- 验证是否为所有后缀禁用复制:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com replication list There are no replicated suffixes
- 删除更改日志:
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com replication delete-changelog
15.14.2. 使用 Web 控制台删除更改日志
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单,然后选择 条目。
- 单击。
15.15. 导出复制更改日志
先决条件
- 在 Directory 服务器实例上启用复制。
流程
/tmp/changelog.ldif
文件,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com replication dump-changelog -o /tmp/changelog.ldif
dirsrv
用户需要适当的文件系统权限来创建指定的文件。
15.16. 从 LDIF 格式的 Changelog 转储导入复制更改日志
先决条件
- 在 Directory 服务器实例上启用复制。
- changelog 转储已创建,如 第 15.15 节 “导出复制更改日志” 所述。
流程
/tmp/changelog.ldif
文件中导入 changelog 转储,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com replication restore-changelog from-ldif /tmp/changelog.ldif
dirsrv
用户需要读取指定的文件的权限。
15.17. 移动复制更改日志目录
/var/lib/dirsrv/slapd-instance_name/new_changelogdb/
:
- 显示到更改日志的当前路径并设置新路径:
- 使用命令行:
- 显示当前目录:
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -x \ -b "cn=changelog5,cn=config" nsslapd-changelogdir ... nsslapd-changelogdir: /var/lib/dirsrv/slapd-instance_name/changelogdb/
稍后的步骤中需要显示的路径来移动目录。 - 设置新路径:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=changelog5,cn=config changetype: modify replace: nsslapd-changelogdir nsslapd-changelogdir: /var/lib/dirsrv/slapd-instance_name/new_changelogdb/
- 使用 Web 控制台:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单,然后选择 条目。
- 单击 Show Advanced Settings。
- 在 Changelog Location 字段中识别当前路径。稍后的步骤中需要显示的路径来移动目录。
- 在 Changelog Location 字段中设置新路径。
- 点击。
- 停止 Directory 服务器实例:
# dsctl instance_name stop
- 将之前目录的内容移到
/var/lib/dirsrv/slapd-instance_name/new_changelogdb/
中:# mv /var/lib/dirsrv/slapd-instance_name/changelogdb/ \ /var/lib/dirsrv/slapd-instance_name/new_changelogdb/
- 删除上一个目录:
# rm /var/lib/dirsrv/slapd-instance_name/changelogdb/
- 启动 Directory 服务器实例:
# dsctl instance_name start
15.18. 修剪 Replication Changelog
nsslapd-changelogmaxage
参数中更改日志中的最大年龄。nsslapd-changelogmaxentries
参数中更改日志中的记录总数。
nsslapd-changelogtrim-interval
)。
15.18.1. 配置复制更改
nsDS5ReplicaPurgeDelay
参数中设置的复制清除延迟匹配。
- 配置更改日志修剪:
- 要设置 changelog 条目的最大年龄,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com replication set-changelog --max-age "4w"
此命令将最长期限设置为 4 周。参数支持以下单元:- s (S)
- M (S) 分钟
- H (H) (小时)
- d (D) 表示天
- W (W) 周
- 要设置最大条目数,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com replication set-changelog --max-entries "100000"
此命令将 changelog 中条目的最大数量设置为 100,000。
- 默认情况下,Directory 服务器每 5 分钟(300 秒)修剪更改日志。要设置不同的间隔,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com replication set-changelog --trim-interval 600
此命令将间隔设置为 10 分钟(600 秒)。
15.18.2. 手动缩小大型更改日志的大小
先决条件
流程
- 可选:显示 changelog 的大小:
# ls -lh /var/lib/dirsrv/slapd-instance_name/changelogdb/ total 159M rw------. 1 dirsrv dirsrv 159M Nov 21 04:01 a1cf5703-697a11ed-896ed7a0-04f329b5_637b3daf000000010000.db rw------. 1 dirsrv dirsrv 30 Nov 21 03:58 DBVERSION
本例显示 /var/lib/dirsrv/slapd-instance_name/changelogdb/ 目录仅包含 159M 的 changelog 文件。 - 要在缩小 changelog 大小后重置参数,请显示并记录对应参数的当前值:
# dsconf instance_name replication get-changelog dn: cn=changelog5,cn=config cn: changelog5 nsslapd-changelogdir: /var/lib/dirsrv/slapd-instance_name/changelogdb/ nsslapd-changelogmaxage: 7d nsslapd-changelogtrim-interval: 300 objectClass: top objectClass: nsChangelogConfig
如果在输出中没有看到任何特定属性,Directory 服务器将使用它们的默认值。 - 临时减少与修剪相关的参数:
# dsconf -D "cn=Directory Manager" ldap://server.example.com replication set-changelog --max-age "300s" --max-entries 500 --trim-interval 60
重要出于性能原因,请不要永久使用较短的间隔设置。 - 等待
--trim-interval
参数中设置的时间过期。 - 紧凑更改日志以重新拥有磁盘空间:
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend compact-db --only-changelog
- 在临时减少它们前,将 changelog 参数重置为它们的值:
# dsconf -D "cn=Directory Manager" ldap://server.example.com replication set-changelog --max-age "7d" --max-entries 0 --trim-interval 300
验证
- 显示 changelog 的大小:
# ls -lh /var/lib/dirsrv/slapd-instance_name/changelogdb/ total 14M rw------. 1 dirsrv dirsrv 14M Nov 21 05:08 a1cf5703-697a11ed-896ed7a0-04f329b5_637b3daf000000010000.db rw------. 1 dirsrv dirsrv 30 Nov 21 05:01 DBVERSION
15.19. 强制复制更新
先决条件
- 复制被设置。
- 消费者已初始化。
流程
- 检查复制协议是否配置了更新计划:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt get --suffix="dc=example,dc=com" agreement_name
如果命令的输出包含 nsDS5ReplicaUpdateSchedule: * 或nsDS5ReplicaUpdateSchedule
参数不存在,则不会配置更新计划。如果nsDS5ReplicaUpdateSchedule
包含计划,如下所示,请注意值:nsDS5ReplicaUpdateSchedule: 0800-2200 0246
- 如果配置了更新调度,请输入以下命令临时禁用它:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt set --schedule \* --suffix="dc=example,dc=com" agreement_name
- 临时禁用复制协议:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt disable --suffix="dc=example,dc=com" agreement_name
- 重新启用复制协议来强制进行复制更新:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt enable --suffix="dc=example,dc=com" agreement_name
- 如果在此流程开始时配置了复制调度,请将调度设置为先前的值:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt set --schedule "0800-2200 0246" --suffix="dc=example,dc=com" agreement_name
15.20. 设置复制超时周期
nsDS5ReplicaTimeout
设置复制操作在超时和失败前等待消费者的响应的秒数。要设置最佳数量,请检查访问日志来查看复制过程的平均时间,并相应地设置超时时间。nsDS5DebugReplicaTimeout
在启用调试日志时设置复制操作的超时时间。此设置可能比nsDS5ReplicaTimeout
设置更小,因为调试日志可能会减慢目录操作的速度。此属性可以选择设置应用此参数的错误日志级别;默认值为复制调试(8192)。
# ldapmodify -D "cn=Directory Manager" -W -x dn: cn=example-agreement,cn=replica,cn=dc\3Dexample\2Cdc\3Dcom,cn=mapping tree,cn=config changetype: modify add: nsDS5ReplicaTimeout nsDS5ReplicaTimeout: 600 - add: nsDS5DebugReplicaTimeout nsDS5DebugReplicaTimeout: 6000
15.21. 使用 Retro Changelog 插件
changeLogEntry
。有关 changelog 条目中可能的属性列表,请参阅 Red Hat Directory Server 配置、命令行和文件参考中的 Changelog 属性部分。
15.21.1. 启用 Retro Changelog 插件
- 生成大量复制流量,一半是重复的更新。
- 使用与 retro changelog 修剪相关的删除操作创建错误。
- 复制性能不佳,在供应商上没有协调更新。
15.21.1.1. 使用命令行启用 Retro Changelog 插件
- 使用
dsconf
工具启用插件:# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin retro-changelog enable
- 重启实例:
# dsctl instance_name restart
15.21.1.2. 使用 Web 控制台启用 Retro Changelog 插件
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 选择菜单。
- 在左侧的列表中选择 Retro Changelog 插件。
- 将状态更改为 On。
- 单击。
- 重启实例。请参阅 第 1.5.2 节 “使用 Web 控制台启动和停止目录服务器实例”。
15.21.2. 修剪 Retro Changelog
nsslapd-changelogmaxage
参数和下一次修剪间隔中设置的记录最长期限,则会在 nsslapd-changelog-trim -interval 中设置,则会自动缩小重新更改日志
的大小。
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin retro-changelog set --max-age="2d"
15.21.3. 搜索和修改 Retro Changelog
15.21.4. 重新引入更改日志和访问控制策略
cn=changelog
条目的 aci
属性。例如,如果要向所有授权用户 授予读取、搜索 和比较 权限,请将以下 ACI 添加到 cn=changelog
:
dn: cn=changelog
aci: (targetattr="changeNumber || objectClass")(targetfilter="(objectClass=changelogentry)")
(version 3.0; acl "Enable authenticated users to read the retro changelog"; allow (read, search, compare)
(userdn="ldap:///all");)
ci
属性时,请不要向匿名用户(userdn=anyone
)授予读取权限,因为更改日志条目可以包含敏感信息,如密码。您必须只允许经过身份验证的用户和用户(userdn=all
)访问此信息。
15.22. 显示特定复制协议的状态
15.22.1. 使用命令行显示特定复制协议的状态
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-agmt status --suffix="dc=example,dc=com" agreement_name agreement_name Status for agreement_name agmt consumer.example.com:636 Replica Enabled: on Update In Progress: FALSE Last Update Start: 19700101000000Z Last Update End: 19700101000000Z Number Of Changes Sent: 0 Number Of Changes Skipped: None Last Update Status: Error (-1) Problem connecting to replica - LDAP error: Can't contact LDAP server (connection error) Init In Progress: Last Init Start: 19700101000000Z Last Init End: 19700101000000Z Last Init Status: unavailable Reap Active: 0 Replication Status: Not in Synchronization: supplier (5bed8467000100010000) consumer (Unavailable) Reason(Unknown) Replication Lag Time: Unavailable
consumer.example.com
主机不可用。
15.22.2. 使用 Web 控制台显示特定复制协议的状态
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单,然后选择
- 从左侧窗格中的列表中选择 Replication 条目。
- 根据您要显示目录服务器实例或 Winsync 协议之间的复制协议状态,请选择适当的选项卡。Update Status 列显示复制协议的状态。
15.23. 监控复制拓扑
# dsconf -D "cn=Directory Manager" ldap://supplier.example.com replication monitor Enter password for cn=Directory Manager on ldap://supplier.example.com: password Enter a bind DN for consumer.example.com:389: cn=Directory Manager Enter a password for cn=Directory Manager on consumer.example.com:389: password Supplier: server.example.com:389 -------------------------------- Replica Root: dc=example,dc=com Replica ID: 1 Replica Status: Available Max CSN: 5e3acb77001d00010000 Status For Agreement: "example-agreement" (consumer.example.com:389) Replica Enabled: on Update In Progress: FALSE Last Update Start: 20200205140439Z Last Update End: 20200205140440Z Number Of Changes Sent: 1:166/0 Number Of Changes Skipped: None Last Update Status: Error (0) Replica acquired successfully: Incremental update succeeded Last Init Start: 20200205133709Z Last Init End: 20200205133711Z Last Init Status: Error (0) Total update succeeded Reap Active: 0 Replication Status: In Synchronization Replication Lag Time: 00:00:00 Supplier: consumer.example.com:389 ----------------------------------- Replica Root: dc=example,dc=com Replica ID: 65535 Replica Status: Available Max CSN: 00000000000000000000
15.23.1. 在 .dsrc 文件中为 Replication Monitoring 设置凭证
~/.dsrc
文件中的拓扑中的每个服务器设置绑定 DN 和可选密码。
例 15.1. 带有不同字段解释的 .dsrc 文件示例
~/.dsrc
文件示例:
[repl-monitor-connections] connection1 = server1.example.com:389:cn=Directory Manager:* connection2 = server2.example.com:389:cn=Directory Manager:[~/pwd.txt] connection3 = hub1.example.com:389:cn=Directory Manager:S3cret
connection1
连接 connection3
作为每个条目的密钥。但是,只要它是唯一的,就可以使用任何密钥。
dsconf
实用程序会连接到实例复制协议中配置的所有服务器。如果实用程序在 ~/.dsrc
中找到主机名,它将使用定义的凭证向远程服务器进行身份验证。在上例中,dsconf
在连接到服务器时使用以下凭证:
主机名 | 绑定 DN | 密码 |
---|---|---|
server1.example.com | cn=Directory Manager | 密码 |
server2.example.com | cn=Directory Manager | 从 ~/pwd.txt 读取密码 |
hub1.example.com | cn=Directory Manager | S3cret |
15.23.2. 在 Replication Topology 监控输出中使用 Aliases
- 在
~/.dsrc
文件中定义别名:[repl-monitor-aliases] M1 = server1.example.com:389 M2 = server2.example.com:389
- 通过将
-a alias=host_name:port
参数传给 dsconf 复制监控器命令来定义 别名:# dsconf -D "cn=Directory Manager" ldap://server.example.com replication monitor -a M1=server1.example.com:389 M2=server2.example.com:389
... Supplier: M1 (server1.example.com:389) ... Supplier: M2 (server2.example.com:389) ...
15.24. 比较两个目录服务器实例
ds-replcheck
工具允许您比较两个在线服务器。或者,ds-replcheck
可以在离线模式下比较两个 LDIF 格式的文件,并在在线模式下比较两个服务器。
-l time_in_seconds
参数传给 ds-replcheck
。默认情况下,这个值被设置为 300 秒(5 分钟)。如果实用程序检测到在滞后时间内不一致,则不会报告它。这有助于减少假的正状态。
ds-replcheck
会报告这些属性的不同。要忽略这些属性,请将 -i attribute_list
参数传给实用程序。
dc=example,dc=com
后缀:
# ds-replcheck -D "cn=Directory Manager" -W \ -m ldap://server1.example.com:389 \ -r ldap://server2.example.com:389 \ -b "dc=example,dc=com"
- 数据库 RUV
- 列出数据库的复制更新向量(RUV),包括最小和最大更改序列号(CSN)。例如:
Supplier RUV: {replica 1 ldap://server1.example.com:389} 58e53b92000200010000 58e6ab46000000010000 {replica 2 ldap://server2.example.com:389} 58e53baa000000020000 58e69d7e000000020000 {replicageneration} 58e53b7a000000010000 Replica RUV: {replica 1 ldap://server1.example.com:389} 58e53ba1000000010000 58e6ab46000000010000 {replica 2 ldap://server2.example.com:389} 58e53baa000000020000 58e7e8a3000000020000 {replicageneration} 58e53b7a000000010000
- 条目数
- 显示两个服务器上的条目总数,包括 tombstone 条目。例如:
Supplier: 12 Replica: 10
- tombstones
- 显示每个副本上的 tombstone 条目数。这些条目添加到总条目数中。例如:
Supplier: 4 Replica: 2
- 冲突条目
- 列出每个冲突条目的可辨识名称(DN)、冲突类型及其创建日期。例如:
Supplier Conflict Entries: 1 - nsuniqueid=48177227-2ab611e7-afcb801a-ecef6d49+uid=user1,dc=example,dc=com - Conflict: namingConflict (add) uid=user1,dc=example,dc=com - Glue entry: no - Created: Wed Apr 26 20:27:40 2017 Replica Conflict Entries: 1 - nsuniqueid=48177227-2ab611e7-afcb801a-ecef6d49+uid=user1,dc=example,dc=com - Conflict: namingConflict (add) uid=user1,dc=example,dc=com - Glue entry: no - Created: Wed Apr 26 20:27:40 2017
- 缺少条目
- 列出每个缺少的条目的 DN,以及条目所在的其他服务器的创建日期。例如:
Entries missing on Supplier: - uid=user2,dc=example,dc=com (Created on Replica at: Wed Apr 12 14:43:24 2017) - uid=user3,dc=example,dc=com (Created on Replica at: Wed Apr 12 14:43:24 2017) Entries missing on Replica: - uid=user4,dc=example,dc=com (Created on Supplier at: Wed Apr 12 14:43:24 2017)
- 条目事件
- 列出包含与其他服务器上不同的属性的条目的 DN。如果状态信息可用,则也会显示它。如果没有属性的状态信息可用,它将列为原始值。这意味着值没有更新,因为第一次初始化了复制。例如:
cn=group1,dc=example,dc=com --------------------------- Replica missing attribute "objectclass": - Supplier's State Info: objectClass;vucsn-58e53baa000000020000: top - Date: Wed Apr 5 14:47:06 2017 - Supplier's State Info: objectClass;vucsn-58e53baa000000020000: groupofuniquenames - Date: Wed Apr 5 14:47:06 2017
15.25. 常见复制冲突
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-conflict list dc=example,dc=com
15.25.1. 命名冲突
nsuniqueid
操作属性中的唯一标识符。当发生命名冲突时,这个唯一 ID 会附加到非唯一的 DN 中。
- uid=user_name,ou=People,dc=example,dc=com
- nsuniqueid=66446001-1dd211b2+uid=user_name,ou=People,dc=example,dc=com
- 要只保留有效的条目(uid=user_name,ou=People,dc=example,dc=com)并删除冲突条目,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-conflict delete nsuniqueid=66446001-1dd211b2+uid=user_name,ou=People,dc=example,dc=com
- 要只保留冲突条目(nsuniqueid=66446001-1dd211b2+uid=user_name,ou=People,dc=example,dc=com),请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-conflict swap nsuniqueid=66446001-1dd211b2+uid=user_name,ou=People,dc=example,dc=com
- 要保留这两个条目,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-conflict convert --new-rdn=uid=user_name_NEW nsuniqueid=66446001-1dd211b2+uid=user_name,ou=People,dc=example,dc=com
要保留冲突条目,您必须在--new-rdn
选项指定一个新的 Relative Distinguished Name (RDN)来重命名冲突条目。上一命令将冲突条目重命名为 uid=user_name_NEW,ou=People,dc=example,dc=com。
15.25.2. Orphan Entry Conflicts
- 如果冲突解析流程发现带有匹配唯一标识符的已删除条目,glue 条目是该条目的重新发送,添加了 glue 对象类和
nsds5ReplConflict
属性。在这种情况下,修改 glue 条目以删除 glue 对象类和nsds5ReplConflict
属性,以将条目保留为正常条目或删除 glue 条目及其子条目。 - 服务器使用 glue 和 Scalable Object 对象类创建一个最小的条目。
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-conflict list-glue suffix
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-conflict delete-glue DN_of_glue_entry
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-conflict convert-glue DN_of_glue_entry
15.25.3. 解决 Obsolete 或 Missing Suppliers 的错误
[22/Jan/2021:17:16:01 -0500] NSMMReplicationPlugin - ruv_compare_ruv: RUV [changelog max RUV] does not contain element [{replica 8 ldap://m2.example.com:389} 4aac3e59000000080000 4c6f2a02000000080000] which is present in RUV [database RUV] <...several more samples...> [22/Jan/2021:17:16:01 -0500] NSMMReplicationPlugin - replica_check_for_data_reload: Warning: for replica dc=example,dc=com there were some differences between the changelog max RUV and the database RUV. If there are obsolete elements in the database RUV, you should remove them using the CLEANALLRUV task. If they are not obsolete, you should check their status to see why there are no changes from those servers in the changelog.
8
。
cleanallruv
目录任务从拓扑中的所有供应商中删除 RUV 条目。
cleanallruv
任务被复制。因此,您只需要在一个供应商上运行它。
过程 15.1. 使用 cleanallruv 任务操作删除 Obsolete 或 Missing Supplier
- 列出所有 RUV 记录和副本 ID (有效且无效),因为删除的供应商可能在其他供应商上具有保留的元数据:
# ldapsearch -o ldif-wrap=no -xLLL -H m1.example.com -D "cn=Directory Manager" -W -b dc=example,dc=com '(&(nsuniqueid=ffffffff-ffffffff-ffffffff-ffffffff)(objectclass=nstombstone))' nsDS5ReplicaId nsDS5ReplicaType nsds50ruv dn: cn=replica,cn=dc\3Dexample\2Cdc\3Dcom,cn=mapping tree,cn=config nsDS5ReplicaId: 1 nsDS5ReplicaType: 3 nsds50ruv: {replicageneration} 55d5093a000000010000 nsds50ruv: {replica 1 ldap://m1.example.com:389} 55d57026000000010000 55d57275000000010000 nsds50ruv: {replica 20 ldap://m2.example.com:389} 55e74b8c000000140000 55e74bf7000000140000 nsds50ruv: {replica 9 ldap://m2.example.com:389} nsds50ruv: {replica 8 ldap://m2.example.com:389} 506f921f000000080000 50774211000500080000
请注意返回的副本 ID:1、
20
、9
和8
。 - 通过在
cn=config
后缀下搜索副本配置条目 DNcn=replica
,列出所有供应商的当前定义和有效的副本 ID。注意消费者和只读节点始终将副本 ID 设置为65535
,nsDS5ReplicaType: 3
表示供应商。# ldapsearch -o ldif-wrap=no -xLLL -H m1.example.com m2.example.com -D "cn=Directory Manager" -W -b cn=config cn=replica nsDS5ReplicaId nsDS5ReplicaType dn: cn=replica,cn=dc\3Dexample\2Cdc\3Dcom,cn=mapping tree,cn=config nsDS5ReplicaId: 1 nsDS5ReplicaType: 3 dn: cn=replica,cn=dc\3Dexample\2Cdc\3Dcom,cn=mapping tree,cn=config nsDS5ReplicaId: 20 nsDS5ReplicaType: 3
在搜索第一步中返回的所有 URI 后(在此流程中,m1.example.com
和m2.example.com
),比较返回的供应商列表(具有nsDS5ReplicaType: 3
)与上一步中的 RUV 列表。在上例中,此搜索仅返回 ID1
和20
,但前面的搜索也会在 URIm2.example.com
上返回9
和8
。这意味着,后者的两个被删除,需要清理其 RUV。 - 确定哪个 RUV 需要清理后,创建一个新的
cn=cleanallruv,cn=tasks,cn=config
条目,并提供有关复制配置的以下信息:- 复制数据库的基本 DN (
replica-base-dn
) - 副本 ID (
副本 ID
) - 是否要从缺少的供应商捕获到最大更改状态号(CSN),还是只删除所有 RUV 条目,并丢失任何更新(
replica-force-cleaning
);将此属性设置为no
意味着任务将等待所有配置的副本,以首先从删除的副本中获得所有更改,然后删除 RUV。
# dsconf -D "cn=Directory Manager" ldap://m2.example.com repl-tasks \ cleanallruv --suffix="dc=example,dc=com" --replica-id=8
注意cleanallruv
任务被复制。因此,您只需要在一个供应商上运行它。对您要清理的每个 RUV 重复相同的操作(此流程中的 ID9
)。 - 清理之前发现的所有副本的 RUV 后,您可以使用第一步中的搜索来验证是否删除了所有额外的 RUV:
# ldapsearch -o ldif-wrap=no -xLLL -H m1.example.com -D "cn=Directory Manager" -W -b dc=example,dc=com '(&(nsuniqueid=ffffffff-ffffffff-ffffffff-ffffffff)(objectclass=nstombstone))' nsDS5ReplicaId nsDS5ReplicaType nsds50ruv dn: cn=replica,cn=dc\3Dexample\2Cdc\3Dcom,cn=mapping tree,cn=config nsDS5ReplicaId: 1 nsDS5ReplicaType: 3 nsds50ruv: {replicageneration} 55d5093a000000010000 nsds50ruv: {replica 1 ldap://m1.example.com:389} 55d57026000000010000 55d57275000000010000 nsds50ruv: {replica 20 ldap://m2.example.com:389} 55e74b8c000000140000 55e74bf7000000140000
如以上输出中显示的那样,副本 ID8
和9
不再存在,这表示其 RUV 已被成功清理。
15.26. 对复制问题进行故障排除
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-errorlog-level=8192
第 16 章 将红帽目录服务器与 Microsoft Active Directory 同步
16.1. 关于 Windows 同步
- 目录服务器 Windows 同步.用户和组条目的同步在同步协议中配置,就像复制协议中配置复制一样。同步协议定义了同步哪些条目类型(用户、组或两者),以及哪些方向更改会被同步(从 Directory Server 到 Active Directory,从 Active Directory 到 Directory Server 或两者)。目录服务器依赖于多层复制插件来同步用户和组条目。用于多层次复制的更改也用于将更新从目录服务器发送到 Active Directory,作为 LDAP 操作。服务器还针对其 Windows 服务器执行 LDAP 搜索操作,将 Windows 条目所做的更改同步到对应的目录服务器条目。
- 密码同步服务。如果您在 cn=config 条目中将
nsslapd-unhashed-pw-switch
参数设置为 on,则目录服务器上的密码更改将自动同步到 Active Directory。但是,必须有一个特殊的 hook,才能识别并传输 Active Directory 上的密码更改。这由密码同步服务完成。此应用程序捕获 Active Directory 域控制器的密码更改,并通过 LDAPS 将它们发送到目录服务器。密码同步服务必须安装在每个 Active Directory 域控制器上。
图 16.1. Active Directory - 目录服务器同步过程
winSyncInterval
参数来更改此默认设置。使用 Dirsync 可确保仅检索自上次搜索以来更改的条目。
- 在创建同步协议时,您可以选择同步新的 Windows 条目(
nsDS7NewWinUserSyncEnabled
和nsDS7NewWinGroupSyncEnabled
),因为它们被创建。如果这些属性设置为 on,则现有的 Windows 用户/组会同步到目录服务器,并且创建它们时创建的用户/组会同步到目录服务器。在 Windows 子树中,只有具有用户或组对象类的条目才能同步到目录服务器。 - 在 Directory 服务器上,只能同步具有 ntUser 或 ntGroup 对象类和属性的条目。
图 16.2. 多层目录服务器 - Windows 域同步
16.2. 支持的 Active Directory 版本
16.3. 同步密码
- Password Sync 工具必须在 Windows 计算机上与目录服务器同步的本地安装。
- 密码同步 只能将 Windows 机器链接到单个目录服务器;若要与多个目录服务器实例同步更改,请为多层次复制配置目录服务器。
- 密码过期警告和时间、失败的绑定尝试和其他与密码相关的信息会按服务器在本地强制执行,且不会在同步对等服务器间同步。
- 在配置了与 Windows 服务器的复制协议的目录服务器实例中,将 cn=config 条目中的
nsslapd-unhashed-pw-switch
参数设置为 on。 - 所有服务器上都应该执行相同的绑定行为。确保在 Directory 服务器和 Active Directory 服务器上创建相同的或类似的密码策略。
- 为同步创建的条目(例如,服务器身份)需要有永不过期的密码。为确保这些特殊用户有没有过期的密码,请将
passwordExpirationTime
属性添加到 Directory Server 条目,并为它赋予 20380119031407Z (有效范围的顶部)。
16.4. 在 Active Directory 和 Directory 服务器之间设置同步
16.4.1. 第 1 步:在目录服务器主机上启用 TLS
16.4.2. 第 2 步:在 AD 域中启用密码复杂度
- 打开 组策略管理 控制台,并在域中创建新的组策略对象(GPO)。有关使用 组策略管理 控制台的详情,请查看 Windows 文档。
- 右键点击 GPO,然后选择 Edit 以打开 组策略管理编辑器。
- 导航到 Password 的策略必须满足复杂性要求。→ → → → ,然后双击名为
- 启用策略并点击。
- 关闭 组策略管理编辑器 和 组策略管理 控制台。
16.4.3. 第 3 步:从 AD 中提取 CA 证书
- 如果您的 AD CA 证书是自签名的:
- 在安装了 认证机构 应用程序的 AD DC 上,按 Super key+R 组合打开 Run 对话框。
- 输入 certsrv.msc 命令,然后单击 以打开 认证机构 应用程序。
- 右键点击本地证书颁发机构的名称,然后选择 Properties。
- 在 General 选项卡中,选择要在 CA 证书字段中导出的证书,然后点 。
- 在 Details 选项卡中,点 以启动 证书导出向导。
- 单击 Base-64 编码 X.509 (.CER)。,然后选择
- 为导出的文件指定合适的目录和文件名称。单击以导出证书,然后单击 。
- 将 root CA 证书复制到目录服务器主机。
- 如果您的 AD CA 证书由外部 CA 签名:
- 确定 root CA。例如:
# openssl s_client -connect adserver.example.com:636 CONNECTED(00000003) depth=1 C = US, O = Demo Company, OU = IT, CN = Demo CA-28 verify error:num=20:unable to get local issuer certificate verify return:0 --- Certificate chain 0 s:/C=US/O=Demo Company/OU=IT/CN=adserver.example.com i:/C=US/O=Demo Company/OU=IT/CN=Demo CA-1 1 s:/C=US/O=Demo Company/OU=IT/CN=Demo CA-1 i:/C=US/O=Demo Company/OU=IT/CN=Demo Root CA 2
前面的例子显示 AD 服务器的 CA 证书由CN=Demo CA-1
签名,它由CN=Demo Root CA 2
签名。这意味着CN=Demo Root CA 2
是 root CA。 - 如何检索 CA 证书,联系 root CA 的 operator。
- 将 root CA 证书复制到目录服务器主机。
16.4.4. 第 4 步:从目录服务器的 NSS 数据库中提取 CA 证书
- 列出数据库中的证书:
# certutil -d /etc/dirsrv/slapd-instance_name/ -L Certificate Nickname Trust Attributes SSL,S/MIME,JAR/XPI Server-Cert u,u,u Example CA C,,
- 从数据库中提取 CA 证书。例如,使用
Example CA
nickname 提取 CA 证书,并将其存储在/root/ds-ca.crt
文件中:# certutil -d /etc/dirsrv/slapd-instance_name/ -L -n "Example CA" -a > /root/ds-ca.crt
- 将 CA 证书复制到 AD DC。
16.4.5. 第 5 步:创建同步帐户
在目录服务器中创建帐户
Password Sync
服务中的 Directory Server 帐户将密码同步到目录服务器。例如,要在目录服务器中创建 cn=pw_sync_user,dc=config
用户:
- 创建用户帐户:
# ldapadd -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=pw_sync_user,cn=config objectClass: inetorgperson objectClass: person objectClass: top cn: pw_sync_user sn: pw_sync_user userPassword: password passwordExpirationTime: 20380101000000Z
这会创建cn=pw_sync_user,dc=config
帐户,并将其过期时间设置为 2038 年 1 月 1 日。重要为安全起见,请不要在同步子树中创建帐户。 - 在子树之上设置一个 ACI,它将同步并为
cn=pw_sync_user,dc=config
用户授予 write 和 compare 权限。例如,要将此类 ACI 添加到 ou=People,dc=example,dc=com 条目:# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=People,dc=example,dc=com changetype: modify add: aci aci: (targetattr="userPassword")(version 3.0;acl "Password synchronization"; allow (write,compare) userdn="ldap:///cn=pw_sync_user,dc=config";)
- 配置目录服务器可以在更改日志中以明文形式存储密码:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-unhashed-pw-switch=on
由于 Directory 服务器使用与 Active Directory 不同的密码加密,目录服务器必须以明文形式向 Windows 服务器发送密码。但是,明文密码通过 TLS 加密连接发送,这是密码同步所需的,因此不会向网络公开。
在 AD 中创建帐户
Domain Admins
组的成员,或者在 AD 中具有等同的权限。有关创建 AD 帐户的详情,请查看您的 AD 文档。
16.4.6. 第 6 步:安装 密码同步 服务
16.4.7. 第 7 步:将 CA 证书目录服务器添加到 密码 同步服务的证书数据库中
- 进入
C:\Program Files\Red Hat Directory Password synchronization\
目录:> cd "C:\Program Files\Red Hat Directory Password Synchronization\"
- 在当前目录中创建证书数据库:
> certutil.exe -d . -N
certutil.exe
工具提示为它创建的新数据库设置密码。 - 导入目录服务器实例使用的 CA 证书。您将此证书在 第 16.4.4 节 “第 4 步:从目录服务器的 NSS 数据库中提取 CA 证书” 中复制到 Windows DC。例如,要从
C:\ds-ca.crt
文件中导入证书,并使用Example CA
nickname 将其存储在数据库中:> certutil.exe -d . -A -n "Example CA" -t CT,, -a -i "C:\ds-ca.crt"
- (可选)验证 CA 证书是否已正确存储在数据库中:
> certutil.exe -d . -L Certificate Nickname Trust Attributes SSL,S/MIME,JAR/XPI Example CA CT,,
- 重启 Windows DC。重启系统前,密码同步 服务不可用。
16.4.8. 第 8 步:将 CA 证书 AD 用于目录服务器的证书数据库
- 导入 CA 证书 AD 使用。您将此证书在 第 16.4.3 节 “第 3 步:从 AD 中提取 CA 证书” 中复制到目录服务器主机。例如,要从
/root/ad-ca.crt
文件中导入证书,并使用Example CA
nickname 将其存储在数据库中:> certutil -d /etc/dirsrv/slapd-instance_name/ -A -n "Example CA" -t CT,, -a -i /root/ad-ca.crt
- (可选)验证 CA 证书是否已正确存储在数据库中:
> certutil -d /etc/dirsrv/slapd-instance_name/ -L Certificate Nickname Trust Attributes SSL,S/MIME,JAR/XPI ... Example CA CT,,
16.4.9. 第 9 步:配置数据库以进行同步和创建同步协议
16.4.9.1. 使用命令行配置数据库以进行同步和创建同步协议
ds.example.com
的主机上运行 Directory 服务器,并在名为 win-server.ad.example.com
的主机上运行 AD DC。以下流程描述了如何在这些主机之间配置同步:
- 为后缀启用复制:
# dsconf -D "cn=Directory Manager" ldap://ds.example.com replication \ enable --suffix="dc=example,dc=com" --role="supplier" --replica-id=1
此命令将ds.example.com
主机配置为 dc=example,dc=com 后缀的供应商,并将此条目的副本 ID 设置为 1。重要对于拓扑中的所有供应商,副本 ID 必须是 1 到 65534 之间的唯一整数。 - 添加同步协议并初始化协议。例如:
# dsconf -D "cn=Directory Manager" ldap://ds.example.com repl-winsync-agmt \ create --suffix="dc=example,dc=com" --host="win-server.ad.example.com" --port=636 \ --conn-protocol="LDAPS" --bind-dn="cn=user_name,cn=Users,dc=ad,dc=example,dc=com" \ --bind-passwd="password" --win-subtree="cn=Users,dc=example,dc=com" \ --ds-subtree="ou=People,dc=example,dc=com" --win-domain="AD" \ --init example-agreement
此命令创建一个名为 example-agreement 的复制协议。复制协议定义了设置,如 AD DC 的主机名、协议和身份验证信息,目录服务器在将数据连接到 DC 时使用。创建协议后,目录服务器会初始化协议。要稍后初始化协议,请省略--init
选项。请注意,在初始化协议前同步不会启动。有关初始化同步协议的详情,请参考 第 16.11.2.1 节 “使用命令行执行完全同步”。(可选)将--sync-users="on"
和--sync-groups="on"
选项传给命令,以自动将新的 Windows 用户和组同步到目录服务器。有关命令中使用的选项的详情,请输入:# dsconf -D "cn=Directory Manager" ldap://ds.example.com repl-agmt --help
- 验证初始化是否成功:
# dsconf -D "cn=Directory Manager" ldap://ds.example.com repl-winsync-agmt \ init-status --suffix="dc=example,dc=com" example-agreement Agreement successfully initialized.
16.4.9.2. 配置数据库以使用 Web 控制台进行同步和创建同步协议
ds.example.com
的主机上运行 Directory 服务器,并在名为 win-server.ad.example.com
的主机上运行 AD DC。以下流程描述了如何在这些主机之间配置同步:
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 为后缀启用复制:
- 打开菜单。
- 选择 dc=example,dc=com 后缀,然后单击 。
- 在 Replication Role 字段中选择 Supplier,并输入副本 ID。例如:这些设置将
ds.example.com
主机配置为 dc=example,dc=com 后缀的供应商,并将此条目的副本 ID 设置为 1。重要对于拓扑中的所有供应商,副本 ID 必须是 1 到 65534 之间的唯一整数。 - 点。
- 添加同步协议并初始化协议:
- 打开菜单并选择 条目。
- 点并填写字段。例如:这些设置将创建一个名为
example-agreement
的同步协议。同步协议定义了设置,如 DC 的主机名、协议和身份验证信息,目录服务器在连接和同步数据时使用。(可选)选择 Sync New Windows Users 和 Sync New Windows Groups,以将新的 Windows 用户和组自动同步到 Directory Server。创建协议后,目录服务器会初始化协议。要稍后初始化协议,请不要选择 Do Online Initialization。请注意,在初始化协议前同步不会启动。有关初始化同步协议的详情,请参考 第 16.11.2.2 节 “使用 Web 控制台执行完全同步”。 - 点。
- 验证初始化是否成功:
- 打开菜单。
- 选择条目。如果初始化成功完成,Web 控制台会在 Last Update Status 列中显示 Error (0) Replica obtained: Incremental update successful 信息。根据要同步的数据量,初始化最多可能需要几小时。
16.5. 同步用户
- 如果在同步协议中通过选择 Sync New Windows Users 选项,则 Active Directory 域中的用户会被同步。同步时,所有 Windows 用户都会复制到目录服务器中,然后在创建时同步新用户。
- 目录服务器用户帐户通过 Directory Server 条目中存在的特定属性与 Active Directory 同步。任何目录服务器条目都必须具有 ntUser 对象类和
ntUserCreateNewAccount
属性;ntUserCreateNewAccount
属性(即使在现有条目上)会向 Directory Server Windows 同步插件发送信号,将条目写入到 Active Directory 服务器。在下次常规更新时,会创建和修改的带有 ntUser 对象类的用户条目,并在下一次常规更新时与 Windows 机器同步,这是条目的标准轮询。
- ntUserDomainId.这与 Active Directory 条目的
sAMAccountName
属性对应。 - ntUniqueId.它包含对应 Windows 条目的
objectGUID
属性的值。此属性由同步进程设置,不应手动设置或修改。 - ntUserDeleteAccount.当 Windows 条目同步时,会自动设置此属性,但必须为 Directory Server 条目手动设置。如果
ntUserDeleteAccount
的值为 true,则当 Directory Server 条目被删除时,会删除对应的 Windows 条目。否则,该条目保留在 Active Directory 中,但如果在 Directory Server 中删除,则条目会从 Directory Server 数据库中删除。
ntUserCreateNewAccount
和 ntUserDeleteAccount
允许目录管理器精确控制同步子树中的哪些用户在 Active Directory 上同步。
16.5.1. 在 Directory 服务器和 Active Directory 之间同步的用户属性
目录服务器 | Active Directory |
---|---|
cn[a] | name |
ntUserDomainId | sAMAccountName |
ntUserHomeDir | homeDirectory |
ntUserScriptPath | scriptPath |
ntUserLastLogon | lastLogon |
ntUserLastLogoff | lastLogoff |
ntUserAcctExpires | accountExpires |
ntUserCodePage | codePage |
ntUserLogonHours | logonHours |
ntUserMaxStorage | maxStorage |
ntUserProfile | profilePath |
ntUserParms | userParameters |
ntUserWorkstations | userWorkstations |
[a]
cn 和其它同步属性不同。当从 Directory Server 同步到 Active Directory 时,它会被直接映射 (cn 到 cn )。从 Active Directory 同步到 Directory 服务器时,cn 从 Windows 上的 name 属性映射到 Directory Server 中的 cn 属性。
|
cn[a] | physicalDeliveryOfficeName |
description | postOfficeBox |
destinationIndicator | postalAddress |
facsimileTelephoneNumber | postalCode |
givenName | registeredAddress |
homePhone | sn |
homePostalAddress | st |
Initials | 法国 |
l | telephoneNumber |
teletexTerminalIdentifier | |
手机 | telexNumber |
o | title |
ou | usercertificate |
pager | x121Address |
[a]
cn 和其它同步属性不同。当从 Directory Server 同步到 Active Directory 时,它会被直接映射 (cn 到 cn )。从 Active Directory 同步到 Directory 服务器时,cn 从 Windows 上的 name 属性映射到 Directory Server 中的 cn 属性。
|
16.5.2. Red Hat Directory Server 和 Active Directory 之间的用户架构差异
16.5.2.1. cn 属性的值
cn
属性可以是多值,而在 Active Directory 中,此属性必须只有一个值。当 Directory Server cn
属性同步时,只有一个值发送到 Active Directory peer。
cn
值添加到 Active Directory 条目,且该值不是 Directory Server 中 cn
的值之一,则所有 Directory Server cn
值都会用单个 Active Directory 值覆盖。
cn
属性作为其命名属性,其中 Directory 服务器使用 uid
。这意味着,如果目录服务器中编辑 cn
属性,则可能完全重命名条目(并意外)。如果 cn
更改被写入 Active Directory 条目,则会重命名该条目,新的命名条目将写回目录服务器。
16.5.2.2. 密码策略
16.5.2.3. street 和 streetAddress 的值
streetAddress
用于用户或组的 postal 地址;这是目录服务器使用 street
属性的方式。Active Directory 和 Directory 服务器分别使用 streetAddress
和 street
属性的方式有两个重要的区别:
- 在目录服务器中,
streetAddress
是street
的别名。Active Directory 也具有street
属性,但它是一个单独的属性,可以存放独立的值,而不是streetAddress
的别名。 - Active Directory 将
streetAddress
和street
定义为单值属性,而目录服务器将street
定义为多值属性,如 RFC 4519 中指定的。
streetAddress
和 street
属性的不同方法,在活动目录和目录服务器中设置地址属性时有两个规则:
- Windows 同步将 Windows 条目中的
streetAddress
映射到目录服务器中的street
。为避免冲突,不应在 Active Directory 中使用street
属性。 - 只有一个目录服务器
street
属性值被同步到 Active Directory。如果在 Active Directory 中更改了streetAddress
属性,且 Directory 服务器中不存在新值,则目录服务器中的所有street
属性值都会被替换为新的单个 Active Directory 值。
16.5.2.4. 初始属性的限制
initials
属性,Active Directory 会实施最大长度约束为六个字符,但目录服务器没有长度限制。如果在 Directory Server 中添加大于六个字符的 initials
属性,则该值会在与 Active Directory 条目同步时进行修剪。
16.5.3. 为目录服务器用户配置用户会话
- ntUser 对象类
ntUserDomainId
属性,用于提供 Windows IDntUserCreateNewAccount
属性向同步插件发出信号,以便将目录服务器条目同步到 Active Directory
ldapmodify
工具:
dn: uid=scarter,ou=People,dc=example,dc=com changetype: modify add: objectClass objectClass:ntUser - add: ntUserDomainId ntUserDomainId: Sam Carter - add: ntUserCreateNewAccount ntUserCreateNewAccount: true - add: ntUserDeleteAccount ntUserDeleteAccount: true
16.5.4. 为活动目录用户配置用户会话
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-winsync-agmt set --sync-users="on" --suffix="dc=example,dc=com" example-agreement
--sync-users
选项设置为 off。
16.6. 同步组
- 如果在同步协议中通过选择 Sync New Windows Groups 选项,则 Active Directory 域中的组会被同步。在同步启动时,所有 Windows 组都会复制到目录服务器中,然后在创建时同步新组。
- Directory Server 组帐户通过 Directory Server 条目中存在的特定属性与 Active Directory 同步。任何目录服务器条目都必须具有 ntGroup 对象类和
ntGroupCreateNewGroup
属性;ntGroupCreateNewGroup
属性(即使在一个现有的条目中)会向目录服务器 Windows 同步发送信息,将条目写入 Active Directory 服务器。在下次常规更新时,创建并同步了 ntGroup 对象类的新或修改的组。
- 两个属性控制是否在 Active Directory、
ntGroupCreateNewGroup
和ntGroupDeleteGroup
上创建和删除 Directory Server 组。需要ntGroupCreateNewGroup
将目录服务器组同步到 Active Directory。 - ntUserDomainId 包含 Active Directory 域中条目的唯一 ID。这是 ntGroup 对象类的唯一必需属性。
- ntGroupType 是 Windows 组的类型。Windows 组类型是 global/security、domain local/security、builtin、generic/security、global/distribution、domain local/distribution 或 Universal/distribution。这为同步的 Windows 组自动设置,但必须在 Directory Server 条目上手动设置这些属性,然后才能同步。
16.6.1. 关于 Windows 组类型
-2147483646
用于全局/安全(默认)-2147483644
用于域本地/安全-2147483643
用于内置-2147483640
用于 universal/security2
代表全局/发布4
用于域本地/发布8
用于通用/发布
16.6.2. 目录服务器和 Active Directory 之间的组属性
目录服务器 | Active Directory | ||
---|---|---|---|
cn | name | ||
ntUserDomainID | name | ||
ntGroupType | groupType | ||
| 成员[a] | ||
cn | o |
description | ou |
l | seeAlso |
16.6.3. Red Hat Directory Server 和 Active Directory 之间的组架构差异
16.6.4. 为目录服务器组配置组同步
- ntGroup 对象类。
ntUserDomainId
属性,为该条目提供 Windows ID。ntGroupCreateNewGroup
属性向同步插件发出信号,以将目录服务器条目同步到 Active Directory。ntGroupDeleteGroup
属性是可选的,但如果在 Directory Server 中删除,这会设置是否从 Active Directory 域自动删除该条目。
ntGroupType
属性。如果没有指定此属性,则组会自动添加为全局安全组(ntGroupType:-2147483646)。
ldapmodify
:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=Example Group,ou=Groups,dc=example,dc=com changetype: modify add: objectClass objectClass:ntGroup - add: ntUserDomainId ntUserDomainId: example-group - add: ntGroupCreateNewGroup ntGroupCreateNewGroup: true - add: ntGroupDeleteGroup ntGroupDeleteGroup: true - add: ntGroupType ntGroupType: 2
16.6.5. 为活动目录组配置组同步
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-winsync-agmt set --sync-groups="on" --suffix="dc=example,dc=com" example-agreement
--sync-groups
选项设置为 off。
16.7. 配置 Uni-Directional 同步
oneWaySync
,启用单向同步并指定发送更改的方向。可能的值有 fromWindows
(用于 Active Directory 到目录服务器同步)和 toWindows
(目录服务器到 Active Directory 同步)。如果此属性不存在,则同步是双向的。
图 16.3. uni-Directional 同步
--one-way-sync="方向"
选项来启用单向同步:
- 如果您在 第 16.4.9 节 “第 9 步:配置数据库以进行同步和创建同步协议” 中创建新的同步协议,请将选项传递给 dsconf repl-winsync-agmt create 命令。
- 如果同步协议已存在,请更新协议。例如,将同步从 AD 设置为 Directory 服务器:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-winsync-agmt set --one-way-sync="fromWindows" --suffix="dc=example,dc=com" example-agreement
设置为 Windows
,在更新 Active Directory 服务器上的密码后,密码也会发送到目录服务器。
16.8. 在 Windows 同步中配置多个子树和过滤器
Windows 同步中的多个子树
winSyncSubtreePair
参数中配置 Directory 服务器和 Active Directory 子树。例如,要设置多个 ou=OU1、dc=DSexample、dc=com 和 ou=OU1,DC=ADexample,DC=com 子树:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-winsync-agmt set --subtree-pair="ou=OU1,dc=DSexample,dc=com:ou=OU1,DC=ADexample,DC=com" --suffix="dc=example,dc=com" example-agreement
winSyncSubtreePair
,nsds7WindowsReplicaSubtree
AD 子树参数和 nsds7DirectoryReplicaSubtree
DS 子树参数用于同步目标检查。否则,这两个参数将被忽略。
Windows 同步中的过滤器
--win-filter
在 Active Directory 服务器上设置额外的过滤器,--ds-filter
参数在 Directory Server 上设置额外的过滤器。
example_agreement
同步条目,它包含 user
和 group
属性:
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-winsync-agmt \ set --win-filter="(|(cn=*user*)(cn=*group*))" --ds-filter="(|(uid=*user*)(cn=*group*))" \ example_agreement
16.9. 为用户和组同步 POSIX 属性
ntUser
和 ntGroup
属性,以将其识别为 Windows 帐户,但没有同步 POSIX 属性(即使它们存在于 Active Directory 条目中),并且没有在 Directory Server 端添加 POSIX 属性。
uidNumber
、gidNumber
和 homeDirectory
)都会在 Active Directory 和 Directory Server 条目之间同步。但是,如果将新的 POSIX 条目或 POSIX 属性添加到目录服务器中的现有条目,则只有 POSIX 属性与 Active Directory 对应的条目同步。POSIX 对象类(posixAccount 用于用户,posixGroup 用于组)不会添加到 Active Directory 条目中。
16.9.1. 启用 POSIX 属性同步
- 启用插件:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin "cn=Posix Winsync API,cn=plugins,cn=config" enable
- 重启实例:
# dsctl instance_name restart
16.9.2. 更改 Posix 组属性同步设置
- 使用以下命令启用嵌套组映射:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin posix-winsync set --map-nested-grouping="true"
- 重新启动目录服务器以加载新配置。
# dsctl instance_name restart
16.9.3. 修复 posixGroup 条目中的 Mismatched member 和 uniqueMember Attribute 值
posixGroup
条目中的 member
和 uniqueMember
属性值不匹配,请使用 dsconf plugin posix-winsync fixup 命令来解决这个问题:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin posix-winsync fixup DN
memberUid
值,并自动修改 member
和 uniqueMember
属性值,以匹配 AD 中定义的值。
-f filter
参数传给命令,以指定命令应该修复 memberUid
属性中的条目。如果没有过滤器,命令对包含 inetuser、inetadmin 和 nsmemberof 对象类的所有条目进行操作。
16.10. 删除和重新创建条目
16.10.1. 删除条目
ntUserDeleteAccount
或 ntGroupDeleteGroup
属性设置为 true 时,才会删除 Active Directory 上的对应条目。
ntUniqueId
属性。如果在将唯一 ID 同步回目录服务器 前 在 Active Directory 上删除了 Directory Server 条目,则不会 在 Directory Server 上删除该条目。目录服务器使用 ntUniqueId
属性来识别并将 Active Directory 上所做的更改同步到对应的目录服务器条目;如果没有该属性,Directory 服务器将不会识别删除。
winSyncInterval
的长度(默认为五分钟),然后再删除它,以便同步 ntUniqueId
属性。
16.10.2. 重新创建条目
ntUniqueId
属性,该属性向 Active Directory 服务器发送信号,此新条目是一个 tombstone 条目。
16.11. 发送同步更新
winSyncInterval
设置(用于从 Active Directory 域检索更改)或 nsds5replicaupdateschedule
设置(用于从 Directory 服务器推送更改)中一样频繁进行。默认情况下,更改每五分钟从 Active Directory 检索,并且会立即发送目录服务器的更改。
16.11.1. 执行手动增量同步
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-winsync-agmt poke --suffix="dc=example,dc=com" example-agreement
16.11.2. 执行完全同步
16.11.2.1. 使用命令行执行完全同步
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-winsync-agmt init --suffix="suffix" agreement_name
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-winsync-agmt init-status --suffix="suffix" agreement_name
16.11.2.2. 使用 Web 控制台执行完全同步
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单并选择 条目。
- 打开您要同步的同步协议旁边的 Full Re-Synchronization。菜单,然后选择重新同步不会删除同步对等点上的数据。进程发送和接收所有更新,并添加任何新的或修改的目录服务器条目。例如,该过程添加了一个已存在的目录服务器用户,该用户添加了 ntUser 对象类。
- 打开菜单。
- 选择条目。如果同步成功完成,Web 控制台会在 Last Update Status 列中显示 Error (0) Replica obtained: Incremental update successful 信息。
16.11.3. 设置同步计划
nsds5replicaupdateschedule
属性,按可配置的调度(类似于复制)向 Active Directory 发送更新。目录服务器轮询 Active Directory 以检查更改; 它检查 Active Directory 服务器的频率在 winSyncInterval
属性中设置。
nsds5replicaupdateschedule
属性。使用 24 小时时钟,调度使用 start (SSSS)和结束(EEEE)时间设置 HHMM。调度同步更新的天数从 0 (Sunday)到 6 (Saturday)。
nsds5replicaupdateschedule: SSSS EEEE DDDDDDD
nsds5replicaupdateschedule: 1200 1400 0246
winSyncInterval
属性。此属性以秒为单位,因此默认 300 表示目录服务器每 300 秒或五分钟轮询 Active Directory 服务器。如果目录搜索用时过长并影响性能,则将其设置为更高的值会很有用。
winSyncInterval: 1000
16.11.4. 更改同步连接
- 绑定用户名和密码(
nsDS5ReplicaBindDN
和nsDS5ReplicaCredentials
)。 - 连接方法(
nsDS5ReplicaTransportInfo
)。只能将nsDS5ReplicaTransportInfo
从 LDAP 改为 StartTLS,反之亦然。无法更改为或从 LDAPS 更改,因为无法更改端口号,并在 LDAP 和 LDAPS 间切换需要更改端口号。
nsDS5ReplicaBindDN: cn=sync user,cn=Users,dc=ad1 nsDS5ReplicaCredentials: {DES}ffGad646dT0nnsT8nJOaMA== nsDS5ReplicaTransportInfo: StartTLS
16.11.5. 处理从同步的子树中移出的条目
samAccount
和 Directory 服务器中的 uid
属性关联。如果条目(基于 samAccount/uid
关系)从同步子树中删除,则同步插件备注,因为它已被删除或移动。这是条目不再同步的同步插件的信号。
Account
ID 为 jsmith 的用户在 Active Directory 上的 ou=Employees 子树中创建。同步子树为 ou=Users,因此 jsmith 用户永远不会与目录服务器同步。
图 16.4. Active Directory Tree
samAccount/uid
关系),是主动移到同步的子树外,本质上是一个重命名操作。然后假设应删除"corresponding"目录服务器条目。
图 16.5. Active Directory 和 Directory Server Trees 比较
winSyncMoveAction
属性设置如何处理这些移动条目的说明:
- none 不执行任何操作,因此如果同步的目录服务器条目存在,则可以将其同步到或创建 范围内的 Active Directory 条目。如果没有同步的目录服务器条目,则不会发生任何情况(这是 Directory Server 版本 9.1 及之后的版本中的默认行为)。
- Un sync 从 Directory Server 条目中删除任何与同步相关的属性(
ntUser
或ntGroup
),否则保留 Directory Server 条目。重要当取消同步 Active Directory 条目可能被删除的条目时,存在风险,并且 Directory Server 条目保持不变。这可能会造成数据不一致的问题,特别是当 Directory Server 条目用于稍后在 Active Directory 一侧重新创建条目时。 - Delete 删除 Directory 服务器端的对应条目,无论它是否与 Active Directory 同步(这是 9.0 中的默认行为)。重要您几乎不需要删除目录服务器条目,而无需删除对应的 Active Directory 条目。这个选项仅适用于与 Directory Server 9.0 系统兼容。
# dsconf -D "cn=Directory Manager" ldap://server.example.com repl-winsync-agmt --move-action="action" --suffix="suffix" agreement_name
16.12. 故障排除
启用复制日志记录以记录同步错误
错误 #1: 在同步后,状态返回错误 81。
错误 #2:条目从 Active Directory 上的一个子树移到另一个子树中,但不会移到 Directory Server 上的对应子树中。
第 17 章 使用 SyncRepl
协议设置内容同步
内容同步
插件,目录服务器会根据 RFC 4533 支持 SyncRepl
协议。此协议可让 LDAP 服务器和客户端使用 Red Hat Directory Server 作为源,将其本地数据库与目录服务器的更改内容同步。
SyncRepl
协议:
- 在目录服务器中启用
内容同步
插件,并选择性地创建新用户,客户端将用于绑定到目录服务器。帐户必须具有读取目录中内容的权限。 - 配置客户端。例如,将子树的搜索基础设置为 sync。详情请查看您的客户端文档。
17.1. 使用命令行配置内容同步
插件
内容同步
插件:
内容同步
插件需要Retro Changelog
插件来记录nsuniqueid
属性:- 要验证 retro changelog 是否已启用,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin retro-changelog show ... nsslapd-pluginEnabled: off
- 添加
nsuniqueid
属性来重新引入 changelog 插件配置:# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin retro-changelog set --attribute nsuniqueid:targetUniqueId
- 另外,还可应用以下建议来提高性能:
- 为 retro 更改日志中的条目设置最大有效期。例如,要设置 2 天(2d):
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=changelog5,cn=config changetype: modify replace: nsslapd-changelogmaxage nsslapd-changelogmaxage: 2d
- 如果您知道哪个后端或子树客户端访问来同步数据,请限制
Retro Changelog
插件的范围。例如,要排除cn=demo,dc=example,dc=com
子树,请输入:# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin retro-changelog set --exclude-suffix "cn=demo,dc=example,dc=com"
- 启用
内容同步
插件:# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin set --enabled on "Content Synchronization"
- 使用默认值,Directory 服务器会在
oid=1.3.6.1.4.1.4203.1.9.1.1,cn=features,cn=config
条目中创建访问控制指令(ACI),使所有用户能够使用SyncRepl
协议:aci: (targetattr != "aci")(version 3.0; acl "Sync Request Control"; allow( read, search ) userdn = "ldap:///all";)
(可选)更新 ACI 以使用SyncRepl
控制来限制。有关 ACI 的详情,请参考 第 18.11 节 “定义绑定规则”。 - 重启 Directory 服务器:
# dsctl instance_name restart
SyncRepl
协议将数据与目录服务器同步。
第 18 章 管理访问控制
18.1. Access Control Principles
- 对于整个目录、子树或特定条目
- 对于特定用户,属于特定组或角色的所有用户或目录中的所有用户
- 对于特定位置,如 IP 地址、IP 范围或 DNS 名称。请注意,负载均衡器可能会影响特定于位置的规则。
18.2. ACI 放置
aci
操作属性中。要设置 ACI,请将 aci
属性添加到对应的目录条目中。目录服务器应用 ACI:
- 只有包含 ACI 的条目,如果它没有任何子条目。例如,如果客户端需要访问 uid=user_name,ou=People,dc=example,dc=com 对象,并且仅在 dc=example,dc=com 上设置 ACI,而不应用于任何子条目,则只应用此 ACI。注意具有 添加权限 的 ACI 也适用于以后创建的子条目。
- 对于包含 ACI 以及下面的所有条目的条目(如果其具有子条目)。因此,当服务器评估对任何给定条目的访问权限时,它会验证请求和目录后缀之间的每个条目的 ACI,以及条目本身的 ACI。例如,在 dc=example,dc=com 和 ou=People,dc=example,dc=com 条目上设置 ACI:如果客户端想要访问 uid=user_name,ou=People,dc=example,dc=com 对象,它没有 ACI,目录服务器首先使用 dc=example,dc=com 和 ou=People,dc=example,dc=com 创建集合。目录服务器从目标条目构建适用的 ACI 底部的列表,最高到顶级后缀。但是,将此列表视为集合,客户端应用程序不应该预计 ACI 评估的任何顺序。服务器选择与资源条目匹配的 ACI,从此初始集合中创建最终适用的 ACI 集合。然后,首先评估拒绝权限的 ACI。如果成功评估了 DENY ACI,则操作会失败。如果没有找到 DENY ACI,Directory 服务器会检查是否存在授予 ALLOW 权限的 ACI。如果至少一个 ACI 允许访问,目录服务器会授予访问权限。如果没有 ACI 授予 ALLOW 权限,Directory 服务器会拒绝访问,操作会失败。
organizationalUnit
条目或 locality
条目一级创建。
18.3. ACI 结构
aci
属性使用以下语法:
(target_rule) (version 3.0; acl "ACL_name"; permission_rule bind_rules;)
target_rule
指定控制访问的条目、属性或组条目和属性。详情请查看 第 18.9 节 “定义目标”。版本 3.0
是标识 ACI 版本的必要字符串。- ACI
"ACL_name"
设置描述 ACI 的名称或字符串。 bind_rules
指定在绑定期间必须匹配的规则以允许或拒绝访问。详情请查看 第 18.11 节 “定义绑定规则”。
(target_rule)(version 3.0; acl "ACL_name"; permission_rule bind_rules; permission_rule bind_rules; ... ;)
18.4. ACI 评估
18.5. ACI 的限制
- 如果您的目录数据库通过多个服务器分发,则以下限制适用于您可在 ACI 中使用的关键字:
- ACI 取决于使用 groupdn 关键字的组条目必须位于与组条目相同的服务器上。如果组是动态的,则组的所有成员都必须在服务器上有一个条目。静态组的成员条目可以位于远程服务器上。
- ACI 取决于 roledn 关键字的角色定义,必须与角色定义条目位于同一个服务器上。每个要拥有该角色的条目也必须位于同一服务器上。
但是,您可以使用 userattr 关键字将目标条目中存储的值与存储在绑定用户条目中的值匹配。在这种情况下,即使绑定用户在服务器上没有存储 ACI 的条目,也会频繁评估访问。详情请查看 第 2.3.3 节 “数据库链接和访问控制评估”。 - 您不能在以下 ACI 关键字中使用虚拟属性,如服务类(CoS)属性:
- targetfilter
- targattrfilters
- userattr
详情请查看 第 8 章 整理和分组条目。 - 访问控制规则仅在本地服务器上评估。例如,如果您在 ACI 关键字的 LDAP URL 中指定服务器的主机名,则忽略 URL。
18.6. 目录服务器处理复制拓扑中的 ACI
条目的
ci 属性中。因此,如果包含 ACI 的条目是复制数据库的一部分,则会复制 ACI。
18.7. 使用命令行管理 ACI
18.7.1. 显示 ACI
ldapsearch
工具使用命令行显示 ACI。例如,显示 dc=example,dc=com 和子条目上设置的 ACI:
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -x \ -b "dc=example,dc=com" -s sub '(aci=*)' aci
18.7.2. 添加 ACI
ldapmodify
工具添加 ACI。例如:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=People,dc=example,dc=com changetype: modify add: aci aci: (targetattr="userPassword") (version 3.0; acl "Allow users updating their password"; allow (write) userdn= "ldap:///self";)
18.7.3. 删除 ACI
- 显示条目上设置的 ACI。请参阅 第 18.7.1 节 “显示 ACI”。
- 删除 ACI:
- 如果在条目中只设置一个
aci
属性,或者您想要从条目中删除所有 ACI:# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=People,dc=example,dc=com changetype: delete delete: aci
- 如果条目中存在多个 ACI,您想要删除特定的 ACI,请指定确切的 ACI:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=People,dc=example,dc=com changetype: modify delete: aci aci: (targetattr="userPassword") (version 3.0; acl "Allow users updating their password"; allow (write) userdn= "ldap:///self";)
18.7.4. 更新 ACI
- 删除现有的 ACI。请参阅 第 18.7.3 节 “删除 ACI”。
- 使用更新的设置添加新的 ACI。请参阅 第 18.7.2 节 “添加 ACI”。
18.8. 使用 Web 控制台管理 ACI
18.8.1. 在 LDAP 浏览器中创建访问控制指令
先决条件
- 访问 Web 控制台。
- Red Hat Directory Server 中存在父条目。
流程
- 登录 Web 控制台并点击。
- Web 控制台加载界面后,单击 。
- 选择一个 LDAP 条目并点击 Options 菜单。
- 从下拉菜单中选择 ACIs
- 要使用 LDAP 浏览器向导创建 ACI,有两个选项:
- 点使用向导创建 ACI。继续下一步。
- 单击manually,在文本字段中输入指令,然后点 。
- 按照向导中的步骤,在完成每个步骤后点按钮。
- 要创建 ACI,请查看向导生成的数据,然后点。
- 要关闭向导窗口,请点击按钮。
验证
- 验证新的 ACI 是否出现在窗口中。
18.8.2. 在 LDAP 浏览器中编辑访问控制指令
先决条件
- 访问 Web 控制台。
- Red Hat Directory Server 中存在父条目。
流程
- 登录 Web 控制台并点击。
- Web 控制台加载界面后,单击 。
- 选择一个 LDAP 条目并点击 Options 菜单。
- 从下拉菜单中选择 ACIs
- 点 Options 菜单并选择。
- 修改文本字段中的说明,然后点。
验证
- 在窗口中,展开您修改的 ACI 并观察您的更改。
18.8.3. 在 LDAP 浏览器中删除访问控制指令
先决条件
- 访问 Web 控制台。
- Red Hat Directory Server 中存在父条目。
流程
- 登录 Web 控制台并点击。
- Web 控制台加载界面后,单击 。
- 选择一个 LDAP 条目并点击 Options 菜单。
- 从下拉菜单中选择以打开 窗口。
- 点您要删除的 ACI 的 Node options 图标,然后选择。
- 选中复选框,然后单击 按钮。
验证
- 在窗口中,验证您删除的 ACI 不再出现在 ACI 列表中。
18.9. 定义目标
aci
属性和以下条目的条目。
(target_rule)(version 3.0; acl "ACL_name"; permission_rule bind_rules;)
(target_rule_1)(target_rule_2)(...)(version 3.0; acl "ACL_name"; permission_rule bind_rules;)
- target
- targetattr
- targetattrfilters
- targetfilter
- target_from
- target_to
语法
(keyword comparison_operator "expression")
- 关键字 :设置目标的类型。请参阅 第 18.9.1 节 “常用的目标关键字”。
- compare_operator: Valid 值为 = 和 !=,并且指明目标是否为表达式中指定的对象。警告出于安全考虑,红帽建议使用 != 运算符,因为它允许对所有其他条目或属性进行指定的操作。例如:
(targetattr != "userPassword");(version 3.0; acl "example"); allow (write) ... );
前面的示例允许用户在您设置 ACI 的 Distinguished Name (DN)下设置、更新或删除任何属性,但userPassword
属性除外。但是,这还可让用户添加额外的aci
属性,允许写入此属性的访问。 - 表达式 :设置目标,且必须用引号括起来。表达式本身取决于您使用的关键字。
18.9.1. 常用的目标关键字
- 目标 :请参阅 第 18.9.1.1 节 “以目录条目为目标”。
- 目标attr :请参阅 第 18.9.1.2 节 “目标属性”。
- targetfilter :请参阅 第 18.9.1.3 节 “使用 LDAP 过滤器目标条目和属性”。
- targattrfilters: 请参阅 第 18.9.1.4 节 “使用 LDAP 过滤器目标属性值”。
18.9.1.1. 以目录条目为目标
(target comparison_operator "ldap:///distinguished_name")
例 18.1. 使用 目标 关键字
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=People,dc=example,dc=com changetype: modify add: aci aci: (target = "ldap:///ou=People,dc=example,dc=com") (version 3.0; acl "Allow users to read and search attributes of own entry"; allow (search, read) (userdn = "ldap:///self");)
在 target Keyword 中使用通配符
uid
属性设为以字母 a 开头的值:
(target = "ldap:///uid=a*,ou=People,dc=example,dc=com")
例 18.2. 使用通配符以目录条目为目标
uid
属性,而不仅仅是存储在 dc=example,dc=com 条目本身中的条目:
(target = "ldap:///uid=user_name*,dc=example,dc=com")
- uid=user_name,dc=example,dc=com
- uid=user_name,ou=People,dc=example,dc=com
- uid=user_name2,dc=example,dc=com
18.9.1.2. 目标属性
- 在读取操作中,哪些属性将返回到客户端
- 在搜索操作中,将搜索哪些属性
- 在写入操作中,可以将哪些属性写入对象
- 在 add 操作中,创建新对象时可以添加哪些属性
(targetattr comparison_operator "attribute_1 || attribute_2 || ...")
例 18.3. 使用 targetattr Keyword
userPassword
属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: dc=example,dc=com changetype: modify add: aci aci: (targetattr = "userPassword") (version 3.0; acl "Allow users updating own userPassword"; allow (write) (userdn = "ldap:///self");)
将通配符 与目标attr Keyword 搭配使用
(targetattr = "*")
18.9.1.3. 使用 LDAP 过滤器目标条目和属性
(targetfilter comparison_operator "LDAP_filter")
例 18.4. 使用 targetfilter 关键字
department
属性设置为 Engineering 或 Sales 的所有条目:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: dc=example,dc=com changetype: modify add: aci aci: (targetfilter = "(|(department=Engineering)(department=Sales)") (version 3.0; acl "Allow HR updating engineering and sales entries"; allow (write) (groupdn = "ldap:///cn=Human Resources,dc=example,dc.com");)
使用带有 targetfilter 关键字的通配符
uid
属性为目标:
(targetfilter = "(uid=adm*) ...)
18.9.1.4. 使用 LDAP 过滤器目标属性值
- 对于一个带有一个属性和过滤组合的操作:
(targattrfilters="operation=attribute:filter")
- 对于具有多个属性和过滤组合的一个操作:
(targattrfilters="operation=attribute_1:filter_1 && attribute_2:filter_2 ... && attribute_m:filter_m")
- 对于两个操作,每个操作都有多个属性和过滤组合:
(targattrfilters="operation_1=attribute_1_1:filter_1_1 && attribute_1_2:filter_1_2 ... && attribute_1_m:filter_1_m , operation_2=attribute_2_1:filter_2_1 && attribute_2_2:filter_2_2 ... & attribute_2_n:filter_2_n ")
- 在创建条目和过滤器应用到新条目中的属性时,该属性的每个实例必须与过滤器匹配。
- 删除条目和过滤器应用到条目中的属性时,该属性的每个实例也必须与过滤器匹配。
- 修改条目和操作会添加一个属性,则应用到该属性的 add 过滤器必须匹配。
- 如果操作删除了属性,则应用到该属性的 del 过滤器必须匹配。如果条目中已存在的属性的单个值被替换,则 add 和 del 过滤器必须都匹配。
例 18.5. 使用 targattrfilters Keyword
telephone
属性,只要值以 123 前缀开头:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: dc=example,dc=com changetype: modify add: aci aci: (targattrfilters="add=nsroledn:(!(nsroledn=cn=Admin)) && telephoneNumber:(telephoneNumber=123*)") (version 3.0; acl "Allow adding roles and telephone"; allow (add) (userdn = "ldap:///self");)
18.9.2. 更多目标关键字
18.9.2.1. 目标源和目标 DN
- 将条目从 ACI 中设置的不同源移动。
- 将条目移到 ACI 中设置的不同目的地。
- 从源 DN 中删除现有条目:
- 将新条目添加到目标 DN。
例 18.6. 使用 target_from 和 target_to Keywords
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: dc=example,dc=com changetype: modify add: aci aci: (target_from="ldap:///uid=*,cn=staging,dc=example,dc=com") (target_to="ldap:///cn=People,dc=example,dc=com") (version 3.0; acl "MODDN from"; allow (moddn)) userdn="ldap:///uid=user,dc=example,dc=com";)
18.9.3. 目标规则的高级用法
18.9.3.1. 委派创建和维护组的权限
例 18.7. 委派创建和维护组的权限
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: dc=example,dc=com changetype: modify add: aci aci: (target = "ldap:///cn=*,ou=Groups,dc=example,dc=com") (targattrfilters="add=objectclass:(|(objectclas=top)(objectclass=groupOfUniqueNames))) (targetattr="cn || uniqueMember || objectClass") (version 3.0; acl "example"; allow (read, search, write, add) (userdn = "ldap:///uid=test,ou=People,dc=example,dc=com");)
- 可以创建必须包含 top 和 groupOfUniqueNames 对象类的对象。
- 无法添加额外的对象类,如 帐户。例如,这可以防止使用 Directory 服务器帐户进行本地身份验证,为
root
用户创建具有无效用户 ID 的新用户,如 0。
18.9.3.2. 定位条目和属性
例 18.8. 定位条目和属性
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: dc=example,dc=com changetype: modify add: aci aci: (target="ldap:///cn=*,dc=example,dc=com")(targetattr="member" || "cn") (version 3.0; acl "Allow uid=user to search and read members of groups"; allow (read, search) (userdn = "ldap:///uid=user,ou=People,dc=example,dc.com");)
18.9.3.3. 目标与过滤器匹配的条目属性
例 18.9. 目标与过滤器匹配的条目属性
department
属性设置为 Engineering 的所有条目的 jpegPhoto
和 manager
属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: dc=example,dc=com changetype: modify add: aci aci: (targetattr = "jpegPhoto || manager") (targetfilter = "(department=Engineering)") (version 3.0; acl "Allow engineering admins updating jpegPhoto and manager of department members"; allow (write) (groupdn = "ldap:///cn=Engineering Admins,dc=example,dc.com");)
18.9.3.4. 以单个目录条目为目标
例 18.10. 以单个目录条目为目标
ou
和 cn
属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=Engineering,dc=example,dc=com changetype: modify add: aci aci: (targetattr = "ou || cn") (targetfilter = "(ou=Engineering)") (version 3.0; acl "Allow uid=user to search and read engineering attributes"; allow (read, search) (userdn = "ldap:///uid=user,ou=People,dc=example,dc.com");)
ou
属性设置为 Engineering。
18.10. 定义权限
(target_rule) (version 3.0; acl "ACL_name"; permission_rule bind_rules;)
语法
permission (rights)
- 权限 :如果 ACI 允许或拒绝权限,则设置。
- 权限 :设置 ACI 允许或拒绝的权限。请参阅 第 18.10.1 节 “用户权限”。
例 18.11. 定义权限
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (target = "ldap:///ou=People,dc=example,dc=com") (version 3.0;
acl "Allow users to read and search attributes of own entry"; allow (search, read)
(userdn = "ldap:///self");)
18.10.1. 用户权限
right | 描述 |
---|---|
读取 | 设置用户是否可以读取目录数据。此权限只适用于 LDAP 中的搜索操作。 |
write | 通过添加、修改或删除属性来设置用户是否可以修改条目。此权限适用于 LDAP 中的 modify 和 modrdn 操作。 |
add | 设置用户可以创建条目。此权限只适用于 LDAP 中的 add 操作。 |
delete | 设置用户是否可以删除条目。此权限只适用于 LDAP 中的 delete 操作。 |
search | 设置用户可以搜索目录数据。要查看作为搜索结果的一部分返回的数据,分配 search 和 read 权限。此权限只适用于 LDAP 中的搜索操作。 |
compare | 设置用户是否可以将其提供的数据与目录中存储的数据进行比较。通过 比较 权限,目录会返回成功或失败消息以响应查询,但用户无法看到 entry 或 属性的值。此权限仅适用于 LDAP 中的比较操作。 |
selfwrite | 设置用户是否可以从组添加或删除自己的 DN。这个右边仅用于组管理。 |
proxy |
设置指定的 DN 是否可以使用另一个条目的权限访问目标。代理右侧的代理 在 ACL 范围内被授予,作为正确授予的用户或组可以作为任何目录服务器用户运行命令。您不能将代理权限限制为某些用户。
为安全起见,设置 ACI,它在目录的最目标级别设置 proxy 权限。
|
all | 设置除 代理外的所有权限。 |
18.10.2. LDAP 操作所需的权限
- 添加一个条目:
- 授予对 要添加的 条目的添加权限。
- 授予条目中每个属性值 的写入权限。默认情况下会授予此右边,但可使用 targattrfilters 关键字进行限制。
- 删除条目:
- 授予对 您要删除的 条目的删除权限。
- 授予条目中每个属性值 的写入权限。默认情况下会授予此右边,但可使用 targattrfilters 关键字进行限制。
- 修改条目中的属性:
- 授予属性类型 的写入权限。
- 授予每个属性类型值 的写入权限。默认情况下会授予此右边,但可使用 targattrfilters 关键字进行限制。
- 修改条目的 RDN:
- 授予条目 的写入权限。
- 授予新 RDN 中使用的属性类型 的写入权限。
- 如果要授予删除旧 RDN 的权利,授予旧 RDN 中使用的属性类型 的写入权限。
- 授予新 RDN 中使用的属性值 的写入权限。默认情况下会授予此右边,但可使用 targattrfilters 关键字进行限制。
- 比较属性值:
- 授予属性类型 的比较 权限。
- 搜索条目:
- 授予搜索过滤器中使用的每个属性类型 的搜索 权限。
- 授予对条目中使用的属性类型 的读取权限。
18.10.3. 访问控制和 modrdn 操作
cn
属性的条目:
ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: dc=example,dc=com changetype: modify add: aci aci: (target="ldap:///cn=*,ou=people,dc=example,dc=com") (version 3.0; acl "Deny modrdn rights to the example group"; deny(write) groupdn="ldap:///cn=example,ou=groups,dc=example,dc=com";)
18.11. 定义绑定规则
- dns
- 组成员资格或分配的角色
- 条目必须绑定的位置
- 在绑定过程中必须使用的身份验证类型
- 绑定发生的时间或天数
(target_rule) (version 3.0; acl "ACL_name"; permission_rule bind_rules;)
语法
keyword comparison_operator "expression"
- 关键字 :设置绑定操作的类型。请参阅 第 18.11.1 节 “常用的绑定规则”。
- compare_operator: Valid 值为 = 和 !=,并且指明目标是否为表达式中指定的对象。如果关键字支持其他比较运算符,则会在对应的部分中提到。
- 表达式 :设置表达式,且必须用引号括起来。表达式本身取决于您使用的关键字。
18.11.1. 常用的绑定规则
- 用户DN :请参阅 第 18.11.1.1 节 “定义基于用户的访问权限”。
- groupdn :请参阅 第 18.11.1.2 节 “定义基于组的访问”。
18.11.1.1. 定义基于用户的访问权限
userdn comparison_operator "ldap:///distinguished_name || ldap:///distinguished_name || ..."
- LDAP 过滤器:请参阅 第 18.11.1.1.2 节 “使用带有 LDAP 过滤器的 userdn Keyword”。
- 任何人 别名:请参阅 第 18.11.1.1.3 节 “授予匿名访问权限”。
- 所有 别名: 请参阅 第 18.11.1.1.4 节 “授予对经过身份验证的用户的访问权限”。
- 自助服务 : 请参阅 第 18.11.1.1.5 节 “启用用户访问您自己的条目”。
- 父 别名: 请参阅 第 18.11.1.1.6 节 “为用户的 Child 条目设置访问权限”。
18.11.1.1.1. 使用带有 userdn Keyword 的 DN
userdn comparison_operator ldap:///distinguished_name
例 18.12. 使用带有 userdn Keyword 的 DN
管理器
属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=People,dc=example,dc=com changetype: modify add: aci aci: (targetattr="manager") (version 3.0; acl "Allow uid=admin reading manager attribute"; allow (search, read) userdn = "ldap:///uid=admin,ou=People,dc=example,dc=com";)
18.11.1.1.2. 使用带有 LDAP 过滤器的 userdn Keyword
userdn comparison_operator "ldap:///distinguished_name??scope?(filter)"
例 18.13. 使用带有 LDAP 过滤器的 userdn Keyword
department
的属性被设置为 Human Resources,以便可以更新 ou=People,dc=example,dc=com 条目中的用户的 homePostalAddress
属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=People,dc=example,dc=com changetype: modify add: aci aci: (targetattr="homePostalAddress") (version 3.0; acl "Allow HR setting homePostalAddress"; allow (write) userdn = "ldap:///ou=People,dc=example,dc=com??sub?(department=Human Resources)";)
18.11.1.1.3. 授予匿名访问权限
- 没有绑定 DN 和密码
- 有效的绑定 DN 和密码
userdn comparison_operator "ldap:///anyone"
例 18.14. 授予匿名访问权限
sn
, givenName
, 和 telephoneNumber
属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=People,dc=example,dc=com changetype: modify add: aci aci: (targetattr="sn" || targetattr="givenName" || targetattr = "telephoneNumber") (version 3.0; acl "Anonymous read, search for names and phone numbers"; allow (read, search) userdn = "ldap:///anyone";)
18.11.1.1.4. 授予对经过身份验证的用户的访问权限
userdn comparison_operator "ldap:///all"
例 18.15. 授予对经过身份验证的用户的访问权限
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=example,ou=Groups,dc=example,dc=com changetype: modify add: aci aci: (targetattr="member") (version 3.0; acl "Allow users to add/remove themselves from example group"; allow (selfwrite) userdn = "ldap:///all";)
18.11.1.1.5. 启用用户访问您自己的条目
userdn comparison_operator "ldap:///self"
例 18.16. 启用用户访问您自己的条目
userPassword
属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=People,dc=example,dc=com changetype: modify add: aci aci: (targetattr="userPassword") (version 3.0; acl "Allow users updating their password"; allow (write) userdn = "ldap:///self";)
18.11.1.1.6. 为用户的 Child 条目设置访问权限
userdn comparison_operator "ldap:///parent"
例 18.17. 为用户的 Child 条目设置访问权限
manager
属性,如 cn=example,cn=user,ou=People,dc=example,dc=com :
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=user,ou=People,dc=example,dc=com changetype: modify add: aci aci: (targetattr="manager") (version 3.0; acl "Allow cn=user to update manager attributes"; allow (write) userdn = "ldap:///parent";)
18.11.1.2. 定义基于组的访问
成员
uniqueMember
memberURL
memberCertificateDescription
groupdn comparison_operator "ldap:///distinguished_name || ldap:///distinguished_name || ..."
- LDAP 过滤器。请参阅 第 18.11.1.2.2 节 “使用带有 LDAP 过滤器的 groupdn Keyword”。
18.11.1.2.1. 使用带有 groupdn Keyword 的 DN
groupdn comparison_operator ldap:///distinguished_name
例 18.18. 使用带有 groupdn Keyword 的 DN
manager
属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=People,dc=example,dc=com changetype: modify add: aci aci: (targetattr="manager") (version 3.0; acl "Allow example group to read manager attribute"; allow (search, read) groupdn = "ldap:///cn=example,ou=Groups,dc=example,dc=com";)
18.11.1.2.2. 使用带有 LDAP 过滤器的 groupdn Keyword
groupdn comparison_operator "ldap:///distinguished_name??scope?(filter)"
例 18.19. 使用带有 LDAP 过滤器的 groupdn Keyword
manager
属性设置为 example,请更新 ou=People,dc=example,dc=com 中的条目的 homePostalAddress
:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=People,dc=example,dc=com changetype: modify add: aci aci: (targetattr="homePostalAddress") (version 3.0; acl "Allow manager=example setting homePostalAddress"; allow (write) userdn = "ldap:///dc=example,dc=com??sub?(manager=example)";)
18.11.2. 进一步绑定规则
18.11.2.1. 根据匹配值定义访问
userattr comparison_operator "attribute_name#bind_type_or_attribute_value
18.11.2.1.1. 使用 USERDN 绑定类型
userattr comparison_operator "attribute_name#USERDN"
例 18.20. 使用 USERDN 绑定类型
telephoneNumber
属性的所有权限:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=People,dc=example,dc=com changetype: modify add: aci aci: (targetattr = "telephoneNumber") (version 3.0; acl "Manager: telephoneNumber"; allow (all) userattr = "manager#USERDN";)
manager
属性中的 DN,则前面的 ACI 被评估为 true。
18.11.2.1.2. 使用 GROUPDN 绑定类型
userattr comparison_operator "attribute_name#GROUPDN"
例 18.21. 使用 GROUPDN 绑定类型
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=Social Committee,ou=Groups,dc=example,dc=com changetype: modify add: aci aci: (target="ou=Social Committee,ou=Groups,dc=example,dc=com) (targattrfilters="del=objectClass:(objectClass=groupOfNames)") (version 3.0; acl "Delete Group"; allow (delete) userattr = "owner#GROUPDN";)
owner
属性中指定的组的成员,则前面的 ACI 会被评估为 true。
userattr comparison_operator "ldap:///distinguished_name?attribute_name#GROUPDN"
18.11.2.1.3. 使用 ROLEDN 绑定类型
userattr comparison_operator "attribute_name#ROLEDN"
例 18.22. 使用 ROLEDN 绑定类型
cn=Administrators,dc=example,dc=com
角色的用户,以搜索和读取 ou=People,dc=example,dc=com 中的条目的 管理器
属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=People,dc=example,dc=com changetype: modify add: aci aci: (version 3.0; acl "Allow example role owners to read manager attribute"; allow (search, read) userattr = manager#ROLEDN;)
18.11.2.1.4. 使用 SELFDN 绑定类型
userattr comparison_operator "attribute_name#SELFDN"
例 18.23. 使用 SELFDN 绑定类型
ipatokenOwner
属性中设置了绑定用户的 DN:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=otp,dc=example,dc=com changetype: modify add: aci aci: (target = "ldap:///ipatokenuniqueid=*,cn=otp,dc=example,dc=com") (targetfilter = "(objectClass=ipaToken)")(version 3.0; acl "token-add-delete"; allow (add) userattr = "ipatokenOwner#SELFDN";)
18.11.2.1.5. 使用 LDAPURL 绑定类型
userattr comparison_operator "attribute_name#LDAPURL"
例 18.24. 使用 LDAPURL 绑定类型
aciurl
属性设置为 ldap:///ou=People,dc=example,dc=com???one? (uid=userö):
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=People,dc=example,dc=com changetype: modify add: aci aci: (targetattr = "*") (version 3.0; acl "Allow read,search "; allow (read,search) (userattr = "aciurl#LDAPURL);)
18.11.2.1.6. 使用带有 Inheritance 的用户attr Keyword
userattr comparison_operator "parent[inheritance_level].attribute_name#bind_type_or_attribute_value
- inheritance_level: Comma 分隔列表,用于指示目标下面多少级别继承 ACI。您可以在目标条目下面包括五个级别(0、1、2、3、4)。零(0)表示目标条目。
- attribute_name :以 userattr 或 groupattr 关键字为目标的属性。
- bind_type_or_attribute_value :设置属性值或绑定类型,如 USERDN。
userattr = "parent[0,1].manager#USERDN"
例 18.25. 使用带有 Inheritance 的用户attr Keyword
owner
属性中设置,以及包含 cn=mail,cn=Profiles,dc=com 和 cn= news,cn=Profiles,dc=com 的第一个子条目级别:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=Profiles,dc=example,dc=com changetype: modify add: aci aci: (targetattr="*") (version 3.0; acl "Profile access", allow (read,search) userattr="parent[0,1].owner#USERDN" ;)
18.11.2.2. 定义从特定 IP 地址或范围的访问
ip comparison_operator "IP_address_or_range"
例 18.26. 在绑定规则中使用 IPv4 地址范围
192.0.2.0/24
网络访问 dc=example,dc=com 条目:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: dc=example,dc=com changetype: modify add: aci aci: (targetattr = "*") (version 3.0;acl "Deny 192.0.2.0/24"; deny (all) (userdn = "ldap:///anyone") and (ip != "192.0.2.");)
例 18.27. 在绑定规则中使用 IPv6 地址范围
2001:db8::/64
网络访问 dc=example,dc=com 条目:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: dc=example,dc=com changetype: modify add: aci aci: (targetattr = "*") (version 3.0;acl "Deny 2001:db8::/64"; deny (all) (userdn = "ldap:///anyone") and (ip != "2001:db8::");)
18.11.2.3. 定义从特定主机或域的访问
dns comparison_operator "host_name_or_domain_name"
例 18.28. 定义来自特定主机的访问
client.example.com
主机访问 dc=example,dc=com 条目:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: dc=example,dc=com changetype: modify add: aci aci: (targetattr = "*") (version 3.0;acl "Deny client.example.com"; deny (all) (userdn = "ldap:///anyone") and (dns != "client.example.com");)
例 18.29. 定义从特定域的访问
example.com
域中的所有主机访问 dc=example,dc=com 条目:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: dc=example,dc=com changetype: modify add: aci aci: (targetattr = "*") (version 3.0;acl "Deny example.com"; deny (all) (userdn = "ldap:///anyone") and (dns != "*.example.com");)
18.11.2.4. 连接中需要级别安全性
ssf comparison_operator key_strength
- = (等于)
- ! (不等于)
- & lt; (小于)
- > (greater than)
- <= (不小于或等于)
- >=(greater or equal)
例 18.30. 连接中需要级别安全性
userPassword
属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: dc=example,dc=com changetype: modify add: aci aci: (targetattr = "userPassword") (version 3.0; acl "Allow users updating own userPassword"; allow (write) (userdn = "ldap:///self") and (ssf >= "128");)
18.11.2.5. 在星期的特定天定义访问权限
dayofweek comparison_operator "comma-separated_list_of_days"
例 18.31. 在星期的特定天数授予访问权限
uid=用户,ou=People,dc=example,dc=com
用户条目的访问,以便在 Saturdays 和 Sundays 上绑定到服务器:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=People,dc=example,dc=com changetype: modify add: aci aci: (version 3.0; acl "Deny access on Saturdays and Sundays"; deny (all) (userdn = "ldap:///uid=user,ou=People,dc=example,dc=com") and (dayofweek = "Sun,Sat");)
18.11.2.6. 在一天的特定时间定义访问权限
timeofday comparison_operator "time"
- = (等于)
- ! (不等于)
- & lt; (小于)
- > (greater than)
- <= (不小于或等于)
- >=(greater or equal)
例 18.32. 在一天的特定时间定义访问
uid=用户,ou=People,dc=example,dc=com
用户条目的访问,以便在 6pm 到 0am 之间绑定到服务器:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=People,dc=example,dc=com changetype: modify add: aci aci: (version 3.0; acl "Deny access between 6pm and 0am"; deny (all) (userdn = "ldap:///uid=user,ou=People,dc=example,dc=com") and (timeofday >= "1800" and timeofday < "2400");)
18.11.2.7. 根据身份验证方法定义访问
authmethod comparison_operator "authentication_method"
- 无 :不需要身份验证,并代表匿名访问。这是默认值。
- simple :客户端必须提供要绑定到目录的用户名和密码。
- SSL :客户端必须使用数据库、智能卡或其他设备中的 TLS 证书绑定到目录。有关基于证书的身份验证的详情,请参考 第 9.9 节 “使用基于证书的客户端身份验证”。
- SASL :客户端必须通过简单身份验证和安全层(SASL)连接绑定到目录。当您在绑定规则中使用此验证方法时,还要指定 SASL 机制,如 EXTERNAL。
例 18.33. 仅使用 EXTERNAL SASL 身份验证方法为连接启用访问
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=People,dc=example,dc=com changetype: modify add: aci aci: (version 3.0; acl "Deny all access without certificate"; deny (all) (authmethod = "none" or authmethod = "simple");)
18.11.2.8. 根据角色定义访问权限
roledn comparison_operator "ldap:///distinguished_name || ldap:///distinguished_name || ..."
例 18.34. 根据角色定义访问权限
nsRole
属性中设置的 cn=Human Resources,ou=People,dc=example,dc=com 角色的用户,以搜索并读取 ou=People,dc=example,dc=com 中的条目的 管理器
属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=People,dc=example,dc=com changetype: modify add: aci aci: (targetattr="manager") (version 3.0; acl "Allow manager role to update manager attribute"; allow (search, read) roledn = "ldap:///cn=Human Resources,ou=People,dc=example,dc=com";)
18.11.3. 使用布尔值 Operator 组合绑定规则
bind_rule_1 boolean_operator bind_rule_2...
例 18.35. 使用布尔值 Operator 组合绑定规则
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: ou=People,dc=example,dc=com changetype: modify add: aci aci: (target="ldap:///ou=People,dc=example,dc=com") (version 3.0; acl "Allow members of administrators and operators group to manage users"; allow (read, search, add, write, delete) groupdn = "ldap:///cn=Administrators,ou=Groups,dc=example,com" AND groupdn = "ldap:///cn=Operators,ou=Groups,dc=example,com";)
目录服务器评估布尔值 Operator
- 从左到右的所有表达式。在以下示例中,bind_rule_1 会被首先评估:
(bind_rule_1) OR (bind_rule_2)
- 从内部到最接近的表达式。在以下示例中,bind_rule_2 会被首先评估,bind_rule_3 秒:
(bind_rule_1) OR ((bind_rule_2) AND (bind_rule_3))
- 不在 AND 或 OR 运算符之前。在以下示例中,bind_rule_2 会被首先评估:
(bind_rule_1) AND NOT (bind_rule_2)
AND 和 OR 运算符没有优先级顺序。
18.12. 检查条目上的访问权限(受影响的右边)
- 管理员可以使用 get valid rights 命令更好地组织目录的访问控制指令。经常需要限制一组用户可以查看或编辑另一个组。例如,QA Managers 组的成员可能有权限搜索并读
manager
和salary
等属性,当只有 HR Group 的成员有权限修改或删除它们。检查用户或组的有效权限是验证是否有适当的访问控制。 - 用户可以运行 get valid rights 命令,以查看自己可在其个人条目上查看或修改哪些属性。例如,用户应该有权访问
homePostalAddress
和cn
等属性,但只能对manager
和salary
属性具有读取访问权限。
18.12.1. 带有 Get Effective rights Search 的权利显示
entryLevelRights: vadn attributeLevelRights: givenName:rscWO, sn:rscW, objectClass:rsc, uid:rsc, cn:rscW
权限 | 描述 |
---|---|
a | 添加一个条目。 |
d | 删除此条目。 |
n | 重命名 DN。 |
v | 查看条目。 |
权限 | 描述 |
---|---|
r | 读。 |
s | 搜索。 |
w | 写(mod-add)。 |
o | Obliterate(mod-del).与删除类似。 |
c | 比较。 |
W | 自我写入。 |
O | 自我删除。 |
18.12.2. Get Effectives Search 的格式
-E
选项定义 GER 参数,以使用 ldapsearch 命令传递 LDAP 控制。(如果在没有 -E
选项的情况下运行 ldapsearch,则自然地返回该条目,则不会获得有效的权限信息。)
# ldapsearch -x -D bind_dn -W -p server_port -h server_hostname -E [!]1.3.6.1.4.1.42.2.27.9.5.2=:GER_subject (searchFilter) attributeList
-b
是用于搜索 GER 主题的子树或条目的基本 DN。如果搜索基础是特定的条目 DN,或者只返回一个条目,则结果会显示请求者超过该特定条目的权限。如果搜索 base 下的多个条目与过滤器匹配,则搜索会返回每个匹配条目,并且请求者授予每个条目的权限。- 1.3.6.1.4.1.42.2.27.9.5.2 是 get valid 权限控制的 OID。
- 感叹号(!)指定搜索操作是否应该返回错误,如果服务器不支持此控制(!),或者是否应该忽略它,并使搜索返回正常(无解)。
- GER_subject 是正在检查其权限的用户。如果 GER_subject 留空(dn:),则返回匿名用户的权限。
- 可选的 attributeList 将 get 有效权限结果限制为指定的属性或对象类。与常规 ldapsearch 一样,这可以提供特定的属性,如
邮件
。如果没有列出属性,则返回该条目的每个存在属性。使用星号 (*) 返回条目的每个可能属性的权利,包括现有属性和非不存在的属性。使用加号(+)返回条目的操作属性。检查特定属性权限的示例在 第 18.12.3.2 节 “为非独占属性搜索 Effective rights 的示例” 和 第 18.12.3.3 节 “针对特定属性或对象类搜索受影响的示例” 中给出。
-E
)对搜索的目标必须的权限(-b
)。get valid rights search 是一个常规 ldapsearch,它只是查找与搜索参数匹配的条目并返回其信息。get valid rights 选项在这些搜索结果中添加额外的信息,显示特定用户对这些结果具有哪些权限。该 GER 主题用户可以是请求者自己(-D
与 -E
)或其他人相同。
- 用户 A 检查他具有其他目录条目的权限。
- 用户 A 检查其个人条目的权利。
- 用户 A 检查用户 B 必须具有 User A 条目的权利。
18.12.3. GER 搜索示例
18.12.3.1. 检查访问右边的常规示例
-D
和 -E
选项都给出其条目作为请求者。由于他正在检查其个人条目,-b
选项还包含其 DN。
例 18.36. 检查个人右边(用户 A 到用户 A)
# ldapsearch -x -p 389 -h server.example.com -D "uid=tmorris,ou=people,dc=example,dc=com" -W -b "uid=tmorris,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=tmorris,ou=people,dc=example,dc=com' "(objectClass=*)" dn: uid=tmorris,ou=People,dc=example,dc=com givenName: Ted sn: Morris ou: IT ou: People l: Santa Clara manager: uid=jsmith,ou=People,dc=example,dc=com roomNumber: 4117 mail: tmorris@example.com facsimileTelephoneNumber: +1 408 555 5409 objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson uid: tmorris cn: Ted Morris userPassword: {SSHA}bz0uCmHZM5b357zwrCUCJs1IOHtMD6yqPyhxBA==entryLevelRights:
vattributeLevelRights:
givenName:rsc, sn:rsc, ou:rsc, l:rsc, manager:rsc, roomNumber:rscwo, mail:rscwo, facsimileTelephoneNumber:rscwo, objectClass:rsc, uid:rsc, cn:rsc, userPassword:wo
-D
)会检查其权利(-E
)到 Dave Miller 条目(-b
):
例 18.37. 通过另一个用户单独检查一个用户的权利(用户 A 到用户 B)
# ldapsearch -p 389 -h server.example.com -D "uid=tmorris,ou=people,dc=example,dc=com" -W -b "uid=dmiller,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=tmorris,ou=people,dc=example,dc=com' "(objectClass=*)" dn: uid=dmiller,ou=People,dc=example,dc=com ... entryLevelRights: vad attributeLevelRights: givenName:rscwo, sn:rscwo, ou:rscwo, l:rscwo, manager:rsc, roomNumber:rscwo, mail:rscwo, facsimileTelephoneNumber:rscwo, objectClass:rscwo, uid:rscwo, cn:rscwo, userPassword:rswo
-E
)已超过了其子级,Ted Morris (-b
):
例 18.38. Directory Manager 的检查一个用户超过另一个用户(用户 A 到用户 B)
# ldapsearch -p 389 -h server.example.com -D "cn=Directory Manager" -W -b "uid=tmorris,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=jsmith,ou=people,dc=example,dc=com' "(objectClass=*)" dn: uid=tmorris,ou=People,dc=example,dc=com ... entryLevelRights: vadn attributeLevelRights: givenName:rscwo, sn:rscwo, ou:rscwo, l:rscwo, manager:rscwo, roomNumber:rscwo, mail:rscwo, facsimileTelephoneNumber:rscwo, objectClass:rscwo, uid:rscwo, cn:rscwo, userPassword:rscwo
# ldapsearch -p 389 -h server.example.com -D "uid=dmiller,ou=people,dc=example,dc=com" -W -b "uid=tmorris,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=tmorris,ou=people,dc=example,dc=com' "(objectClass=*)" ldap_search: Insufficient access ldap_search: additional info: get-effective-rights: requester has no g permission on the entry
例 18.39. 检查一些个人条目是否拥有权利
# ldapsearch -p 389 -h server.example.com -D "uid=tmorris,ou=people,dc=example,dc=com" -W -b "uid=tmorris,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=dmiller,ou=people,dc=example,dc=com' "(objectClass=*)" dn: uid=tmorris,ou=people,dc=example,dc=com ... entryLevelRights: v attributeLevelRights: givenName:rsc, sn:rsc, ou:rsc, l:rsc,manager:rsc, roomNumber:rsc, mail:rsc, facsimileTelephoneNumber:rsc, objectClass:rsc, uid:rsc, cn:rsc, userPassword:none
ou
、giveName
、l
和其他属性以及没有对 userPassword
属性的权利。
18.12.3.2. 为非独占属性搜索 Effective rights 的示例
userPassword
值,则对上述条目的任何有效权限搜索将不会返回 userPassword
的任何有效权限,即使可以允许自写和自我删除权限。
例 18.40. 非独占属性的返回影响右边
# ldapsearch -D "cn=Directory Manager" -W -b "uid=scarter,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" "*"
dn: uid=scarter,ou=People,dc=example,dc=com
givenName: Sam
telephoneNumber: +1 408 555 4798
sn: Carter
ou: Accounting
ou: People
l: Sunnyvale
manager: uid=dmiller,ou=People,dc=example,dc=com
roomNumber: 4612
mail: scarter@example.com
facsimileTelephoneNumber: +1 408 555 9700
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
uid: scarter
cn: Sam Carter
userPassword: {SSHA}Xd9Jt8g1UsHC8enNDrEmxj3iJPKQLItlDYdD9A==
entryLevelRights: vadn
attributeLevelRights: objectClass:rscwo, aci:rscwo, sn:rscwo, cn:rscwo, description:rscwo, seeAlso:rscwo, telephoneNumber:rscwo, userPassword:rscwo, destinationIndicator:rscwo, facsimileTelephoneNumber:rscwo, internationaliSDNNumber:rscwo, l:rscwo, ou:rscwo, physicalDeliveryOfficeName:rscwo, postOfficeBox:rscwo, postalAddress:rscwo, postalCode:rscwo, preferredDeliveryMethod:rscwo, registeredAddress:rscwo, st:rscwo, street:rscwo, teletexTerminalIdentifier:rscwo, telexNumber:rscwo, title:rscwo, x121Address:rscwo, audio:rscwo, businessCategory:rscwo, carLicense:rscwo, departmentNumber:rscwo, displayName:rscwo, employeeType:rscwo, employeeNumber:rscwo, givenName:rscwo, homePhone:rscwo, homePostalAddress:rscwo, initials:rscwo, jpegPhoto:rscwo, labeledUri:rscwo, manager:rscwo, mobile:rscwo, pager:rscwo, photo:rscwo, preferredLanguage:rscwo, mail:rscwo, o:rscwo, roomNumber:rscwo, secretary:rscwo, uid:rscwo,x500UniqueIdentifier:rscwo, userCertificate:rscwo, userSMIMECertificate:rscwo, userPKCS12:rscwo
机密
,即使该属性不存在。
18.12.3.3. 针对特定属性或对象类搜索受影响的示例
例 18.41. 为特定属性获得受影响的结果
# ldapsearch -D "cn=Directory Manager" -W -b "uid=scarter,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)"cn mail initials
dn: uid=scarter,ou=People,dc=example,dc=com cn: Sam Carter mail: scarter@example.com entryLevelRights: vadn attributeLevelRights:cn:rscwo, mail:rscwo, initials:rscwo
例 18.42. 获取对象类中属性的结果
# ldapsearch -D "cn=Directory Manager" -W -b "uid=scarter,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" uidNumber@posixAccount
...
dn: cn=template_posixaccount_objectclass,uid=scarter,ou=people,dc=example,dc=com
uidnumber: (template_attribute)
entryLevelRights: v
attributeLevelRights: uidNumber:rsc
-D
)是目录管理器时,使用搜索格式 属性@objectClass 才可用。
例 18.43. 获取对象类所有属性的结果
# ldapsearch -D "cn=Directory Manager" -W -b "uid=scarter,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" *@posixaccount
...
dn: cn=template_posixaccount_objectclass,uid=scarter,ou=people,dc=example,dc=com
objectClass: posixaccount
objectClass: top
homeDirectory: (template_attribute)
gidNumber: (template_attribute)
uidNumber: (template_attribute)
uid: (template_attribute)
cn: (template_attribute)
entryLevelRights: v
attributeLevelRights: cn:rsc, uid:rsc, uidNumber:rsc, gidNumber:rsc, homeDirectory:rsc, objectClass:rsc, userPassword:none, loginShell:rsc, gecos:rsc, description:rsc, aci:rsc
18.12.3.4. 为 Non-Existent 条目的 Get Effective rights 搜索示例
jsmith
)必须哪些权限对于不存在的用户。要检查不存在的条目,服务器会在该子树中生成一个模板条目。例如,若要检查模板条目 cn=joe 新用户 cn=joe new user,cn=accounts,ou=body,dc=example,dc=com
,服务器会创建 cn=template,cn=accounts,ou=body,dc=example,dc=com
。
cn=joe 新用户,cn=accounts,ou=body,dc=example,dc=com
with person 对象类(@person
),服务器会生成 cn=template_person_objectclass,cn=accounts,ou=body,dc=example,dc=com
。
scarter
的权利,以了解带有 uidNumber
的不存在的 Posix 条目作为其 RDN:
# ldapsearch -D "cn=Directory Manager" -W -b "ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" @posixaccount:uidnumber
dn: uidNumber=template_posixaccount_objectclass,ou=people,dc=example,dc=com
entryLevelRights: v
attributeLevelRights: description:rsc, gecos:rsc, loginShell:rsc, userPassword
:rsc, objectClass:rsc, homeDirectory:rsc, gidNumber:rsc, uidNumber:rsc, uid:
rsc, cn:rsc
18.12.3.5. 获取 Effectiverights 搜索属性的示例
例 18.44. 为过期属性获得 Effective rights 结果
# ldapsearch -D "cn=Directory Manager" -W -x -b "uid=scarter,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" "+"
dn: uid=scarter,ou=People,dc=example,dc=com
entryLevelRights: vadn
attributeLevelRights: nsICQStatusText:rscwo, passwordGraceUserTime:rscwo, pwdGraceUserTime:rscwo, nsYIMStatusText:rscwo, modifyTimestamp:rscwo, passwordExpWarned:rscwo, pwdExpirationWarned:rscwo, entrydn:rscwo, aci:rscwo, nsSizeLimit:rscwo, nsAccountLock:rscwo, passwordExpirationTime:rscwo, entryid:rscwo, nsSchemaCSN:rscwo, nsRole:rscwo, retryCountResetTime:rscwo, ldapSchemas:rscwo, nsAIMStatusText:rscwo, copiedFrom:rscwo, nsICQStatusGraphic:rscwo, nsUniqueId:rscwo, creatorsName:rscwo, passwordRetryCount:rscwo, dncomp:rscwo, nsTimeLimit:rscwo, passwordHistory:rscwo, pwdHistory:rscwo, nscpEntryDN:rscwo, subschemaSubentry:rscwo, nsYIMStatusGraphic:rscwo, hasSubordinates:rscwo, pwdpolicysubentry:rscwo, nsAIMStatusGraphic:rscwo, nsRoleDN:rscwo, createTimestamp:rscwo, accountUnlockTime:rscwo, copyingFrom:rscwo, nsLookThroughLimit:rscwo, nsds5ReplConflict:rscwo, modifiersName:rscwo, parentid:rscwo, passwordAllowChangeTime:rscwo, nsBackendSuffix:rscwo, nsIdleTimeout:rscwo, ldapSyntaxes:rscwo, numSubordinates:rscwo
18.12.3.6. Get Effective rights 结果和访问控制规则的示例
dn: dc=example,dc=com objectClass: top objectClass: domain dc: example aci: (target=ldap:///ou=Accounting,dc=example,dc=com)(targetattr="*")(version 3.0; acl "test acl"; allow (read,search,compare) (userdn = "ldap:///anyone") ;) dn: ou=Accounting,dc=example,dc=com objectClass: top objectClass: organizationalUnit ou: Accounting
例 18.45. 使用 No ACL Set (Directory Manager)获得 Effective rights 结果
# ldapsearch -D "cn=Directory Manager" -W -b "dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" "*@person" dn: cn=template_person_objectclass,uid=scarter,ou=people,dc=example,dc=com objectClass: person objectClass: top cn: (template_attribute) sn: (template_attribute) description: (template_attribute) seeAlso: (template_attribute) telephoneNumber: (template_attribute) userPassword: (template_attribute) entryLevelRights: none attributeLevelRights: sn:none, cn:none, objectClass:none, description:none, seeAlso:none, telephoneNumber:none, userPassword:none, aci:none
例 18.46. 在没有 ACL 设置的情况下获得 Effective 的结果(普通用户)
# ldapsearch -D "uid=scarter,ou=people,dc=example,dc=com" -W -b "dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" "*@person"
18.12.4. Get Effective rights 返回码
代码 | Description |
---|---|
0 | 成功完成。 |
1 | 操作错误。 |
12 | 关键扩展不可用。如果将 criticality 表达式设为 true,且正在查询的条目上不存在有效权限,则返回此错误。 |
16 | 没有这样的属性。如果特别查询访问权限的属性,但该属性在架构中不存在,则会返回此错误。 |
17 | 未定义的属性类型。 |
21 | 无效的属性语法。 |
50 | 权利不足。 |
52 | 不可用。 |
53 | 取消静默执行。 |
80 | 其他。 |
18.13. 日志记录访问控制信息
18.14. 高级访问控制:使用 Macro ACI
18.14.1. 宏 ACI 示例
aci: (targetattr="*")(targetfilter=(objectClass=nsManagedDomain)) (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=hostedCompany1,dc=example,dc=com";)
图 18.1. Macro ACI 的目录树示例
aci: (targetattr="*")(targetfilter=(objectClass=nsManagedDomain)) (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=hostedCompany1,dc=example,dc=com";)
aci: (targetattr="*")(targetfilter=(objectClass=nsManagedDomain)) (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=subdomain1,dc=hostedCompany1,dc=example,dc=com";)
aci: (targetattr="*")(targetfilter=(objectClass=nsManagedDomain)) (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=hostedCompany2,dc=example,dc=com";)
aci: (targetattr="*")(targetfilter=(objectClass=nsManagedDomain)) (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=subdomain1,dc=hostedCompany2,dc=example,dc=com";)
aci: (target="ldap:///ou=Groups,($dn),dc=example,dc=com") (targetattr="*")(targetfilter=(objectClass=nsManagedDomain)) (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,[$dn],dc=example,dc=com";)
18.14.2. 宏 ACI 语法
- ($dn)
- [$DN]
- ($attr.attrName),其中 attrName 代表目标条目中包含的属性
Macro | ACI Keyword |
---|---|
($dn) | target, targetfilter, userdn, roledn, groupdn, userattr |
[$DN] | targetfilter, userdn, roledn, groupdn, userattr |
($attr.attrName) | userDN, roledn, groupdn, userattr |
- 如果您在 targetfilter, userdn, roledn, groupdn, userattr 中使用 ($dn),则必须定义一个包括 ($dn) 的目标。
- 如果您在 targetfilter, userdn, roledn, groupdn, userattr 中使用 [$dn],则必须定义一个包括 ($dn) 的目标。
18.14.2.1. 宏匹配($dn)
(target="ldap:///ou=Groups,($dn),dc=example,dc=com")
aci: (target="ldap:///ou=*,($dn),dc=example,dc=com") (targetattr = "*") (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,($dn),dc=example,dc=com";)
aci: (target="ldap:///ou=Groups,dc=subdomain1,dc=hostedCompany1, dc=example,dc=com") (targetattr = "*") (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups, dc=subdomain1,dc=hostedCompany1,dc=example,dc=com";)
18.14.2.2. [$dn] 的宏匹配
aci: (target="ldap:///ou=Groups,($dn),dc=example,dc=com") (targetattr = "*") (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,[$dn],dc=example,dc=com";)
- ($DN) 匹配 dc=subdomain1,dc=hostedCompany1。
- 主题中的 [$DN] 替换为 dc=subdomain1,dc=hostedCompany1。结果为 groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=subdomain1,dc=hostedCompany1,dc=example,dc=com"。如果绑定 DN 是该组的成员,则匹配的进程将停止,并且评估 ACI。如果不匹配,该过程将继续。
- 主题中的 [$DN] 替换为 dc=hostedCompany1。结果为 groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=hostedCompany1,dc=example,dc=com"。在这种情况下,如果绑定 DN 不是该组的成员,则不会评估 ACI。如果是一个成员,则评估 ACI。
aci: (target="ldap:///ou=*, ($dn),dc=example,dc=com") (targetattr="*")(targetfilter=(objectClass=nsManagedDomain)) (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,[$dn],dc=example,dc=com";)
18.14.2.3. 宏匹配($attr.attrName)
roledn = "ldap:///cn=DomainAdmins,($attr.ou)"
dn: cn=Jane Doe,ou=People,dc=HostedCompany1,dc=example,dc=com cn: Jane Doe sn: Doe ou: Engineering,dc=HostedCompany1,dc=example,dc=com ...
ou
属性,并使用此属性的值来扩展宏。因此,在示例中,roledn 被扩展如下:
roledn = "ldap:///cn=DomainAdmins,ou=Engineering,dc=HostedCompany1,dc=example,dc=com"
dn: cn=Jane Doe,ou=People,dc=HostedCompany1,dc=example,dc=com cn: Jane Doe sn: Doe ou: Engineering,dc=HostedCompany1,dc=example,dc=com ou: People,dc=HostedCompany1,dc=example,dc=com...
roledn = "ldap:///cn=DomainAdmins,ou=Engineering,dc=HostedCompany1,dc=example,dc=com" roledn = "ldap:///cn=DomainAdmins,ou=People,dc=HostedCompany1,dc=example,dc=com"
18.15. 在目录管理器上设置访问控制
18.15.1. 关于目录管理器帐户上的访问控制
- 时间范围的基于时间的访问控制,如 8a.m. 到 5p.m。(0800 到 1700)以及每周中的特定天的访问控制,因此仅在明确定义的天中允许访问。这与 第 18.11.2.5 节 “在星期的特定天定义访问权限” 和 第 18.11.2.6 节 “在一天的特定时间定义访问权限” 类似。
- IP 地址规则,其中只有指定的 IP 地址、域或子网被显式允许或拒绝。这与 第 18.11.2.2 节 “定义从特定 IP 地址或范围的访问” 类似。
- 主机访问规则,其中只有指定的主机名、域名或子域被显式允许或拒绝。这与 第 18.11.2.3 节 “定义从特定主机或域的访问” 类似。
18.15.2. 配置 RootDN 访问控制插件
RootDN Access Control
插件,然后设置适当的访问控制规则。
- 启用
RootDN 访问控制
插件:# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin root-dn enable Plugin 'RootDN Access Control' enabled ...
- 为访问控制指令设置绑定规则。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin root-dn set --open-time=0600 --close-time=2100 --allow-host="*.example.com" --deny-host="*.remote.example.com"
您可以设置以下参数:--open-time
和--close-time
用于基于时间的访问控制。--days-allowed
用于基于日常访问控制。--allow-host
、--deny-host
、--allow-ip
和--deny-ip
用于基于主机的访问控制。这些是所有多值属性,您可以使用通配符来允许或拒绝 IP 范围或域。重要拒绝规则具有更高的优先级,然后允许规则。例如,如果--allow-host
参数设为 192.168.1.0/24 example.com,并且--deny-host
设置为 192.168.1.0/24 front-office.example.com,则阻止从 front-office.example.com 子域中的所有主机访问,因为目录管理器会被阻止。
- 重启 Directory 服务器:
# dsctl instance_name restart
第 19 章 使用健康检查功能来识别问题
组件 | 重要性 | 结果代码 | 描述 |
---|---|---|---|
后端 | 低 | DSBLE0003 | 数据库没有初始化。创建数据库,但数据库为空。 |
后端 | Medium | DSBLE0001 | 配置中缺少后端的映射树条目。 |
config | 低 | DSCLE0001 | 禁用高分辨率时间戳。 |
config | 高 | DSVIRTLE0001 | 虚拟属性被错误地索引。角色或服务(CoS)定义使用的索引属性可能会破坏搜索结果。 |
操作系统 | Medium | DSPERMLE0001 | 在 /etc/resolve.conf 文件中设置的权限与 0644 不同。 |
操作系统 | 高 | DSDSLE0001 | 磁盘空间较低 |
操作系统 | 高 | DSPERMLE0002 | /etc/dirsrv/slapd-instance_name/pin.txt 和 /etc/dirsrv/slapd-instance_name/pwdfile.txt 文件设置的权限与 0400 不同。 |
插件 | 低 | DSRILE0001 | 为 参考完整性 插件设置了更新延迟。这可能导致复制问题。 |
插件 | 高 | DSRILE0002 | 参考完整性 插件丢失索引。如果没有索引,插件会为每个删除操作查询某些属性。这可能导致硬检测的未索引搜索和高 CPU 用量。 |
复制 | 低 | DSREPLLE0002 | 数据库中存在冲突条目。 |
复制 | 低 | DSSKEWLE0001 | 复制时间偏移时间大于 6 小时,小于 12 小时。 |
复制 | Medium | DSCLLE0001 | changelog 修剪被禁用。在这种情况下,changelog 会在没有限制的情况下增长。 |
复制 | Medium | DSREPLLE0004 | 健康检查无法检索复制状态。 |
复制 | Medium | DSREPLLE0003 | 拓扑不同步,但复制工作正常。 |
复制 | Medium | DSREPLLE0005 | 无法访问远程副本。 |
复制 | Medium | DSSKEWLE0002 | 复制时间偏移时间大于 12 小时,小于 24 小时。 |
复制 | 高 | DSREPLLE0001 | 拓扑不同步,复制无法正常工作。 |
复制 | 高 | DSSKEWLE0003 | 复制时间偏移时间大于 24 小时。复制会话可能会破坏。 |
安全性 | Medium | DSELE0001 | 最小 TLS 版本设置为小于 TLS 1.2 的值。 |
安全性 | 高 | DSCLE0002 | 配置了弱密码存储方案。 |
Server | 高 | DSBLE0002 | 健康检查无法查询后端。 |
TLS 证书 | Medium | DSCERTLE0001 | 服务器证书在下一个 30 天内过期。 |
TLS 证书 | 高 | DSCERTLE0002 | 服务器证书已过期。 |
19.1. 运行目录服务器健康检查
# dsctl instance_name healthcheck Beginning lint report, this could take a while ... Checking Backends ... Checking Config ... Checking Encryption ... Checking FSChecks ... Checking ReferentialIntegrityPlugin ... Checking MonitorDiskSpace ... Checking Replica ... Checking Changelog5 ... Checking NssSsl ... Healthcheck complete. 1 Issue found! Generating report ...
例 19.1. 健康检查可能的报告
[1] DS Lint Error: DSELE0001 -------------------------------------------------------------------------------- Severity: MEDIUM Affects: -- cn=encryption,cn=config Details: ----------- This Directory Server may not be using strong TLS protocol versions. TLS1.0 is known to have a number of issues with the protocol. Please see: https://tools.ietf.org/html/rfc7457 It is advised you set this value to the maximum possible. Resolution: ----------- There are two options for setting the TLS minimum version allowed. You, can set "sslVersionMin" in "cn=encryption,cn=config" to a version greater than "TLS1.0" You can also use 'dsconf' to set this value. Here is an example: # dsconf slapd-instance_name security set --tls-protocol-min=TLS1.2 You must restart the Directory Server for this change to take effect. Or, you can set the system wide crypto policy to FUTURE which will use a higher TLS minimum version, but doing this affects the entire system: # update-crypto-policies --set FUTURE ===== End Of Report (1 Issue found) =====
--json
参数传递给命令:
# dsctl --json instance_name healthcheck
例 19.2. JSON 格式可能的健康检查报告
[ { "dsle": "DSELE0001", "severity": "MEDIUM", "items": [ "cn=encryption,cn=config" ], "detail": "This Directory Server may not be using strong TLS protocol versions. TLS1.0 is known to\nhave a number of issues with the protocol. Please see:\n\nhttps://tools.ietf.org/html/rfc7457\n\nIt is advised you set this value to the maximum possible.", "fix": "There are two options for setting the TLS minimum version allowed. You,\ncan set \"sslVersionMin\" in \"cn=encryption,cn=config\" to a version greater than \"TLS1.0\"\nYou can also use 'dsconf' to set this value. Here is an example:\n\n # dsconf slapd-instance_name security set --tls-protocol-min=TLS1.2\n\nYou must restart the Directory Server for this change to take effect.\n\nOr, you can set the system wide crypto policy to FUTURE which will use a higher TLS\nminimum version, but doing this affects the entire system:\n\n # update-crypto-policies --set FUTURE" } ]
第 20 章 管理用户身份验证
20.1. 设置用户密码
userPassword
属性且还没有激活时,才能使用条目绑定到目录。由于用户密码存储在目录中,因此可以使用任何 LDAP 操作(如使用 ldapmodify 实用程序)设置或重置用户密码。
pwdReset
操作属性设置为 true。应用可以使用此属性来识别管理员是否重置了用户的密码。
目录管理器
(root DN)设置密码时,将绕过密码策略且不验证。不要将这些帐户用于常规用户密码管理。仅使用它们来执行需要绕过密码策略的密码管理任务。
20.2. 设置密码管理员
- 强制用户更改密码,
- 将用户的密码改为密码策略中定义的不同存储方案,
- 绕过密码语法检查,
- 并添加已哈希密码。
userPassword
属性。红帽建议不要将密码管理员帐户用于这些普通任务。
- 在本地策略中。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com localpwp set ou=people,dc=example,dc=com --pwdadmin "cn=password_admins,ou=groups,dc=example,dc=com"
- 在全局策略中。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy set --pwdadmin "cn=password_admins,ou=groups,dc=example,dc=com"
passwordAdminSkipInfoUpdate: on/off
设置,以提供对密码管理员执行的密码保护的精细控制。当您启用此设置时,密码更新不会更新某些属性,例如 passwordHistory
,passwordExpirationTime
,passwordRetryCount
,pwdReset
, 和 passwordExpWarned
。
20.3. 外部更改密码
# dsidm ldap://server.example.com -D bind_dn -W -b dc=example,dc=com account change_password user newPassword oldPassword
# dsidm ldap://server.example.com -Z bind_dn -W -b dc=example,dc=com account change_password user newPassword oldPassword
# dsidm ldap://server.example.com -Z bind_dn -W -b dc=example,dc=com account change_password user newPassword oldPassword
20.4. 管理密码策略
- 用户必须根据时间表更改其密码。
- 用户必须提供非主要密码。
- 密码语法必须满足某些复杂性要求。
目录管理器
(root DN)设置密码时,将绕过密码策略且不验证。不要将这些帐户用于常规用户密码管理。仅使用它们来执行需要绕过密码策略的密码管理任务。
- 密码策略检查的类型或级别。此信息指示服务器是否应该检查并强制实施全局密码策略,还是本地(子树/用户级别)密码策略。密码策略在反转的 pyramid 中工作,从常规到特定的。全局密码策略由子树级密码策略替代,该策略由用户级密码策略替代。仅对条目强制执行一个密码策略;密码策略不会被添加。这意味着,如果在全局或子树级别策略中配置了特定属性,但没有在用户级密码策略中,则属性在尝试登录时不会用于用户,因为 active, applied 策略是用户级策略。
- 密码添加和修改信息。密码信息包括密码语法和密码历史记录详情。
- 绑定信息。绑定信息包括允许的宽限期数量、密码参与属性和跟踪绑定失败。
20.4.1. 配置全局密码策略
20.4.1.1. 使用命令行配置全局密码策略
dsconf
工具显示并编辑全局密码策略设置:
- 显示当前设置:
# dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy get Global Password Policy: cn=config ------------------------------------ passwordstoragescheme: PBKDF2_SHA256 passwordChange: on passwordMustChange: off passwordHistory: off passwordInHistory: 6 ...
- 调整密码策略设置。例如,要启用密码语法检查并将密码的最小长度设置为 12 个字符,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy set --pwdchecksyntax=on --pwdmintokenlen=12
如需可用设置的完整列表,请输入:# dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy set --help
- 启用密码策略:
# dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy set --pwdlockout on
20.4.1.2. 使用 Web 控制台配置全局密码策略
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 在 Global Policy。,选择
- 设置全局密码策略设置。您可以在以下类别中设置参数:
- 常规设置,如密码存储方案
- 密码过期设置,如密码过期的时间。
- 帐户锁定设置,例如在应锁定帐户的登录尝试次数后。
- 密码语法设置,如最小密码长度。
要显示参数的 cn=config 条目中的工具提示和对应属性名称,请将鼠标光标悬停在设置上。详情请查看 红帽目录服务器配置、命令和文件参考 中的参数描述。 - 点击。
20.4.2. 使用本地密码策略
nsslapd-pwpolicy-inherit-global
参数为 on,则可以从全局策略继承语法。
--pwpinheritglobal
选项,则 local 策略中的 passwordcheck
Locator 选项设置为 OFF,并在全局策略中继承以下属性到本地策略:
passwordchecksyntax
passwordminlength
passwordmindigits
passwordminalphas
passwordminuppers
passwordminlowers
passwordminspecials
passwordmin8bit
passwordmaxrepeats
passwordmincategories
passwordmintokenlength
20.4.2.1. 其中目录服务器存储本地密码策略条目
- 对于子树(如 ou=body,dc=example,dc=com),添加了以下条目:
- 在子树级别上的容器条目(
nsPwPolicyContainer
),用于保存子树及其所有子项的各种密码策略相关条目。例如:dn: cn=nsPwPolicyContainer,ou=people,dc=example,dc=com objectClass: top objectClass: nsContainer cn: nsPwPolicyContainer
- 用于保存特定于子树的所有密码策略属性的实际密码策略规格条目(
nsPwPolicyEntry
)。例如:dn: cn="cn=nsPwPolicyEntry,ou=people,dc=example,dc=com", cn=nsPwPolicyContainer,ou=people,dc=example,dc=com objectclass: top objectclass: extensibleObject objectclass: ldapsubentry objectclass: passwordpolicy
- 具有指向上述(
nsPwPolicyEntry
)条目的pwdpolicysubentry
值的 CoS 模板条目(nsPwTemplateEntry
)条目。例如:dn: cn="cn=nsPwTemplateEntry,ou=people,dc=example,dc=com", cn=nsPwPolicyContainer,ou=people,dc=example,dc=com objectclass: top objectclass: extensibleObject objectclass: costemplate objectclass: ldapsubentry cosPriority: 1 pwdpolicysubentry: cn="cn=nsPwPolicyEntry,ou=people,dc=example,dc=com", cn=nsPwPolicyContainer,ou=people,dc=example,dc=com
- 子树级别的 CoS 规格条目。例如:
dn: cn=newpwdpolicy_cos,ou=people,dc=example,dc=com objectclass: top objectclass: LDAPsubentry objectclass: cosSuperDefinition objectclass: cosPointerDefinition cosTemplateDn: cn=cn=nsPwTemplateEntry\,ou=people\,dc=example,dc=com, cn=nsPwPolicyContainer,ou=people,dc=example,dc=com cosAttribute: pwdpolicysubentry default operational
- 对于用户(例如,uid=user_name,ou=body,dc=example,dc=com),添加了以下条目:
- 父级别的容器条目(
nsPwPolicyContainer
),用于保存用户及其所有子项的各种密码策略相关条目。例如:dn: cn=nsPwPolicyContainer,ou=people,dc=example,dc=com objectClass: top objectClass: nsContainer cn: nsPwPolicyContainer
- 用于保存特定于用户的密码策略属性的实际密码策略规格条目(
nsPwPolicyEntry
)。例如:dn: cn="cn=nsPwPolicyEntry,uid=user_name,ou=people,dc=example,dc=com", cn=nsPwPolicyContainer,ou=people,dc=example,dc=com objectclass: top objectclass: extensibleObject objectclass: ldapsubentry objectclass: passwordpolicy
20.4.2.2. 配置本地密码策略
- 验证子树或用户条目是否已存在本地密码策略。例如:
# dsconf -D "cn=Directory Manager" ldap://server.example.com localpwp get "ou=People,dc=example,dc=com" Error: The policy wasn't set up for the target dn entry or it is invalid
如果不存在本地策略,请创建一个:- 创建子树密码策略:
# dsconf -D "cn=Directory Manager" ldap://server.example.com localpwp addsubtree "ou=People,dc=example,dc=com"
- 创建用户密码策略:
# dsconf -D "cn=Directory Manager" ldap://server.example.com localpwp adduser "uid=user_name,ou=People,dc=example,dc=com"
重要当您创建新的本地策略时,上一命令会自动将 cn=config 条目中的nsslapd-pwpolicy-local
参数设置为 on。如果不应该启用本地密码策略,请手动将参数设置为 off :dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy set --pwdlocal off
- 设置本地策略属性。例如,要启用密码过期并将最长密码过期时间设置为 14 天(1209600 秒):
- 在子树密码策略中:
# dsconf -D "cn=Directory Manager" ldap://server.example.com localpwp set --pwdexpire=on --pwdmaxage=1209600 "ou=People,dc=example,dc=com"
- 在用户密码策略中:
# dsconf -D "cn=Directory Manager" ldap://server.example.com localpwp set --pwdexpire=on --pwdmaxage=1209600 "uid=user_name,ou=People,dc=example,dc=com"
如需可用设置的完整列表,请输入:# dsconf -D "cn=Directory Manager" ldap://server.example.com localpwp set --help
20.5. 配置临时密码规则
- 只有
cn=Directory Manager
帐户才能分配临时密码。 - 目录服务器只允许身份验证尝试固定次数,以避免攻击者探测密码。
- 目录服务器允许在指定延迟后尝试,以配置在设置后临时密码不可用。
- 目录服务器只允许身份验证尝试指定时间,以便在用户不使用或重置它时临时密码过期。
- 如果身份验证成功,Directory 服务器要求用户在服务器执行任何其他操作前重置密码。
20.5.1. 在全局密码策略中启用临时密码策略
- 如果管理员重置密码,则启用该用户的密码。
- 在全局密码策略中配置该功能。
userPassword
属性,并将 passwordMustChange
属性设置为 on,目录服务器会应用临时密码规则。
流程
- 配置用户在管理员重置后必须更改密码:
# dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy set --pwdmustchange on
- 在全局密码策略中配置临时密码策略设置:
# dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy set --pwptprmaxuse 5 --pwptprdelayexpireat 3600 --pwptprdelayvalidfrom 60
在本例中:--pwptprmaxuse
选项将用户可以使用临时密码的最大尝试次数设置为 5。--pwptprdelayexpireat
选项将临时密码到期前的时间设置为 3600 秒(1 小时)--pwptprdelayvalidfrom
选项配置--pwptprdelayexpireat
中设置的时间在管理员重置用户密码后启动 60 秒。
验证
- 显示存储临时密码规则的属性:
# dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy get | grep -i TPR passwordTPRMaxUse: 5 passwordTPRDelayExpireAt: 3600 passwordTPRDelayValidFrom: 60
20.5.2. 在本地密码策略中启用临时密码策略
userPassword
属性,并将 passwordMustChange
属性设置为 on,目录服务器会应用临时密码规则,如果用户:
- 启用本地密码策略
- 存储在启用了本地密码策略的子树中
流程
- 配置用户在管理员重置后必须更改密码:
# dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy set --pwdmustchange on
- 配置临时密码规则设置:
- 对于子树:
# dsconf -D "cn=Directory Manager" ldap://server.example.com localpwp addsubtree --pwptprmaxuse 5 --pwptprdelayexpireat 3600 --pwptprdelayvalidfrom 60 ou=People,dc=example,dc=com
- 对于用户:
# dsconf -D "cn=Directory Manager" ldap://server.example.com localpwp adduser --pwptprmaxuse 5 --pwptprdelayexpireat 3600 --pwptprdelayvalidfrom 60 uid=example,ou=People,dc=example,dc=com
请注意,您只能对存在的条目设置本地密码策略。在这些示例中:--pwptprmaxuse
选项将用户可以使用临时密码的最大尝试次数设置为 5。--pwptprdelayexpireat
选项将临时密码过期前的时间设置为 3600 秒(1 小时)。-pwptprdelayvalidfrom
选项配置--pwptprdelayexpireat
中设置的时间在管理员重置用户密码后启动 60 秒。
验证
- 显示可分辨名称(DN)的本地密码策略:
# dsconf -D "cn=Directory Manager" ldap://server.example.com localpwp get distinguished_name | grep -i TPR passwordTPRMaxUse: 5 passwordTPRDelayExpireAt: 3600 passwordTPRDelayValidFrom: 60
20.6. 了解密码过期控制
- 过期的控制(2.16.840.1.113730.3.4.4):指示密码已过期。目录服务器在以下情况下发送这个控制:
- 密码已过期,宽限期已耗尽。服务器拒绝绑定并显示 Error 49 消息。
- 密码已过期,但宽限期仍可用。允许绑定。
- 如果在 cn=config 条目中启用了
passwordMustChange
,则用户需要在管理员更改后重置密码。允许绑定,但除了更改密码外的任何后续操作都会产生 Error 53 信息。
- 过期控制(2.16.840.1.113730.3.4.5):表示密码将很快过期。目录服务器在以下情况下发送这个控制:
- 密码将在 cn=config 条目中的
passwordWarning
属性中设置的密码警告周期内过期。 - 如果在 cn=config 条目的
passwordSendExpiringTime
属性中启用了密码策略配置选项,则会始终返回过期控制,无论密码是否在警告周期内。
- 绑定响应控制(1.3.6.1.4.1.42.2.27.8.5.1):控制包含有关即将过期或即将过期的密码状态的详细信息。注意只有在客户端请求时,目录服务器仅发送绑定响应控制。例如,如果使用 ldapsearch,则必须将
-e ppolicy
参数传给命令,以请求绑定响应控制。例 20.1. 在查询中请求绑定响应控制
如果您请求绑定响应控制,例如,通过将-e ppolicy
参数传给 ldapsearch 命令,服务器会返回有关帐户过期的详细信息。例如:# ldapsearch -D "uid=user_name,dc=example,dc=com" -xLLL -W \ -b "dc=example,dc=com" -e ppolicy ldap_bind: Success (0); Password expired (Password expired, 1 grace logins remain)
20.7. 管理目录管理器密码
root
用户。Directory Manager 条目和对应的密码是在实例安装过程中设置的。
cn=Directory Manager
。
20.7.1. 重置目录管理器密码
- 停止 Directory 服务器实例:
# dsctl instance_name stop
- 生成新的密码哈希。例如:
# pwdhash -D /etc/dirsrv/slapd-instance_name password {PBKDF2_SHA256}AAAgABU0bKhyjY53NcxY33ueoPjOUWtl4iyYN5uW...
指定目录服务器配置的路径会自动使用nsslapd-rootpwstoragescheme
属性中设置的密码存储方案来加密新密码。 - 编辑
/etc/dirsrv/slapd-instance_name/dse.ldif
文件,并将nsslapd-rootpw
属性设置为上一步中显示的值:nsslapd-rootpw: {PBKDF2_SHA256}AAAgABU0bKhyjY53NcxY33ueoPjOUWtl4iyYN5uW...
- 启动 Directory 服务器实例:
# dsctl instance_name start
20.7.2. 更改目录管理器密码
20.7.2.1. 使用命令行更改目录管理器密码
- 将
nsslapd-rootpw
参数设置为纯文本值,目录服务器会自动加密:# dsconf -D "cn=Directory Manager" ldaps://server.example.com config replace nsslapd-rootpw=password
警告不要在密码中使用大括号({})。目录服务器以 {password-storage-scheme}hashed_password 格式存储密码。服务器将大括号中的字符解释为密码存储方案。如果字符串是无效的存储方案,或者密码没有正确哈希,则目录管理器无法连接到服务器。 - 要手动加密密码并在
nsslapd-rootpw
参数中对其进行设置:- 生成新的密码哈希。例如:
# pwdhash -D /etc/dirsrv/slapd-instance_name password {PBKDF2_SHA256}AAAgAMwPYIhEkQozTagoX6RGG5E7d6/6oOJ8TVty...
指定目录服务器配置的路径会自动使用nsslapd-rootpwstoragescheme
属性中设置的密码存储方案来加密新密码。 - 使用安全连接(STARTTLS)将
nsslapd-rootpw
属性设置为上一步中显示的值:# dsconf -D "cn=Directory Manager" ldaps://server.example.com config replace nsslapd-rootpw="{PBKDF2_SHA256}AAAgAMwPYIhEkQozTagoX6RGG5E7d6/6oOJ8TVty..."
20.7.2.2. 使用 Web 控制台更改目录管理器密码
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开 Server Settings。菜单,然后选择
- 打开 Directory Manager 选项卡。
- 在 Directory Manager Password 和 Confirm Password 字段中输入新密码
- 另外,还可设置不同的密码存储方案。
- 点击。
20.7.3. 更改目录管理器密码存储主题
nsslapd-rootpwstoragescheme
)的存储方案可能与用于加密用户密码的方案(nsslapd-pwstoragescheme
)不同。
20.7.3.1. 使用命令行更改目录管理器密码存储主题
- 生成使用新存储方案的新密码哈希。例如:
# pwdhash -s PBKDF2_SHA256 password {PBKDF2_SHA256}AAAgAMwPYIhEkQozTagoX6RGG5E7d6/6oOJ8TVty...
- 将
nsslapd-rootpwstoragescheme
属性设置为存储 scheme,将nsslapd-rootpw
属性设置为在前一个步骤中显示的值,使用安全连接 (STARTTLS):# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-rootpwstoragescheme=PBKDF2_SHA256 nsslapd-rootpw="{PBKDF2_SHA256}AAAgAMwPYIhEkQozTagoX6RGG5E7d6/6oOJ8TVty..."
20.7.3.2. 使用 Web 控制台更改目录管理器密码存储主题
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开 Server Settings。菜单,然后选择
- 打开 Directory Manager 选项卡。
- 设置密码存储方案。
- 目录服务器无法使用新的存储方案重新加密当前密码。因此,在 Directory Manager Password 和 Confirm Password 字段中输入新密码。
- 单击。
20.7.4. 更改目录管理器 DN
cn=New Directory Manager
:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-rootdn="cn=New Directory Manager"
20.8. 检查无密码访问的帐户可用性
20.8.1. 使用帐户 Usability Extension Control 搜索条目
-J
来指定控制,或使用 accountusability:true
标志来指定控制:
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -b "dc=example,dc=com" -s sub-J "accountusability:true"
"(objectclass=*)" # Account Usability Response Control# The account is usable
dn: dc=example,dc=com objectClass: domain objectClass: top dc: example ...
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -b "uid=bjensen,ou=people,dc=example,dc=com" -s base-J "accountusability:true"
"(objectclass=*)" # Account Usability Response Control# The account is usable
dn: uid=bjensen,ou=people,dc=example,dc=com ...
帐户状态 | 控制结果消息 |
---|---|
带有有效密码的活跃帐户 | 帐户可用 |
没有设置密码的活动帐户 | 帐户可用 |
过期的密码 | 密码过期 |
修改帐户的密码策略 | 密码过期 |
帐户被锁定,没有锁定持续时间 | 密码重置 |
帐户被锁定,有一个锁定持续时间 | 自动解锁账户的时间(以秒为单位) |
在第一次登录时应重置帐户的密码 | 密码重置 |
密码已过期,并允许宽限期 | 允许密码过期并允许 X 宽限期 |
密码已过期,安全登录的数量已耗尽 | 密码过期 |
密码将过期(过期警告) | 密码将在 X 秒数后过期 |
20.8.2. 更改用户可以执行帐户的搜索功能
# ldapmodify -D "cn=Directory Manager" -W -x dn: oid=1.3.6.1.4.1.42.2.27.9.5.8,cn=features,cn=config changetype: modify add: aci aci: (targetattr = "*")(version 3.0; acl "Account Usable"; allow (read)(groupdn = "ldap:///cn=Administrators,ou=groups,dc=example,dc=com");)
20.9. 配置基于密码的帐户锁定策略
20.9.1. 使用命令行配置帐户锁定策略
# dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy set --pwdlockout on --pwdmaxfailures=4
--pwdlockout
:将此参数设置为 on 或 off,以启用或禁用帐户锁定功能。--pwdunlock
:将此参数设置为 on,以在锁定持续时间后解锁帐户。--pwdlockoutduration
:设置帐户将被锁定的秒数。--pwdmaxfailures
:在帐户锁定前设置允许失败的密码尝试的最大数量。--pwdresetfailcount
:设置目录服务器重置帐户的失败登录数前的秒数。
20.9.2. 使用 Web 控制台配置帐户锁定策略
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开 Database 选项卡,然后选择 Global Password Policy。
- 在 Account Lockout 选项卡中,启用 Enable Account Lockout 设置并设置参数。例如:要显示参数的 cn=config 条目中的工具提示和对应属性名称,请将鼠标光标悬停在设置上。详情请查看 红帽目录服务器配置、命令和文件参考 中的参数描述。
- 点击。
20.9.3. 禁用传统密码锁定行为
passwordMaxFailure
)时,可以解释不同的方法。它取决于服务器如何计算整个故障计数中最后一次失败的尝试。
passwordLegacyPolicy
参数中设置。
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace passwordLegacyPolicy=off
20.10. 配置基于时间的帐户锁定策略
- 插件本身的配置条目。这会设置用于该服务器上配置的所有帐户策略的全局值。
- 帐户策略配置条目。此条目位于用户目录中,基本上是一个模板,它被引用并应用到用户帐户条目。
- 应用帐户策略条目的条目。用户帐户可以直接引用帐户策略,或者 CoS 或角色可用于自动将帐户策略应用到一组用户帐户。注意通过
acctPolicySubentry
属性应用帐户策略。虽然此属性可以直接添加到用户帐户,但此属性是单值 - 这意味着只能将一个帐户策略应用到该帐户。在大多数情况下可能会很正常。但是,一个机构可能有意创建两个帐户策略,一个用于帐户不活跃,然后根据年龄进行帐户过期。使用 CoS 应用帐户策略,允许将多个帐户策略用于帐户。
20.10.1. 帐户策略插件语法
- nsslapd-pluginEnabled,它设定插件是否启用或禁用。此属性默认为 off。
- nsslapd-pluginarg0,指向插件配置目录的 DN。配置条目通常是插件本身的子条目,如 cn=config,cn=Account Policy Plugin,cn=plugins,cn=config。
- 在 nsslapd-pluginarg0 属性中标识的插件配置条目。这会为插件设置全局配置,用于识别帐户策略配置条目和管理用户帐户条目。这些设置适用于服务器。配置条目属性在 Red Hat Directory Server Configuration, Command, Command, and File Reference 中的 Account Policy Plug-in Attributes 部分中进行了描述。
- 帐户策略配置条目。这类似于模板条目,它为帐户策略设置特定值。用户帐户 - 直接或通过 CoS 条目 - 引用此帐户策略条目。下表中描述了帐户策略和用户条目属性:
表 20.2. 帐户策略条目和用户条目属性 属性 定义 配置或用户条目 accountpolicy (对象类) 为在activation 或 expiration 策略中的帐户定义模板条目。 配置 accountInactivityLimit (attribute) 在帐户被锁定前,设置帐户最后一次登录时间(以秒为单位)的时间(以秒为单位)。 配置 acctPolicySubentry (attribute) 标识属于帐户策略的任何条目(特别是帐户锁定策略)。此属性的值指向应用到该条目的帐户策略的 DN。 User createTimestamp (operational 属性) 包含最初创建的日期和时间。 User lastLoginTime (operational 属性) 包含给定帐户向目录进行身份验证的时间戳。 User 详情请查看 Red Hat Directory Server Configuration、命令和文件参考中的属性描述
20.10.2. 帐户身份和帐户过期
帐户策略
插件允许您设置:
- 帐户过期:帐户在创建帐户后被禁用一定时间。
- 帐户不活跃:帐户在最后一次成功登录后被禁用了一定时间。这可让您自动禁用未使用的帐户。
帐户策略
插件:
- 启用帐户策略插件:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy enable
- 设置插件配置条目:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy set --config-entry="cn=config,cn=Account Policy Plugin,cn=plugins,cn=config"
- 创建插件配置条目:
- 要将 CoS 或角色与帐户策略搭配使用,请将
alwaysRecordLogin
值设置为yes
。这意味着每个条目都有登录时间,即使它没有acctPolicySubentry
属性。 - 将用于帐户策略评估的 primary 属性设置为
stateAttrName
的值。对于帐户不活跃,请使用lastLoginTime
属性。对于简单的帐户过期时间,请使用createTimestamp
属性。 - 您可以在
altStateAttrName
中设置二级属性,该属性会在stateAttrName
中定义的主属性不存在。如果没有指定属性作为替代值,则使用默认值createTimestamp
。警告如果 primary 属性的值被设置为lastLoginTime
,并且altStateAttrName
设置为createTimestamp
,则现有环境中的用户会在帐户没有lastLoginTime
属性时自动锁定,并且createTimestamp
比配置的不活跃周期旧。对于这种情况,请将 alternatives 属性设置为1.1
。这会明确地声明不使用任何属性作为替代方案。下一次登录时,将自动创建lastLoginTime
属性。 - 设置要使用的属性,以显示哪些条目应用了帐户策略(cct
PolicySubentry
)。 - 在帐户策略中设置属性,它用于设置实际超时时间,以秒为单位(
accountInactivityLimit
)。
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy config-entry set "cn=config,cn=Account Policy Plugin,cn=plugins,cn=config" --always-record-login yes --state-attr lastLoginTime --alt-state-attr 1.1 --spec-attr acctPolicySubentry --limit-attr accountInactivityLimit
- 重启服务器以载入新插件配置:
# dsctl instance_name restart
- 定义帐户策略:
# ldapadd
-a
-D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=Account Inactivation Policy,dc=example,dc=com objectClass: top objectClass: ldapsubentry objectClass: extensibleObjectobjectClass: accountpolicy
accountInactivityLimit: 2592000
cn: Account Inactivation Policy - 创建服务模板条目的类:
# ldapadd
-a
-D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=TempltCoS,dc=example,dc=com objectClass: top objectClass: ldapsubentry objectClass: extensibleObject objectClass: cosTemplate acctPolicySubentry: cn=Account Inactivation Policy,dc=example,dc=com帐户策略可以直接在用户条目上定义,而不使用 CoS。但是,使用 CoS 允许为多个条目可靠地应用和更新帐户策略,并允许将多个策略应用到条目。 - 创建服务定义条目的类。CoS 的受管条目是帐户策略属性,
acctPolicySubentry
。这个示例将 CoS 应用到整个目录树:# ldapadd
-a
-D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=DefnCoS,dc=example,dc=com objectClass: top objectClass: ldapsubentry objectclass: cosSuperDefinition objectclass: cosPointerDefinition cosTemplateDn: cn=TempltCoS,dc=example,dc=com cosAttribute: acctPolicySubentry default operational-default
20.10.3. 禁用帐户在密码过期后保留时间挂载
dn: cn=config,cn=Account Policy Plugin,cn=plugins,cn=config objectClass: top objectClass: extensibleObject cn: config alwaysrecordlogin: yes stateAttrName: non_existent_attribute altStateAttrName: passwordExpirationTime specattrname: acctPolicySubentry limitattrname: accountInactivityLimit
stateAttrName
参数中使用 dummy 值。因此,只有 altStateAttrName
参数中设置的 passwordExpirationTime 属性才会用于计算帐户何时过期。
lastLoginTime
属性中最后一次成功登录的时间,请设置:
dn: cn=config,cn=Account Policy Plugin,cn=plugins,cn=config alwaysRecordLoginAttr: lastLoginTime
passwordExpirationTime
属性和 accountInactivityLimit
参数的值中设定的时间总和,则会自动禁用帐户。使用这个配置,如果用户的 passwordExpirationTime
属性中的值和 accountInactivityLimit
参数中的值总和超过时间,则会自动禁用帐户,因为 alwaysRecordLoginAttr
属性上次更新。
20.10.4. 在不设置锁定策略的情况下跟踪登录时间
lastLoginTime
属性添加到用户条目,但不需要设置其他策略规则。
- 启用帐户策略插件:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy enable
- 创建插件配置条目以记录登录时间:
- 将
alwaysRecordLogin
值设置为 yes,以便每个条目都有登录时间记录。 - 将
lastLoginTime
属性设置为用于帐户策略的属性(stateattrname
)。 - 设置要使用的属性,以显示哪些条目应用了帐户策略(cct
PolicySubentry
)。 - 在帐户策略中设置属性,用于设置实际的超时时间,以秒为单位(
accountInactivityLimit
)。
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin account-policy config-entry set "cn=config,cn=Account Policy Plugin,cn=plugins,cn=config" --always-record-login yes --state-attr lastLoginTime --alt-state-attr createTimestamp --spec-attr acctPolicySubentry --limit-attr accountInactivityLimit
- 重启服务器以载入新插件配置:
# dsctl instance_name restart
20.10.5. 解锁不活动帐户
- 使用 dsidm 工具:
# dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" account unlock "uid=example"
- 通过将
lastLoginTime
属性重置为当前时间戳来手动:# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: uid=example,ou=people,dc=example,dc=com changetype: modify replace: lastLoginTime lastLoginTime: 20210901000000Z
lastLoginTime
属性将其值存储在 GMT/UTC 时间(Zulu 时区),由附加的Z
指示到时间戳。
20.11. 复制帐户锁定属性
passwordRetryCount
retryCountResetTime
accountUnlockTime
20.11.1. 管理帐户锁定和复制
- 在数据供应商上强制执行密码策略。
- 在参与复制的所有服务器上强制使用帐户锁定。
passwordMinAge
andpasswordMaxAge
passwordExp
passwordWarning
- 所有副本都会发出来自即将等待密码过期的服务器的警告。此信息保留在每台服务器上,因此如果用户依次绑定到多个副本,则多次会发出相同的警告。另外,如果用户更改密码,则可能需要时间来将此信息过滤到副本。如果用户更改密码,然后立即重新绑定,则可能会发现绑定失败,直到副本注册更改为止。
- 所有服务器上应该执行相同的绑定行为,包括供应商和副本。确保在每个服务器上创建相同的密码策略配置信息。
- 帐户锁定计数器在多层次环境中可能无法按预期工作。默认情况下,帐户锁定计数器不会被复制(尽管可以进行配置)。如果帐户锁定属性没有复制,则用户可以从一个服务器锁定,但可以成功绑定到另一台服务器(或者,用户可能被解锁在一个服务器上,仍然阻止在另一台服务器上)。如果复制了帐户锁定属性,那么在一个服务器上的帐户锁定变化以及该更改被传播到其他服务器时,可能会滞后。它取决于复制计划。
- 为复制创建的条目(例如,服务器身份)需要有永不过期的密码。要确保这些特殊用户有没有过期的密码,请在条目中添加
passwordExpirationTime
属性,并为它赋予 20380119031407Z (有效范围的顶部)。
alwaysRecordLogin
参数设置为 yes,则 lastLoginTime
属性的值可以在供应商和只读副本上有所不同。例如,如果用户登录到只读副本,则 lastLoginTime
属性会在本地更新,但该值不会复制到供应商服务器。
20.11.2. 配置目录服务器以复制密码策略属性
passwordIsGlobalPolicy
属性,它在消费者目录服务器配置中启用,以允许使用者接受密码策略操作属性。
passwordIsGlobalPolicy
配置参数:
# dsconf -D "cn=Directory Manager" ldap://server.example.com pwpolicy set --pwdisglobal="on"
passwordRetryCount
、retryCountResetTime
和 accountUnlockTime
。
20.11.3. 为密码策略属性配置同步复制
passwordIsGlobalPolicy
属性会影响复制中的消费者,从而使使用者能够接收这些属性的更新。要控制密码策略属性是否实际由供应商复制,请使用部分复制,用于控制复制哪些特定条目属性。
passwordIsGlobalPolicy
属性设置为 off,则不应复制密码策略属性,请使用部分复制(在 第 15.1.7 节 “使用 DNATactional Replication 复制子属性集”中相同)强制该属性在供应商中,并在复制协议中特别排除这些属性。
- 在供应商上配置复制协议时,请单击 Show Advanced Settings。
- 在 Exclude Attributes 字段中输入
passwordRetryCount
、retryCountResetTime
,以及accountUnlockTime
属性名称。 - 完成配置复制协议。
20.12. 启用不同类型的绑定
20.12.1. 需要安全绑定
nsslapd-require-secure-binds
属性,请确保复制协议、同步协议和串联配置指定安全连接。否则,这些操作将失败。
- 将
nsslapd-require-secure-binds
配置参数设置为 on :# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-require-secure-binds=on
- 重启实例:
# dsctl instance_name restart
20.12.2. 禁用匿名绑定
rootdse
允许匿名搜索和读取访问搜索根 DSE 本身,但限制对所有其他目录条目的访问。
- 将
nsslapd-allow-anonymous-access
配置参数设为 off :# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-allow-anonymous-access=off
- 重启实例:
# dsctl instance_name restart
20.12.3. 允许未验证的绑定
# ldapsearch -w "" -p 389 -h server.example.com -b "dc=example,dc=com" \ -s sub -x "(objectclass=*)" ldap_bind: Server is unwilling to perform (53) additional info: Unauthenticated binds are not allowed
nsslapd-allow-unauthenticated-binds
配置选项设置为:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-allow-unauthenticated-binds=on
20.12.4. 配置自动绑定
自动绑定
功能”中)。
20.12.4.1. Autobind 和 LDAPI 概述
- 用户条目,如果 Unix 用户与一个用户条目匹配
- 如果 Unix 用户是 root 用户,或者
nsslapd-ldapimaprootdn
中定义的超级用户,则目录管理器
图 20.1. 自动绑定连接路径
gidNumber=gid+uidNumberuid, autobindsuffix
20.12.4.2. 配置 自动绑定
功能
Autobind
功能只允许对目录服务器的匿名访问。但是,您可以将 Linux 用户映射到目录服务器条目,并将 root
用户映射到 Directory Manager:
- 验证
nsslapd-ldapiautobind
参数是否已启用,这是默认设置:# dsconf -D "cn=Directory Manager" ldap://server.example.com config get nsslapd-ldapiautobind nsslapd-ldapiautobind: on
- 如果将
nsslapd-ldapiautobind
参数设置为 off,请启用它:# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-ldapiautobind=on
- 要映射用户条目,请设置:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-ldapimaptoentries=on nsslapd-ldapiuidnumbertype=uidNumber nsslapd-ldapigidnumbertype=gidNumber nsslapd-ldapientrysearchbase=ou=People,dc=example,dc=com
- nsslapd-ldapimaptoentries=on 启用条目映射。
- nsslapd-ldapiuidnumbertype=uidNumber 设置包含 Unix UID 号的目录服务器中的属性。
- nsslapd-ldapigidnumbertype=gidNumber 设置包含 Unix GID 号的目录服务器中的属性。
- nsslapd-ldapientrysearchbase=ou=People,dc=example,dc=com 设置搜索用户条目的 DN。
- (可选)要将 Red Hat Enterprise Linux 中的
root
用户映射到 Directory Server 中的 cn=Directory Manager 帐户:# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-ldapimaprootdn="cn=Directory Manager"
- 重启实例:
# dsctl instance_name restart
20.13. 使用透传身份验证
图 20.2. 简单传递身份验证过程
- 配置目录服务器(身份验证目录)安装在机器 A 上。配置目录始终包含带有身份验证用户条目的后缀,如 o=114。在本例中,服务器名称为 authdir.example.com。
- 然后,在机器 B 上安装用户目录服务器(PTA 目录)。用户目录存储 root 后缀,如 dc=example,dc=com。在本例中,服务器名称为 userdir.example.com。
- 使用以下命令在 userdir.example.com 上设置插件:
# dsconf -D "cn=Directory Manager" ldap://userdir.example.com plugin pass-through-auth enable # dsconf -D "cn=Directory Manager" ldap://userdir.example.com plugin pass-through-auth url add "ldap://authdir.example.com/o=RedHat"
- 在 userdir.example.com 上重新启动目录服务器。
- 用户主目录现在被配置为,向配置目录 authdir.example.com 发送带有包括 o=RedHat 的 DN 的所有绑定请求。
- 用户目录允许 o=rhcs 中的任何用户 绑定。
20.13.1. PTA 插件语法
- 添加直通身份验证 URL:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin pass-through-auth url add URL
- 修改直通身份验证 URL:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin pass-through-auth url modify old_URL new_URL
- 删除直通身份验证 URL:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin pass-through-auth url delete URL
nsslapd-pluginarg
属性后缀来指定几个验证目录或子树,如 第 20.13.3.2 节 “指定多个验证目录服务器” 所述。例如:
nsslapd-pluginarg0: LDAP URL for the first server nsslapd-pluginarg1: LDAP URL for the second server nsslapd-pluginarg2: LDAP URL for the third server ...
变量 | 定义 | ||
---|---|---|---|
state | 定义插件是否启用或禁用。可接受值为 on 或 off。 | ||
ldap|ldaps | 定义 TLS 是否用于两个目录服务器之间的通信。请参阅 第 20.13.2.1 节 “配置服务器以使用安全连接” 了解更多信息。 | ||
authDS | 身份验证目录主机名。通过添加冒号,然后添加端口号,可以给定目录服务器的端口号。例如: ldap://dirserver.example.com:389/。如果没有指定端口号,PTA 服务器会尝试使用其中一个标准端口进行连接:
| ||
子树 | 直通子树。PTA 目录服务器从 DN 位于此子树中的所有客户端通过绑定请求传递给身份验证目录服务器。请参阅 第 20.13.2.3 节 “指定 Pass-Through Subtree” 了解更多信息。此服务器上不能存在此子树。 | ||
maxconns | 可选。PTA 目录可以同时打开到身份验证目录的最大连接数。默认值为 3。请参阅 第 20.13.2.4 节 “配置可选参数” 了解更多信息。 | ||
maxops | 可选。PTA 目录可以同时同时操作的最大数量(通常是绑定请求)可以发送到单一连接中的身份验证目录。默认值为 5。请参阅 第 20.13.2.4 节 “配置可选参数” 了解更多信息。 | ||
timeout | 可选。PTA 目录从身份验证目录服务器等待响应的时间限制(以秒为单位)。如果超过这个超时,服务器会向客户端返回错误。默认值为 300 秒(5 分钟)。指定零(0)以指示不应强制实施时间限制。请参阅 第 20.13.2.4 节 “配置可选参数” 了解更多信息。 | ||
ldver | 可选。用于连接到身份验证目录的 LDAP 协议版本。目录服务器支持 LDAP 版本 2 和 3。默认为版本 3,红帽强烈建议不要使用 LDAPv2,因为它是非常旧且已被弃用的技术。请参阅 第 20.13.2.4 节 “配置可选参数” 了解更多信息。 | ||
connlifetime | 可选。可以使用连接的时间限制(以秒为单位)。如果在这段时间到期后客户端启动绑定请求,服务器将关闭连接并打开与身份验证目录的新连接。除非启动了绑定请求,否则服务器不会关闭连接,并且目录决定超过连接生命周期。如果没有指定这个选项,或者只列出一个主机,则不会强制执行连接生命周期。如果列出了两个或多个主机,则默认为 300 秒(5 分钟)。请参阅 第 20.13.2.4 节 “配置可选参数” 了解更多信息。 | ||
startTLS |
可选。使用 STARTTLS 进行与身份验证目录的连接的标记。STARTTLS 通过标准端口建立安全连接,因此使用 LDAP 而不是 LDAPS 连接非常有用。TLS 服务器和 CA 证书都需要在两个服务器上可用。
默认值为 0, 即关闭。要启用 STARTTLS,请将其设置为 1。要使用 STARTTLS,LDAP URL 必须使用 ldap:,而不是 ldaps:。
请参阅 第 20.13.2.4 节 “配置可选参数” 了解更多信息。
|
20.13.2. 配置 PTA 插件
- 使用 dsconf 插件 pass-through-auth 命令修改 cn=Pass Through Authentication,cn=plugins,cn=config 条目。
- 重启目录服务器。
20.13.2.1. 配置服务器以使用安全连接
nsslapd-pluginarg0: ldaps://ldap.example.com:636/o=example
20.13.2.2. 指定 Authenticating 目录服务器
- 使用 dsconf 插件 pass-through-auth 命令编辑 PTA 插件条目:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin pass-through-auth add ldap://server.example.com/o=example
(可选)包含端口号。如果没有提供端口号,PTA Directory 服务器会尝试对 ldap:// 使用标准端口(389)或 ldaps:// 的安全端口(636)进行连接。如果 PTA 目录服务器和身份验证目录服务器之间的连接中断或者无法打开连接,则 PTA 目录服务器会将请求发送到指定的下一个服务器(若有)。根据需要,可以指定多个目录服务器,以便在第一个目录服务器不可用时提供故障转移。所有身份验证目录服务器都在nsslapd-pluginarg0
属性中设置。多个身份验证目录服务器以空格分隔的 host:port 对列表中列出,其格式如下:ldap|ldaps://host1:port1 host2:port2/subtree
- 重新启动服务器。
# dsctl instance_name restart
20.13.2.3. 指定 Pass-Through Subtree
- 使用 dsconf 插件 pass-through-auth 命令将 LDIF 文件导入到目录中:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin pass-through-auth add ldap://server.example.com/o=example
有关此语法中的变量组件的详情,请参考 表 20.3 “PTA 插件参数”。 - 重启服务器:
# dsctl instance_name restart
20.13.2.4. 配置可选参数
ldap|ldaps://authDS/subtree maxconns, maxops, timeout, ldver, connlifetime, startTLS
- PTA 目录服务器可以同时打开到身份验证目录的最大连接数,由 PTA 语法中的 maxconns 表示。默认值为 3。
- PTA 目录服务器可同时向单个连接中的身份验证目录服务器发送的最大绑定请求数量。在 PTA 语法中,此参数是 maxops。默认值为 5。
- PTA 目录服务器的时间限制,以等待来自身份验证目录服务器的响应。在 PTA 语法中,这个参数是 超时。默认值为 300 秒(5 分钟)。
- 用于连接到身份验证目录服务器的 PTA 目录服务器的 LDAP 协议版本。在 PTA 语法中,此参数是 ldver。默认值为 LDAPv3。
- 可以使用连接的时间限制(以秒为单位)。如果在这段时间到期后客户端启动绑定请求,服务器将关闭连接并打开与身份验证目录服务器的新连接。除非启动了绑定请求,服务器不会关闭连接,并且服务器确定已超过超时。如果没有指定这个选项,或者在 authDS 参数中只列出一个身份验证目录服务器,则不会强制执行时间限制。如果列出了两个或多个主机,则默认为 300 秒(5 分钟)。在 PTA 语法中,这个参数是 connlifetime。
- 是否将 STARTTLS 用于连接。STARTTLS 通过标准 LDAP 端口创建一个安全连接。对于 STARTTLS,服务器必须安装有服务器和 CA 证书,但它们不需要在 TLS 中运行。默认值为 0, 即 STARTTLS 为 off。要启用 STARTTLS,请将其设置为 1。要使用 STARTTLS,LDAP URL 必须使用 ldap:,而不是 ldaps:。
- 使用 dsconf 插件 pass-through-auth 命令编辑插件条目:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin pass-through-auth add ldap://server.example.com/o=example 3,5,300,3,300,0
(在这个示例中,每个可选参数都被设置为默认值。) 确保 subtree 参数和可选参数之间有一个空格。注意虽然这些参数是可选的,但如果定义了其中任何一个参数,但也必须定义它们,即使它们使用了默认值。 - 重启服务器:
# dsctl instance_name restart
20.13.3. PTA 插件语法示例
dse.ldif
文件中 PTA 插件语法示例:
20.13.3.1. 指定一个 Authenticating Directory 服务器和一个 Subtree
dn: cn=Pass Through Authentication,cn=plugins,cn=config ... nsslapd-pluginEnabled: on nsslapd-pluginarg0: ldap://configdir.example.com/o=example ...
20.13.3.2. 指定多个验证目录服务器
nsslapd-pluginarg0
属性中设置。多个身份验证目录服务器列在 host:port 对列表中。例如:
dn: cn=Pass Through Authentication,cn=plugins,cn=config ... nsslapd-pluginEnabled: on nsslapd-pluginarg0: ldap://configdir.example.com:389 config2dir.example.com:1389/o=example ...
nsslapd-pluginarg0
属性设置身份验证目录服务器;额外的 nsslapd-pluginargN
属性可以为 PTA 插件设置额外的 后缀,但不设置额外的 主机。
20.13.3.3. 指定一个目录服务器和多个子树
dn: cn=Pass Through Authentication,cn=plugins,cn=config ... nsslapd-pluginEnabled: on nsslapd-pluginarg0: ldap://configdir.example.com/o=example nsslapd-pluginarg1: ldap://configdir.example.com/dc=example,dc=com ...
20.13.3.4. 使用非默认值参数值
dn: cn=Pass Through Authentication,cn=plugins,cn=config ... nsslapd-pluginEnabled: on nsslapd-pluginarg0: ldap://configdir.example.com/o=example 10,5,300,3,300,1 ...
20.13.3.5. 为不同的目录服务器指定不同的可选参数和子树
dn: cn=Pass Through Authentication,cn=plugins,cn=config ... nsslapd-pluginEnabled: on nsslapd-pluginarg0:ldap://configdir.example.com/o=example 10,15,30,3,600,0 nsslapd-pluginarg1:ldap://config2dir.example.com/dc=example,dc=com 7,7,300,3,300,1 ...
20.14. 使用 Active Directory 格式的用户名进行身份验证
uid=user_name,ou=People,dc=example,dc=com
进行验证。但是 DN 可能会难以记住。如果启用并配置 AD DN 插件,您可以使用 Active Directory 格式的用户名,如 user_name
或 user_name@域
,而不是 DN。
example.com
作为默认域:
- 添加 cn=addn,cn=plugins,cn=config 插件条目并设置默认域:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=addn,cn=plugins,cn=config changetype: add objectClass: top objectClass: nsSlapdPlugin objectClass: extensibleObject cn: addn nsslapd-pluginPath: libaddn-plugin nsslapd-pluginInitfunc: addn_init nsslapd-pluginType: preoperation nsslapd-pluginEnabled: on nsslapd-pluginId: addn nsslapd-pluginVendor: 389 Project nsslapd-pluginVersion: 1.3.6.0 nsslapd-pluginDescription: Allow AD DN style bind names to LDAP addn_default_domain: example.com
插件条目中所需的addn_default_domain
参数会设置默认域。如果在身份验证过程中指定的用户名不包含域名,则插件会附加此域。 - 为默认域添加配置条目:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=example.com,cn=addn,cn=plugins,cn=config changetype: add objectClass: top objectClass: extensibleObject cn: example.com addn_base: ou=People,dc=example,dc=com addn_filter: (&(objectClass=account)(uid=%s))
有关示例中使用的参数的详情,请查看 红帽目录服务器配置、命令和文件参考 中的描述。警告必须至少为默认域添加配置条目。如果缺少该条目,Directory 服务器将无法启动。 - 另外,您还可以按照上一步所述创建额外的域配置来支持多个域名。每个域配置都可以使用不同的搜索基础和过滤器。
- 重启 Directory 服务器实例:
# dsctl instance_name restart
20.15. 使用 PAM 进行传递身份验证
图 20.3. PAM 传递身份验证过程
20.15.1. PAM 直通身份验证配置选项
- 由 PAM Pass Through Auth 插件控制的后缀。这涵盖了要排除的后缀,包括后缀以及如何处理缺少的后缀。
- 配置的后缀中的单个条目,它们是身份验证配置的目标。默认情况下,后缀中的所有条目都包含在身份验证范围内,但可以配置多个不同的 PAM Through Auth 插件实例,然后将不同的插件配置应用到不同的用户。
- PAM 属性映射。提供给目录服务器的凭据必须以某种方式映射到 LDAP 条目,然后返回到 PAM 服务中的凭据。这可以通过定义映射方法,然后(可选)用来匹配凭据的 LDAP 属性来完成。
- 常规配置,如使用 TLS 连接、PAM 服务使用,以及是否回退到 LDAP 身份验证(如果 PAM 身份验证失败)。
pamFilter
属性设置 LDAP 过滤器来搜索要用于插件的特定条目的子集。
20.15.1.1. 为 PAM PTA 指定目标的后缀
pamExcludeSuffix
属性排除一个后缀。默认情况下,只有配置子树(cn=config)会被排除。或者,PAM PTA 插件可以应用到带有 pamIncludeSuffix
属性的后缀。这两个属性都是多值。
pamExcludeSuffix: cn=config
pamIncludeSuffix
时,仅包含给定的后缀,所有其他后缀都会被自动排除。由于此属性是多值的,因此可以通过明确列出后缀,将多个后缀包含在 PAM 评估中。
pamIncludeSuffix: ou=Engineering,dc=example,dc=com pamIncludeSuffix: ou=QE,dc=example,dc=com
pamMissingSuffix
属性告知服务器在指定的后缀(包括或排除)不存在时如何处理失败。如果设置为 IGNORE,如果没有后缀,则插件仅跳过该后缀并尝试下一个后缀。
pamMissingSuffix: IGNORE pamIncludeSuffix: ou=Engineering,dc=example,dc=com pamIncludeSuffix: ou=Not Real,dc=example,dc=com
20.15.1.2. 将不同的 PAM 直通身份验证配置应用到不同的条目
pamFilter
属性中指定 LDAP 过滤器,该过滤器标识要通过身份验证策略应用到的后缀中的特定条目。
20.15.1.3. 设置 PAM PTA 映射
pamIDMapMethod: RDN ENTRY DN
映射 | 描述 |
---|---|
RDN | 此方法使用绑定 DN 中最接近 RDN 的值。这个方法的映射是由目录服务器定义的。如果没有给出,这是默认映射方法。 |
ENTRY | 此方法从绑定 DN 条目中的用户定义的属性拉取 PAM 身份的值。identity 属性在 pamIDAttr 属性中定义。例如: pamIDAttr: customPamUid |
DN | 此方法使用与绑定 DN 的完整可分辨名称。这个方法的映射是由目录服务器定义的。 |
20.15.1.4. 配置常规 PAM PTA 设置
- 要发送到 PAM 的服务名称(pamService);这是要在
/etc/pam.d
中使用的配置文件的名称 - 是否需要安全连接(pamSecure)
- 如果 PAM 身份验证失败,是否回退到 LDAP 身份验证(pamFallback)
pamFallback: false pamSecure: false pamService: ldapserver
20.15.2. 配置 PAM 透传身份验证
pamFilter
属性设置 LDAP 过滤器来搜索要与插件搭配使用的特定条目。
- 确保 PAM 服务已被完全配置。
- 从 PAM 配置文件中删除 pam_fprintd.so 模块。重要pam_fprintd.so 模块不能位于 PAM Pass Through Auth 插件配置的
pamService
属性引用的配置文件中。使用 PAM fprintd 模块会导致 Directory 服务器达到最大文件描述符限制,并可能导致 Directory 服务器进程中止。 - 启用 PAM Pass Through Auth 插件:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin set "PAM Pass Through Auth" --enabled on
- 创建 PAM Pass Through Auth 配置条目:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin pass-through-auth pam-config "Admin PAM PTA Config" add --exclude-suffix="cn=config" --id_map_method="RDN ENTRY" --id-attr="customPamUid" --filter="(manager=uid=example_user,ou=people,dc=example,dc=com pamFallback: FALSE" --secure="TRUE" --service="ldapserver"
- 重启实例:
# dsctl instance_name restart
20.15.3. 在 Active Directory 中使用 PAM 传递身份验证作为后端
图 20.4. 使用 SSSD 进行 PAM 传递身份验证
- 将 SSSD 配置为使用 Active Directory 服务器作为其身份提供程序之一。此配置包括在 RHEL 系统直接与 Windows Active Directory 集成中的使用 SSSD 将 RHEL 系统直接连接到 AD 部分。
- 启用 PAM Pass Through Auth 插件,如下所示:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin set "PAM Pass Through Auth" --enabled on
- 创建 PAM Pass Through Auth 配置条目,如下所示:
# dsconf -D "cn=Directory Manager" ldap://server.example.com plugin pass-through-auth pam-config "AD PAM PTA Config" add --id_map_method="ENTRY" --id-attr="uid" --service="login" --include-suffix="ou=people,dc=example,dc=com" --missing-suffix="ERROR"
这个示例使用uid LDAP
属性作为用户名传递给 Active Directory,并只为人 OU 启用此配置。 - 重新启动目录服务器实例,以加载配置。
# dsctl instance_name restart
20.16. 手动取消激活用户和角色
nsAccountLock
来激活用户和角色。当条目包含值为 true 的 nsAccountLock
属性时,服务器会拒绝绑定。
20.16.1. 显示帐户或角色的状态
- 帐户,请输入:
# dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" account entry-status "uid=user_name,ou=People,dc=example,dc=com" Entry DN: uid=user_name,ou=People,dc=example,dc=com Entry Creation Date: 20200813085535Z (2020-08-13 08:55:35) Entry Modification Date: 20200813085535Z (2020-08-13 08:55:35) Entry State: activated
可选:将-V
选项传递给命令以显示附加详情:# dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" account entry-status "uid=user_name,ou=People,dc=example,dc=com" -V Entry DN: uid=user_name,ou=People,dc=example,dc=com Entry Creation Date: 20200824160645Z (2020-08-24 16:06:45) Entry Modification Date: 20200824160645Z (2020-08-24 16:06:45) Entry Last Login Date: 20200824160645Z (2020-08-24 16:06:45) Entry Time Until Inactive: 2 seconds (2020-08-24 16:07:45) Entry State: activated
以上输出是一个活跃的帐户示例,如输出的最后两行所示。不活动的帐户会提供类似如下的输出:# dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" account entry-status "uid=user_name,ou=People,dc=example,dc=com" -V Entry DN: uid=user_name,ou=People,dc=example,dc=com Entry Creation Date: 20200824160645Z (2020-08-24 16:06:45) Entry Modification Date: 20200824160645Z (2020-08-24 16:06:45) Entry Last Login Date: 20200824160645Z (2020-08-24 16:06:45) Entry Time Since Inactive: 3 seconds (2020-08-24 16:07:45) Entry State: inactivity limit exceeded
- 角色,请输入:
# dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" role entry-status "cn=Marketing,ou=People,dc=example,dc=com" Entry DN: cn=Marketing,ou=people,dc=example,dc=com Entry State: activated
subtree-status
而不是 entry-status
选项。使用 subtree-status
选项时,您可以指定过滤器(-f
)和搜索范围(-s)
来缩小结果范围。另外,您可以使用 -i
选项重新定义搜索,使其只返回不活跃的帐户或 -o date
选项,仅返回在指定日期前不活跃的帐户:
# dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" account account "ou=People,dc=example,dc=com" -f "(uid=*)" -V -o "2020-08-25T14:30:30"
20.16.2. 使用命令行激活和激活用户和角色
- 用户帐户,请输入:
# dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" account lock "uid=user_name,ou=People,dc=example,dc=com
- 角色,请输入:
# dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" role lock "cn=Marketing,ou=People,dc=example,dc=com
- 用户帐户,请输入:
# dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" account unlock "uid=user_name,ou=People,dc=example,dc=com
- 角色,请输入:
# dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" role unlock "cn=Marketing,ou=People,dc=example,dc=com
第 21 章 监控服务器和数据库活动
21.1. 目录服务器日志文件的类型
- 访问日志 :包含有关客户端连接和与目录服务器实例的连接的信息。此日志类型默认启用。
- 错误日志:包含错误的详细信息,以及目录在正常操作过程中遇到的事件的详细信息。此日志类型默认启用。警告如果 Directory 服务器无法写入错误日志,服务器会向 Syslog 服务发送错误消息并退出。此日志类型默认启用。
- 审计日志:记录对每个数据库所做的更改以及服务器配置。默认不启用此日志。
- 审计日志:记录失败的审计事件。默认不启用此日志。
21.2. 显示日志文件
21.2.1. 使用命令行显示日志文件
# less /var/log/dirsrv/slapd-instance_name/access
# dsconf -D "cn=Directory Manager" ldap://server.example.com config get nsslapd-accesslog nsslapd-errorlog nsslapd-auditlog nsslapd-auditfaillog nsslapd-accesslog: /var/log/dirsrv/slapd-instance_name/access nsslapd-errorlog: /var/log/dirsrv/slapd-instance_name/errors nsslapd-auditlog: /var/log/dirsrv/slapd-instance_name/audit nsslapd-auditfaillog: /var/log/dirsrv/slapd-instance_name/audit-failure
21.2.2. 使用 Web 控制台显示日志文件
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单。
- 打开菜单,然后选择您要显示的日志文件。
- 另外,您还可以将以下设置应用到日志文件查看器中:
- 设置要在 Log Lines To Show 字段中显示的行数。
- 通过选择 continuously Refresh 来启用自动显示新日志条目。
- 单击按钮以应用更改。
21.3. 配置日志文件
21.3.1. 启用或禁用日志
21.3.1.1. 使用命令行启用或禁用日志记录
- 访问日志:
nsslapd-accesslog-logging-enabled
- 错误日志:
nsslapd-errorlog-logging-enabled
- 审计日志:
nsslapd-auditlog-logging-enabled
- 审计失败日志:
nsslapd-auditfaillog-logging-enabled
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-auditlog-logging-enabled=on
21.3.1.2. 使用 Web 控制台启用或禁用日志记录
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开菜单,然后在 条目下选择要配置的日志类型。
- 为所选日志类型启用或禁用日志记录功能。
- (可选)设置额外的参数来定义,例如日志轮转或日志删除策略。
- 点击。
21.3.2. 配置特定于插件的日志记录
21.3.3. 禁用高分辨率日志时间戳
[27/May/2016:17:52:04.754335904 -0500] schemareload - Schema validation passed. [27/May/2016:17:52:04.894255328 -0500] schemareload - Schema reload task finished.
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-logging-hr-timestamps-enabled=off
[27/May/2016:17:52:04 -0500] schemareload - Schema validation passed. [27/May/2016:17:52:04 -0500] schemareload - Schema reload task finished.
21.3.4. 定义日志文件轮转策略
- 访问模式
- 访问模式对新创建的日志文件设置文件权限。
- 访问日志:
nsslapd-accesslog-mode
- 错误日志:
nsslapd-errorlog-mode
- 审计日志:
nsslapd-auditlog-mode
- 审计失败日志:
nsslapd-auditfaillog-mode
- 日志的最大数量
- 设置要返回的最大日志文件数。达到文件数量时,Directory 服务器会在创建新日志文件前删除最旧的日志文件。
- 访问日志:
nsslapd-accesslog-maxlogsperdir
- 错误日志:
nsslapd-errorlog-maxlogsperdir
- 审计日志:
nsslapd-auditlog-maxlogsperdir
- 审计失败日志:
nsslapd-auditfaillog-maxlogsperdir
- 每个日志的文件大小
- 以 MB 为单位设置日志文件的最大大小,然后再轮转。
- 访问日志:
nsslapd-accesslog-maxlogsize
- 错误日志:
nsslapd-errorlog-maxlogsize
- 审计日志:
nsslapd-auditlog-maxlogsize
- 审计失败日志:
nsslapd-auditfaillog-maxlogsize
- 各自创建一个日志
- 设置日志文件的最长年龄。
nsslapd-accesslog-logrotationtime
andnsslapd-accesslog-logrotationtimeunit
nsslapd-errorlog-logrotationtime
andnsslapd-errorlog-logrotationtimeunit
nsslapd-auditlog-logrotationtime
andnsslapd-auditlog-logrotationtimeunit
nsslapd-auditfaillog-logrotationtime
andnsslapd-auditfaillog-logrotationtimeunit
另外,您可以使用以下参数轮转日志文件的时间:nsslapd-accesslog-logrotationsynchour
和nsslapd-accesslog-logrotationsyncmin
nsslapd-errorlog-logrotationsynchour
和nsslapd-errorlog-logrotationsyncmin
nsslapd-auditlog-logrotationsynchour
andnsslapd-auditlog-logrotationsyncmin
nsslapd-auditfaillog-logrotationsynchour
和nsslapd-auditfaillog-logrotationsyncmin
389-Directory/1.4.0.11 B2018.197.1151 server.example.com:389 (/etc/dirsrv/slapd-instance)
21.3.4.1. 使用命令行定义日志文件轮转策略
600
,以保持最大 2
个,并轮转日志文件大小为 100
MB 或每 5 天
,请输入:
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-errorlog-mode=600 nsslapd-errorlog-maxlogsperdir=2 nsslapd-errorlog-maxlogsize=100 nsslapd-errorlog-logrotationtime=5 nsslapd-errorlog-logrotationtimeunit=day
21.3.4.2. 使用 Web 控制台定义日志文件轮转策略
21.3.5. 定义日志文件删除策略
存档文件
。
- 日志总大小
- 如果所有访问、错误、审计或审计失败日志文件的大小都增加配置的值,则会自动删除最旧的日志文件。
- 访问日志:
nsslapd-accesslog-logmaxdiskspace
- 错误日志:
nsslapd-errorlog-logmaxdiskspace
- 审计日志:
nsslapd-auditlog-logmaxdiskspace
- 审计日志:
nsslapd-auditfaillog-logmaxdiskspace
- 可用磁盘空间小于
- 当可用磁盘空间达到这个值时,最旧的存档文件会被自动删除。
- 访问日志:
nsslapd-accesslog-logminfreediskspace
- 错误日志:
nsslapd-errorlog-logminfreediskspace
- 审计日志:
nsslapd-auditlog-logminfreediskspace
- 审计日志:
nsslapd-auditfaillog-logminfreediskspace
- 当文件早于指定时间时
- 当日志文件早于配置的时间时,它会被自动删除。
- 访问日志:
nsslapd-accesslog-logexpirationtime
和nsslapd-accesslog-logexpirationtimeunit
- 错误日志:
nsslapd-errorlog-logminfreediskspace
和nsslapd-errorlog-logexpirationtimeunit
- 审计日志:
nsslapd-auditlog-logminfreediskspace
和nsslapd-auditlog-logexpirationtimeunit
- 审计日志:
nsslapd-auditfaillog-logminfreediskspace
和nsslapd-auditfaillog-logexpirationtimeunit
21.3.5.1. 使用命令行配置日志删除策略
500
MB,则自动删除最旧的访问日志文件,请运行:
dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-accesslog-logmaxdiskspace=500
21.3.5.2. 使用 Web 控制台配置日志删除策略
21.3.6. 手动日志文件轮转
/var/log/dirsrv/slapd-instance
- 停止该实例。
# dsctl instance_name stop
- 移动或重命名正在轮转的日志文件,以便旧日志文件可用于将来的参考。
- 启动实例:
# dsctl instance_name restart
21.3.7. 配置日志级别
- 访问日志:
nsslapd-accesslog-level
- 错误日志:
nsslapd-errorlog-level
21.3.7.1. 使用命令行配置日志级别
nsslapd-errorlog-level
参数设置为 96 (32 + 64):
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-errorlog-level=96
nsslapd-accesslog-level
参数设置为 260 (4 + 256):
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-accesslog-level=260
21.3.7.2. 使用 Web 控制台配置日志级别
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 配置:
- 访问日志级别:
- 打开→ → 菜单。
- 在 Access Logging Levels 部分中选择日志级别。例如:
- 错误日志级别:
- 打开→ → 菜单。
- 在 Error Logging Levels 部分中选择日志级别。例如:
- 点击。
21.3.7.3. 日志记录内部操作
- 服务器发起的内部操作
- 服务器启动的内部操作日志条目示例:
[14/Jan/2021:09:45:25.814158882 -0400] conn=Internal(0) op=0(0)(0) MOD dn="cn=uniqueid generator,cn=config" [14/Jan/2021:09:45:25.822103183 -0400] conn=Internal(0) op=0(0)(0) RESULT err=0 tag=48 nentries=0 etime=0.0007968796
对于此类型的日志条目:conn
字段设置为 Internal,后跟 (0)。op
字段设置为 0 (0) (nesting_level)。对于服务器发起的内部操作,操作 ID 和内部操作 ID 始终为 0。对于没有嵌套的日志条目,嵌套级别为 0。
- 客户端发起的内部操作
- 客户端启动的内部操作日志条目示例:
[14/Jan/2021:09:45:14.382918693 -0400] conn=5 (Internal) op=15(1)(0) SRCH base="cn=config,cn=userroot,cn=ldbm database,cn=plugins,cn=config" scope=1 filter="objectclass=vlvsearch" attrs=ALL [14/Jan/2021:09:45:14.383191380 -0400] conn=5 (Internal) op=15(1)(0) RESULT err=0 tag=48 nentries=0 etime=0.0000295419 [14/Jan/2021:09:45:14.383216269 -0400] conn=5 (Internal) op=15(2)(0) SRCH base="cn=config,cn=example,cn=ldbm database,cn=plugins,cn=config" scope=1 filter="objectclass=vlvsearch" attrs=ALL [14/Jan/2021:09:45:14.383449419 -0400] conn=5 (Internal) op=15(2)(0) RESULT err=0
对于此类型的日志条目:conn
字段设置为客户端连接 ID,后跟字符串 (内部)。op
字段包含操作 ID,后跟 (internal_operation_ID) (嵌套ing_level)。内部操作 ID 可能会有所不同,没有嵌套的日志条目,嵌套级别为 0。
nsslapd-plugin-logging
参数设置为 on,并且启用了内部操作日志记录,目录服务器还会记录插件的内部操作。
例 21.1. 启用插件的内部操作日志条目
uid=user,dc=example,dc=com
条目,并且引用 完整性 插件会自动从 example
组中删除此条目,服务器日志:
[time_stamp] conn=2 op=37 DEL dn="uid=user,dc=example,dc=com" [time_stamp] conn=2 (Internal) op=37(1) SRCH base="uid=user,dc=example,dc=com" scope=0 filter="(|(objectclass=*)(objectclass=ldapsubentry))" attrs=ALL [time_stamp] conn=2 (Internal) op=37(1) RESULT err=0 tag=48 nentries=1 etime=0.0000129148 [time_stamp] conn=2 (Internal) op=37(2) SRCH base="dc=example,dc=com" scope=2 filter="(member=uid=user,dc=example,dc=com)" attrs="member" [time_stamp] conn=2 (Internal) op=37(2) RESULT err=0 tag=48 nentries=0 etime=0.0000123162 [time_stamp] conn=2 (Internal) op=37(3) SRCH base="dc=example,dc=com" scope=2 filter="(uniquemember=uid=user,dc=example,dc=com)" attrs="uniquemember" [time_stamp] conn=2 (Internal) op=37(3) RESULT err=0 tag=48 nentries=1 etime=0.0000128104 [time_stamp] conn=2 (Internal) op=37(4) MOD dn="cn=example,dc=example,dc=com" [time_stamp] conn=2 (Internal) op=37(5) SRCH base="cn=example,dc=example,dc=com" scope=0 filter="(|(objectclass=*)(objectclass=ldapsubentry))" attrs=ALL [time_stamp] conn=2 (Internal) op=37(5) RESULT err=0 tag=48 nentries=1 etime=0.0000130685 [time_stamp] conn=2 (Internal) op=37(4) RESULT err=0 tag=48 nentries=0 etime=0.0005217545 [time_stamp] conn=2 (Internal) op=37(6) SRCH base="dc=example,dc=com" scope=2 filter="(owner=uid=user,dc=example,dc=com)" attrs="owner" [time_stamp] conn=2 (Internal) op=37(6) RESULT err=0 tag=48 nentries=0 etime=0.0000137656 [time_stamp] conn=2 (Internal) op=37(7) SRCH base="dc=example,dc=com" scope=2 filter="(seeAlso=uid=user,dc=example,dc=com)" attrs="seeAlso" [time_stamp] conn=2 (Internal) op=37(7) RESULT err=0 tag=48 nentries=0 etime=0.0000066978 [time_stamp] conn=2 (Internal) op=37(8) SRCH base="o=example" scope=2 filter="(member=uid=user,dc=example,dc=com)" attrs="member" [time_stamp] conn=2 (Internal) op=37(8) RESULT err=0 tag=48 nentries=0 etime=0.0000063316 [time_stamp] conn=2 (Internal) op=37(9) SRCH base="o=example" scope=2 filter="(uniquemember=uid=user,dc=example,dc=com)" attrs="uniquemember" [time_stamp] conn=2 (Internal) op=37(9) RESULT err=0 tag=48 nentries=0 etime=0.0000048634 [time_stamp] conn=2 (Internal) op=37(10) SRCH base="o=example" scope=2 filter="(owner=uid=user,dc=example,dc=com)" attrs="owner" [time_stamp] conn=2 (Internal) op=37(10) RESULT err=0 tag=48 nentries=0 etime=0.0000048854 [time_stamp] conn=2 (Internal) op=37(11) SRCH base="o=example" scope=2 filter="(seeAlso=uid=user,dc=example,dc=com)" attrs="seeAlso" [time_stamp] conn=2 (Internal) op=37(11) RESULT err=0 tag=48 nentries=0 etime=0.0000046522 [time_stamp] conn=2 op=37 RESULT err=0 tag=107 nentries=0 etime=0.0010297858
21.3.8. 禁用用于调试的访问日志缓冲
21.3.8.1. 使用命令行禁用访问日志缓冲
- 将
nsslapd-accesslog-logbuffering
参数设置为 off :# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-accesslog-logbuffering=off
21.3.8.2. 使用 Web 控制台禁用访问日志缓冲
- 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”。
- 选择实例。
- 打开→ → 。
- 选择 Disable Access Log Buffering。
- 单击。
21.4. 获取访问日志统计信息
logconv.pl
脚本解析访问日志,并返回服务器上运行的不同用户和操作的摘要信息。
# logconv.pl /relative/path/to/accessLog
# logconv.pl /var/log/dirsrv/slapd-instance/access*
logconv.pl
的不同选项在 man page 和 Configuration, Command, and File Reference 中介绍。
logconv.pl
可以通过多种方式从访问日志中拉取常规使用信息。
logconv.pl
会打印总操作列表、连接总数、每种操作类型计数,以及持久性搜索等某些扩展操作计数。
# logconv.pl /var/log/dirsrv/slapd-instance/access Access Log Analyzer 8.2 Command: logconv.pl /var/log/dirsrv/slapd-instance/access Processing 1 Access Log(s)... [001] /var/log/dirsrv/slapd-instance/access size (bytes): 77532 Total Log Lines Analysed: 527 Start of Logs: 14/Oct/2017:16:15:22.452909568 End of Logs: 14/Oct/2017:16:39:50.157790196 Processed Log Time: 0 Hours, 24 Minutes, 27.704877056 Seconds Restarts: 10 Secure Protocol Versions: - TLS1.2 client bound as uid=user_name,ou=people,o=example.com (11 connections) - TLS1.2 128-bit AES; client CN=CA Subsystem,O=example.com; issuer CN=Certificate Authority,O=example.com (11 connections) - TLS1.2 128-bit AES-GCM (2 connections) - TLS1.2 128-bit AES (3 connections) Peak Concurrent Connections: 38 Total Operations: 4771 Total Results: 4653 Overall Performance: 97.5% Total Connections: 249 (0.17/sec) (10.18/min) - LDAP Connections: 107 (0.07/sec) (4.37/min) - LDAPI Connections: 128 (0.09/sec) (5.23/min) - LDAPS Connections: 14 (0.01/sec) (0.57/min) - StartTLS Extended Ops: 2 (0.00/sec) (0.08/min) Searches: 2963 (2.02/sec) (121.13/min) Modifications: 649 (0.44/sec) (26.53/min) Adds: 785 (0.53/sec) (32.09/min) Deletes: 10 (0.01/sec) (0.41/min) Mod RDNs: 6 (0.00/sec) (0.25/min) Compares: 0 (0.00/sec) (0.00/min) Binds: 324 (0.22/sec) (13.25/min) Proxied Auth Operations: 0 Persistent Searches: 17 Internal Operations: 0 Entry Operations: 0 Extended Operations: 4 Abandoned Requests: 0 Smart Referrals Received: 0 VLV Operations: 30 VLV Unindexed Searches: 0 VLV Unindexed Components: 20 SORT Operations: 22 Entire Search Base Queries: 12 Paged Searches: 2 Unindexed Searches: 0 Unindexed Components: 149 FDs Taken: 249 FDs Returned: 212 Highest FD Taken: 107 Broken Pipes: 0 Connections Reset By Peer: 0 Resource Unavailable: 0 Max BER Size Exceeded: 0 Binds: 324 Unbinds: 155 --------------------------------- - LDAP v2 Binds: 41 - LDAP v3 Binds: 180 - AUTOBINDs(LDAPI): 103 - SSL Client Binds: 0 - Failed SSL Client Binds: 0 - SASL Binds: 134 - EXTERNAL: 114 - GSSAPI: 20 - Directory Manager Binds: 10 - Anonymous Binds: 1 Cleaning up temp files... Done.
b
) 数量,由服务器 (c
) 返回的总连接代码通过 -bc
传递。
# logconv.pl -bc /var/log/dirsrv/slapd-instance/access ... ----- Total Connection Codes ----- U1 3 Cleanly Closed Connections B1 1 Bad Ber Tag Encountered ----- Top 20 Bind DN's ----- Number of Unique Bind DN's: 212 1801 cn=Directory Manager 1297 Anonymous Binds 311 uid=jsmith,ou=people... 87 uid=bjensen,ou=peopl... 85 uid=mreynolds,ou=peo... 69 uid=jrockford,ou=peo... 55 uid=sspencer,ou=peop... ...
-S
)或范围内,数据可以限制为特定开始时间(-
S)后的条目。设置开始和结束时间后,logconv.pl
会首先打印给定的时间范围,然后显示该周期的概述。
# logconv.pl -S "[01/Jul/2016:16:11:47.000000000 -0400]" -E "[01/Jul/2016:17:23:08.999999999 -0400]" /var/log/dirsrv/slapd-instance/access ... ----------- Access Log Output ------------ Start of Logs: 01/Jul/2016:16:11:47 End of Logs: 01/Jul/2016:17:23:08 ...
-M
)或每秒(-m
)的数据。在这种情况下,数据会在时间单位递增输出到指定的 CSV 输出文件中。
# logconv.pl -m|-M outputFile accessLogFile
# logconv.pl -M /home/output/statsPerMin.txt /var/log/dirsrv/slapd-instance/access*
-M|-m
选项也可以与 -S
和 -E
参数一起使用,在特定时间段内平均或每秒数。
Time,time_t,Results,Search,Add,Mod,Modrdn,Delete,Abandon,Connections,SSL Conns,Bind,Anon Bind,Unbind,Unindexed
- 打开 CSV 文件。
- 点菜单,然后选择 。
- 在 Chart Type 区域中,将 Chart 类型设置为 XY (Scatter)。
- 将 sub 类型设置为行。
- 选择要按 X 值排序的选项。
- 接受其他屏幕中的默认值(特别是,使用列中的数据集),并将第一行和第一列设置为标签,并创建 chart。
21.5. 为 Graceful Shutdown 监控本地磁盘
21.6. 监控服务器活动
21.7. 监控数据库活动
21.8. 监控数据库链接活动
21.9. 启用和禁用计数器
nsslapd-counters
参数启用要运行的计数器。但是,运行计数器可能会影响性能,因此也可以关闭计数器。如果计数器关闭,则它们都的值为零(0)。
# dsconf -D "cn=Directory Manager" ldap://server.example.com config replace nsslapd-counters=off
21.10. 使用 SNMP 监控目录服务器
21.10.1. 关于 SNMP
21.10.2. 启用和禁用 SNMP 支持
nsSNMPEnabled
参数设置为 on 或 off。例如,在 Directory 服务器实例中禁用 SNMP:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=SNMP,cn=config changetype: modify replace: nsSNMPEnabled nsSNMPEnabled: on
21.10.3. 设置参数以使用 SNMP 识别实例
nsSNMPOrganization
nsSNMPLocation
nsSNMPContact
nsSNMPDescription
nsSNMPLocation
参数设置为 Munich,请 :
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x dn: cn=SNMP,cn=config changetype: modify replace: nsSNMPLocation nsSNMPLocation: Munich, Germany
21.10.4. 为目录服务器设置 SNMP 代理
- 安装 389-ds-base-snmp 和 net-snmp 软件包:
# yum install 389-ds-base-snmp net-snmp
- 要配置 SNMP master 代理,请编辑
/etc/snmp/snmpd.conf
文件,添加以下条目来启用代理可扩展性(AgentX)协议:master agentx
有关 AgentX 协议的详情,请参考 RFC 2741。 - 要配置 SNMP 子代理,请编辑
/etc/dirsrv/config/ldap-agent.conf
文件,为要监控的每个目录服务器实例添加一个 server 参数。例如:server slapd-instance_name
- 另外,还可创建一个 SNMP 用户帐户:
- 停止
snmpd
服务:# systemctl stop snmpd
- 创建 SNMP 用户帐户。例如:
# net-snmp-create-v3-user -A authentication_password -a SHA \ -X private_password -x AES user_name
有关命令中使用的参数的详情,请查看 net-snmp-create-v3-user(1) man page。 - 启动
snmpd
服务:# systemctl start snmpd
- 另外,还可设置目录服务器描述性属性。详情请查看 第 21.10.3 节 “设置参数以使用 SNMP 识别实例”。
- 启动
dirsrv-snmp
服务:# systemctl start dirsrv-snmp
- 另外,验证配置:
- 安装 net-snmp-utils 软件包:
# yum install net-snmp-utils
- 查询目录服务器对象标识符(OID)。例如:
# snmpwalk -v3 -u user_name -M /usr/share/snmp/mibs:/usr/share/dirsrv/mibs/ \ -l AuthPriv -m +RHDS-MIB -A authentication_password -a SHA -X private_password -x AES server.example.com .1.3.6.1.4.1.2312.6.1.1
21.10.5. 配置 SNMP Traps
dsEntityContact
变量中定义的电子邮件地址发送电子邮件,同时向另一个实例的 dsEntityContact
变量中的页面号发送通知。
- DirectoryServerDown.每当子代理检测到目录服务器可能没有运行时,都会生成此陷阱。此陷阱将发送有目录服务器实例描述、版本、物理位置和联系信息,这些信息在
dsEntityDescr
、dsEntityVers
、dsEntityLocation
和dsEntityContact
变量中详细介绍。 - DirectoryServerStart.每当子代理检测到目录服务器已启动或重启时,都会生成此陷阱。此陷阱将发送有目录服务器实例描述、版本、物理位置和联系信息,这些信息在
dsEntityDescr
、dsEntityVers
、dsEntityLocation
和dsEntityContact
变量中详细介绍。
21.10.6. 使用管理信息基础
/usr/share/dirsrv/mibs
目录中的名为 redhat-directory.mib
的文件。此 MIB 包含与目录的网络管理相关的变量定义。这些变量称为受管对象。使用目录 MIB 和 Net-SNMP,您可以像网络上的所有其他受管设备一样监控您的目录。有关使用 MIB 的详情,请参考 第 21.10.4 节 “为目录服务器设置 SNMP 代理”。
21.10.6.1. 操作表
redhat-directory.mib
文件 的操作 表中的受管对象。
受管对象 | 描述 |
---|---|
dsAnonymousBinds | 从服务器启动以来匿名绑定到目录的绑定数量。 |
dsUnauthBinds | 从服务器启动以来,未经身份验证的绑定到目录的数量。 |
dsSimpleAuthBinds | 从服务器启动以来,绑定到使用简单身份验证方法(如密码保护)建立的目录数量。 |
dsStrongAuthBinds | 从服务器启动以来,绑定到使用强身份验证方法(如 TLS 或 SASL 机制)建立的目录数量。 |
dsBindSecurityErrors | 由于身份验证失败或服务器启动以来,目录被拒绝的绑定请求数。 |
dsInOps | 从服务器启动以来,从另一个目录转发到此目录的操作数量。 |
dsReadOps | 从应用程序启动以来此目录服务的读取操作数量。此对象的值始终为 0, 因为 LDAP 使用搜索操作间接实施读取操作。 |
dsCompareOps | 从服务器启动以来此目录提供服务的比较操作数量。 |
dsAddEntryOps | 从服务器启动以来此目录提供服务的添加操作数量。 |
dsRemoveEntryOps | 从服务器启动以来此目录提供服务的删除操作数量。 |
dsModifyEntryOps | 从服务器启动以来此目录提供服务的修改操作数量。 |
dsModifyRDNOps | 从服务器启动以来此目录提供服务的修改 RDN 操作数量。 |
dsListOps | 从服务器启动以来此目录提供服务的列表操作数。此对象的值始终为 0, 因为 LDAP 使用搜索操作间接实施列表操作。 |
dsSearchOps | 从服务器启动以来此目录提供服务的搜索操作总数。 |
dsOneLevelSearchOps | 从服务器启动以来此目录提供服务的一个级别的搜索操作数。 |
dsWholeSubtreeSearchOps | 从服务器启动以来此目录提供服务的整个子树搜索操作数量。 |
dsReferrals | 此目录返回的引用数量,以响应自服务器启动以来的客户端请求。 |
dsSecurityErrors | 转发到没有满足安全要求的这个目录的操作数量。 |
dsErrors | 因为错误(除了安全或引用错误)无法提供服务的请求数。错误包括名称错误、更新错误、属性错误和服务错误。部分服务请求不会计算为错误。 |
21.10.6.2. 条目表
受管对象 | 描述 |
---|---|
dsCopyEntries | 此目录包含副本的目录条目数。此对象的值始终为 0 ( 因为当前没有执行任何更新)。 |
dsCacheEntries | 目录中缓存的条目数。 |
dsCacheHits | 从应用程序启动以来本地保存缓存的操作数量。 |
21.10.6.3. 实体表
受管对象 | 描述 |
---|---|
dsEntityDescr | 为 Directory 服务器实例设置的描述。 |
dsEntityVers | Directory 服务器实例的 Directory Server 版本号。 |
dsEntityOrg | 负责 Directory 服务器实例的组织。 |
dsEntityLocation | 目录服务器实例的物理位置。 |
dsEntityContact | 负责 Directory 服务器实例的人员的名称和联系信息。 |
dsEntityName | 目录服务器实例的名称。 |
21.10.6.4. 互动表
受管对象 | 描述 |
---|---|
dsIntTable | 详情,在表的每一行中,与被监控目录服务器交互的历史记录相关。 |
dsIntEntry | 包含目录服务器与对等目录服务器交互详情的条目。 |
dsIntIndex | 唯一密钥的一部分以及 applIndex 来标识概念行,其中包含目录服务器(由 applIndex引用)和对等目录服务器之间的有用信息。 |
dsName | 此条目所属的对等目录服务器的可分辨名称(DN)。 |
dsTimeOfCreation | 创建此行时 sysUpTime 的值。如果在网络管理子系统初始化前创建了该条目,此对象将包含 0 的值。 |
dsTimeOfLastAttempt | 最后一次尝试联系此目录服务器时,sysUpTime 的值。如果在网络管理子系统初始化前进行最后一次尝试,此对象将包含 0 的值。 |
dsTimeOfLastSuccess | 最后一次尝试联系此目录服务器时,sysUpTime 的值成功。如果没有成功尝试,或者在网络管理子系统初始化前尝试上次成功尝试,则此条目将为零。 |
dsFailuresSinceLastSuccess | 最后一次尝试联系此目录服务器成功后的失败次数。如果没有成功尝试,这个计数器将包含自创建此条目以来的失败次数。 |
dsFailures | 创建此条目后累积失败。 |
dsSuccesses | 创建此条目后累积成功。 |
dsURL | 目录服务器应用程序的 URL。 |
第 22 章 使高可用性和灾难恢复计划
22.1. 识别潜在的场景
场景 | 对基础架构的影响 | 理想的响应 |
---|---|---|
数据崩溃 | 通过软件或硬件故障(或通过恶意攻击),在一个站点或一个服务器上的数据可能会损坏。如果该损坏的服务器是多层次复制中的供应商,那么在整个部署中可以快速传播损坏。 | 应有一个隔离的服务器,可访问最新未修正的数据备份。当检测到问题时,可以在常规基础架构上暂停复制,并且此服务器可以上线,以使用良好的数据重新初始化供应商。 |
自然灾难和其他 mass 事件 | 自然灾难可能会使整个办公室或数据中心离线,即使是长期的电源中断。 | 目录操作可以在另一个物理位置传输到具有相同数据的镜像站点。 |
服务器或机器丢失 | 一台机器可能会失败。 | 另一个具有相同数据的计算机可以假定机器的位置丢失。 |
22.2. 定义 Rollover 的 Type
- 热 滚动意味着基础架构在另一个站点完全镜像,并且备份站点始终与主站点保持在线和当前。这只需要一些调整,才能将操作从主切换到备份。
- 温 滚动意味着备份站点的所有元素都就位(大量的网络连接、所有必需的应用程序和硬件),但系统不会被主动运行或仍然配置。这可能需要一些额外的时间来配置机器并获取系统运行。
- 冷 滚动表示站点可用,但有一些资源可立即可用来设置它。
22.3. 识别用于灾难恢复的目录服务器功能
- 备份数据库并定期验证备份
- 使用命名管道脚本,多层次复制、串联、备份数据库和监控服务器
- 链
22.3.1. 备份用于灾难恢复的目录数据
ldap://server.example.com
实例的备份:
0 22 * * 1 /usr/sbin/dsconf -D "cn=Directory Manager" ldap://server.example.com backup create
dse.ldif
文件)。
22.3.2. 用于高可用性的多层复制
例 22.1. 多站点复制场景
- 对于单一服务器失败,存储在该实例上的所有数据都可以从其他服务器访问和检索。
- 为了丢失整个办公室或共处工具,服务器可以镜像到完全不同的物理位置(由 Directory 服务器广泛的区域复制性能实现)。通过最少的工作量,可以将流量重定向到复制站点,而无需在线使新的服务器上线。
22.3.3. 高可用性的串联数据库
例 22.2. 链的情况
22.4. 定义恢复过程
- 什么信号表示灾难?有些事情是明显的(大量电源中断、网络丢失或触发),但其他情况需要定义。例如,需要在线备份服务器哪些信号?
- 谁对灾难做出响应以及如何响应?发生灾难情况后,谁负责操作?它们如何通知该事件?它们应该做什么?
- 在站点存储灾难恢复计划中的打印副本。
- 定期测试灾难恢复计划,并在配置和基础架构更改后测试。
22.5. 基本示例:执行恢复
- 计划 A 涵盖了丢失一个目录服务器实例
- 计划 B 涵盖了某些类型的数据损坏或攻击
- 规划 C 包括丢失整个办公室
第 23 章 创建测试条目
用户
:创建一个包含用户条目的 LDIF 文件。组
:创建一个包含静态组和成员条目的 LDIF 文件。COS-def
:创建一个 LDIF 文件,其中包含经典指针或间接服务(CoS)定义。COS-template
:创建一个包含 CoS 模板的 LDIF 文件。角色
:创建一个包含受管、过滤或间接角色条目的 LDIF 文件。mod-load
:创建包含修改操作的 LDIF 文件。使用ldapmodify
工具导入此文件。嵌套
:创建一个 LDIF 文件,该文件包含级联或模糊树设计中的大量嵌套条目。
- 使用
mod-load
选项创建 LDIF 文件后ldapmodify
工具 - 所有其他选项的
ldapadd
工具
嵌套
条目类型外,如果您不提供任何命令行选项,dsctl ldifgen 命令将使用互动模式:
# dsctl instance_name ldifgen entry_type
23.1. 使用示例用户条目创建 LDIF 文件
/tmp/users.ldif
的 LDIF 文件,该文件将 100,000 个通用用户添加到 dc=example,dc=com 后缀,请输入:
# dsctl instance_name ldifgen users --suffix "dc=example,dc=com" --number 100000 --generic --ldif-file=/tmp/users.ldif
- ou=accounting
- ou=product 开发
- ou=product 测试
- ou=human 资源
- ou=payroll
- ou=people
- ou=groups
# dsctl instance_name ldifgen users --help
23.2. 创建带有示例组条目的 LDIF 文件
/tmp/groups.ldif
的 LDIF 文件,该文件将 500 个组添加到 ou=groups,dc=example,dc=com 条目,并且每个组都有 100 个成员,请输入:
# dsctl instance_name ldifgen groups --number 500 --suffix "dc=example,dc=com" --parent "ou=groups,dc=example,dc=com" --num-members 100 --create-members --member-parent "ou=People,dc=example,dc=com" --ldif-file /tmp/group.ldif example
ldapmodif
工具添加组,您可以超过最大基本编码规则(BER)大小限制,导入会失败。在这种情况下,增加 cn=config 条目中的 nsslapd-maxbersize
参数的值。
# dsctl instance_name ldifgen groups --help
23.3. 使用示例 CoS 定义创建 LDIF 文件
/tmp/cos-definition.ldif
的 LDIF 文件,该文件将经典 CoS 定义添加到 ou=cos 定义dc=example,dc=com 条目:
# dsctl instance_name ldifgen cos-def Postal_Def --type classic --parent "ou=cos definitions,dc=example,dc=com" --cos-specifier businessCatagory --cos-template "cn=sales,cn=classicCoS,dc=example,dc=com" --cos-attr postalcode telephonenumber --ldif-file /tmp/cos-definition.ldif
# dsctl instance_name ldifgen cos-def --help
23.4. 创建带有示例修改声明的 LDIF 文件
# dsctl instance_name ldifgen mod-load --parent dc=example,dc=com --num-users 1000 --create-users --mod-users 1000 --add-users 10 --del-users 100 --mod-users 1000 --modrdn-users 100 --mod-attrs cn uid sn --delete-users
/tmp/modifications.ldif
文件:
- 创建带有 1000 ADD 操作的 LDIF 文件,以创建用户条目。
- 通过更改其
cn
、uid
、ssn
属性来修改所有条目。 - 添加额外的 10 个用户条目。
- 执行 100 个 MODRDN 操作。
- 删除 100 条目
- 删除结尾的所有剩余条目。
# dsctl instance_name ldifgen mod-load --help
23.5. 创建带有嵌套示例条目的 LDIF 文件
/tmp/nested.nldif
的 LDIF 文件,该文件在 dc=example,dc=com 条目下的不同机构单元(OU)中添加 600 个用户,每个 OU 包含最多 100 个用户:
# dsctl instance_name ldifgen nested --num-users 600 --node-limit 100 --suffix "dc=example,dc=com"
# dsctl instance_name ldifgen nested --help
附录 A. 使用 LDAP 客户端工具
A.1. 运行扩展操作
-e
或 -E
选项来发送扩展操作。-e
参数可用于任何 OpenLDAP 客户端工具,并发送有关操作的常规指令,如如何处理密码策略。-E
仅用于 ldapsearches,并传递更有用的控制,如 GER 搜索、排序和页面信息,以及其他非支持扩展操作的信息。
-E extended_operation_type=operation_parameters
# ldapsearch -x -D "cn=Directory Manager" -W -b "ou=Engineers,ou=People,dc=example,dc=com" -E pg=3 "(objectclass=*)" cn dn: uid=jsmith,ou=Engineers,ou=People,dc=example,dc=com cn: John Smith dn: uid=bjensen,ou=Engineers,ou=People,dc=example,dc=com cn: Barbara Jensen dn: uid=hmartin,ou=Engineers,ou=People,dc=example,dc=com cn: Henry Martin Results are sorted. next page size (3): 5
ldapexop 1.2.840.113556.1.4.319=3
A.2. 比较条目
sn
值 Smith:
# ldapcompare -D "cn=Directory Manager" -W -p 389 -h server.example.com -x sn:smith uid=bjensen,ou=people,dc=example,dc=com comparing type: "sn" value: "smith" in entry "uid=bjensen,ou=people,dc=example,dc=com" compare FALSE ldapcompare -D "cn=Directory Manager" -W -p 389 -h server.example.com -x sn:smith uid=jsmith,ou=people,dc=example,dc=com comparing type: "sn" value: "smith" in entry "uid=jsmith,ou=people,dc=example,dc=com" compare TRUE
- 直接在命令行中传递的单个 attribute:value 语句
sn:Smith
- 直接在命令行中传递的单个 attribute::base64value 语句,用于
jpegPhoto
或验证证书或 CRL 等属性jpegPhoto:dkdkPDKCDdko0eiofk==
- 一个 attribute:file 语句,指向包含属性比较值列表的文件,脚本则通过列表迭代
postalCode:/tmp/codes.txt
-f
选项指定要比较的 DN 列表。
例 A.1. 将一个属性值与一个条目进行比较
ldapcompare -D "cn=Directory Manager" -W -p 389 -h server.example.com -x sn:smith uid=jsmith,ou=people,dc=example,dc=com comparing type: "sn" value: "smith" in entry "uid=jsmith,ou=people,dc=example,dc=com" compare TRUE
例 A.2. 比较文件中的列表属性值
sn
值的文件。
jensen johnson johannson jackson jorgenson
uid=jen200,ou=people,dc=example,dc=com uid=dsj,ou=people,dc=example,dc=com uid=matthewjms,ou=people,dc=example,dc=com uid=john1234,ou=people,dc=example,dc=com uid=jack.son.1990,ou=people,dc=example,dc=com
# ldapcompare -D "cn=Directory Manager" -W -p 389 -h server.example.com -x sn:/tmp/surnames.txt -f /tmp/names.txt comparing type: "sn" value: "jensen" in entry "uid=jen200,ou=people,dc=example,dc=com" compare TRUE
A.3. 更改密码
# ldappasswd -x -D bind_dn -W -p server_port -h server_hostname [-A | -a oldPassword] [-S | -s newPassword] [user]
例 A.3. 目录管理器更改用户的密码 Over TLS
# ldappasswd -D "cn=Directory Manager" -W -ZZ -p 389 -h server.example.com -x -s new_password "uid=tuser1,ou=People,dc=example,dc=com"
例 A.4. 生成用户密码的目录管理器
# ldappasswd -D "cn=Directory Manager" -W -ZZ -p 389 -h server.example.com -x "uid=tuser2,ou=People,dc=example,dc=com"
例 A.5. 用户更改密码
# ldappasswd -p 389 -h server.example.com -ZZ -x -D "uid=tuser3,ou=People,dc=example,dc=com" -W -a old_password -s new_password
例 A.6. 使用 DIGEST_MD5 用户验证并更改 His 密码
# ldappasswd -p 389 -h server.example.com -O noplain,minssf=1,maxbufsize=512 -Y GSSAPI -U "dn:uid=jsmith,ou=people,dc=example,dc=com" -R EXAMPLE.COM -W -s new_password
例 A.7. 用户通过 Kerberos 提示验证新密码
# ldappasswd -p 389 -h server.example.com -O noplain,minssf=1,maxbufsize=512 -I
A.4. 生成 LDAP URL
-H
选项传递 LDAP URL,而不是其他连接信息(如主机名、端口、子树和搜索基础)。
- 将给定的 LDAP URL 修正成其 constituent 元素
- 从给定元素构建一个新的有效的 LDAP URL
选项 | 描述 |
---|---|
用于声明 URL | |
-H "URL" | 传递 LDAP URL 以划分成元素。 |
用于构造 URL | |
-a 属性 | 提供在搜索结果中特别返回的以逗号分隔的属性。 |
-b base | 为 URL 设置搜索基础或子树。 |
-f filter | 设置要使用的搜索过滤器。 |
-h hostname | 提供目录服务器的主机名。 |
-p port | 提供目录服务器的端口。 |
-S ldap|ldaps|ldapi | 提供用于连接的协议,如 ldap、ldaps 或 ldapi。 |
-s scope | 提供搜索范围。 |
例 A.8. 声明 LDAP URL
-H
选项在现有 LDAP URL 中 source,工具会返回 neat 列表中 URL 元素:
# ldapurl -H "ldap://:389/dc=example,dc=com?cn,sn?sub?(objectclass=inetorgperson)" scheme: ldap port: 389 dn: dc=example,dc=com selector: cn selector: sn scope: sub filter: (objectclass=inetorgperson)
例 A.9. 构建 LDAP URL
ldapurl -a cn,sn -b dc=example,dc=com -s sub -f "(objectclass=inetorgperson)" ldap://:389/dc=example,dc=com?cn,sn?sub?(objectclass=inetorgperson)
附录 B. LDAP 数据交换格式
B.1. 关于 LDIF 文件格式
dn: distinguished_name objectClass: object_class objectClass: object_class ... attribute_type[;subtype]:attribute_value ...
- 每个 LDIF 条目都必须有一个 DN 和至少一个对象类定义。
- 包括为条目定义的对象类所需的任何属性。
- 所有其他属性和对象类都是可选的。
- 对象类和属性可以按任何顺序指定。
- 冒号后面的空格是可选的。
字段 | 定义 |
---|---|
[id] | 可选。代表条目 ID 的正十进制数字。数据库创建工具会自动生成此 ID。永远不会自行添加或编辑这个值。 |
dn: distinguished_name | 指定条目的可分辨名称。 |
objectClass: object_class | 指定要用于此条目的对象类。对象类标识条目允许和所需的属性类型或 schema。有关自定义模式的信息,请参阅 Red Hat Directory Server 11 Configuration, Command, and File Reference 来获得标准对象类列表和 第 12 章 管理目录架构。 |
attribute_type | 指定要与条目一起使用的描述性属性。属性应在架构中定义。有关自定义模式的信息,请参阅 Red Hat Directory Server 11 Configuration, Command, and File Reference 来获得标准属性列表和 第 12 章 管理目录架构。 |
[subtype] | 可选。指定子类型、语言、二进制或探测。使用此标签标识代表对应属性值的语言,或者属性值是二进制还是属性值的探测。有关支持的子类型标签的完整列表,请参阅 ???。 |
attribute_value | 指定要与属性类型一起使用的属性值。 |
B.2. 在 LDIF 中继续行
dn: cn=some_example_user,dc=example,dc=com dn: cn=some_e xample_user, dc=example,d c=com
B.3. 代表二进制数据
B.3.1. 标准 LDIF 表示法
jpegphoto: < file:/path/to/photo
version: 1
# ldapmodify -x -D userDN -W version: 1 dn: cn=Barney Fife,ou=People,dc=example,dc=com changetype: modify add: usercertificate usercertificate;binary: < file: BarneysCert
B.3.2. base-64 Encoding
jpegPhoto::encoded_data
- 以冒号(:)或空格开头的任何值。
- 包含非 ASCII 数据的任何值,包括新行。
# ldif -b attribute_name
# ldif -b jpegPhoto < mark.jpg > out.ldif
jpegPhoto
属性的 LDIF 格式。输出被保存到 out.ldif
。
B.4. 使用 LDIF 指定目录条目
B.4.1. 指定域条目
dn: distinguished_name objectClass: top objectClass: domain dc: domain_component_name list_of_optional_attributes ...
dn: dc=example,dc=com objectclass: top objectclass: domain dc: example description: Fictional example company
LDIF Element | 描述 |
---|---|
dn: distinguished_name | 必需。指定条目的可分辨名称。 |
objectClass: top | 必需。指定 顶级 对象类。 |
objectClass: domain | 指定 域 对象类。此行将条目定义为域或域组件。有关可与这个对象类一起使用的属性列表,请参阅 Red Hat Directory Server 11 Configuration, Command, and File Reference。--> |
dc: domain_component | 指定域名的属性。服务器通常在初始设置过程中配置,并以 dc=hostname,dc=domain,dc=toplevel 的形式具有后缀或命名上下文。例如,dc=ldap,dc=example,dc=com。域条目应使用最旧的 dc 值,如 dc: ldap。如果后缀是 dc=example,dc=com,则 dc 值为 dc: example。除非服务器已配置为使用该后缀,否则不要为 dn: dc=com 创建条目。 |
list_of_attributes | 指定要为该条目维护的可选属性列表。有关可用于此对象类 的属性列表,请参阅 Red Hat Directory Server 11 配置、命令和文件参考。 |
B.4.2. 指定机构单元条目
dn: distinguished_name objectClass: top objectClass: organizationalUnit ou: organizational_unit_name list_of_optional_attributes ...
dn: ou=people,dc=example,dc=com objectclass: top objectclass: organizationalUnit ou: people description: Fictional example organizational unit
LDIF Element | 描述 |
---|---|
dn: distinguished_name | 指定条目的可分辨名称。需要 DN。如果 DN 中有一个逗号,则必须使用反斜杠(\)转义逗号,如 dn: ou=body,dc=example,dc=com。 |
objectClass: top | 必需。指定 顶级 对象类。 |
objectClass: organizationalUnit | 指定 organizationalUnit 对象类。此行将条目定义为 组织单元。有关此对象类可用属性的列表,请参阅 Red Hat Directory Server 11 Configuration, Command, and File Reference。 |
ou: organizational_unit_name | 指定机构单元名称的属性。 |
list_of_attributes | 指定要为该条目维护的可选属性列表。有关此对象类可用属性的列表,请参阅 Red Hat Directory Server 11 Configuration, Command, and File Reference。 |
B.4.3. 指定机构人条目
dn: distinguished_name objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson cn: common_name sn: surname list_of_optional_attributes
dn: uid=bjensen,ou=people,dc=example,dc=com objectclass: top objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson cn: Babs Jensen sn: Jensen givenname: Babs uid: bjensen ou: people description: Fictional example person telephoneNumber: 555-5557 userPassword: {SSHA}dkfljlk34r2kljdsfk9
LDIF Element | 描述 |
---|---|
dn: distinguished_name | 必需。指定条目的可分辨名称。例如,dn: uid=bjensen,ou=body,dc=example,dc=com。如果 DN 中有一个逗号,则必须使用反斜杠(\)转义逗号。 |
objectClass: top | 必需。指定 顶级 对象类。 |
objectClass: person | 指定 person 对象类。应包含此对象类规格,因为许多 LDAP 客户端在搜索个人或机构人员时需要它。 |
objectClass: organizationalPerson | 指定 organizationalPerson 对象类。应包含此对象类规格,因为有些 LDAP 客户端在搜索机构人员期间需要它。 |
objectClass: inetOrgPerson | 指定 inetOrgPerson 对象类。建议 inetOrgPerson 对象类创建机构人员条目,因为此对象类包含广泛的属性范围。此对象类需要 uid 属性,并且包含此对象类的条目会根据 uid 属性的值命名。有关此对象类可用属性的列表,请参阅 Red Hat Directory Server 11 Configuration, Command, and File Reference。 |
cn: common_name | 指定个人的通用名称,这是个人常用的全名。例如: cn: Bill Anderson。至少需要一个通用名称。 |
sn: surname | 指定个人的姓氏或姓氏。例如,s n: Anderson。需要 surname。 |
list_of_attributes | 指定要为该条目维护的可选属性列表。有关此对象类可用属性的列表,请参阅 Red Hat Directory Server 11 Configuration, Command, and File Reference。 |
B.5. 使用 LDIF 定义目录
- 创建包含以 LDIF 格式添加的条目的 ASCII 文件。确保每个条目都通过空行与下一个条目分开。在条目之间仅使用一行,并确保文件的第一行不为空,否则 ldapmodify 实用程序将退出。如需更多信息,请参阅 第 B.4 节 “使用 LDIF 指定目录条目”。
- 使用数据库中的最顶层或 root 条目开始每个文件。根条目必须代表数据库中包含的后缀或子修复。例如,如果数据库具有后缀 dc=example,dc=com,则目录中的第一个条目必须是 dn: dc=example,dc=com。有关后缀的详情,请查看 红帽目录服务器配置、命令和文件参考 中描述的"Suffix"参数。
- 确保一个条目代表 LDIF 文件中的分支点,然后再放置在该分支下创建的条目。例如,要将条目放在人员和组子树中,请在在这些子树中创建条目前为这些子树创建分支点。注意LDIF 文件按顺序读取,因此必须在子条目前列出父条目。
- 使用以下方法之一从 LDIF 文件创建目录:
- 通过 Web 控制台初始化数据库。如果存在一个小的数据库要导入(小于 10,000 条目),则使用此方法。请参阅 第 6.1.3 节 “使用 Web 控制台导入数据”。警告这个方法是破坏性的,将擦除后缀中的任何现有数据。
- ldif2db 或 ldif2db.pl 命令行工具。如果存在要导入的大型数据库(超过 10,000 个条目),则使用此方法。请参阅 第 6.1.2.2 节 “导入服务器为 Offline 的数据”。
- 如果服务器正在运行,则无法使用 ldif2db。
- ldif2db.pl 只能在服务器运行时使用。
警告这个方法是破坏性的,将擦除后缀中的任何现有数据。 - 带有 -a 参数的 ldapmodify 命令行工具。如果新子树添加到现有数据库,或者后缀中存在不应删除的数据,则使用此方法。与从 LDIF 文件创建目录的其他方法不同,必须在使用 ldapmodify 添加子树前运行目录服务器。请参阅 第 3.1.3 节 “添加条目”。
例 B.1. LDIF 文件示例
dn: dc=example,dc=com objectclass: top objectclass: domain dc: example description: Fictional example domain dn: ou=People,dc=example,dc=com objectclass: top objectclass: organizationalUnit ou: People description: Fictional example organizational unit tel: 555-5559 dn: cn=June Rossi,ou=People,dc=example,dc=com objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson cn: June Rossi sn: Rossi givenName: June mail: rossi@example.com userPassword: {sha}KDIE3AL9DK ou: Accounting ou: people telephoneNumber: 2616 roomNumber: 220 dn: cn=Marc Chambers,ou=People,dc=example,dc=com objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson cn: Marc Chambers sn: Chambers givenname: Marc mail: chambers@example.com userPassword: {sha}jdl2alem87dlacz1 telephoneNumber: 2652 ou: Manufacturing ou: People roomNumber: 167 dn: cn=Robert Wong,ou=People,example.com Corp,dc=example,dc=com objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson cn: Robert Wong cn: Bob Wong sn: Wong givenname: Robert givenname: Bob mail: bwong@example.com userPassword: {sha}nn2msx761 telephoneNumber: 2881 roomNumber: 211 ou: Manufacturing ou: people dn: ou=Groups,dc=example,dc=com objectclass: top objectclass: organizationalUnit ou: groups description: Fictional example organizational unit
B.6. 以多种语言存储信息
- 管理员创建一个文件
street.txt
,其带有法语 street 地址值:1 rue de l'Université
- 然后,文件内容转换为 UTF-8: :
# iconv -t UTF-8 -o output.txt street.txt
- 以下 LDIF 条目是使用 street
Address 的 street address 值的 UTF-8 值创建的;lang-fr
。dn: uid=bjensen,ou=people,dc=example,dc=com objectclass: top objectclass: person objectclass: organizationalPerson name: Babs Jensen cn: Babs Jensen sn: Jensen uid: bjensen streetAddress: 1 University Street streetAddress;lang-en: 1 University Street streetAddress;lang-fr
:: AasljdoaAJASI023909jaASJaonasd0ADS
preferredLanguage: fr属性 name 和 subtype 后双冒号表示该值采用二进制 base-64 编码。
附录 C. LDAP URL
- 使用基于 Web 的客户端访问目录服务器时,LDAP URL 用于识别特定的目录服务器实例。
- LDAP URL 用于配置目录服务器引用。
- LDAP URL 用于配置访问控制指令。
C.1. LDAP URL 的组件
ldap[s]://hostname:port/base_dn?attributes?scope?filter
组件 | 描述 | |||
---|---|---|---|---|
主机名 | LDAP 服务器的名称、IPv4、Ir IPv6 地址。例如: ldap.example.com、192.0.2.90 或 [2001:db8::1]。 | |||
端口 | LDAP 服务器的端口号(例如 696)。如果没有指定端口,则使用标准 LDAP 端口(389)或 LDAPS 端口(636)。 | |||
base_dn | 目录中条目的可分辨名称(DN)。此 DN 标识搜索开始点的条目。如果没有指定基本 DN,搜索将从目录树的根目录开始。 | |||
属性 | 要返回的属性。要指定多个属性,请使用逗号分隔属性;例如 cn,mail,telephoneNumber。如果 URL 中没有指定属性,则返回所有属性。 | |||
scope | 搜索的范围,可以是以下值之一:
| |||
filter | 应用到搜索指定范围内的条目的搜索过滤器。如果没有指定过滤器,服务器将使用过滤器 (objectClass=114)。 |
ldap://ldap.example.com/dc=example,dc=com??sub?(sn=Jensen)
C.2. 转义 Unsafe Characters
不安全的 Character | 转义 Characters |
---|---|
space | %20 |
< | %3c |
> | %3e |
" | %22 |
# | %23 |
% | %25 |
{ | %7b |
} | %7d |
| | %7c |
\ | %5c |
^ | %5e |
~ | %7e |
[ | %5b |
] | %5d |
` | %60 |
C.3. LDAP URL 示例
示例 1
以下 LDAP URL 指定用于可分辨名称 dc=example,dc=com 的条目的基本搜索。
ldap://ldap.example.com/dc=example,dc=com
- 因为没有指定端口号,则会使用标准 LDAP 端口号(389)。
- 因为没有指定属性,搜索会返回所有属性。
- 因为没有指定搜索范围,所以搜索仅限于基本条目 dc=example,dc=com。
- 因为没有指定过滤器,目录使用默认的过滤器(objectclass=114)。
示例 2
以下 LDAP URL 使用 DN dc=example,dc=com 检索条目的 postalAddress
属性:
ldap://ldap.example.com/dc=example,dc=com?postalAddress
- 因为没有指定搜索范围,所以搜索仅限于基本条目 dc=example,dc=com。
- 因为没有指定过滤器,目录使用默认的过滤器(objectclass=114)。
示例 3
以下 LDAP URL 为 Barbara Jensen 获取条目的 cn
, mail
, 和 telephoneNumber
属性:
ldap://ldap.example.com/cn=Barbara%20Jensen,dc=example,dc=com?cn,mail,telephoneNumber
- 因为没有指定搜索范围,所以搜索仅限于基础条目 cn=Barbara Jensen,dc=example,dc=com。
- 因为没有指定过滤器,目录使用默认的过滤器 (objectclass=rhacm)。
示例 4
以下 LDAP URL 指定搜索具有 surname Jensen 的条目,且位于 dc=example,dc=com 下的任何级别:
ldap://ldap.example.com/dc=example,dc=com??sub?(sn=Jensen)
- 因为没有指定属性,搜索会返回所有属性。
- 由于搜索范围是 子,所以搜索将基本条目 dc=example,dc=com 和条目位于基本条目下的所有级别。
5 示例
以下 LDAP URL 为 dc=example,dc=com 下一个级别指定对象类的搜索:
ldap://ldap.example.com/dc=example,dc=com?objectClass?one
- 由于搜索范围是一,所以搜索会将所有条目位于基础条目 dc=example,dc=com 下。搜索范围不包括基本条目。
- 因为没有指定过滤器,目录使用默认的过滤器(objectclass=114)。
附录 D. 国际化
D.1. 关于区域设置
- 校准订购。合并顺序提供关于如何排序给定语言字符的语言和特定于的信息。它可识别字母的字母序列等内容,如何将字母与字母与字母进行比较,而在比较字符串时可以忽略任何字符,以及比较字符串时可以忽略的任何字符。合并顺序也考虑有关语言的特定于语言的信息,例如读取语言的方向(从左到右、左到右、左到左和下线)。
- 字符类型。字符类型将字母字符与数字或其他字符区分开。例如,在某些语言中,管道(|)字符被视为分页,而在其他语言中,它被视为字母。另外,它还定义大写字母到小写字母的映射。
- 货币格式。货币格式指定特定区域使用的货币符号、符号是否在其值之前或之后,以及代表货币单位的方式。
- 时间/日期格式。时间和日期格式指示区域中的时间和日期的自定义格式。时间和日期格式指示日期是以 mm/dd/yy (月、天、年份)或 dd/mm/yy (day、month、year)格式中的自定义日期,并指定给定语言和月的天数。例如,1996 年 1 月 10 日的日期表示为 10。在 zech 和 10 janvier 1996 年 8 月 1996 日表示。
D.2. 支持的区域设置
/etc/dirsrv/config/slapd-collations.conf
文件。
D.3. 支持的语言子类型
语言标签 | 语言 |
---|---|
af | Afrikaans |
be | Belarusian |
bg | Bulgarian |
ca | Catalan |
CS | czech |
da | Danish |
de | 德语 |
el | Greek |
en | English |
es | 西班牙语 |
eu | Basque |
fi | Finnish |
fo | Faroese |
fr | 法语 |
GA | Irish |
gl | Galician |
HR | Croatian |
hu | Hungarian |
id | 印度西亚 |
is | Icelandic |
it | 意大利语 |
ja | 日语 |
ko | 韩语 |
nl | 荷兰语 |
否 | Norwegian |
pl | polish |
pt | 葡萄牙语 |
ro | Romanian |
ru | 俄语 |
sk | Slovak |
sl | Slovenian |
sq | albanian |
SR | Serbian |
sv | Swedish |
tr | Turkish |
uk | Ukrainian |
zh | 中文 |
D.4. 搜索国际目录
D.4.1. 匹配规则格式
- 作为区域整合顺序的 OID,用于基础搜索。
- 作为与协调顺序关联的语言标签,用于基础搜索。
- 作为 Collation order 的 OID,以及一个代表关系运算符的后缀。
- 作为与协调顺序关联的语言标签,以及一个代表关系运算符的后缀。
D.4.1.1. 将 OID 用于匹配规则
/etc/dirsrv/config/slapd-collations.conf
文件。
attr:OID:=(relational_operator value)
departmentNumber
属性,请使用以下过滤器:
departmentNumber:2.16.840.1.113730.3.3.2.46.1:=>= N4709
D.4.1.2. 为匹配规则使用语言标签
/etc/dirsrv/config/slapd-collations.conf
文件。
attr:language-tag:=(relational_operator value)
cn:es:== estudiante
D.4.1.3. 为匹配规则使用 OID 和后缀
attr: OID+suffix:=value
mozldap
工具支持,而不支持 OpenLDAP 工具,如 ldapsearch。
businessCategory
属性,请使用以下过滤器:
businessCategory:2.16.840.1.113730.3.3.2.7.1.3:=softwareprodukte
/etc/dirsrv/config/slapd-collations.conf
文件。有关关系运算符及其等效后缀的列表,请参阅 表 D.2 “搜索类型、Operator 和后缀”。
D.4.1.4. 为匹配规则使用语言标签和后缀
attr: language-tag+suffix:=value
mozldap
工具支持,而不支持 OpenLDAP 工具,如 ldapsearch。
sn:fr.4:=La Salle
/etc/dirsrv/config/slapd-collations.conf
文件。有关关系运算符及其等效后缀的列表,请参阅 表 D.2 “搜索类型、Operator 和后缀”。
D.4.2. 支持的搜索类型
- 相等性(=)
- substring (*)
- greater-than (>)
- greater-than 或 equal-to (>=)
- less-than (<)
- less-than 或 equal-to (<=)
搜索类型 | Operator | 后缀 |
---|---|---|
less-than | < | .1 |
less-than 或 equal-to | <= | .2 |
ç›¸ç‰ | = | .3 |
greater-than 或 equal-to | >= | .4 |
greater-than | > | .5 |
子字符串 | * | .6 |
D.4.3. 国际搜索示例
D.4.3.1. less-Than 示例
sn:2.16.840.1.113730.3.3.2.15.1:=< Marquez ... sn:es:=< Marquez ... sn:2.16.840.1.113730.3.3.2.15.1.1:=Marquez ... sn:es.1:=Marquez
D.4.3.2. less-Than 或 Equal-to Example
roomNumber:2.16.840.1.113730.3.3.2.23.1:=<= CZ422 ... roomNumber:hu:=<= CZ422 ... roomNumber:2.16.840.1.113730.3.3.2.23.1.2:=CZ422 ... roomNumber:hu.2:=CZ422
D.4.3.3. 相等示例
businessCategory
属性(在过期顺序),以下匹配规则过滤器可以正常工作:
businessCategory:2.16.840.1.113730.3.3.2.7.1:==softwareprodukte ... businessCategory:de:== softwareprodukte ... businessCategory:2.16.840.1.113730.3.3.2.7.1.3:=softwareprodukte ... businessCategory:de.3:=softwareprodukte
D.4.3.4. greater-Than 或 Equal-to Example
locality:2.16.840.1.113730.3.3.2.18.1:=>= Québec ... locality:fr:=>= Québec ... locality:2.16.840.1.113730.3.3.2.18.1.4:=Québec ... locality:fr.4:=Québec
D.4.3.5. 更大的示例
mailHost:2.16.840.1.113730.3.3.2.5.1:=> schranka4 ... mailHost:cs:=> schranka4 ... mailHost:2.16.840.1.113730.3.3.2.5.1.5:=schranka4 ... mailHost:cs.5:=schranka4
D.4.3.6. 子字符串示例
uid:2.16.840.1.113730.3.3.2.49.1:=* *ming ... uid:zh:=* *ming ... uid:2.16.840.1.113730.3.3.2.49.1.6:=* *ming .. uid:zh.6:=* *ming
modifiersName
或 memberOf
)的子字符串搜索过滤器在过滤器包含一个或多个空格字符时并不总是正确匹配条目。
(memberOf=*Domain Administrators*)
(memberOf=cn=Domain Administrators*) ... (memberOf=cn=Domain Administrators,ou=Groups,dc=example,dc=com)
D.5. 匹配规则故障排除
# ldapsearch -x -p 389 -D "uid=userID,ou=people,dc=example,dc=com" -W -b "dc=example,dc=com" "sn:2.16.840.1.113730.3.3.2.7.1:=passin" ldapsearch -x -p 389 -D "uid=userID,ou=people,dc=example,dc=com" -W -b "dc=example,dc=com" "sn:de:=passin"
# ldapsearch -x -p 389 -D "uid=userID,ou=people,dc=example,dc=com" -W -b "dc=example,dc=com" "sn:2.16.840.1.113730.3.3.2.7.1.3
:=passin" ldapsearch -x -p 389 -D "uid=userID,ou=people,dc=example,dc=com" -W -b "dc=example,dc=com" "sn:de.3
:=passin"
附录 E. 修订历史记录
修订历史 | |||
---|---|---|---|
修订 11.5-1 | Tue May 10 2022 | ||
| |||
修订 11.4-1 | Tue Nov 09 2021 | ||
| |||
修订 11.3-1 | Tue May 11 2021 | ||
| |||
修订 11.2-1 | Tue Nov 03 2020 | ||
| |||
修订 11.1-1 | Tue Apr 28 2020 | ||
| |||
修订 11.0-1 | Tue Nov 05 2019 | ||
|