18.12. 检查条目上的访问权限(受影响的右边)

查找特定条目中用户对属性的访问权限,为管理员提供便捷的方式,以便管理员查找和控制访问权限。
获得有效权限 是一种扩展目录搜索的方法,以显示哪些访问权限,如读取、搜索、写入和自我写入、添加和删除 - 用户对于指定条目。
在目录服务器中,常规用户可以查看他们可以查看的条目的权限,并可检查其他个人条目的访问权限。Directory Manager 可以检查一个用户具有其他用户的权限。
在两种常见情况下,检查条目的有效权限很有用:
  • 管理员可以使用 get valid rights 命令更好地组织目录的访问控制指令。经常需要限制一组用户可以查看或编辑另一个组。例如,QA Managers 组的成员可能有权限搜索并读 managersalary 等属性,当只有 HR Group 的成员有权限修改或删除它们。检查用户或组的有效权限是验证是否有适当的访问控制。
  • 用户可以运行 get valid rights 命令,以查看自己可在其个人条目上查看或修改哪些属性。例如,用户应该有权访问 homePostalAddresscn 等属性,但只能对 managersalary 属性具有读取访问权限。
getEffectiveRights 搜索中涉及三个实体。第一个是 请求者,这是发出 getEffectiveRights 搜索操作时经过身份验证的条目。第二个是评估其权利 的主题,它被定义为 GER 控制中的 授权 DN。第三个是 目标,它由请求搜索基本、搜索过滤器和属性列表定义。

18.12.1. 带有 Get Effective rights Search 的权利显示

当在命令行中搜索任何 get valid rights 搜索时,显示请求者必须属于目标条目的权利。
对于任何条目,可以使用两种类型的访问权限:第一个是高级别权限,对条目本身的权限,这意味着用户 A 可以对整个用户 B 条目执行的操作类型。第二个访问权限级别更为精细,显示 给定属性用户 A 具有哪些权限。在这种情况下,用户 A 可能对同一条目的不同属性具有不同的访问权限。用户允许的任何访问控制都是 对该条目的有效权限
例如:
entryLevelRights: vadn
attributeLevelRights: givenName:rscWO, sn:rscW, objectClass:rsc, uid:rsc, cn:rscW
表 18.2 “条目右边” 表 18.3 “属性右边” 分别显示条目和属性的访问权限,它们分别由 get valid rights 搜索返回。

表 18.2. 条目右边

权限 描述
a 添加一个条目。
d 删除此条目。
n 重命名 DN。
v 查看条目。

表 18.3. 属性右边

权限 描述
r 读。
s 搜索。
w 写(mod-add)。
o Obliterate(mod-del).与删除类似。
c 比较。
W 自我写入。
O 自我删除。

18.12.3. GER 搜索示例

根据需要返回的信息类型以及正在搜索的条目和属性类型,可以运行 GER 搜索的方式。

18.12.3.1. 检查访问右边的常规示例

用于有效权限搜索的一个常见场景是让常规用户决定自己个人条目可以进行了哪些更改。
例如,Ted Morris 希望检查他必须检查其条目的权限。-D-E 选项都给出其条目作为请求者。由于他正在检查其个人条目,-b 选项还包含其 DN。

例 18.36. 检查个人右边(用户 A 到用户 A)

# ldapsearch -x -p 389 -h server.example.com -D "uid=tmorris,ou=people,dc=example,dc=com" -W -b "uid=tmorris,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=tmorris,ou=people,dc=example,dc=com' "(objectClass=*)"

 dn: uid=tmorris,ou=People,dc=example,dc=com
 givenName: Ted
 sn: Morris
 ou: IT
 ou: People
 l: Santa Clara
 manager: uid=jsmith,ou=People,dc=example,dc=com
 roomNumber: 4117
 mail: tmorris@example.com
 facsimileTelephoneNumber: +1 408 555 5409
 objectClass: top
 objectClass: person
 objectClass: organizationalPerson
 objectClass: inetOrgPerson
 uid: tmorris
 cn: Ted Morris
 userPassword: {SSHA}bz0uCmHZM5b357zwrCUCJs1IOHtMD6yqPyhxBA==
 entryLevelRights: v
 attributeLevelRights: givenName:rsc, sn:rsc, ou:rsc, l:rsc, manager:rsc, roomNumber:rscwo, mail:rscwo, facsimileTelephoneNumber:rscwo, objectClass:rsc, uid:rsc, cn:rsc, userPassword:wo
