18.9. 定义目标

ACI 中的目标规则定义目录服务器将 ACI 应用到哪些条目。如果您没有设置目标,ACM 应用到包含 aci 属性和以下条目的条目。
在 ACI 中,以下突出显示的部分是目标规则:
(target_rule)(version 3.0; acl "ACL_name"; permission_rule bind_rules;)
对于复杂的 ACI,Directory 服务器在 ACI 中支持多个带有不同关键字的目标规则:
(target_rule_1)(target_rule_2)(...)(version 3.0; acl "ACL_name"; permission_rule bind_rules;)
如果您指定多个目标规则,则顺序不相关。请注意,您只能在 ACI 中使用以下每个关键字一次:
  • target
  • targetattr
  • targetattrfilters
  • targetfilter
  • target_from
  • target_to

语法

目标规则的一般语法是:
(keyword comparison_operator "expression")
  • 关键字 :设置目标的类型。请参阅 第 18.9.1 节 “常用的目标关键字”
  • compare_operator: Valid 值为 =!=,并且指明目标是否为表达式中指定的对象。
    警告
    出于安全考虑,红帽建议使用 != 运算符,因为它允许对所有其他条目或属性进行指定的操作。例如:
    (targetattr != "userPassword");(version 3.0; acl "example"); allow (write) ... );
    前面的示例允许用户在您设置 ACI 的 Distinguished Name (DN)下设置、更新或删除任何属性,但 userPassword 属性除外。但是,这还可让用户添加额外的 aci 属性,允许写入此属性的访问。
  • 表达式 :设置目标,且必须用引号括起来。表达式本身取决于您使用的关键字。

18.9.1. 常用的目标关键字

管理员经常使用以下目标关键字:

18.9.1.1. 以目录条目为目标

要根据 DN 及其下面的条目控制访问,请在 ACI 中使用 target 关键字。使用 target 关键字的目标规则将 DN 用作表达式:
(target comparison_operator "ldap:///distinguished_name")
注意
您必须使用目标的 DN 上的 target 关键字或更高级别的 DN 设置 ACI。例如,如果您以 ou=People,dc=example,dc=com 为目标,您必须在 ou=People,dc=example,dc=comdc=example,dc=com 中设置 ACI。

例 18.1. 使用 目标 关键字

要启用存储在 ou=People,dc=example,dc=com 条目中的用户,以搜索并显示其自身条目中的所有属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (target = "ldap:///ou=People,dc=example,dc=com") (version 3.0;
 acl "Allow users to read and search attributes of own entry"; allow (search, read)
 (userdn = "ldap:///self");)

target Keyword 中使用通配符

您可以使用 * 通配符来以多个条目为目标。
以下目标规则示例与 ou=People,dc=example,dc=com 中的所有条目匹配:它的 uid 属性设为以字母 a 开头的值:
(target = "ldap:///uid=a*,ou=People,dc=example,dc=com")
根据通配符的位置,该规则不仅适用于属性值,也应用到完整的 DN。因此,您可以使用通配符替换 DN 的部分内容。

例 18.2. 使用通配符以目录条目为目标

以下规则以 dc=example,dc=com 树中的所有条目为目标,它们带有匹配的 uid 属性,而不仅仅是存储在 dc=example,dc=com 条目本身中的条目:
(target = "ldap:///uid=user_name*,dc=example,dc=com")
以上目标规则与多个条目匹配,例如:
  • uid=user_name,dc=example,dc=com
  • uid=user_name,ou=People,dc=example,dc=com
  • uid=user_name2,dc=example,dc=com
重要
目录服务器不支持 DN 的后缀部分中的通配符。例如,如果您的目录的后缀是 dc=example,dc=com,则无法使用此后缀中的通配符使用带通配符的目标,如 (target = "ldap:///dc=39).com")

18.9.1.2. 目标属性

要将 ACI 中的访问限制到某些属性,请使用 targetattr 关键字。例如,这个关键字定义了:
  • 在读取操作中,哪些属性将返回到客户端
  • 在搜索操作中,将搜索哪些属性
  • 在写入操作中,可以将哪些属性写入对象
  • 在 add 操作中,创建新对象时可以添加哪些属性
注意
在某些情况下,您可以使用 targetattr 关键字将其他目标关键字与 targetattr 相结合来保护 ACI。例如,请参阅 第 18.9.3 节 “目标规则的高级用法”
重要
读取和 搜索操作 中,默认目标没有属性。没有 targetattr 关键字的 ACI 只对带有正确影响一个完整条目的 ACI 有用,例如 adddelete
要在目标规则中分隔使用 targetattr 关键字的多个属性,请使用 ||
(targetattr comparison_operator "attribute_1 || attribute_2 || ...")
表达式中设置的属性必须在 schema 中定义。
注意
表达式中指定的属性适用于您在其上创建 ACI 的条目,并在进一步的目标规则不限制的情况下应用到其下面的所有条目。

