利用castellan改进的密钥存储

https://blueprints.launchpad.net/sahara/+spec/improved-secret-storage

Sahara目前在其数据库中存储着一些密钥(例如密码),这些密钥与部署的框架相关。此蓝图建议使用castellan软件包密钥管理器接口,将密钥存储卸载到OpenStack密钥管理服务。

问题描述

Sahara在数据库中存储用户名和密码的情况有很多。存储这些凭据对暴露控制器数据库的任何安装都存在安全风险。为了降低用户凭据泄露的风险,Sahara应转向使用外部密钥管理器来控制用户密码的存储。

提议的变更

本规范建议将castellan软件包集成到Sahara中。Castellan是一个软件包,它为OpenStack密钥管理服务提供了一个入口点。它还提供了一个可插拔的密钥管理器接口,允许使用该服务的不同实现,包括使用硬件安全模块 (HSM) 和支持密钥管理互操作性协议 (KMIP) 的设备的实现。

通过可插拔接口,将实现一个Sahara特定的密钥管理器,该管理器将继续允许将密钥存储在数据库中。此插件将是默认密钥管理器,以保持向后兼容性,并且不需要任何数据库修改或迁移。

对于希望利用外部密钥管理器的用户,将提供有关如何为castellan启用barbican密钥管理器插件的文档。启用barbican插件需要对Sahara配置文件进行一些修改。通过这种方式,用户将能够自定义其部署中外部密钥管理器的使用方式。

示例默认配置

[key_manager]
api_class = sahara.utils.key_manager.sahara_key_manager.SaharaKeyManager

示例 barbican 配置

[key_manager]
api_class = castellan.key_manager.barbican_key_manager.BarbicanKeyManager

为了适应Sahara的特定需求,将创建一个用于与castellan交互的新类;SaharaKeyManager。该类将基于castellan软件包中定义的抽象基类KeyManager

SaharaKeyManager类将在没有外部密钥管理器的情况下,围绕密钥存储实现一个薄层。该类将允许Sahara继续像Kilo版本一样运行,从而保持向后兼容性。该类将是castellan的默认插件实现。

示例用法

from castellan import key_manager as km
from castellan.key_manager.objects import passphrase

keymanager = km.API()

# create secret
new_secret = passphrase.Passphrase('password_text_here')

# store secret
new_secret_id = keymanager.store_key(context, new_secret)

# retrieve secret
retrieved_secret = keymanager.get_key(context, new_secret_id)
secret_cleartext = retrieved_secret.get_encoded()

# revoke secret
keymanager.delete_key(context, new_secret_id)

此解决方案将提供通过barbican插件卸载密钥的能力,从而使得攻击者需要攻破数据库并学习Sahara管理员凭据才能访问存储的密码。本质上,我们正在为潜在的攻击者增加一个障碍。

本规范侧重于当前存储在Sahara数据库中的密码。以下是本规范将移动到密钥管理器的密码列表

  • 从UI输入的数据源Swift密码

  • 从UI输入的任务二进制文件Swift密码

  • 数据源的代理用户密码

  • 任务二进制文件的代理用户密码

  • vanilla 1.2.1插件的Hive MySQL密码

  • CDH 5插件的Hive数据库密码

  • CDH 5.3.0插件的Hive数据库密码

  • CDH 5.4.0插件的Hive数据库密码

  • CDH 5.3.0插件的Sentry数据库密码

  • CDH 5.4.0插件的Sentry数据库密码

  • CDH 5插件的Cloudera Manager密码

  • CDH 5.3.0插件的Cloudera Manager密码

  • CDH 5.4.0插件的Cloudera Manager密码

替代方案

使用外部密钥管理器的另一种可能的方法是让Sahara加密密码并将它们存储在Swift中。这将满足将密码从Sahara数据库中删除的目标,同时提供一定程度的防范凭据被盗的安全措施。

这种方法的缺点是它将Sahara置于仲裁安全交易的位置。即,在存储密码数据的创建和检索中使用密码学。

数据模型影响

无。

REST API 影响

无。

其他最终用户影响

无。

部署者影响

castellan软件包将提供一个新的配置选项来设置密钥管理器实现。默认情况下这将是SaharaKeyManager。希望使用barbican的部署者可能需要根据其安装设置一些其他选项。这些选项将在文档中讨论。

使用外部密钥管理器取决于在将要使用它的堆栈中安装了barbican。

开发者影响

正在向Sahara添加新的存储密码的开发人员应始终使用密钥管理器接口。

Sahara-image-elements impact

无。

Sahara-dashboard / Horizon 影响

无。

实现

负责人

主要负责人

mimccune (Michael McCune)

其他贡献者

工作项

  • 创建 SaharaKeyManager 类

  • 为新类添加测试

  • 为密钥存储添加测试

  • 创建外部密钥管理器用法文档

  • 将密码迁移到密钥管理器

依赖项

castellan软件包,可通过pypi获得。目前此版本 (0.1.0) 还没有barbican实现,但正在审核中[1].

测试

将创建单元测试来测试SaharaKeyManager类。还将为集成的实现创建单元测试。

理想情况下,将创建功能集成测试,以确保密钥的正确存储和检索。添加这些测试代表了对测试基础设施的较大更改,因为需要添加barbican。根据更改测试部署的影响,这些可能最好在单独的更改中解决。

文档影响

将在高级配置指南中创建一个新部分,以描述此新功能的使用方法。

此外,此功能还应在OpenStack安全指南中描述。这将需要对文档项目进行单独的更改请求。

参考资料

[1]: https://review.openstack.org/#/c/171918

castellan 仓库 https://github.com/openstack/castellan

注意,castellan文档仍在不断完善中

barbican 文档 https://docs.openstack.org/barbican/latest/

barbican wiki https://github.com/cloudkeep/barbican/wiki