例如,Ted Morris 可能是一个经理,或者在需要编辑其他用户的条目(如 IT 或人工资源)中工作。在这种情况下,他可能希望检查自己对另一个用户条目的权限,如 例 18.37 “通过另一个用户单独检查一个用户的权利(用户 A 到用户 B)” 中所示,Ted (-D)会检查其权利(-E)到 Dave Miller 条目(-b):

例 18.37. 通过另一个用户单独检查一个用户的权利(用户 A 到用户 B)

# ldapsearch -p 389 -h server.example.com -D "uid=tmorris,ou=people,dc=example,dc=com" -W -b "uid=dmiller,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=tmorris,ou=people,dc=example,dc=com' "(objectClass=*)"

dn: uid=dmiller,ou=People,dc=example,dc=com
...
entryLevelRights: vad
attributeLevelRights: givenName:rscwo, sn:rscwo, ou:rscwo, l:rscwo, manager:rsc, roomNumber:rscwo, mail:rscwo, facsimileTelephoneNumber:rscwo, objectClass:rscwo, uid:rscwo, cn:rscwo, userPassword:rswo
对于所有属性,Ted Morris 具有对 Dave Miller 条目的读、搜索、比较、修改和删除权限。这些结果与检查 Ted Morris 对其自己的条目的访问权限不同,因为他只具有对这些属性的读、搜索和比较权利。
Directory Manager 能够检查一个用户具有另一个用户条目的权限。在 例 18.38 “Directory Manager 的检查一个用户超过另一个用户(用户 A 到用户 B)” 中,目录管理器检查经理 Jane Smith (-E)已超过了其子级,Ted Morris (-b):

例 18.38. Directory Manager 的检查一个用户超过另一个用户(用户 A 到用户 B)

# ldapsearch -p 389 -h server.example.com -D "cn=Directory Manager" -W -b "uid=tmorris,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=jsmith,ou=people,dc=example,dc=com' "(objectClass=*)"

dn: uid=tmorris,ou=People,dc=example,dc=com
...
entryLevelRights: vadn
attributeLevelRights: givenName:rscwo, sn:rscwo, ou:rscwo, l:rscwo, manager:rscwo, roomNumber:rscwo, mail:rscwo, facsimileTelephoneNumber:rscwo, objectClass:rscwo, uid:rscwo, cn:rscwo, userPassword:rscwo
只有管理员才能检索不同用户对条目具有的有效权限。如果 Ted Morris 尝试确定 Dave Miller 对 Dave Miller 条目的权限,则他会收到不正确的访问错误:
# ldapsearch -p 389 -h server.example.com -D "uid=dmiller,ou=people,dc=example,dc=com" -W -b "uid=tmorris,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=tmorris,ou=people,dc=example,dc=com' "(objectClass=*)"

ldap_search: Insufficient access
ldap_search: additional info: get-effective-rights: requester has no g permission on the entry
但是,普通用户可以运行 get valid rights search 以查看另一个用户必须具有哪些个人条目的权限。在 例 18.39 “检查一些个人条目是否拥有权利” 中,Ted Morris 检查 Dave Miller 在 Ted Morris 条目上是否有权限。

例 18.39. 检查一些个人条目是否拥有权利

# ldapsearch -p 389 -h server.example.com -D "uid=tmorris,ou=people,dc=example,dc=com" -W -b "uid=tmorris,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=dmiller,ou=people,dc=example,dc=com' "(objectClass=*)"

dn: uid=tmorris,ou=people,dc=example,dc=com
...
entryLevelRights: v
attributeLevelRights: givenName:rsc, sn:rsc, ou:rsc, l:rsc,manager:rsc, roomNumber:rsc, mail:rsc, facsimileTelephoneNumber:rsc, objectClass:rsc, uid:rsc, cn:rsc, userPassword:none
在这种情况下,Dave Miller 能够查看条目的 DN,以及读取、搜索和比较 ou、giveNamel 和其他属性以及没有对 userPassword 属性的权利。