例 18.3. 使用 targetattr Keyword

要启用存储在 dc=example,dc=com 和所有子条目中的用户,以更新其自己条目的 userPassword 属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "userPassword") (version 3.0;
 acl "Allow users updating own userPassword";
 allow (write) (userdn = "ldap:///self");)

将通配符 与目标attr Keyword 搭配使用

例如,使用 * 通配符您可以以所有属性为目标:
(targetattr = "*")
警告
为安全起见,请不要将通配符用于 目标attr,因为它允许访问所有属性,包括操作属性。例如,如果用户可以添加或修改所有属性,用户可以创建额外的 ACI 并增加他们自己的权限。

18.9.1.3. 使用 LDAP 过滤器目标条目和属性

要针对一组与特定条件匹配的条目为目标,请使用带有 LDAP 过滤器的 target filter 关键字:
(targetfilter comparison_operator "LDAP_filter")
过滤器表达式是一个标准的 LDAP 搜索过滤器,如 第 14 章 查找目录条目 所述。

例 18.4. 使用 targetfilter 关键字

要为 cn=Human Resources,dc=example,dc.com 组的成员授予权限,以修改 department 属性设置为 EngineeringSales 的所有条目:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetfilter = "(|(department=Engineering)(department=Sales)")
 (version 3.0; acl "Allow HR updating engineering and sales entries";
 allow (write) (groupdn = "ldap:///cn=Human Resources,dc=example,dc.com");)
targetfilter 关键字以整个条目为目标。如果您将它与 targetattr 关键字结合使用,则 ACI 仅适用于目标条目的属性子集。请参阅 第 18.9.3.3 节 “目标与过滤器匹配的条目属性”
注意
当目标条目和属性分散到目录中时,使用 LDAP 过滤器很有用。但是,结果有时无法预测,因为过滤器不会直接命名您要管理访问权限的对象。过滤的 ACI 目标的一组条目可能会更改,因为属性会被添加或删除。因此,如果您在 ACI 中使用 LDAP 过滤器,请使用相同的过滤器验证它们是否以正确的条目和属性为目标,例如在 ldapsearch 操作中。

使用带有 targetfilter 关键字的通配符

targetfilter 关键字支持通配符与标准 LDAP 过滤器类似。例如,要针对其值以 adm 开头的所有 uid 属性为目标:
(targetfilter = "(uid=adm*) ...)

18.9.1.4. 使用 LDAP 过滤器目标属性值

您可以使用访问控制来目标属性的特定值。这意味着,如果该属性的值满足 ACI 中定义的条件,您可以对属性授予或拒绝权限。根据属性值授予或拒绝访问权限的 ACI,称为基于值的 ACI。
注意
这只适用于 ADDDEL 操作。您不能根据特定值限制搜索权限。
要创建基于值的 ACI,请使用以下语法使用 targattrfilters 关键字:
  • 对于一个带有一个属性和过滤组合的操作:
    (targattrfilters="operation=attribute:filter")
  • 对于具有多个属性和过滤组合的一个操作:
    (targattrfilters="operation=attribute_1:filter_1 && attribute_2:filter_2 ... && attribute_m:filter_m")
  • 对于两个操作,每个操作都有多个属性和过滤组合:
    (targattrfilters="operation_1=attribute_1_1:filter_1_1 && attribute_1_2:filter_1_2 ... && attribute_1_m:filter_1_m , operation_2=attribute_2_1:filter_2_1 && attribute_2_2:filter_2_2 ... & attribute_2_n:filter_2_n ")
在前面的语法示例中,您可以将操作设置为 adddelattribute:filter 组合设置过滤器和过滤器应用到的属性。
下面描述了过滤器如何匹配:
  • 在创建条目和过滤器应用到新条目中的属性时,该属性的每个实例必须与过滤器匹配。
  • 删除条目和过滤器应用到条目中的属性时,该属性的每个实例也必须与过滤器匹配。
  • 修改条目和操作会添加一个属性,则应用到该属性的 add 过滤器必须匹配。
  • 如果操作删除了属性,则应用到该属性的 del 过滤器必须匹配。如果条目中已存在的属性的单个值被替换,则 adddel 过滤器必须都匹配。

例 18.5. 使用 targattrfilters Keyword

要创建 ACI,允许用户在自己的条目中添加任何角色,但 Admin 角色除外,并添加 telephone 属性,只要值以 123 前缀开头:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targattrfilters="add=nsroledn:(!(nsroledn=cn=Admin)) &&
 telephoneNumber:(telephoneNumber=123*)") (version 3.0;
 acl "Allow adding roles and telephone";
 allow (add) (userdn = "ldap:///self");)

18.9.2. 更多目标关键字

这部分描述了不经常使用的目标关键字。

18.9.2.1. 目标源和目标 DN

