将默认策略格式从 JSON 迁移到 YAML

多种因素导致策略弃用出现问题。我们需要进行一些更改,以便在不给 OpenStack 部署者带来困扰的情况下允许策略弃用。

问题描述

有几个独立但相关的因素相互交织,导致策略弃用时出现问题

  • 打包者喜欢生成一个示例策略供用户在配置服务时参考。

  • 出于向后兼容的原因,oslo.policy 仍然将策略文件的文件名默认为 policy.json。这鼓励软件包生成 JSON 示例策略文件,这不是我们想要的。

  • 以 JSON 格式生成示例策略文件会导致所有代码中的策略规则被覆盖,因为无法在 JSON 中注释掉默认规则。

由于上述原因,当服务中的策略规则被弃用时,拥有 JSON 示例策略文件的用户将在升级时立即应用新规则。这没有给他们机会来处理更改,这是 oslo.policy 中弃用机制的预期行为(通常会在旧规则和新规则上应用 OR 运算,以确保依赖于旧规则的环境将继续工作)。

提议的变更

我们希望正式弃用 JSON 文件格式支持,并将 oslo.policy 的默认值切换为 YAML。

为了做到这一点,我们需要与 oslo.policy 的使用者进行仔细协调。更改 policy_file 的默认值而不尽一切努力向部署者传达更改是危险的。如果部署者错过了此更改,他们的自定义策略可能无法应用,从而造成重大的安全问题。

此处提出的建议是,每个项目都添加一个升级检查,该检查将查找 JSON 格式的策略文件,如果找到则失败。一旦某个项目具备了此检查,他们就可以使用 set_defaultspolicy_file 的默认值更改为 policy.yaml。 此外,应在每个项目中添加关于此更改的发行说明。

为了促进此迁移,我们应该编写一个工具来将现有的策略迁移到 YAML。该工具将进行格式更改,并且还应注释掉与代码中的策略默认值匹配的任何规则。 只有部署者实际自定义的规则才应存在于生成的文件中。 我们也许可以使用 oslopolicy-policy-upgrade 工具来做到这一点。

同时,我们可以正式弃用 oslo.policy 中的 JSON 格式支持。 如果我们检测到正在使用 JSON 文件进行策略,我们应该记录一个警告。 还需要弃用 CLI 工具中的 JSON 支持。

我们还可以考虑在 oslo.policy 方面使 JSON 文件的存在成为一个硬性错误。 我们可以提供一个标志,服务可以在完成迁移到 YAML 后设置。 如果设置了该标志并且我们找到一个 policy.json 文件,那将是一个致命错误,并且服务甚至无法启动。 这将防止我们在部署中静默地打开安全漏洞。

一个相关的更改,对于更改默认文件格式来说并非绝对必要,但将进一步改进弃用过程,是添加一个策略文件中冗余规则的运行时检查。 这将提供与 oslopolicy-list-redundant 相同的功能。

备选方案

保持现状,并尝试更好地传达部署者应该使用 YAML。 这基本上是围绕代码中策略的原始计划,显然没有奏效。

Impact on Existing APIs

JSON 格式的策略文件支持将被弃用。

安全影响

策略对安全性有重大影响,因此我们需要非常小心地进行此更改。 这需要与 Oslo 的使用者协调,以确保我们以最安全的方式进行更改。

性能影响

短期内没有。 删除 JSON 支持后,我们将能够停止检查格式为 JSON 的文件,这可能会略微提高读取策略文件的性能。

Configuration Impact

oslo.policy 中 policy_file 选项的默认值将从 policy.json 更改为 policy.yaml

开发人员影响

每个项目都需要一个升级检查,以警告仍然存在 JSON 策略文件的用户。

每个项目都需要覆盖 policy_file 默认值,一旦他们添加了升级检查。

Testing Impact

我们需要制定一个测试矩阵,涵盖我们可能遇到的所有可能情况。 例如,部署者可能拥有

  • policy.json

  • policy.yaml

  • 同时存在 policy.json 和 policy.yaml

  • 位于自定义路径的 JSON 文件

  • 位于自定义路径的 YAML 文件

我们需要确保测试所有这些,以确保我们做正确的事情。

实现

负责人

主要负责人

gmann

其他贡献者

???

里程碑

完成目标里程碑

工作项

  • 与其他项目协调,添加升级检查并更改 policy_file 的默认值。

  • 提供一个工具来转换现有的策略文件为 YAML,最好具有注释掉原始文件中与代码中策略默认值匹配的任何规则的功能。

  • 一旦所有项目都具备了升级检查,就更改 oslo.policy 中的 policy_file 默认值,以便所有未来的项目都具有正确的默认值。

  • 弃用 oslo.policy 中的 JSON 支持。

  • 弃用策略 CLI 工具中的 JSON 输出。

文档影响

关于此的发行说明将非常重要。 针对每个项目的文档,建议不要使用 JSON,也可能有所帮助。 请注意,oslo.policy 文档已经建议使用 YAML 而不是 JSON。

依赖项

我们需要所有项目都具备升级检查,才能安全地更改此默认值。

参考资料

Oslo Victoria 虚拟 PTG Etherpad

注意

本作品采用知识共享署名 3.0 非移植许可协议授权。 http://creativecommons.org/licenses/by/3.0/legalcode