18.12.3.2. 为非独占属性搜索 Effective rights 的示例

默认情况下,对于没有值的条目中的属性不会给出信息;例如,如果删除了 userPassword 值,则对上述条目的任何有效权限搜索将不会返回 userPassword 的任何有效权限,即使可以允许自写和自我删除权限。
使用带有适当权限的、带有星号 (*) 的搜索会返回条目可用的每个属性,包括条目上未设置的属性。

例 18.40. 非独占属性的返回影响右边

# ldapsearch -D "cn=Directory Manager" -W -b "uid=scarter,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" "*"  

dn: uid=scarter,ou=People,dc=example,dc=com
givenName: Sam
telephoneNumber: +1 408 555 4798
sn: Carter
ou: Accounting
ou: People
l: Sunnyvale
manager: uid=dmiller,ou=People,dc=example,dc=com
roomNumber: 4612
mail: scarter@example.com
facsimileTelephoneNumber: +1 408 555 9700
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
uid: scarter
cn: Sam Carter
userPassword: {SSHA}Xd9Jt8g1UsHC8enNDrEmxj3iJPKQLItlDYdD9A==
entryLevelRights: vadn
attributeLevelRights: objectClass:rscwo, aci:rscwo, sn:rscwo, cn:rscwo, description:rscwo, seeAlso:rscwo, telephoneNumber:rscwo, userPassword:rscwo, destinationIndicator:rscwo, facsimileTelephoneNumber:rscwo, internationaliSDNNumber:rscwo, l:rscwo, ou:rscwo, physicalDeliveryOfficeName:rscwo, postOfficeBox:rscwo, postalAddress:rscwo, postalCode:rscwo, preferredDeliveryMethod:rscwo, registeredAddress:rscwo, st:rscwo, street:rscwo, teletexTerminalIdentifier:rscwo, telexNumber:rscwo, title:rscwo, x121Address:rscwo, audio:rscwo, businessCategory:rscwo, carLicense:rscwo, departmentNumber:rscwo, displayName:rscwo, employeeType:rscwo, employeeNumber:rscwo, givenName:rscwo, homePhone:rscwo, homePostalAddress:rscwo, initials:rscwo, jpegPhoto:rscwo, labeledUri:rscwo, manager:rscwo, mobile:rscwo, pager:rscwo, photo:rscwo, preferredLanguage:rscwo, mail:rscwo, o:rscwo, roomNumber:rscwo, secretary:rscwo, uid:rscwo,x500UniqueIdentifier:rscwo, userCertificate:rscwo, userSMIMECertificate:rscwo, userPKCS12:rscwo
列出了可用于该条目的所有属性,如 机密,即使该属性不存在。

18.12.3.3. 针对特定属性或对象类搜索受影响的示例

另外,可以进一步搜索与属性相关的 GER,可以搜索特定属性和属性集合的权限,并列出条目中设置的某一对象类提供的所有属性。
第 18.12.2 节 “Get Effectives Search 的格式” 中格式化示例中列出的一个选项是 attributeList。要只返回特定属性的有效权限,请在 search 命令末尾列出以空格分开的属性。

例 18.41. 为特定属性获得受影响的结果

# ldapsearch -D "cn=Directory Manager" -W -b "uid=scarter,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" cn mail initials  

dn: uid=scarter,ou=People,dc=example,dc=com
cn: Sam Carter
mail: scarter@example.com
entryLevelRights: vadn
attributeLevelRights: cn:rscwo, mail:rscwo, initials:rscwo
可以像 例 18.41 “为特定属性获得受影响的结果” 中的 initials 属性一样,可以在 attributeList 中指定不存在的属性,以查看可用的权利,类似于使用星号列出所有属性。
Directory Manager 也可以列出特定对象类所有可用的属性的权限。此选项具有格式 属性@objectClass。这会返回两个条目:指定 GER 主题的第一个,另一个用于对象类的模板条目。

