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。请参阅 目标规则 的高级用法。
在 read
和 search
操作中,默认目标为 no 属性。没有 targetattr
关键字的 ACI 仅适用于影响完整条目(如 add
或 delete
)的权限。
要分隔使用 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 属性设为 Engineering
或 Sales
的所有条目:
# 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。这只适用于 ADD
和 DEL
操作。您不能根据特定值限制搜索权利。
要创建基于值的 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 ")
在前面的语法示例中,您可以设置操作 来添加
或 del
。attribute:filter
组合设置过滤器和过滤器所应用到的属性。
下面描述了过滤器如何匹配:
- 当创建条目和过滤器应用到新条目中的属性时,该属性的每个实例都必须与过滤器匹配。
- 当删除条目和过滤器应用到条目中的属性时,该属性的每个实例还必须与过滤器匹配。
-
当修改条目和操作时,操作会添加一个属性,则应用到该属性的
add
过滤器必须匹配。 -
如果操作删除某个属性,则应用到该属性的
del
过滤器必须匹配。如果条目中已存在某个属性的单独值已被替换,则add
和del
过滤器都必须匹配。
例 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_from
和 target_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_from
或 target_to
关键字,则 ACI 与任何源或目的地匹配。