维护目录中条目的访问策略时,您需要了解所定义的 ACI 对安全性的影响。目录服务器允许您评估现有 ACI,方法是查看 ACI 针对给定条目为给定用户授予的有效权限。
目录服务器会对“获得有效的权限”控制做出响应,可在搜索操作中包含此控制。对此控制的响应是在搜索结果中返回有关条目和属性的有效权限信息。此额外信息包括每个条目及其每个属性的读写权限。可以为用于搜索的绑定 DN 或任意 DN 请求这些权限。此功能允许管理员测试目录用户的权限。
有效权限功能依赖于 LDAP 控制。必须确保用于绑定到远程服务器的代理标识也可以访问这些有效权限属性。
查看有效权限的操作是一种目录操作,必需对该操作进行保护和适当地限制。
要限制对有效权限信息的访问权限,请修改 getEffectiveRights 属性的默认 ACI。然后为 getEffectiveRightsInfo 属性创建新的 ACI。
例如,以下 ACI 只允许目录管理者组的成员获得有效权限:
aci: (targetattr != "aci")(version 3.0; acl "getEffectiveRights"; allow(all) groupdn = "ldap:///cn=Directory Administrators,ou=Groups,dc=example,dc=com";) |
要获取有效权限信息,您必需具有使用有效权限控制的访问控制权限,并且具有对 aclRights 属性的读取权限。这种双层访问控制提供了可在必要时进一步微调的基本安全性。与代理类似,如果您对某个条目中的 aclRights 属性具有读取访问权限,则可以请求任何人对于该条目及其属性的权限信息。这表明管理资源的用户可以确定具有该资源权限的人员,即使此用户实际上并不管理具有这些权限的人员。
如果请求权限信息的用户没有使用有效权限控制的权限,则此操作将会失败,并返回错误消息。但是,如果请求权限信息的用户具有使用此控制的权限,但没有读取 aclRights 属性的权限,则 aclRights 属性不会出现在返回的条目中。此行为反映了目录服务器的常规搜索行为。
通过在 ldapsearch 命令中使用 -J "1.3.6.1.4.1.42.2.27.9.5.2" 选项可指定“获得有效的权限”控制。默认情况下,此控制将在搜索结果中返回绑定 DN 对条目和属性的有效权限。
可使用以下选项更改默认行为:
-c "dn: bind DN " — 搜索结果将显示使用给定 DN 进行绑定的用户的有效权限。此选项允许管理员检查其他用户的有效权限。选项 -c "dn:" 显示匿名验证的有效权限。
-X "attributeName ... " — 搜索结果还包括对指定属性的有效权限。使用此选项可指定不在搜索结果中显示的属性。例如,可以使用此选项确定用户是否有权添加当前不在条目中的属性。
使用 -c 和/或 -X 选项时,将自动包含 OID 为“获得有效的权限”控制的 -J 选项,无需另行指定 。如果为有效权限控制指定 NULL 值,则会检索当前用户的权限。此外,还会检索当前 ldapsearch 操作所返回的属性和条目的权限。
接下来您必须选择要查看的信息类型。可以选择简单权限,也可以选择说明如何授予或拒绝这些权限的详细日志记录信息。通过分别添加 aclRights 或 aclRightsInfo 作为要在搜索结果中返回的属性,可以确定信息类型。您可以同时请求两个属性,以接收所有的有效权限信息,但实际上简单权限会在详细的日志记录信息中重复这些信息。
aclRights 和 aclRightsInfo 属性的行为与虚拟操作属性类似。这些属性并未存储在目录中,如果未经明确请求,将不会返回这些属性。它们是由目录服务器在响应“获得有效的权限”控制时生成的。
因此,这些属性无法用在任何类型的过滤器或搜索操作中。
有效权限功能继承了影响访问控制的其他参数。这些参数包括时间、验证方法、计算机地址和名称。
以下示例说明用户 Carla Fuente 如何查看她在目录中的权限。在结果中,1 表示授予权限,0 表示拒绝权限。
$ ldapsearch -J "1.3.6.1.4.1.42.2.27.9.5.2 -h host1.Example.com -p 389 \ -D "uid=cfuente,ou=People,dc=example,dc=com" -w - -b "dc=example,dc=com" \ "(objectclass=*)" aclRights Enter bind password: dn: dc=example,dc=com aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0 dn: ou=Groups, dc=example,dc=com aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0 dn: ou=People, dc=example,dc=com aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0 dn: cn=Accounting Managers,ou=groups,dc=example,dc=com aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0 dn: cn=HR Managers,ou=groups,dc=example,dc=com aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0 dn: uid=bjensen,ou=People, dc=example,dc=com aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0 dn: uid=cfuente, ou=People, dc=example,dc=com aclRights;entryLevel: add:0,delete:0,read:1,write:1,proxy:0 |
此结果为 Carla Fuente 显示了她在目录中至少具有读取权限的条目,并表明她可以修改自身的条目。有效权限控制不会避开普通访问权限,因此用户看不到他们没有读取权限的条目。在以下示例中,目录管理员可以看到 Carla Fuente 没有读取权限的条目:
$ ldapsearch -h host1.Example.com -p 389 -D cn=admin,cn=Administrators,cn=config -w - \ -c "dn: uid=cfuente,ou=People,dc=example,dc=com" -b "dc=example,dc=com" \ "(objectclass=*)" aclRights Enter bind password: dn: dc=example,dc=com aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0 dn: ou=Groups, dc=example,dc=com aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0 dn: cn=Directory Administrators, dc=example,dc=com aclRights;entryLevel: add:0,delete:0,read:0,write:0,proxy:0 dn: ou=Special Users,dc=example,dc=com aclRights;entryLevel: add:0,delete:0,read:0,write:0,proxy:0 dn: ou=People, dc=example,dc=com aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0 dn: cn=Accounting Managers,ou=groups,dc=example,dc=com aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0 dn: cn=HR Managers,ou=groups,dc=example,dc=com aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0 dn: uid=bjensen,ou=People, dc=example,dc=com aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0 dn: uid=cfuente, ou=People, dc=example,dc=com aclRights;entryLevel: add:0,delete:0,read:1,write:1,proxy:0 |
在前面的输出中,目录管理员可以看出 Carla Fuente 甚至无法查看目录树的 Special Users 和 Directory Administrators 分支。在以下示例中,目录管理员可以看出 Carla Fuente 无法修改其自身条目中的 mail 和 manager 属性:
$ ldapsearch -h host1.Example.com -p 389 -D cn=admin,cn=Administrators,cn=config -w - \ -c "dn: uid=cfuente,ou=People,dc=example,dc=com" -b "dc=example,dc=com" \ "(uid=cfuente)" aclRights "*" Enter bind password: version: 1 dn: uid=cfuente, ou=People, dc=example,dc=com aclRights;attributeLevel;mail: search:1,read:1,compare:1, write:0,selfwrite_add:0,selfwrite_delete:0,proxy:0 mail: cfuente@Example.com aclRights;attributeLevel;uid: search:1,read:1,compare:1, write:1,selfwrite_add:1,selfwrite_delete:1,proxy:0 uid: cfuente aclRights;attributeLevel;givenName: search:1,read:1,compare:1, write:1,selfwrite_add:1,selfwrite_delete:1,proxy:0 givenName: Carla aclRights;attributeLevel;sn: search:1,read:1,compare:1, write:1,selfwrite_add:1,selfwrite_delete:1,proxy:0 sn: Fuente aclRights;attributeLevel;cn: search:1,read:1,compare:1, write:1,selfwrite_add:1,selfwrite_delete:1,proxy:0 cn: Carla Fuente aclRights;attributeLevel;userPassword: search:0,read:0, compare:0,write:1,selfwrite_add:1,selfwrite_delete:1,proxy:0 userPassword: {SSHA}wnbWHIq2HPiY/5ECwe6MWBGx2KMiZ8JmjF80Ow== aclRights;attributeLevel;manager: search:1,read:1,compare:1, write:0,selfwrite_add:0,selfwrite_delete:0,proxy:0 manager: uid=bjensen,ou=People,dc=example,dc=com aclRights;attributeLevel;telephoneNumber: search:1,read:1,compare:1, write:1,selfwrite_add:1,selfwrite_delete:1,proxy:0 telephoneNumber: (234) 555-7898 aclRights;attributeLevel;objectClass: search:1,read:1,compare:1, write:1,selfwrite_add:1,selfwrite_delete:1,proxy:0 objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetorgperson aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0 |