重建时重置实例密钥对

Launchpad 蓝图: https://blueprints.launchpad.net/nova/+spec/rebuild-keypair-reset

本文档描述了在重建时重置密钥对的新方法实现方式。

问题描述

目前 Nova 没有办法在重建过程中重置实例密钥对。因此,至少 nova rebuild 将是一种重置实例密钥对的方法。

用例

  • 作为一个用户,我丢失了密钥,需要进入我的实例,但不想丢失我的 IP 地址,所以我需要使用新的密钥进行重建。 [1]

  • 作为一个用户,我使用重建来将新的操作系统镜像部署到我的 ironic 管理的机器上。我希望以类似的方式使用重建来进行密钥对轮换。 [2]

  • 作为一个用户,我创建了一个完整的 Heat 堆栈,然后发现我使用了错误的密钥。与其重新创建整个堆栈,我只想使用正确的密钥重建实例。 [3]

提议的变更

将在重建 API 输入体中添加一个新的参数,命名为 key_name。重建 API 调用后,响应体必须包含更新后的新实例 key_name

备选方案

您需要删除并创建一个使用不同密钥对的新实例。值得注意的是,新实例将拥有一个新的 ID,这可能会导致云应用程序的其他资源跟踪记录。

数据模型影响

REST API 影响

将为 nova rebuild API 添加一个新的微版本。然后用户可以使用 rebuild API 重置实例密钥对。

注意

key_name 的查找将基于发起请求的当前用户,这可能与创建实例的用户不同。这是可能的,因为同一项目中的用户可以重建其他用户的实例,但密钥的范围限定为用户。有关更多详细信息,请参阅安全影响部分。

  • 服务器模式

base_rebuild_vXXX = {
    'type': 'object',
    'properties': {
        'rebuild': {
            'type': 'object',
            'properties': {
                'name': parameter_types.name,
                'imageRef': parameter_types.image_id,
                'adminPass': parameter_types.admin_password,
                'metadata': parameter_types.metadata,
                'preserve_ephemeral': parameter_types.boolean,
                'OS-DCF:diskConfig': parameter_types.disk_config,
                'accessIPv4': parameter_types.accessIPv4,
                'accessIPv6': parameter_types.accessIPv6,
                'personality': parameter_types.personality,
                'key_name': parameter_types.name,
            },
            'required': ['imageRef'],
            'additionalProperties': False,
        },
    },
    'required': ['rebuild'],
    'additionalProperties': False,
}

安全影响

密钥由用户拥有(这是唯一真实的情况)。服务器由项目拥有。因此,使用 key_name 进行重建是根据发起重建的用户查找密钥对。这可能是人们想要的,如果出现意外情况,最初创建实例的其他用户可以再次重建实例。我们将确保在 API 参考中记录这种微妙之处,并进行此微版本更改。

通知影响

重建操作的通知 [4] 将使用新的密钥对名称。

其他最终用户影响

python-novaclient 也应该将这个新的 key_name 参数添加到 nova rebuild shell 命令中。

性能影响

其他部署者影响

开发人员影响

实现

负责人

工作项

  • 使用新的 API 微版本向 rebuild API 添加 key_name 参数 [5]

  • CLI 支持。

  • 测试。

  • 文档。

依赖项

测试

  • 重建一个实例,并查看数据库中的 key_name 和 key_data 是否真的发生了变化。

  • 针对新微版本的 Tempest 测试用例。如果重建的实例处于 ACTIVE 状态,请确保 cloud-init 或 config drive 进行了正确的公钥设置。

文档影响

需要为新的 API(rebuild)微版本编写文档。这些文档将描述新的实例重建 API 请求和响应。

参考资料