例 18.42. 获取对象类中属性的结果

# ldapsearch -D "cn=Directory Manager" -W -b "uid=scarter,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" uidNumber@posixAccount   
...
dn: cn=template_posixaccount_objectclass,uid=scarter,ou=people,dc=example,dc=com
uidnumber: (template_attribute)
entryLevelRights: v
attributeLevelRights: uidNumber:rsc
注意
只有在请求者(-D)是目录管理器时,使用搜索格式 属性@objectClass 才可用。
使用星号(*)而不是一个特定的属性,会返回特定 GER 主题的所有属性(包括存在的和不存在的),以及对象类模板的完整属性。

例 18.43. 获取对象类所有属性的结果

# ldapsearch -D "cn=Directory Manager" -W -b "uid=scarter,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" *@posixaccount   
...
dn: cn=template_posixaccount_objectclass,uid=scarter,ou=people,dc=example,dc=com 
objectClass: posixaccount 
objectClass: top 
homeDirectory: (template_attribute) 
gidNumber: (template_attribute) 
uidNumber: (template_attribute) 
uid: (template_attribute) 
cn: (template_attribute) 
entryLevelRights: v 
attributeLevelRights: cn:rsc, uid:rsc, uidNumber:rsc, gidNumber:rsc, homeDirectory:rsc, objectClass:rsc, userPassword:none, loginShell:rsc, gecos:rsc, description:rsc, aci:rsc

18.12.3.4. 为 Non-Existent 条目的 Get Effective rights 搜索示例

管理员可能希望根据现有的访问控制规则检查特定用户(jsmith)必须哪些权限对于不存在的用户。要检查不存在的条目,服务器会在该子树中生成一个模板条目。例如,若要检查模板条目 cn=joe 新用户 cn=joe new user,cn=accounts,ou=body,dc=example,dc=com,服务器会创建 cn=template,cn=accounts,ou=body,dc=example,dc=com
要检查不存在的条目,get valid rights search 可以使用指定的对象类生成包含(不存在)条目的所有潜在属性的模板条目。对于 cn=joe 新用户,cn=accounts,ou=body,dc=example,dc=com with person 对象类(@person),服务器会生成 cn=template_person_objectclass,cn=accounts,ou=body,dc=example,dc=com
当服务器创建模板条目时,它使用对象类定义中的第一个 MUST 属性来创建 RDN 属性(如果没有 MUST 属性,则使用 MAY)。但是,这可能会导致错误 RDN 值,该值反过来违反或绕过给定子树的 ACI。在这种情况下,可以通过将对象类传递给对象类来指定要使用的 RDN 值。其格式为 @objectclass:rdn_attribute
例如,要检查 scarter 的权利,以了解带有 uidNumber 的不存在的 Posix 条目作为其 RDN:
# ldapsearch -D "cn=Directory Manager" -W -b "ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" @posixaccount:uidnumber

dn: uidNumber=template_posixaccount_objectclass,ou=people,dc=example,dc=com
entryLevelRights: v
attributeLevelRights: description:rsc, gecos:rsc, loginShell:rsc, userPassword
 :rsc, objectClass:rsc, homeDirectory:rsc, gidNumber:rsc, uidNumber:rsc, uid:
 rsc, cn:rsc

18.12.3.5. 获取 Effectiverights 搜索属性的示例

常规 ldapsearches 中不会返回操作属性,包括 get valid rights search。要返回操作属性的信息,请使用加号(+)。这只返回条目中可以使用的操作属性。

例 18.44. 为过期属性获得 Effective rights 结果

# ldapsearch -D "cn=Directory Manager" -W -x -b "uid=scarter,ou=people,dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" "+"  

