迁移 HTTP Store 以使用 Requests

https://blueprints.launchpad.net/glance/+spec/http-store-on-requests

目前,glance_store 使用 httplib 与后端 HTTP Store 通信。如果 Store 以明文形式 (http://) 提供,则这没有问题。如果 Store 以 TLS (https://) 形式提供,则 httplib 未验证连接。为了在所有版本的 Python 上提供连接验证,glance_store 正在迁移到使用 Requests。

问题描述

目前,glance_store 使用 httplib 与后端 HTTP Store 通信。如果 Store 以明文形式 (http://) 提供,则这没有问题。如果 Store 以 TLS (https://) 形式提供,则 httplib 未验证连接 [1]。如果操作员以 HTTPS 提供他们的 Store,他们可能期望 Glance 在下载镜像时验证连接,但事实并非如此。

目前,当 Glance 从后端 Store 下载镜像时,它不会验证校验和。如果攻击者能够正确地定位自己,他们可以通过提供伪造(又名欺骗)证书来拦截连接。这使得攻击者能够通过代表 Store 提供错误的镜像数据来执行拒绝服务攻击。这假设使用 Glance 镜像的服务验证 Glance 在 Content-MD5 头部中提供的校验和。(这也假设攻击者无法更改数据库中的该值,或者在头部到达发出请求的服务之前更改该值。)如果攻击者能够正确地定位自己,他们还可以轻松地监视系统,即使他们选择不破坏数据。

此外,攻击者可以监视 Glance 足够长的时间以生成具有适当校验和的恶意镜像(因为当前使用的是 MD5,它不再是加密安全的,并且越来越容易创建碰撞 [2] [3] [4])。

提议的变更

为了在所有版本的 Python 上提供连接验证,glance_store 应该使用 Requests。已经进行了一次重构,但为了提供适当的向后兼容性,HTTP Store 需要新的配置选项。

用户需要

  • 一种禁用 HTTPS 验证的方法

    本规范建议将该选项命名为 disable_https_verification

  • 一种提供用于验证的证书捆绑包的方法

    本规范建议将该选项命名为 https_ca_bundle

  • 一种提供代理信息的方法

    本规范建议将该选项命名为 http_proxy_information

为了减少升级的影响,本规范建议将新的 disable_https_verification 选项默认设置为 True,并记录警告,说明它将在下一个周期中默认更改为 False。将为此情况编写并发布 OpenStack 安全说明 (OSSN)。

备选方案

加密和认证的镜像支持》规范可能看起来是一个替代方案,但它只是保护镜像数据,并不能保护传输。

数据模型影响

REST API 影响

安全影响

这将提高系统的安全性。

通知影响

其他最终用户影响

如果 HTTP Store 的证书过期,用户将无法下载镜像。

性能影响

通过在 Requests 中使用会话,由于 Requests 实现的连接池,多次请求将会更快。

其他部署者影响

为他们的 HTTP Store 使用自签名证书的部署者需要提供证书作为捆绑包的一部分,供 glance_store 用于验证。

开发人员影响

实现

负责人

主要负责人

icordasc

其他贡献者

评审人员

核心评审人

nikhil-komawar flaper87

其他审核员

sabari

工作项

  • 重构 HTTP Store 以使用 Requests

  • 添加上述描述的配置选项和文档

  • 编写和发布 OSSN

依赖项

测试

应将单元测试添加到 glance_store 库中,以确保操作员可以禁用验证或提供他们自己的捆绑包。

文档影响

将添加并解释新的配置选项。

参考资料