在某些情况下,管理员希望用户移动目录条目。在 ACI 中使用 target_fromtarget_to 关键字,您可以指定操作的源和目标,而无需启用用户:
  • 将条目从 ACI 中设置的不同源移动。
  • 将条目移到 ACI 中设置的不同目的地。
  • 从源 DN 中删除现有条目:
  • 将新条目添加到目标 DN。

例 18.6. 使用 target_fromtarget_to Keywords

例如,要启用 uid=user,dc=example,dc=com 帐户,将用户帐户从 cn=staging,dc=example,dc=com 条目移到 cn=body,dc=example,dc=com
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (target_from="ldap:///uid=*,cn=staging,dc=example,dc=com")
 (target_to="ldap:///cn=People,dc=example,dc=com")
 (version 3.0; acl "MODDN from"; allow (moddn))
 userdn="ldap:///uid=user,dc=example,dc=com";)
注意
ACI 仅适用于定义它们的子树。在上例中,ACI 仅适用于 dc=example,dc=com 子树。
如果没有设置 target_fromtarget_to 关键字,则 ACI 会匹配任何 source 或 destination。

18.9.3. 目标规则的高级用法

通过组合多个关键字,您可以创建复杂的目标规则。本节提供了目标规则的高级用法示例。

18.9.3.1. 委派创建和维护组的权限

在某些情况下,管理员希望将权限委派给其他帐户或组。通过组合目标关键字,您可以创建可以解决这个问题的安全 ACI。

例 18.7. 委派创建和维护组的权限

要启用 uid=用户,ou=People,dc=example,dc=com" 帐户在 ou=groups,dc=example,dc=com 条目中创建和更新组:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (target = "ldap:///cn=*,ou=Groups,dc=example,dc=com")
 (targattrfilters="add=objectclass:(|(objectclas=top)(objectclass=groupOfUniqueNames)))
 (targetattr="cn || uniqueMember || objectClass")
 (version 3.0; acl "example"; allow (read, search, write, add)
 (userdn = "ldap:///uid=test,ou=People,dc=example,dc=com");)
为了安全起见,上例添加了某些限制。uid=test,ou=People,dc=example,dc=com 用户:
  • 可以创建必须包含 topgroupOfUniqueNames 对象类的对象。
  • 无法添加额外的对象类,如 帐户。例如,这可以防止使用 Directory 服务器帐户进行本地身份验证,为 root 用户创建具有无效用户 ID 的新用户,如 0。
targetfilter 规则确保 ACI 条目仅适用于具有 groupofuniquenames 对象类的条目,并且 targetattrfilter 规则可确保不能添加其他对象类。

18.9.3.2. 定位条目和属性

目标 根据 DN 控制访问。但是,如果您将其与通配符和 targetattr 关键字结合使用,您可以针对条目和属性为目标。

例 18.8. 定位条目和属性

要启用 uid=user,ou=People,dc=example,dc.com 用户,以便在 dc=example,dc=com 子树中的所有机构单元中读取和搜索组成员:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (target="ldap:///cn=*,dc=example,dc=com")(targetattr="member" || "cn") (version 3.0;
 acl "Allow uid=user to search and read members of groups";
 allow (read, search) (userdn = "ldap:///uid=user,ou=People,dc=example,dc.com");)

18.9.3.3. 目标与过滤器匹配的条目属性

如果您在两个目标规则中组合 targetattrtargetfilter 关键字,您可以在与过滤器匹配的条目中针对某些属性。

例 18.9. 目标与过滤器匹配的条目属性

要允许 cn=Engineering Admins,dc=example,dc=com 组的成员修改 department 属性设置为 Engineering 的所有条目的 jpegPhotomanager 属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "jpegPhoto || manager")
 (targetfilter = "(department=Engineering)") (version 3.0;
 acl "Allow engineering admins updating jpegPhoto and manager of department members";
 allow (write) (groupdn = "ldap:///cn=Engineering Admins,dc=example,dc.com");)

18.9.3.4. 以单个目录条目为目标

要以单个目录条目为目标,请组合 targetattrtargetfilter 关键字。

例 18.10. 以单个目录条目为目标

要启用 uid=user,ou=People,dc=example,dc=com 用户可以在 ou=Engineering,dc=example,dc=com 条目中读和搜索 oucn 属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=Engineering,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "ou || cn")
 (targetfilter = "(ou=Engineering)") (version 3.0;
 acl "Allow uid=user to search and read engineering attributes";
 allow (read, search) (userdn = "ldap:///uid=user,ou=People,dc=example,dc.com");)
若要启用前面的示例,仅以 ou=Engineering,dc=example,dc=com 条目为目标,则 ou=Engineering,dc=example,dc=com 中的子条目不能将 ou 属性设置为 Engineering
重要
如果您的目录结构发生了变化,则这些类型的 ACI 可能会失败。
或者,您可以创建一个与绑定请求中的用户输入匹配的绑定规则,并使用存储在目标条目的属性值。请参阅 第 18.11.2.1 节 “根据匹配值定义访问”