dn: uid=scarter,ou=People,dc=example,dc=com
entryLevelRights: vadn
attributeLevelRights: nsICQStatusText:rscwo, passwordGraceUserTime:rscwo, pwdGraceUserTime:rscwo, nsYIMStatusText:rscwo, modifyTimestamp:rscwo, passwordExpWarned:rscwo, pwdExpirationWarned:rscwo, entrydn:rscwo, aci:rscwo, nsSizeLimit:rscwo, nsAccountLock:rscwo, passwordExpirationTime:rscwo, entryid:rscwo, nsSchemaCSN:rscwo, nsRole:rscwo, retryCountResetTime:rscwo, ldapSchemas:rscwo, nsAIMStatusText:rscwo, copiedFrom:rscwo, nsICQStatusGraphic:rscwo, nsUniqueId:rscwo, creatorsName:rscwo, passwordRetryCount:rscwo, dncomp:rscwo, nsTimeLimit:rscwo, passwordHistory:rscwo, pwdHistory:rscwo, nscpEntryDN:rscwo, subschemaSubentry:rscwo, nsYIMStatusGraphic:rscwo, hasSubordinates:rscwo, pwdpolicysubentry:rscwo, nsAIMStatusGraphic:rscwo, nsRoleDN:rscwo, createTimestamp:rscwo, accountUnlockTime:rscwo, copyingFrom:rscwo, nsLookThroughLimit:rscwo, nsds5ReplConflict:rscwo, modifiersName:rscwo, parentid:rscwo, passwordAllowChangeTime:rscwo, nsBackendSuffix:rscwo, nsIdleTimeout:rscwo, ldapSyntaxes:rscwo, numSubordinates:rscwo

18.12.3.6. Get Effective rights 结果和访问控制规则的示例

根据对 get 有效权限主题条目生效的任何 ACL 返回有效的权限。
例如,这个 ACL 被设置,在这个示例中,它是唯一 ACL 集:
dn: dc=example,dc=com
objectClass: top
objectClass: domain
dc: example
aci: (target=ldap:///ou=Accounting,dc=example,dc=com)(targetattr="*")(version
 3.0; acl "test acl"; allow (read,search,compare) (userdn = "ldap:///anyone") ;)

dn: ou=Accounting,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: Accounting
因为 ACL 不包含 dc=example,dc=com 子树,所以 get valid rights search 会显示用户对 dc=example,dc=com 条目没有任何权限:

例 18.45. 使用 No ACL Set (Directory Manager)获得 Effective rights 结果

# ldapsearch -D "cn=Directory Manager" -W -b "dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" "*@person"

dn: cn=template_person_objectclass,uid=scarter,ou=people,dc=example,dc=com
objectClass: person
objectClass: top
cn: (template_attribute)
sn: (template_attribute)
description: (template_attribute)
seeAlso: (template_attribute)
telephoneNumber: (template_attribute)
userPassword: (template_attribute)
entryLevelRights: none
attributeLevelRights: sn:none, cn:none, objectClass:none, description:none, seeAlso:none, telephoneNumber:none, userPassword:none, aci:none
如果常规用户而不是 Directory Manager,请尝试运行同一命令,则结果将为空。

例 18.46. 在没有 ACL 设置的情况下获得 Effective 的结果(普通用户)

# ldapsearch -D "uid=scarter,ou=people,dc=example,dc=com" -W -b "dc=example,dc=com" -E '!1.3.6.1.4.1.42.2.27.9.5.2=:dn:uid=scarter,ou=people,dc=example,dc=com' "(objectclass=*)" "*@person"

18.12.4. Get Effective rights 返回码

如果没有为 get valid rights 搜索设置 criticality,并且发生错误,则返回常规条目信息,而是代替 entryLevelRightsattributeLevelRights 的权利,则返回错误代码。此代码可以提供有关正在查询的条目配置的信息。表 18.4 “返回的 Result Codes” 总结错误代码及其可以转发的潜在配置信息。

表 18.4. 返回的 Result Codes

代码 Description
0 成功完成。
1 操作错误。
12 关键扩展不可用。如果将 criticality 表达式设为 true,且正在查询的条目上不存在有效权限,则返回此错误。
16 没有这样的属性。如果特别查询访问权限的属性,但该属性在架构中不存在,则会返回此错误。
17 未定义的属性类型。
21 无效的属性语法。
50 权利不足。
52 不可用。
53 取消静默执行。
80 其他。