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 节 “以目录条目为目标”。
- 目标attr :请参阅 第 18.9.1.2 节 “目标属性”。
- targetfilter :请参阅 第 18.9.1.3 节 “使用 LDAP 过滤器目标条目和属性”。
- targattrfilters: 请参阅 第 18.9.1.4 节 “使用 LDAP 过滤器目标属性值”。
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=com 或 dc=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 关键字的 ACI 只对带有正确影响一个完整条目的 ACI 有用,例如 add 或 delete。
要在目标规则中分隔使用 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
属性设置为 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 关键字以整个条目为目标。如果您将它与 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。
注意
这只适用于 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 ")
在前面的语法示例中,您可以将操作设置为 add 或 del。attribute:filter 组合设置过滤器和过滤器应用到的属性。
下面描述了过滤器如何匹配:
- 在创建条目和过滤器应用到新条目中的属性时,该属性的每个实例必须与过滤器匹配。
- 删除条目和过滤器应用到条目中的属性时,该属性的每个实例也必须与过滤器匹配。
- 修改条目和操作会添加一个属性,则应用到该属性的 add 过滤器必须匹配。
- 如果操作删除了属性,则应用到该属性的 del 过滤器必须匹配。如果条目中已存在的属性的单个值被替换,则 add 和 del 过滤器必须都匹配。
例 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_from 和 target_to 关键字,您可以指定操作的源和目标,而无需启用用户:
- 将条目从 ACI 中设置的不同源移动。
- 将条目移到 ACI 中设置的不同目的地。
- 从源 DN 中删除现有条目:
- 将新条目添加到目标 DN。
例 18.6. 使用 target_from 和 target_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_from 或 target_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 用户:
- 可以创建必须包含 top 和 groupOfUniqueNames 对象类的对象。
- 无法添加额外的对象类,如 帐户。例如,这可以防止使用 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. 目标与过滤器匹配的条目属性
如果您在两个目标规则中组合 targetattr 和 targetfilter 关键字,您可以在与过滤器匹配的条目中针对某些属性。
例 18.9. 目标与过滤器匹配的条目属性
要允许 cn=Engineering Admins,dc=example,dc=com 组的成员修改
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. 以单个目录条目为目标
要以单个目录条目为目标,请组合 targetattr 和 targetfilter 关键字。
例 18.10. 以单个目录条目为目标
要启用 uid=user,ou=People,dc=example,dc=com 用户可以在 ou=Engineering,dc=example,dc=com 条目中读和搜索
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,dc=example,dc=com 条目为目标,则 ou=Engineering,dc=example,dc=com 中的子条目不能将
ou
属性设置为 Engineering。
重要
如果您的目录结构发生了变化,则这些类型的 ACI 可能会失败。
或者,您可以创建一个与绑定请求中的用户输入匹配的绑定规则,并使用存储在目标条目的属性值。请参阅 第 18.11.2.1 节 “根据匹配值定义访问”。