用户可配置的哈希算法

包含您的 Launchpad 蓝图的 URL

https://blueprints.launchpad.net/glance/+spec/configurable-hash-algorithms

允许最终用户在创建新镜像时指定要使用的哈希算法,从而使他们能够将镜像创建者提供的现有哈希值与 Glance 返回的哈希值进行比较,而无需在客户端自行生成哈希值。

问题描述

文档中所述,安全哈希算法功能添加了可用于基于其哈希值验证镜像完整性的镜像属性。添加了两个属性,os_hash_algo,其中包含用于生成哈希值的哈希算法的名称,以及 os_hash_value,其中包含哈希值本身。

我们希望能够使用 web-download 将镜像上传到 Glance - 无论是 OpenShift 发布镜像,还是标准的 CentOS Stream 或 Ubuntu 镜像 - 然后将上传镜像的哈希值与镜像提供商提供的签名进行验证。但是,目前由 os_hash_algo 表示的哈希算法不可由用户配置:它只能通过 [DEFAULT] hashing_algorithm 配置选项进行配置。默认值为 sha512,之所以选择它是因为它的性能优于 SHA-256(参见 安全哈希算法支持),但并非所有镜像提供商都发布 SHA-512 签名:例如,虽然 Debian 发布 SHA-512 签名 (来源),但 Ubuntu 仅发布 SHA-256 签名 (来源),Fedora 也是如此 (来源)。当未以合适的格式提供签名时,有必要要求管理员更改哈希算法(这会影响整个部署并且可能不可行,尤其是在公共云环境中),或者在上传镜像之前在客户端生成哈希值(这会限制 web-download 镜像导入机制的实用性)。我们希望解决这个差距。

提议的变更

为了解决这个问题,我们建议允许用户在创建镜像时选择要使用的哈希算法。我们将把 [DEFAULT] hashing_algorithm 配置选项重命名为 [DEFAULT] default_hashing_algorithm(提供旧名称的别名),并添加一个新的配置选项,[DEFAULT] allowed_hashing_algorithms,它将是一个用户可以指定的允许算法的列表,并最初默认为 ['sha512', 'sha256', 'sha1', 'md5']。 这样,用户可以选择适合其用例的哈希算法,同时操作员仍然可以限制某些算法以例如维护法规遵从性。

备选方案

  • 与其允许用户指定要使用的哈希算法,我们可以开始存储多个哈希算法。这将需要替换两个镜像属性,os_hash_algoos_hash_value,使用新的类似映射的属性或特定于算法的扁平属性(例如,os_hash_value.sha512)。

    这个方案被否决了,因为它具有更大的 API 影响,需要数据库更改,并且由于需要为每个镜像生成多个哈希值而增加 CPU 利用率。

  • 与其引入新的配置选项,我们可以修改现有 [DEFAULT] hashing_algorithm 选项的行为,使其现在接受允许的哈希算法列表,其中第一个项目(索引 0)是默认使用的算法。

    这个方案被否决了,因为它使该选项具有两种用途 - 配置默认值和配置允许的选项 - 这可能会让操作员感到困惑。 此外,任何具有非默认值(例如,sha256)的部署都将保留这些值,并且该值现在将影响默认值和允许的哈希算法,这可能从操作员的角度来看是不可取的,但很容易被忽略。

数据模型影响

无。

REST API 影响

POST /images API 现在将允许用户在创建镜像时指定 os_hash_algo 属性。 如果用户指定了不受支持的算法,则请求将被拒绝,并显示 HTTP 400(错误请求)错误和适当的错误消息。

安全影响

这些问题有很多潜在的问题,但我们认为它们都不是实际问题。

  • 恶意用户可以依赖于使用较弱或不安全的算法的哈希冲突,从而欺骗用户相信他们正在下载例如官方 Ubuntu 镜像,而实际上他们正在下载较弱的镜像。

    使用这种方法需要恶意用户能够创建公共或社区镜像,或者他们需要潜在的受害者接受共享镜像的共享请求。 这在公共云环境中不太可能发生。 此外,更重要的是,使用 SHA-256 或 SHA-512 的哈希冲突尚未公开演示。 这显然不适用于 SHA1 和 MD5,但由于这两个算法的安全性不足已得到充分记录和广泛了解,因此用户不应期望安全性。

  • 恶意用户可以通过上传使用昂贵的哈希算法的镜像来对 Glance 进行拒绝服务攻击。

    用户可以指定的哈希算法集合将由操作员可配置,这意味着只有经过充分了解的、众所周知的算法才会被默认允许。 此外,这样的哈希算法必须是惊人地昂贵才能影响下载和存储 Glance 镜像的现有开销。 我们不知道在实际使用中存在任何这样的哈希算法。

  • 使用特定算法可能会导致操作员违反法规要求。

    受支持的哈希算法将由操作员可配置。 操作员可以仅仅禁用那些由于例如 FIPS 合规性要求而未被允许的算法。

通知影响

无。

其他最终用户影响

这个字段已经受 openstacksdk 支持,但目前被静默忽略。 这将不再如此。 换句话说,现在它将起作用

import openstack

conn = openstack.connect()
openstack.enable_logging(debug=True)

image = conn.image.create_image(
    'foobar',
    os_hash_algo='sha256',
)
print(image)

或者,使用 OpenStackClient (OSC)

openstack image create --property os_hash_algo=sha256 foobar

我们可能希望在 OpenStackClient 的 image create 命令中添加一个新的辅助别名,以便允许用户轻松指定这个众所周知的别名,但这只是一个锦上添花的功能。

性能影响

无。

其他部署者影响

部署者现在将能够配置用户在创建镜像时可以使用的哈希算法。 虽然这将默认设置为一组合理的默认算法,但他们可能希望进一步调整这些算法以满足法规或组织要求。

开发人员影响

无。

实现

负责人

主要负责人

stephen.finucane

其他贡献者

工作项

  • 添加新的配置选项

  • 添加必要的 API 逻辑,以便允许用户在创建镜像期间指定此选项并尊重它在镜像上传期间。

  • Update documentation

依赖项

无。

测试

单元测试和手动测试应该足够了,尽管我们也可以通过新的 Tempest 测试来测试它。

文档影响

我们需要更新 API 文档以及安全哈希算法功能文档。

参考资料

无。