利用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