9.7. 设计访问控制

在决定用来建立目录客户端身份的身份验证方案后,决定如何使用这些方案来保护目录中包含的信息。访问控制可指定某些客户端可以访问特定信息,而其他客户端则不能访问。
使用一个或多个 访问控制列表 (ACL) 定义访问控制。目录的 ACL 包括一个或多个 访问控制信息 (ACI)语句,允许或拒绝权限(如读取、写入、搜索和比较)与指定的条目及其属性。
使用 ACL,可以在目录树的任何级别上设置权限:
  • 整个目录。
  • 目录的特定子树。
  • 目录中特定条目。
  • 一组特定条目属性。
  • 任何与给定 LDAP 搜索过滤器匹配的条目。
此外,可以为特定用户、属于特定组的所有用户或目录所有用户设置权限。最后,可以为网络位置(如 IP 地址(IPv4 或 IPv6)或 DNS 名称定义访问权限。

9.7.1. 关于 ACI 格式

在设计安全策略时,了解在目录中如何表示 ACI 会很有帮助。理解可以在目录中设置什么权限。本节概述了 ACI 机制。有关 ACI 格式的完整描述,请参阅 Red Hat Directory Server Administration Guide
目录 ACI 使用以下通用表单: 目标权限 bind_rule
ACI 变量定义如下:
  • target.指定 ACI 目标、目标属性或两个条目(通常是子树)。目标标识 ACI 应用到的目录元素。ACI 只能将一个条目为目标,但可以针对多个属性。此外,目标也可以包含 LDAP 搜索过滤器。可以为包含通用属性值的广泛分散条目设置权限。
  • 权限。标识此 ACI 所设置的实际权限。权限变量指出,ACI 被允许或拒绝特定类型的目录访问,如读取或搜索,到指定的目标。
  • 绑定规则。标识权限应用到的绑定 DN 或网络位置。绑定规则也可以指定 LDAP 过滤器,如果该过滤器被评估为绑定客户端应用程序,则 ACI 应用到客户端应用程序。
因此,ACI 可以表达如下:"对于目录对象目标,如果 bind_rule 为 true,则允许或拒绝权限"。
权限bind_rule 被设置为一个对,可以有多个 权限- 每个目标的bind_rule 对。可以有效地为任何给定目标设置多个访问控制。例如:
target (permission bind_rule)(permission bind_rule)...
可以设置权限,以允许任何人绑定 Babs Jensen 写入 Babs Jensen 的电话号码。此权限中的绑定规则是说明 "如果您绑定为 Babs Jensen"的部分。目标是 Babs Jensen 的电话号码,权限是 写访问权限

9.7.1.1. 目标

决定在目录中创建的每个 ACI 的目标条目。定位目录分支点条目包括该分支点及其在权限范围内的所有子条目。如果没有为 ACI 明确定义目标条目,则 ACI 的目标是包含 ACI 语句的目录条目。将 targetattr 参数设置为以一个或多个属性为目标。如果没有设置 targetattr 参数,则不会作为任何属性。详情请查看 Red Hat Directory Server Administration Guide 中的对应部分。
对于每个 ACI,每个 ACI 只能将一个条目或与单个 LDAP 搜索过滤器匹配的条目作为目标。
除了目标条目外,该条目上的目标属性也可以应用权限,这只对属性值的子集应用。通过显式命名这些属性或明确指定不以 ACI 的目标属性来命名这些属性的目标属性。目标中排除属性可为所有设置权限,但对象类结构允许的一些属性。
详情请查看 Red Hat Directory Server Administration Guide 中的对应部分。

9.7.1.2. 权限

权限可以允许或拒绝访问。通常,避免拒绝权限(因为 第 9.7.2.2 节 “允许或拒绝访问”中介绍的原因)。权限可以是在目录服务中执行的任何操作:
权限 描述
指明目录数据是否可以读取。
指明目录数据是否可以更改或创建。此权限还允许删除目录数据,但不能删除条目本身。要删除整个条目,用户必须具有删除权限。
搜索
指明能否搜索目录数据。这与读取权限不同,如果作为搜索操作的一部分返回,读取允许查看目录数据。
例如,如果搜索常用名称以及个人房间编号的读取权限,则可以返回房间号码作为通用名称搜索的一部分,但空间编号本身不能用作搜索的主题。使用这个组合以防止人员搜索目录,以查看谁位于特定房间。
比较 指明数据是否可以用于比较操作。比较权限表示搜索功能,但搜索实际目录信息不会返回。相反,会返回一个简单的布尔值,指明比较的值是否匹配。这用于在目录身份验证过程中匹配 userPassword 属性值。
自我写入 仅用于组管理。这个权限可让用户在组中添加或删除自己。
添加 指明是否可以创建子条目。这个权限可让用户在目标条目的下面创建子条目。
删除 指明是否可以删除条目。这个权限可让用户删除目标条目。
Proxy 表示用户可以使用任何其他 DN( Directory Manager 除外)访问具有此 DN 权利的目录。

9.7.1.3. 绑定规则

绑定规则通常表示绑定 DN 受该权限的影响。它还可以指定绑定属性,如一天或 IP 地址的时间。
绑定规则轻松表达 ACI 仅适用于用户自己的条目。这允许用户在更新另一个用户条目的情况下更新自己的条目。
绑定规则表示 ACI 适用于特定情况:
  • 只有绑定操作是从特定 IP 地址(IPv4 或 IPv6)或 DNS 主机名到达时。这通常用于强制从给定计算机或网络域进行所有目录更新。
  • 如果个人匿名绑定。为匿名绑定设置权限也意味着,权限也适用于绑定到该目录的任何人。
  • 对于成功绑定到该目录的任何人。这可在阻止匿名访问时进行常规访问。
  • 只有客户端绑定为条目的直接父项时。
  • 只有该人绑定了满足特定 LDAP 搜索条件的条目。
目录服务器提供多个关键字来更轻松地表达这类访问:
  • .如果 bind DN 是即时父条目,则绑定规则为 true。这意味着,可以授予特定权限,允许目录分支点管理其即时子条目。
  • 自我.如果 bind DN 与请求访问的条目相同,则绑定规则为 true。可以授予特定权限以允许个人更新他们自己的条目。
  • 所有.对于成功绑定到该目录的任何人,绑定规则为 true。
  • Anyone.对于每个人,绑定规则都为 true。这个关键字用于允许或拒绝匿名访问。

9.7.2. 设置权限

默认情况下,除 Directory Manager 外,所有用户都被拒绝访问任何类型的权限。因此,必须为目录设置一些 ACI,以便用户可以访问该目录。
有关如何在目录中设置 ACI 的详情,请参考 Red Hat Directory Server Administration Guide

9.7.2.1. Precedence Rule

当用户尝试任何对目录条目的访问时,Directory 服务器检查目录中设置的访问控制。要确定访问权限,目录服务器应用 优先级规则。此规则指出,当存在两个冲突的权限时,拒绝访问的权限优先于授予访问权限的权限。
例如,如果在目录的根目录下拒绝写入权限,并且该权限适用于访问该目录的任何人,无论可能允许写入任何权限,任何用户都可对该目录进行写入。要允许特定用户对该目录的写入权限,必须设置原始 deny-for-write 范围,使其不会包含该用户。然后,有疑问的用户必须有额外的 allow-for-write 权限。

9.7.2.2. 允许或拒绝访问

对目录树的访问可以明确允许或拒绝,但要谨慎拒绝对该目录的访问。由于具有优先级规则,如果目录明确找到访问规则,无论可能授予了任何冲突权限,则用于禁止访问的目录。
限制允许访问规则的范围只包括用户或客户端应用程序的最小可能子集。例如,可以设置权限,允许用户在其目录条目上写入任何属性,但拒绝除 Directory 管理员组成员以外的所有用户写入 uid 属性的权限。或者,以以下方式编写允许写入访问的两个访问规则:
  • 创建一个规则,允许向每个属性写入特权,但 uid 属性除外。此规则应适用于每个人。
  • 创建一个规则,允许对 uid 属性进行写入特权。此规则应仅应用于 Directory 管理员组的成员。
仅允许特权,避免设置显式拒绝特权。

9.7.2.3. 当拒绝访问

很少需要设置显式拒绝权限,但在有些情况下,它很有用:
  • 有一个大型目录树,其中包括复杂的 ACL。
    为安全起见,可能需要突然拒绝对特定用户、组或物理位置的访问。不必花费时间仔细检查现有的 ACL 以了解如何适当限制允许权限,而是临时设置显式拒绝特权,直到有时间进行分析。如果 ACL 变得很复杂,对于长远来讲,使用拒绝 ACI 只会添加管理的开销。在可能的情况下,尽快取消相关的 ACL 以避免显式拒绝特权,然后简化整体访问控制方案。
  • 访问控制应该基于周中的一天或一天中的一个小时。
    例如,所有写入活动都可以在下午 11:00 时拒绝。(2300 到周一至周一的上午 1:00.(0100).从管理的角度来看,管理一个基于时间的 ACI 更容易,其明确限制此类的基于时间的访问,而不是搜索所有 allow-for-write ACIs 并在这一时间段内限制它们的范围。
  • 在委派目录管理机构到多个人员时,应限制特权。
    要允许一个人或一组人管理目录树的某些部分,而无需修改树的某些方面,请使用明确拒绝特权。
    例如,要确保 Mail Administrators 不允许对通用 name 属性的写访问,请设置可明确拒绝对常见 name 属性的写入访问权限的 ACI。

9.7.2.4. Place Access Control Rules 的位置

访问控制规则可以放在目录中的任何条目上。通常,管理员将访问控制规则放在带有对象类 domainComponent,country,organization,organizationalUnit,inetOrgPerson, 或 group 的条目上。
将规则组织为组尽可能多,以简化 ACL 管理。规则通常适用于其目标条目和所有条目的子项。因此,最好将访问控制规则放在目录分支点或目录分支点上,而不是分散在个别叶(如个人)条目中。

9.7.2.5. 使用过滤的访问控制规则

Directory Server ACI 模型的其中一个更强大的功能是能够使用 LDAP 搜索过滤器来设置访问控制。使用 LDAP 搜索过滤器,将访问权限设置为符合定义的一组条件的任何目录条目。
例如,允许对包含 organizationalUnit 属性的 entry 的读访问权限允许设置为 marketing。
过滤的访问控制规则允许预定义的访问级别。假设目录包含家地址和电话号码信息。有些人希望发布这些信息,另一些则希望取消列出该信息。解决的方法有几种:
  • 在每个用户的目录条目上创建一个名为 publishHomeContactInfo 的属性。
  • 设置一个访问控制规则,仅针对其 publishHomeContactInfo 属性设为 true 的条目授予对 homePhonehomePostalAddress 属性的读取访问权限。使用 LDAP 搜索过滤器来表达此规则的目标。
  • 允许目录用户将自己的 publishHomeContactInfo 属性的值更改为 truefalse。这样,目录用户可以决定是否公开此信息。
有关使用 LDAP 搜索过滤器以及使用 ACI 的 LDAP 搜索过滤器的更多信息,请参阅 红帽目录服务器管理指南

9.7.3. 查看 ACI:获取 Effective Rights

可能需要查看条目上的访问控制集,以便授予细粒度访问控制或高效的条目管理。获取有效权限 是一个扩展 ldapsearch,它返回对条目中的每个属性设置的访问控制权限,并允许 LDAP 客户端确定服务器访问控制配置允许用户执行哪些操作。
访问控制信息被分为两组的访问权限:对于一个属性,权限是条目和权利。"条目的右边表示其权限(如修改或删除),仅限于该特定条目。"在属性的右侧表示该属性中每一个实例的访问权限。
在以下情况下可能需要这种详细的访问控制:
  • 管理员可以将 get effective rights 命令用于分钟的访问控制,例如允许特定组或用户访问条目并限制其他组。例如,QA Managers 组的成员可以搜索和读取 标题salary 等属性,但只有 HR Group 成员具有修改或删除它们的权限。
  • 用户可以使用 get effective rights 选项来确定他们可以在自己的个人条目上查看或修改哪些属性。例如,用户应该有权访问 homePostalAddresscn 等属性,但可能只具有对 titlesalary 的读取访问权限。
使用 -E 交换机执行的 ldapsearch 返回特定条目的访问控制作为正常搜索结果的一部分。以下搜索显示了用户 Ted Morris 必须对其个人条目的权限:
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=*)"

version: 1
dn: uid=tmorris,ou=People,dc=example,dc=com
givenName: Ted
sn: Morris
ou: Accounting
ou: People
l: Santa Clara
manager: uid=dmiller,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: vadn
attributeLevelRights: givenName:rsc, sn:rsc, ou:rsc, l:rscow, manager:rsc, roomNumber:rscwo, mail:rscwo, facsimileTelephoneNumber:rscwo, objectClass:rsc, uid:rsc, cn:rsc, userPassword:wo
在本例中,Ted Morris 具有在其自己的条目上添加、查看、删除或重命名 DN 的权利,如 entryLevelRights 所示。他可以读取、搜索、比较、自我修改或自我删除位置(l)属性,但仅对其密码进行自我写入和自我删除权限,如 attributeLevelRights 结果所示。
默认情况下,条目中没有值或条目中没有对应的属性不会返回有效的权限信息。例如,如果删除了 userPassword 值,则以后对上述条目的有效权限搜索不会返回 userPassword 的任何有效权限,即使可以允许自助和自我删除权利。同样,如果添加了 street 属性读取、比较和搜索权利,则 street: rsc 将出现在 attributeLevelRights 结果中。
可以返回通常未包含在搜索结果中的属性的权限,如不存在的属性或操作属性。使用星号(*)返回条目所有可能属性的权限,包括不存在的属性。
ldapsearch -x -E !1.3.6.1.4.1.42.2.27.9.5.2:dn:uid=scarter,ou=people,dc=example,dc=com "(objectclass=*)" "*"
使用加号(+)返回条目的操作属性,它们通常不会在 ldapsearch 星号 packagemanifests 中返回。例如:
ldapsearch -x -E !1.3.6.1.4.1.42.2.27.9.5.2:dn:uid=scarter,ou=people,dc=example,dc=com "(objectclass=*)" "+"
星号(*)和加号(+)可以一起使用,以返回条目的每个属性。

9.7.4. 使用 ACI:某些 Hint 和 Tricks

在实施安全策略时请注意这一提示。它们有助于降低管理目录安全模型的管理负担,并改进目录的性能特征。
  • 最小化目录中的 ACI 数量。
    虽然目录服务器可以评估超过 50,000 ACI,但很难管理大量 ACI 语句。大量 ACI 可让人工管理员立即决定特定客户端可用的目录对象。
    目录服务器使用宏最小化目录中的 ACI 数量。宏是用于在 ACI 中代表 DN 或 DN 的部分占位符。使用 宏代表 ACI 或绑定规则部分或两者的目标部分中的 DN。有关宏 ACI 的更多信息,请参阅红帽目录服务器管理指南中的" 管理访问控制"章节
  • 平衡允许和拒绝权限。
    虽然默认规则是拒绝对任何没有被特别授予访问权限的用户的访问,但最好使用一个命令 ACI 来减少 ACI 的数量,以便访问树的根,以及少量拒绝 ACI 条目。这种情境可避免使用多个 allow ACI 来接近leaf 条目。
  • 识别任何给定 ACI 上属性的最小集合。
    在允许或拒绝对象中属性子集的访问时,确定最小列表是允许的属性还是拒绝的属性集合。然后,指定 ACI,以便它只需要管理最小列表。
    例如,person 对象类包含大量属性。要允许用户仅更新其中一个或两个属性,请编写 ACI,以便仅允许这些几个属性进行写入访问。但是,要允许用户更新除一或两个属性以外的所有属性,请创建 ACI,以便它允许对所有内容进行写入访问,但有几个命名的属性。
  • 谨慎使用 LDAP 搜索过滤器。
    搜索过滤器不会直接命名管理访问权限的对象。因此,它们的使用可能会导致意外的结果。当目录变得更为复杂时,这尤其如此。在 ACI 中使用搜索过滤器前,使用同一过滤器运行一个 ldapsearch 操作,以明确更改的结果的含义。
  • 不要在目录树的不同部分中重复 ACI。
    针对重叠 ACI 的保护。例如,如果目录根点上有一个 ACI,则允许组对 commonNamegivenName 属性的写入访问权限,而另一个 ACI 则仅允许对 commonName 属性执行同一组写入权限,然后考虑对 ACI 进行修改,以便只有一个控制授予组的写入访问权限。
    随着目录的日益复杂,意外的 ACI 的风险很快会增加。通过避免 ACI 重叠,安全性管理变得更加容易,同时可能会减少包含在目录中的 ACI 总数。
  • 名称 ACI.
    在命名 ACI 是可选的时,为每个 ACI 提供简短的、有意义的名称有助于管理安全模型。
  • 在目录中尽可能地对 ACI 进行分组。
    尝试将 ACI 放置限制为目录根点和主要目录分支点。对 ACI 进行分组有助于管理 ACI 的总列表,并帮助保持目录中的 ACI 总数最少。
  • 避免使用双引号,例如,如果绑定 DN 不等于 cn=Joe 时拒绝写入
    尽管此语法对于服务器是完全可以接受的,但它对于人类管理员来说令人困惑。

9.7.5. 将 ACI 应用到根 DN(目录管理器)

通常,访问控制规则不适用于 Directory Manager 用户。Directory Manager 在 dse.ldif 文件中定义,而不是在常规用户数据库中定义,因此 ACI 目标不包括该用户。
从维护角度来说也有意义。Directory Manager 需要高级别的访问权限来执行维护任务并响应事件。
仍由于 Directory Manager 用户的强大功能,可能会建议某些级别的访问控制来防止未经授权的访问或攻击以 root 用户身份执行。
RootDN Access Control 插件可设置特定于 Directory Manager 用户的特定访问控制规则:
  • 基于时间的访问控制用于时间范围,如 8a.m 到 5p.m。(转至 1700)。
  • day-of-week 访问控制,因此仅在明确定义的天数时允许访问
  • IP 地址规则,其中只有指定的 IP 地址、域或子网被显式允许或拒绝
  • 主机访问规则,其中只有指定的主机名、域名或子域被显式允许或拒绝
与其他访问控制规则一样,拒绝规则监管规则。
重要
确保 Directory Manager 始终具有允许的访问级别。Directory Manager 可能需要在非小时内执行维护操作(用户负载较差时),或响应故障。在这种情况下,设置字符串时或基于日期的访问控制规则可能会阻止 Directory Manager 能够充分管理该目录。
默认情况下禁用根 DN 访问控制规则。必须启用 RootDN Access Control 插件,然后可以设置适当的访问控制规则。
注意
在插件条目中,只能为 Directory Manager 设置一个访问控制规则,它适用于所有访问整个目录。