X509 公钥证书的密钥对支持¶
https://blueprints.launchpad.net/nova/+spec/keypair-x509-certificates
在 Nova API 中引入 X509 公钥证书密钥对支持。
问题描述¶
Nova 密钥对主要由 Linux 来宾操作系统用于处理用户身份验证,通过 SSH 公钥身份验证,而无需承担密码管理和安全性带来的开销。
公钥作为元数据的一部分提供给来宾操作系统,并由 cloud-init 等工具包含在来宾操作系统配置中。
Windows 操作系统原生不支持 SSH,因此身份验证需要使用密码,除非镜像部署者选择包含第三方未经支持的 SSH 服务端口,这可能会带来潜在的安全和支持问题。
Windows 原生支持使用 X509 证书进行无密码身份验证,包括 PowerShell 远程处理。
X509 证书的使用方式可以被认为是与 Linux 上 SSH 密钥的使用方式一致的,因为两者都基于公钥/私钥密钥对。 这受到 Windows 上 SSH 本身不可用的限制。
证书可以由用户生成,也可以由 Nova 生成(与 SSH 密钥对的情况相同)。 自签名证书是可以接受的。
用例¶
最终用户将能够连接到 Windows 实例而无需密码。
与 SSH 密钥对的情况一样,用户可以选择生成 X509 证书并将其公钥传递给 Nova(推荐),或者让 Nova 生成并返回包含私钥的证书。
项目优先级¶
无
提议的变更¶
虽然 Nova 当前仅支持 SSH 密钥对,但 API 可以扩展以支持 x509 证书,同时保持完全的向后兼容性。
需要更改的区域是
Nova API,以将证书类型作为选项接受(如果未提供,则默认为 SSH)
nova.compute.api.KeypairAPI 类,能够生成和管理 X509 证书,除了现有的 SSH 情况
nova.objects.Keypair 类,以添加一个类型属性
相关的数据库迁移
Nova 元数据 API,以支持在 nova.api.metadata.base.InstanceMetadata() 中支持额外的 x509 内容
python-novaclient,以添加可选的密钥对类型选项
使用示例
通过 CLI 生成 x509 密钥对并本地保存私有证书(PKCS#12 格式)
nova keypair-add keypair1 –keypair-type x509
导入 x509 公钥证书
nova keypair-add keypair1 –keypair-type x509 –pub-key /path/to/PEM_encoded_public_certificate
可以通过检查内容来发现证书类型,而无需用户显式提供它。
为了保持向后兼容性,省略证书类型将导致 SSH 证书
nova keypair-add keypair2 –pub-key /path/to/SSH_pub_key
等同于
nova keypair-add keypair2 –keypair-type SSH –pub-key /path/to/SSH_pub_key
在元数据方面,ssh 密钥和 x509 密钥为了向后兼容性而分别提供
“public_keys”: {“keypair2”: “ssh-rsa AAAAB3…cyJvOQ== Generated by Novan”}, “x509”: {“keypair1”: “MIIDaTC…ysk8w==n”},
服务器元数据模式不需要更改: http://git.openstack.org/cgit/openstack/nova/tree/nova/api/openstack/compute/schemas/v3/server_metadata.py
备选方案¶
我们不必担心 WinRM 服务证书,因为 cloudbase-init 等工具可以生成一个自签名证书,其工作方式类似于 ssh 主机密钥。 理想情况下,客户端应该被告知需要信任哪个证书,但这将留到我们对 ssh 主机密钥执行相同操作时再进行处理。
数据模型影响¶
nova.objects.Keypair 需要一个额外的字符串(VARCHAR(20))类型属性,名为“Type”。 初始可能的值将是
“ssh” “x509”
数据库迁移期间的默认值将是“ssh”。
REST API 影响¶
将向“/v2/{tenant_id}/os-keypairs”添加一个名为“os-extended-keypairs”的可选扩展,提供以下功能
GET /v2/{tenant_id}/os-keypairs
将在响应字典中包含键类型“key_type”。
如果未存在“os-extended-keypairs”扩展,则仅返回 SSH 密钥对。
POST /v2/{tenant_id}/os-keypairs
将包含一个可选参数“key_type”(xsd:string),可能的值为“SSH”和“X509”,默认值为“SSH”。
密钥对模式定义也将包含“key_type”
create = {
'type': 'object',
'properties': {
'keypair': {
'type': 'object',
'properties': {
'name': parameter_types.name,
'public_key': {'type': 'string'},
'key_type': {'type': 'string'},
},
'required': ['name'],
'additionalProperties': False,
},
},
'required': ['keypair'],
'additionalProperties': False,
}
server_create = {
'key_name': parameter_types.name,
}
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
无
其他部署者影响¶
无
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
cbelu
- 其他贡献者
alexpilotti
工作项¶
Nova 功能实现
python-novaclient 支持
依赖项¶
来宾操作系统需要使用能够从元数据中检索证书并导入的代理。 Cloudbase-Init >= 0.9.6 已经支持 x509 证书。
测试¶
CI 测试将由 Hyper-V CI 执行。
将为该功能开发 Tempest 测试。
文档影响¶
需要更新 Nova 驱动程序文档,以更新 nova 密钥对 API 和 CLI 命令的使用说明。
参考资料¶
初步讨论(Juno 设计峰会): https://etherpad.openstack.org/p/nova-hyperv-juno
OpenStack 中的无密码 Windows 身份验证 http://www.cloudbase.it/windows-without-passwords-in-openstack/
WinRM 基本知识介绍 http://blogs.technet.com/b/askperf/archive/2010/09/24/an-introduction-to-winrm-basics.aspx
StackForge 上的 Cloudbase-Init: https://github.com/stackforge/cloudbase-init