更新认证以使用 keystone 会话¶
https://blueprints.launchpad.net/sahara/+spec/keystone-sessions
Sahara 当前在创建 OpenStack 客户端时使用基于每个访问的认证。这种认证方式需要在每次创建客户端时建立 keystone 连接。keystone 项目创建了一种机制来简化和改进这个过程,即 Session 对象。这些对象封装了更新认证令牌、缓存连接以及单一安全改进点的机制。Sahara 应该迁移其 OpenStack 客户端对象,以便为所有客户端使用 session 对象。
问题描述¶
对于所有 OpenStack 客户端实例,Sahara 使用基于每个客户端创建的认证方式。对于请求的每个客户端对象,都会从上下文或配置文件(对于管理员帐户)获取一组凭据,用于初始化客户端对象。在此初始化期间,会向 Identity 服务发出请求,以确定用户相对于新客户端的权限。
Sahara 必须意识到每个客户端的认证方法的变化以及使用这些方法可能产生的任何潜在安全漏洞。
这种认证方法不允许 Sahara 在客户端之间共享任何信息,除了原始凭据。反过来,这给 Sahara/客户端接口带来了脆弱性,因为每个认证关系必须单独维护,或者更糟糕的是,使用部分共享模型进行维护。
为每个客户端拥有单独的接口也使得应用安全更新更加困难,因为必须访问、研究并最终根据该客户端的特定细节修复每个客户端实例。
虽然这种方法迄今为止为 Sahara 提供了良好的服务,但 keystone 项目引入了新的抽象层来帮助在客户端之间共享通用认证。这种共享方法,即 keystoneclient Session 对象,为所有客户端提供了一个统一的认证点。它充当包含安全更新、按需认证令牌更新、通用认证方法和标准化服务发现的单一点。
提议的变更¶
Sahara 应该通过利用 keystoneclient Session 对象来标准化其客户端认证代码。此更改将包括创建一个新模块、修改 OpenStack 客户端实用程序函数以及将认证插件对象添加到上下文中。
将创建一个新模块,sahara.service.sessions,用于包含辅助创建和存储 session 对象的实用程序函数和类。该模块还将包含用于 session 缓存的全局单例。
sahara.service.sesssions 将提供一个名为 SessionCache 的类,以及一个获取该类全局单例实例的函数。SessionCache 将包含可以重用于创建单个 OpenStack 客户端的缓存 session 对象。它还将包含用于生成特定客户端所需的 session 对象的功能。某些客户端可能需要缓存唯一的版本,例如,如果客户端需要特定的证书文件,则它可能具有唯一的 session。对于不需要唯一 session 的所有其他客户端,将使用公共 session。
session 对象的认证将由几种方法之一提供,具体取决于所需的 session 类型。对于基于用户的 session,认证将从每个请求生成的 keystonemiddleware 认证插件中获取。对于基于管理员的 session,配置文件中找到的凭据将用于生成认证插件。基于信任的认证将通过根据每种情况下的可用信息生成认证插件来处理,例如,用户的令牌或管理员或代理用户的密码。
将更改 sahara.context.Context 对象,以包含认证插件对象。通过 REST 调用创建时,认证插件将从 keystonemiddleware 获取。复制上下文时,认证插件也将被复制。在其他情况下,认证插件可以以编程方式设置,例如,如果需要管理员认证插件,则可以从配置文件中的值生成它,或者如果需要基于信任的认证,则可以生成它。
将更改各个 OpenStack 客户端实用程序模块,以使用 session 和认证插件对象进行创建。session 将从全局单例获取,认证插件对象可以从上下文中获取,或者在需要更具体的认证的情况下创建,例如,在使用管理员用户或基于信任的认证时。
heat 和 swift 的客户端尚未启用基于 session 的认证。应监控这些客户端是否添加此功能,并在可用时进行迁移。
替代方案¶
另一种方法是创建我们自己的方法来存储通用的认证凭据,但这将是一种徒劳无功的尝试,因为我们仅仅是在复制 keystoneclient 的工作。
数据模型影响¶
无
REST API 影响¶
无
其他最终用户影响¶
无
部署者影响¶
无
开发者影响¶
无
Sahara-image-elements impact¶
无
Sahara-dashboard / Horizon 影响¶
无
实现¶
负责人¶
- 主要负责人
Michael McCune (elmiko)
- 其他贡献者
Andrey Pavlov (apavlov)
工作项¶
创建 sahara.service.sessions
修改上下文以接受认证插件
修改 sahara.utils.openstack 客户端以使用 session
cinder
keystone
neutron
nova
修改管理员认证以使用插件对象
修改信任认证以使用插件对象
创建 session 缓存的测试
创建客户端使用方法的开发者文档
依赖项¶
无
测试¶
为该功能创建的测试将是基于单元的,以执行代码路径和逻辑点。由于这些认证方法将在标准的函数测试过程中得到执行,因此不需要功能测试。
文档影响¶
此更改仅会在 Sahara 项目中创建文档。目前 Sahara 代码库中不存在关于客户端使用的文档。此更改将添加一小节,描述如何使用 sahara.utils.openstack 包实例化客户端,并附带有关通用 session 认证的说明。