1.7. 定义 ACI 目标

访问控制指令(ACI)中的目标规则定义目录服务器应用 ACI 的条目。如果您没有设置目标,ACI 将应用到包含 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

1.7.1. 目标规则的语法

目标规则的一般语法是:

(keyword comparison_operator "expression")
  • 关键字 :设置目标的类型。
  • comparison_operator: 有效值为 =!=,并指明目标是表达式中指定的对象。

    警告

    出于安全考虑,红帽建议不要使用 != 运算符,因为它允许指定对所有其他条目或属性的操作。例如:

    (targetattr != "userPassword");(version 3.0; acl "example"); allow (write) ... );

    前面的示例允许用户设置、更新或删除任何属性,除了设置了 ACI 的 Distinguished Name(DN)下的 userPassword 属性除外。不过,这也可让用户添加额外的 aci 属性,允许对此属性进行写入访问权限。

  • 表达式 :设置目标,且必须使用引号括起。表达式本身取决于您使用的关键字。

1.7.2. 定位目录条目

要根据可辨识的名称(DN)和其下面的条目控制访问,请使用访问控制指令(ACI)中的 target 关键字。使用 target 关键字的目标规则将 DN 用作表达式:

(target comparison_operator "ldap:///distinguished_name")
注意

您必须在目标的 DN 或更高级别的 DN 上使用 target 关键字设置 ACI。例如,如果目标 ou=People,dc=example,dc=com,您必须在 ou=People,dc=example,dc=com 或 dc=example,dc=com 中设置 ACI。

例 1.1. 使用 target 关键字

要启用存储在 ou=People,dc=example,dc=com 条目中的用户,以搜索和显示他们自己的条目中的所有属性:

# ldapmodify -D "cn=Directory Manager" -W -H ldap://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 关键字的通配符

您可以使用 * 通配符目标多个条目。

以下目标规则示例匹配 ou=People,dc=example,dc=com 中所有条目,其 uid 属性设置为以字母 a 开头的值:

(target = "ldap:///uid=a*,ou=People,dc=example,dc=com")

根据通配符的位置,该规则不仅适用于属性值,而且也适用于完整的 DN。因此,您可以使用通配符替换 DN 的部分。

例 1.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=*.com")

1.7.3. 目标属性

要将访问控制指令(ACI)中的访问权限限制为某些属性,请使用 targetattr 关键字。例如,这个关键字定义:

  • 在读取操作中,将向客户端返回哪些属性
  • 在搜索操作中,搜索哪些属性
  • 在写入操作中,可以将哪些属性写入对象
  • 在 add 操作中,创建新对象时可以添加哪些属性

在某些情况下,您可以通过将其他目标关键字与 targetattr 结合使用,使用 targetattr 关键字来保护 ACI。请参阅 目标规则 的高级用法

重要

readsearch 操作中,默认目标为 no 属性。没有 targetattr 关键字的 ACI 仅适用于影响完整条目(如 adddelete )的权限。

要分隔使用 targetattr 关键字的目标规则中的多个属性,请使用 ||

(targetattr comparison_operator "attribute_1 || attribute_2 || ...")

表达式中设置的属性必须在架构中定义。

表达式中指定的属性适用于创建 ACI 的条目以及如果未通过进一步目标规则限制的所有条目。

例 1.3. 使用 targetattr 关键字

要启用存储在 dc=example,dc=com 中的用户,且所有子尝试更新他们自己的条目中的 userPassword 属性,请输入:

# ldapmodify -D "cn=Directory Manager" -W -H ldap::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");)

使用 targetattr 关键字的通配符

使用 * 通配符字符,您可以针对所有属性:

(targetattr = "*")
警告

出于安全考虑,不要将通配符与 targetattr 一起使用,因为它允许访问所有属性,包括操作属性。例如,如果用户可以添加或修改所有属性,用户可以创建额外的 ACI 并增加自己的权限。

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

要针对与特定条件匹配的一组条目,请使用 targetfilter 关键字及 LDAP 过滤器:

(targetfilter comparison_operator "LDAP_filter")

过滤器表达式是标准 LDAP 搜索过滤器。

例 1.4. 使用 targetfilter 关键字

要为 cn=Human Resources,dc=example,dc.com 组的成员授予权限,以修改将 department 属性设为 EngineeringSales 的所有条目:

# ldapmodify -D "cn=Directory Manager" -W -H ldap://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)只适用于目标条目的子集。请参阅目标与过滤器匹配的条目的特定属性

注意

当目标在目录中分发的条目和属性时,使用 LDAP 过滤器很有用。但是,结果有时不可预测,因为过滤器不会直接命名管理访问的对象。当添加或删除属性时,由过滤 ACI 的目标条目集合可能会改变。因此,如果您在 ACI 中使用 LDAP 过滤器,请验证它们是否在同一过滤器中针对正确的条目和属性,例如在 ldapsearch 操作中。

使用 targetfilter 关键字的通配符

targetfilter 关键字支持与标准 LDAP 过滤器类似。例如,要将值以 adm 开头的所有 uid 属性为目标,请使用:

(targetfilter = "(uid=adm*) ...)

1.7.5. 使用 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 ")

在前面的语法示例中,您可以设置操作 来添加delattribute:filter 组合设置过滤器和过滤器所应用到的属性。

下面描述了过滤器如何匹配:

  • 当创建条目和过滤器应用到新条目中的属性时,该属性的每个实例都必须与过滤器匹配。
  • 当删除条目和过滤器应用到条目中的属性时,该属性的每个实例还必须与过滤器匹配。
  • 当修改条目和操作时,操作会添加一个属性,则应用到该属性的 add 过滤器必须匹配。
  • 如果操作删除某个属性,则应用到该属性的 del 过滤器必须匹配。如果条目中已存在某个属性的单独值已被替换,则 adddel 过滤器都必须匹配。

例 1.5. 使用 targattrfilters 关键字

要创建 ACI,允许用户在其自己的条目中添加任何角色,但 Admin 角色除外,以及添加 电话 属性(只要值以 123 前缀开头),请输入:

# ldapmodify -D "cn=Directory Manager" -W -H ldap::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");)

1.7.6. 目标源和目标 DN

在某些情况下,管理员希望允许用户移动目录条目。在访问控制指令(ACI)中使用 target_fromtarget_to 关键字,您可以在不启用用户的情况下指定操作的源和目的地:

  • 要从 ACI 中设定的不同源移动条目。
  • 要将条目移动到 ACI 中设定的不同目的地。
  • 从源 Distinguished Name(DN)中删除现有条目。
  • 将新条目添加到目标 DN 中:

例 1.6. 使用 target_from 和 target_to 关键字

要启用 uid=user,dc=example,dc=com 帐户,将用户帐户从 cn=staging,dc=example,dc=com 条目移到 cn=Person,dc=example,dc=com,请输入:

# ldapmodify -D "cn=Directory Manager" -W -H ldap: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 与任何源或目的地匹配。