迁移 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 库中,以确保操作员可以禁用验证或提供他们自己的捆绑包。
文档影响¶
将添加并解释新的配置选项。