外部策略决策点¶
Keystone 连同 Oslo_policy 一起,为 OpenStack 提供了一个原生授权策略引擎。该方案存在一些默认情况
基于每个 OpenStack 组件(Nova、Glance、Neutron 等)拥有的文件:policy.yaml(或 policy.json)
难以理解
配置不够灵活
仅基于一种授权(访问控制)模型
由于 OpenStack 可能会被具有不同需求的不同用户部署,因此需要一种通用的、灵活的方法,通过该方法用户可以定义、应用和管理自己的授权策略。外部 PDP(策略决策点)禁用默认方式,并将授权委托给外部授权策略引擎。
现有工作 [Fortress, Moon] 表明使用 Fortress 和 Moon 策略引擎这种方法是可行的。本规范提出一个通用的钩子,它将重定向授权请求到外部 PDP,而不是使用原生 PDP。每个策略引擎存储和管理与其策略相关的信息,并根据这些信息和自身的规则授予或拒绝请求。
问题描述¶
目前,如果用户想要修改其 OpenStack 平台的授权策略,他/她必须更新每个组件(Nova、Glance、Neutron 等)的 policy.yaml 文件。
允许的唯一授权模型是基于 RBAC 模型(基于角色的访问控制),并且操作员无法修改此模型。但在某些情况下,他/她可能希望添加新的信息,例如成员资格,并根据其成员资格授权平台上的操作,例如 MLS(多级安全)广泛用于信息流访问控制。
策略修改必须在所有组件上完成,存在出错风险。策略修改不是集中的。
提议的变更¶
此更改建议允许用户选择他们的 PDP(策略决策点)。用户将能够选择
标准的本地 policy.yaml 文件
外部 Fortress 策略引擎平台
外部 Moon 策略引擎平台
…
可以通过修改 policy.json/yaml 来配置和完成 PDP 之间的切换。对于每个规则,都需要设置一个 URL。因此,使用 Oslo_Policy 的每个组件都可以从这项改进中受益。例如,在 Glance policy.json 文件中
{
"context_is_admin": "role:admin",
"default": "role:admin",
...
"get_images": "http://external_pdp_server:8080/{name}s",
...
}
为了能够与这些 PDP 中的一个进行通信,该钩子基于 Oslo_Policy 的 HTTP_Check。此 API 可以像这样简单:
POST /authz
其中 POST 的主体包括
target 请求相关信息
credentials 用户身份验证信息
rule 这是我们需要添加到 HTTP_Check 函数中的新数据,用于标识请求的操作
例如,以下是一些可能的请求
POST /authz/
响应可以只返回一个 HTTP 代码
200 表示请求已授权
403 表示请求未授权
备选方案¶
原始规范 https://review.openstack.org/491565 已提交到 keystone 项目。由于范围责任,这里提出了一个新的规范(本规范)。
通过此规范/功能,我们可以向 oslo.policy 添加配置选项,以告知它绕过其默认规则评估系统并使用外部 PDP 系统。这样做会简化部署程序的配置,因为他们只需要指定 PDP 系统的位置。但是,这会使库的实现更加复杂,因此我们将从这种更简单的方法开始。
安全影响¶
由于它处理授权过程,因此这种更改可能存在安全风险。用户数据不会被修改,因为用户 ID、对象 ID 等数据仅以只读模式使用。但是,如果 PDP 是外部的,数据可能会被恶意网络嗅探器监听或篡改。为了确保请求的响应可以真正被接受,这些连接必须高度安全。
恶意嗅探器可能监听的数据只有
Keystone 项目 ID
用户 ID
操作的目标对象
用户对对象的操作
令牌、密钥和其他敏感数据不会被暴露。此更改不需要任何 API 更改。
此更改可能导致拒绝服务攻击。特别是如果 PDP 是外部的。如果攻击者能够通过 PDP 的外部接口发送大量请求,他可以减慢 PDP 中的授权计算速度,然后减慢最终用户速度,因为最终用户依赖于此授权过程。为了解决此问题,外部 PDP 必须放置在网络架构中,使其无法被最终用户或恶意用户访问。一旦 OpenStack 被配置为使用外部 PDP,并且外部 PDP 宕机,将无法进行任何 OpenStack 操作。
通知影响¶
TODO:无
请指定任何通知的更改。无论是额外的通知、对现有通知的更改,还是删除通知。
其他最终用户影响¶
最终用户不会与此更改交互,另一方面,操作员必须配置此更改。特别是,他/她必须选择内部/外部 PDP,并选择一些配置项,包括
外部 PDP 的 URL
连接到外部 PDP 的用户名(如果需要)
连接到外部 PDP 的密码(如果需要)
性能影响¶
由于授权过程每次都会被调用,并且由于此授权过程可以请求外部服务器,因此可能会对性能产生影响。初步测试表明,在 Moon 平台上,授权过程可能需要 0.2 到 1 秒。
其他部署者影响¶
此更改强制更新 Oslo_Policy 的代码,而 Oslo_Policy 被许多 OpenStack 组件使用。但是,该选择必须始终允许操作员使用旧的内部 PDP(即 policy.yaml 文件)。在这种情况下,他/她将看不到任何更改。但是,如果部署程序想要使用此新功能,则必须准备好一个外部 PDP(例如 Fortress 或 Moon 平台)。他/她只需要在 policy.json 文件中为相应的规则添加外部 PDP 的 URL。
开发人员影响¶
无
实现¶
负责人¶
主要负责人
Ruan He
Thomas Duval
工作项¶
指定使用外部 PDP 所需的配置选项
通过更新 HTTP_Check 类来传递正在评估的规则名称来修改 Oslo_Policy 代码
测试解决方案,我们只需要使用 HTTP_Check 的现有测试。
依赖项¶
为了使外部 PDP 能够理解 HTTP_Check 函数中的 POST 数据
一个 HTTP 代理 已贡献给 Moon,用于解释工作作为 PoC
文档影响¶
必须记录外部 PDP 的具体配置。
参考资料¶
OpenStack 会议关于 Keystone 策略:https://etherpad.openstack.org/p/keystone-policy-meeting
Keystone 策略迁移到代码:https://governance.openstack.org/tc/goals/queens/policy-in-code.html
针对 Apache fortress 解决方案的 Oslo_Policy 提出的修改:https://review.openstack.org/#/c/237521/
针对在 HTTPCheck 中添加信息的 Oslo_Policy 提出的修改:https://review.openstack.org/#/c/498467/
OPNFV 项目的 Moon 实现:https://git.opnfv.org/cgit/moon/tree/keystone-moon