18.12. 检查条目上的访问权限(受影响的右边)
查找特定条目中用户对属性的访问权限,为管理员提供便捷的方式,以便管理员查找和控制访问权限。
获得有效权限 是一种扩展目录搜索的方法,以显示哪些访问权限,如读取、搜索、写入和自我写入、添加和删除 - 用户对于指定条目。
在目录服务器中,常规用户可以查看他们可以查看的条目的权限,并可检查其他个人条目的访问权限。Directory Manager 可以检查一个用户具有其他用户的权限。
在两种常见情况下,检查条目的有效权限很有用:
- 管理员可以使用 get valid rights 命令更好地组织目录的访问控制指令。经常需要限制一组用户可以查看或编辑另一个组。例如,QA Managers 组的成员可能有权限搜索并读
manager
和salary
等属性,当只有 HR Group 的成员有权限修改或删除它们。检查用户或组的有效权限是验证是否有适当的访问控制。 - 用户可以运行 get valid rights 命令,以查看自己可在其个人条目上查看或修改哪些属性。例如,用户应该有权访问
homePostalAddress
和cn
等属性,但只能对manager
和salary
属性具有读取访问权限。
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 搜索返回。
权限 | 描述 |
---|---|
a | 添加一个条目。 |
d | 删除此条目。 |
n | 重命名 DN。 |
v | 查看条目。 |
权限 | 描述 |
---|---|
r | 读。 |
s | 搜索。 |
w | 写(mod-add)。 |
o | Obliterate(mod-del).与删除类似。 |
c | 比较。 |
W | 自我写入。 |
O | 自我删除。 |
18.12.2. Get Effectives Search 的格式
获取有效的权利(有时称为 GER)是一个扩展目录搜索,使用
-E
选项定义 GER 参数,以使用 ldapsearch 命令传递 LDAP 控制。(如果在没有 -E
选项的情况下运行 ldapsearch,则自然地返回该条目,则不会获得有效的权限信息。)
# ldapsearch -x -D bind_dn -W -p server_port -h server_hostname -E [!]1.3.6.1.4.1.42.2.27.9.5.2=:GER_subject (searchFilter) attributeList
-b
是用于搜索 GER 主题的子树或条目的基本 DN。如果搜索基础是特定的条目 DN,或者只返回一个条目,则结果会显示请求者超过该特定条目的权限。如果搜索 base 下的多个条目与过滤器匹配,则搜索会返回每个匹配条目,并且请求者授予每个条目的权限。- 1.3.6.1.4.1.42.2.27.9.5.2 是 get valid 权限控制的 OID。
- 感叹号(!)指定搜索操作是否应该返回错误,如果服务器不支持此控制(!),或者是否应该忽略它,并使搜索返回正常(无解)。
- GER_subject 是正在检查其权限的用户。如果 GER_subject 留空(dn:),则返回匿名用户的权限。
- 可选的 attributeList 将 get 有效权限结果限制为指定的属性或对象类。与常规 ldapsearch 一样,这可以提供特定的属性,如
邮件
。如果没有列出属性,则返回该条目的每个存在属性。使用星号 (*) 返回条目的每个可能属性的权利,包括现有属性和非不存在的属性。使用加号(+)返回条目的操作属性。检查特定属性权限的示例在 第 18.12.3.2 节 “为非独占属性搜索 Effective rights 的示例” 和 第 18.12.3.3 节 “针对特定属性或对象类搜索受影响的示例” 中给出。
获得有效权限搜索的功能是能够检查 GER 主题(
-E
)对搜索的目标必须的权限(-b
)。get valid rights search 是一个常规 ldapsearch,它只是查找与搜索参数匹配的条目并返回其信息。get valid rights 选项在这些搜索结果中添加额外的信息,显示特定用户对这些结果具有哪些权限。该 GER 主题用户可以是请求者自己(-D
与 -E
)或其他人相同。
如果请求者是常规用户(而不是 Directory Manager),则请求者只能看到 GER 主题在请求者自己的条目上具有的有效性。也就是说,如果 John Smith 运行了一个请求,以查看 Babs Jensen 有什么有效权限,那么他只能获得 Babs Jensen 在其自己的条目上具有的有效权限。所有其他条目都会返回一个不足的访问错误,以获取有效权限。
在运行 get valid 权限搜索时,常规用户有三个常规场景:
- 用户 A 检查他具有其他目录条目的权限。
- 用户 A 检查其个人条目的权利。
- 用户 A 检查用户 B 必须具有 User A 条目的权利。
get valid rights 搜索具有多种灵活的不同方法,它可以检查属性的权限。
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:
vattributeLevelRights:
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
、giveName
、l
和其他属性以及没有对 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
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,并且发生错误,则返回常规条目信息,而是代替 entryLevelRights 和 attributeLevelRights 的权利,则返回错误代码。此代码可以提供有关正在查询的条目配置的信息。表 18.4 “返回的 Result Codes” 总结错误代码及其可以转发的潜在配置信息。
代码 | Description |
---|---|
0 | 成功完成。 |
1 | 操作错误。 |
12 | 关键扩展不可用。如果将 criticality 表达式设为 true,且正在查询的条目上不存在有效权限,则返回此错误。 |
16 | 没有这样的属性。如果特别查询访问权限的属性,但该属性在架构中不存在,则会返回此错误。 |
17 | 未定义的属性类型。 |
21 | 无效的属性语法。 |
50 | 权利不足。 |
52 | 不可用。 |
53 | 取消静默执行。 |
80 | 其他。 |