2.4. 配置 Cascading 链
数据库链接可以配置为指向另一个数据库链接,从而创建一个级联链操作。每当需要多个跃点才能访问目录树中的所有数据时,就会发生级联链。
2.4.1. Cascading Chaining 概述
当目录需要多个跃点来处理客户端应用程序的请求时,会发生级联链。
客户端应用程序向服务器 1 发送修改请求。服务器包含一个数据库链接,它将操作转发到 Server 2,其中包含另一个数据库链接。Server 2 上的数据库链接将操作转发到服务器 3,其中包含客户端要在数据库中修改的数据。需要两个跃点来访问客户端要修改的数据的片段。
在正常操作请求中,客户端绑定到服务器,然后评估应用到该客户端的任何 ACI。使用级联链时,客户端绑定请求会在 Server 1 上评估,但应用到客户端的 ACI 仅在请求链到目标服务器(在上例中是 Server 2)后进行评估。
例如,在 Server A 上,目录树被分割:
root 后缀 dc=example,dc=com 和 ou=people 和 ou=groups 自后缀存储在 Server A 中。ou=europe,dc=example,dc=com 和 ou=groups 后缀存储在 Server B 中,ou=europe,dc=example,dc=com 后缀的ou=people 分支存储在 Server C 中。
在服务器 A、B 和 C 上配置级联,即 ou=body ,ou=europe,dc=example,dc=com 条目的目标客户端请求将按如下方式路由:
首先,客户端绑定到 Server A 并通过 Database Link 1 链到 Server B。然后,使用 Database Link 2 连接到 Server C 上的目标数据库,以访问 ou=body ,ou=europe,dc=example,dc=com 分支中的数据。由于目录至少需要两个跃点来提供客户端请求,这被视为级联链。
2.4.2. 使用命令行配置 Cascading Chaining
本节提供了如何使用三个服务器配置级联链的示例,如下图所示:
服务器 1 中的配置步骤
- 创建后缀 c=africa,ou=body,dc=example,dc=com :
# dsconf -D "cn=Directory Manager" ldap://server1.example.com backend create --parent-suffix="ou=people,dc=example,dc=com" --suffix="c=africa,ou=people,dc=example,dc=com"
- 创建 DBLink1 数据库链接:
# dsconf -D "cn=Directory Manager" ldap://server1.example.com chaining link-create --suffix="c=africa,ou=people,dc=example,dc=com" --server-url="ldap://africa.example.com:389/" --bind-mech="" --bind-dn="cn=server1 proxy admin,cn=config" --bind-pw="password" --check-aci="off" "DBLink1"
- 启用循环检测:
# dsconf -D "cn=Directory Manager" ldap://server1.example.com chaining config-set --add-control="1.3.6.1.4.1.1466.29539.12"
服务器 2 中的配置步骤
- 在服务器 2 中为服务器 1 创建代理管理用户,以用于代理授权:
# ldapadd -D "cn=Directory Manager" -W -p 389 -h server2.example.com -x dn: cn=server1 proxy admin,cn=config objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson cn: server1 proxy admin sn: server1 proxy admin userPassword: password description: Entry for use by database links
重要出于安全考虑,请不要使用cn=Directory Manager
帐户。 - 创建后缀 ou=Zanzibar,c=africa,ou=body,dc=example,dc=com :
# dsconf -D "cn=Directory Manager" ldap://server2.example.com backend create --parent-suffix="c=africaou=people,dc=example,dc=com" --suffix="ou=Zanzibar,c=africa,ou=people,dc=example,dc=com"
- 创建 DBLink2 数据库链接:
# dsconf -D "cn=Directory Manager" ldap://server2.example.com chaining link-create --suffix="ou=Zanzibar,c=africa,ou=people,dc=example,dc=com" --server-url="ldap://zanz.africa.example.com:389/" --bind-mech="" --bind-dn="server2 proxy admin,cn=config" --bind-pw="password" --check-aci="on "DBLink2"
由于DBLink2
链接是级联链配置中的中间数据库链接,所以启用 ACL 检查以允许服务器检查是否允许客户端和服务器访问数据库链接。 - 启用循环检测:
# dsconf -D "cn=Directory Manager" ldap://server2.example.com chaining config-set --add-control="1.3.6.1.4.1.1466.29539.12"
- 启用代理授权控制:
# dsconf -D "cn=Directory Manager" ldap://server2.example.com chaining config-set --add-control="2.16.840.1.113730.3.4.12"
- 添加本地代理授权 ACI:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server2.example.com -x dn: c=africa,ou=people,dc=example,dc=com changetype: modify add: aci aci:(targetattr="*")(target="lou=Zanzibar,c=africa,ou=people,dc=example,dc=com") (version 3.0; acl "Proxied authorization for database links"; allow (proxy) userdn = "ldap:///cn=server1 proxy admin,cn=config";)
- 添加一个 ACI,在 server 1 上启用 c=us,ou=body,dc=example,dc=com 中的带有
uid
属性设置的用户,以便在服务器 3 的 ou=Zanzibar,c=africa,ou=people,dc=example,dc=com 后缀数中执行任何类型的操作:# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server2.example.com -x dn: c=africa,ou=people,dc=example,dc=com changetype: modify add: aci aci:(targetattr="*")(target="ou=Zanzibar,c=africa,ou=people,dc=example,dc=com") (version 3.0; acl "Client authorization for database links"; allow (all) userdn = "ldap:///uid=*,c=us,ou=people,dc=example,dc=com";)
如果服务器 3 上的用户在不同的后缀下,则需要在服务器 3 上添加额外的权限,则需要在服务器 2 上添加额外的客户端 ACI。
服务器 3 中的配置步骤
- 在服务器 3 上为服务器 2 创建代理管理用户,以用于代理授权:
# ldapadd -D "cn=Directory Manager" -W -p 389 -h server3.example.com -x dn: cn=server2 proxy admin,cn=config objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson cn: server2 proxy admin sn: server2 proxy admin userPassword: password description: Entry for use by database links
重要出于安全考虑,请不要使用cn=Directory Manager
帐户。 - 添加本地代理授权 ACI:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server3.example.com -x dn: ou=Zanzibar,ou=people,dc=example,dc=com changetype: modify add: aci aci: (targetattr = "*")(version 3.0; acl "Proxied authorization for database links"; allow (proxy) userdn = "ldap:///cn=server2 proxy admin,cn=config";)
- 添加一个 ACI,在 server 1 上启用 c=us,ou=body,dc=example,dc=com 中的带有
uid
属性设置的用户,以便在服务器 3 的 ou=Zanzibar,c=africa,ou=people,dc=example,dc=com 后缀数中执行任何类型的操作:# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server3.example.com -x dn: ou=Zanzibar,ou=people,dc=example,dc=com changetype: modify add: aci aci: (targetattr ="*")(target="ou=Zanzibar,c=africa,ou=people,dc=example,dc=com") (version 3.0; acl "Client authentication for database link users"; allow (all) userdn = "ldap:///uid=*,c=us,ou=people,dc=example,dc=com";)
如果服务器 3 上的用户在不同的后缀下,则需要在服务器 3 上添加额外的权限,则需要在服务器 2 上添加额外的客户端 ACI。
现在设置了级联链配置。此级联配置可让用户绑定到服务器 1,并修改服务器 3 上的 ou=Zanzibar,c=africa,ou=body,dc=example,dc=com 分支中的信息。根据您的安全需求,可能需要提供更详细的访问控制。
2.4.3. 检测循环
目录服务器中包含的 LDAP 控制可防止循环。当第一次尝试链时,服务器会将这个控制设置为允许的最大跃点数或链连接数。每个后续服务器都会减少计数。如果服务器收到 0 计数,它会确定是否已检测到循环并通知客户端应用程序。
要使用控制,请添加 1.3.6.1.4.1.1466.29539.12 OID。有关添加 LDAP 控制的详情,请参考 第 2.3.2.2 节 “链 LDAP 控制”。如果每个数据库链接的配置文件中没有控制,则不会实施循环检测。
允许的跃点数量使用
nsHopLimit
参数定义。默认情况下,该参数设为 10。例如,要将 example
链的跃点限制设置为 5 :
# dsconf -D "cn=Directory Manager" ldap://server.example.com chaining link-set --hop-limit 5 example