Haproxy 端口和相关服务配置¶
蓝图: https://blueprints.launchpad.net/tripleo/+spec/tripleo-haproxy-configuration
当前规范提供了通过 haproxy 提供 HA 端点的选项。
问题描述¶
当前的 tripleo 部署方案将服务绑定到 0.0.0.0:标准端口,并配置 stunnel 监听 SSL 端口。
这种配置存在一些缺点,并且在 HA 环境下无法正常工作,原因如下
haproxy 无法绑定到 <vip_address>:<service_port> - OpenStack 服务绑定到 0.0.0.0:<service_port>
服务端口在许多地方都硬编码(any_service.conf, init-keystone),因此更改它们并从 heat 进行配置将非常麻烦
非 SSL 端点可以从本地主机外部访问,这可能会让用户感到困惑,并在我们希望该服务仅在 SSL 上运行时暴露他们面临不安全的连接。我们希望默认提供 SSL,但我们无法真正阻止它。
提议的变更¶
我们将绑定 haproxy、stunnel (ssl)、OpenStack 服务到具有不同 IP 地址设置的端口。
HAProxy 将仅绑定到 VIP 地址。
如果使用 stunnel,它将被绑定到控制器 ctlplane 地址。
OpenStack 服务将绑定到 localhost 以进行仅 SSL 配置,并绑定到 ctlplane 地址以进行非 SSL 或混合模式配置。它们将绑定到标准的非加密端口,但绝不会绑定到任何端口上的 0.0.0.0。
我们将努力使仅 SSL 成为默认选项。
一个示例,使用 horizon 在混合模式下(HTTPS 和 HTTP)
vip_address = 192.0.2.21 node_address = 192.0.2.24
haproxy listen horizon_http bind vip_address:80 server node_1 node_address:80 listen horizon_https bind vip_address:443 server node_1 node_address:443
stunnel accept node_address:443 connect node_address:80
horizon bind node_address:80
第二个示例,使用 horizon 在 HTTPS 仅模式下
vip_address = 192.0.2.21 node_address = 192.0.2.24
haproxy listen horizon_https bind vip_address:443 server node_1 node_address:443
stunnel accept node_address:443 connect 127.0.0.1:80
horizon bind 127.0.0.1:80
替代方案¶
有几种替代方案,但它们无法涵盖所有安全或可扩展性要求
选项 1:在 0.0.0.0 上为 haproxy、stunnel、OpenStack 服务分配不同的端口
需要额外的防火墙配置
非 SSL 服务端点存在安全问题
haproxy bind :80
listen horizon server node_1 node_address:8800
stunnel accept :8800 connect :8880
horizon bind :8880
选项 2:仅使用 haproxy SSL 终止不是最优的
1.5 仍然处于开发阶段 -> 可能存在稳定性问题
我们需要将其纳入受支持的发行版
这也意味着 haproxy 和实际服务之间没有 SSL
非 SSL 服务端点存在安全问题
haproxy bind vip_address:80
listen horizon server node_1 node_address:80
horizon bind node_address:80
选项 3:在负载均衡器之前添加额外的 SSL 终止
在当前配置中没有用,因为负载均衡器(haproxy)和 OpenStack 服务安装在同一节点上
安全影响¶
如果仅运行 SSL,则只有受 SSL 保护的端点可用。
最小的防火墙配置
不转发解密流量通过非 localhost 连接
控制节点被攻破会暴露所有外部流量(未来和可能过去的)到解密和/或欺骗
其他最终用户影响¶
多个服务将监听同一端口,但如果用户(操作员)了解一些上下文,这将很容易理解。
性能影响¶
方法之间没有区别。
其他部署者影响¶
无
开发人员影响¶
无
实现¶
我们需要让服务配置 - nova 等 - 知道在每个服务的基础上在哪里绑定。当前方法在模板中使用逻辑来选择 localhost 和 my_ip。如果我们将选择移动到 Heat,这将变得更加简单(读取绑定地址,如果设置则使用它,否则不使用)。
我们考虑将 connect_ip 概念扩展到每个服务的基础。现在,所有服务都暴露于 SSL 和纯文本,因此在只有一些服务是纯文本之前,这可行 - 但我们预计这会很快发生。
负责人¶
- 主要负责人
dshulyak
工作项¶
tripleo-incubator: * 构建带有 haproxy 元素的 overcloud-control 镜像
tripleo-image-elements
openstack-ssl 元素重构
重构服务配置以监听 127.0.0.1 / ctlplane 地址:horizon apache 配置、glance、nova、cinder、swift、ceilometer、neutron、heat、keystone、trove
tripleo-heat-templates: * 将 haproxy 元数据添加到 heat-templates
依赖项¶
无
测试¶
CI 测试依赖项
在 overcloud 脚本中使用 VIP 端点
在添加 haproxy 相关元数据到 heat 模板之前,将 haproxy 元素添加到 overcloud-control 镜像(可能启用统计信息)
文档影响¶
更新孵化器手册
更新元素 README.md