允许管理员查询和创建属于任何用户的密钥对

https://blueprints.launchpad.net/nova/+spec/admin-query-any-keypair

此更改允许管理员用户查询其他用户拥有的密钥对,以及代表他们创建/导入新的密钥对。

问题描述

目前,密钥对仅对其所有者可用。管理员应该能够查看其他用户的密钥对,并在需要时代表他们创建新的密钥对。

用例

作为 OpenStack 集群的管理员,我需要查看用户拥有的密钥对。

作为具有管理员权限的人,我希望能够使用分配给其他人的密钥对创建实例,以便他们可以登录。

允许管理员为用户创建密钥对和导入公钥,将允许用户访问使用这些密钥对启动的实例。

对于需要使用配置管理工具(Ansible、Puppet 等)进行额外部署后配置的实例,由管理员预先安装密钥对也非常有用。

项目优先级

(尚未定义)

提议的变更

对于查询操作,此更改不会以任何方式影响 API 格式或模式,而只是添加一个查询键来选择用于密钥对查询的特定用户。但是,需要将一个可选的 user_id 参数添加到 POST 操作中,以指定要创建密钥对的用户。

当前允许的查询请求如下

GET /os-keypairs GET /os-keypairs/[keypair]

在此更改之后,管理员将能够执行以下操作

获取 [user_id] 的密钥对列表

GET /os-keypairs?user_id=[user_id]

查看特定用户的密钥对

GET /os-keypairs/[keypair]?user_id=[user_id]

  • 未来工作

    允许管理员列出所有用户的密钥对将需要额外的工作,这将涉及对数据库模式的更改,将在单独的规范中提交。

备选方案

我们可以添加一个新的管理员 API 方法来促进这一点,但这样做将花费更多的工作,而收益却很少(如果有的话)。

数据模型影响

无。

REST API 影响

  • 查询方法的规范

    • 密钥对的现有索引操作将在激活适当的微版本时扩展为支持可选的“user_id”参数。

    • 方法类型:GET

    • 正常的 http 响应代码:200

    • 预期的错误 http 响应代码

      • 403:如果用户没有权限,根据策略文件

    • /v2.1/{tenant_id}/os-keypairs?user_id={user_id}

    • /v2.1/{tenant_id}/os-keypairs/{keypair_name}?user_id={user_id}

    • 可以通过 URL 传递的参数:备用用户 ID

    • 主体数据的 JSON 模式定义未更改

    • 响应数据的 JSON 模式定义未更改

  • 示例用例

请求

GET http://127.0.0.1:8774/v2.1/e0c1f4c0b9444fa086fa13881798144f/os-keypairs?user_id=example_userid

  • 创建/导入方法的规范

    • 创建方法将在激活适当的微版本时扩展为支持可选的“user_id”参数,该参数将在请求主体中提供。

    • 方法类型:POST

    • 正常的 http 响应代码:200

    • 预期的错误 http 响应代码

      • 403:如果用户没有权限,根据策略文件

    • /v2.1/{tenant_id}/os-keypairs

    • 响应数据的 JSON 模式定义未更改

    • 主体数据的 JSON 模式定义将更改为包含可选的 user_id 参数

create:
{
  "keypair": {
      "name": "%(keypair_name)s",
      "type": "%(keypair_type)s",
      "user_id": %(user_id)s"
  }
}

import:
{
  "keypair": {
      "name": "%(keypair_name)s",
      "type": "%(keypair_type)s",
      "public_key": "%(public_key)s,"
      "user_id": %(user_id)s"
  }
}
  • 这将添加新的策略元素,允许分配此权限

"os_compute_api:os-keypairs:index": "is_admin:True or user_id:%(user_id)s"
"os_compute_api:os-keypairs:show": "is_admin:True or user_id:%(user_id)s"
"os_compute_api:os-keypairs:create": "is_admin:True or user_id:%(user_id)s"

安全影响

管理员能够查看其他用户的公钥并代表他们创建新的密钥对。但是,这些通常被认为是适合公开查看的材料。

通知影响

其他最终用户影响

  • 此更改将意味着对 python-novaclient 进行更改,以允许指定应列出或创建密钥对的用户。

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

vladikr

其他贡献者

Dan Smith, Dan Radez

工作项

  • 添加一个新的微版本,并使 os-keypairs 尊重 user_id 查询/创建参数

依赖项

测试

单元测试足以验证此功能,因为它非常简单。可以添加 API 样本测试,以确保当传递 user_id 参数时,列表调用的输出不会发生差异。添加新的 API 样本以验证创建/导入请求模式。

文档影响

将更新 nova/api/openstack/rest_api_version_history.rst 文档。

参考资料