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 命令的使用说明。

参考资料