弃用文件注入

https://blueprints.launchpad.net/nova/+spec/deprecate-file-injection

弃用计算 REST API 中的“个性化文件”,也称为文件注入。我们已经讨论这个问题好几年了,因为文件注入不安全,不太用户友好,而且我们有替代方案。

问题描述

Nova 的文件注入支持存在一些问题。

  1. 最终用户无法发现它

    [1] 所述,根据计算主机的配置,用户请求注入个性化文件可能会被静默忽略。对于 libvirt 驱动程序,文件注入默认情况下通过 [libvirt]/inject_partition 配置选项禁用,因此默认行为是不响应用户的请求,至少在使用 libvirt 时是这样,而 libvirt 是 Nova 中迄今为止最广泛部署的计算驱动程序。请注意,[libvirt]/inject_partition 配置选项的默认值自 Icehouse 版本以来一直是禁用文件注入 以来

  2. 它不安全

    在注入文件时,如果计算主机上不可用 libguestfs,则将使用 VFSLocalFS 代码通过主机注入文件。这意味着恶意镜像可能会利用主机。这也在邮件列表中讨论过 [2]。最初这是一个解决旧版本 Ubuntu 中问题的解决方法,无论此规范中提出的更改如何,都将被删除。 [3]

  3. 它不持久化

    个性化文件不会持久化在数据库中,这意味着它们无法通过元数据服务 API 检索,并且在服务器实例因源主机故障而在不同计算主机上重建(例如 evacuate 操作)期间也无法使用。

  4. 有更好的替代方案可用

    配置驱动是用户将其用户数据注入到服务器实例的标准方法。提供的 user_data 与实例一起持久化,因此可以从元数据服务 API 获取,并且在另一个主机上重建配置驱动时可用。有三种方法可以告诉 Nova 为实例创建配置驱动

    • 镜像可以具有指示需要配置驱动的元数据。

    • 操作员可以配置 nova.conf 中的 force_config_drive 选项。

    • 最终用户可以通过 config_drive 参数在 POST /servers API 中请求配置驱动。

    请注意,在实例创建期间无法构建配置驱动将导致构建请求被重新安排到另一个计算主机。对于主机上禁用文件注入,则不能这样说。

用例

作为用户,我希望有一种可预测的方式将数据注入到我的服务器实例中。

作为 Nova 开发人员,我不想维护有更好替代方案的遗留代码流程。

提议的变更

在新的微版本中,REST API 有一些更改

  1. 弃用 personality 参数从 POST /servers 创建服务器 API 和 POST /servers/{server_id}/action 重建服务器 API。

    在请求主体中指定 personality 参数将导致 400 Bad Request 错误响应。

  2. 作为此更改的结果,我们将支持将 user_data 传递到重建服务器 API。几个人表示这对于他们的用户来说会很有用,在相关的邮件列表线程中。 [4]

  3. 停止从 GET /limits API 返回 maxPersonalitymaxPersonalitySize 值。由于我们希望停止在创建或重建服务器实例时接受 personality 文件,因此我们也应该在新的微版本中停止报告这些资源的配额限制。

  4. 停止接受和返回 injected_filesinjected_file_path_bytesinjected_file_content_bytes 来自 os-quota-setsos-quota-class-sets API。

注意

injected_filesinjected_file_content_bytesinjected_file_path_length 有可配置的配额限制。对随实例提供的 user_data 没有配额。用户数据的唯一限制是数据库中的字段大小,使用 MySQL 时约为 16MiB。 考虑到默认的文件注入配额值,每个请求的限制小于 1MiB,因此我们在数据库中存储用个性化文件指定的内容有足够的空间。

由于旧版本的微版本仍然支持个性化文件注入,因此与文件注入相关的后端计算代码中不会删除任何内容(除了已经提到的不安全的 VFSLocalFS 代码)。 此外,也不会弃用与文件注入相关的配置选项。 此微版本的重点实际上是向用户发出不应使用计算 API 这部分遗留内容的信号,并设置一个计时器,如果 Nova 在遥远的将来开始需要更高的最低支持微版本,则可以将其删除。

备选方案

持久化提供的个性化文件,但这本质上是复制 user_data,后者已经持久化并可通过元数据服务 API 和配置驱动提供,并且不能解决安全或最终用户可发现性问题。

数据模型影响

REST API 影响

在新的微版本中

  1. 弃用 personality 参数从 POST /servers 创建服务器 API 和 POST /servers/{server_id/action 重建服务器 API。 在微版本之后指定该参数将导致 400 Bad Request 错误响应。

  2. 支持将 user_data 传递到重建服务器操作 API。模式将与 POST /servers 服务器创建 API 相同

    'user_data': {
        'type': 'string',
        'format': 'base64',
        'maxLength': 65535
    }
    
  3. 弃用从 GET /limits API 返回的 maxPersonalitymaxPersonalitySize 响应参数。

  4. 弃用以下 API 中的 injected_filesinjected_file_path_bytesinjected_file_content_bytes 参数

    • GET /os-quota-sets/{tenant_id}

    • PUT /os-quota-sets/{tenant_id}

    • GET /os-quota-sets/{tenant_id}/defaults

    • GET /os-quota-sets/{tenant_id}/detail

    • GET /os-quota-class-sets/{id}

    • PUT /os-quota-class-sets/{id}

安全影响

删除 VFSLocalFS 回退代码实际上对安全性有好处。

通知影响

无;个性化文件从未包含在任何通知中(谢天谢地)。

其他最终用户影响

更新 python-novaclient CLI 和相关的 python API 绑定,特别是

  • 弃用 --file 选项从 nova bootnova rebuild CLI 和 API 绑定。

  • --user-data 添加到 nova rebuild CLI 和 API 绑定。

  • 弃用 maxPersonalitymaxPersonalitySize 字段从 nova limitsnova absolute-limits CLI 和 API 绑定。

  • 弃用 injected_filesinjected_file_content_bytesinjected_file_path_bytesnova quota-shownova quota-updatenova quota-defaultsnova quota-class-shownova quota-class-update CLI 和 API 绑定。

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

Matt Riedemann (mriedem) <mriedem.os@gmail.com>

工作项

  • 添加一个微版本以进行对服务器创建、服务器重建、限制、os-quota-sets 和 os-quota-class-sets API 的提议更改。

  • 在 python-novaclient 中进行相关的更改。

依赖项

测试

  • 负面场景的单元测试。

  • 使用新微版本的正常 API 流的函数 API 示例测试。

文档影响

参考资料

来自 Ocata 的更多邮件列表讨论:http://lists.openstack.org/pipermail/openstack-dev/2016-November/107195.html

历史

修订

发布名称

描述

Queens

引入