LBaaS 参考实现 TLS 支持

https://blueprints.launchpad.net/neutron/+spec/lbaas-ref-impl-tls-support

LBaaS 参考 HAProxy 实现需要改进以支持 TLS,包括 SNI。

此蓝图描述了应该对 HAProxy 参考实现进行的更改,以允许以下蓝图提供的功能:https://blueprints.launchpad.net/neutron/+spec/lbaas-ssl-termination https://blueprints.launchpad.net/neutron/+spec/lbaas-refactor-haproxy-namespace-driver-to-new-driver-interface 及其后续版本得以实现。

问题描述

当前参考驱动程序及其工具不支持“高级”功能,从而阻碍了‘lbaas-ssl-termination’蓝图建议的更高级 API 功能的进一步开发。

为了支持 TLS 卸载配置,参考驱动程序 (HAProxy) 必须更新,以确保适当的“后端”行为和能力。

HAProxy 1.4 (当前稳定版) 中当前不支持的功能
  • TLS 终止。

  • TLS 源 IP 会话持久性

  • TLS 连接的 X-Forwarded-For 标头。

  • TLS 源 IP 负载均衡方法

  • TLS 重加密

此规范不包括 L7、源 IP 会话持久性、TLS 会话 ID 会话持久性、源 IP 负载均衡算法、TLS 重加密以及 x-forwarded-for 或基于证书的客户端身份验证的范围。

此规范的范围包括 TLS,包括 SNI 支持。

提议的变更

当前的参考驱动程序名为‘namespace_driver’,使用 HAProxy 1.4。更新为使用 HAProxy 1.5(取决于打包)。

为了实现这些功能,需要完成以下几点

1. 更新 HAProxy 配置文件。配置将使用规范中指定的 Jinja 构建:“https://blueprints.launchpad.net/neutron/+spec/ lbaas-refactor-haproxy-namespace-driver-to-new-driver-interface” 并对其进行扩展,以包含 TLS 功能。

配置工具将配置新的目录和文件,用于 HAProxy 和证书,结构如下。这将确保不会发生名称冲突。

$state_path/lbaas/$lb_uuid/
$state_path/lbaas/$lb_uuid/$cert1_barbican_id.pem
$state_path/lbaas/$lb_uuid/$cert2_barbican_id.pem
$state_path/lbaas/$lb_uuid/$certN_barbican_id.pem
$state_path/lbaas/$lb_uuid/haproxy.conf
$state_path/lbaas/$lb_uuid/run/
$state_path/lbaas/$lb_uuid/run/haproxy.pid
$state_path/lbaas/$lb_uuid/run/haproxy_stats.sock

2. 包含私钥的 pem 文件将以只允许 root 读取的权限写入,以保护安全凭据。

修改 neutron.agent.linux.util#replace_file 以接受一个可选的‘file_mode’参数,以指定其他于默认‘0644’的权限。这可以防止攻击者在文件权限设置之前读取私钥的竞争条件。

3. 还有一些拆卸方法,即 undeploy_instance,需要更新以进行适当的清理。(杀死进程)。

其他想法:使用 devstack 的用户将无法使用此功能,除非手动安装或 devstack 本身已更新。在某个时候需要在该方面进行更新。

数据模型影响

REST API 影响

无。此蓝图旨在提供未来 REST API 版本中可以支持的功能。

安全影响

用户的私钥将被写入网络节点本地文件系统上 root 可读的文件中。

通知影响

其他最终用户影响

Devstack 需要更新以安装新的软件包(HAProxy 1.5)。

性能影响

必须进行额外的调用才能生成额外的实例。

TLS 卸载会增加网络节点的开销。

IPv6 影响

其他部署者影响

部署者需要确保安装新的依赖项。

开发人员影响

开发人员需要确保他们正在使用基于 lb 配置的附加工具。

开发人员需要创建一个实用程序来检索 Barbican 密钥/数据。

社区影响

此更改自 Juno 以来一直在审查中。 IRC 和邮件列表中进行了大量讨论。

备选方案

或者,如果我们想支持不同的 TLS 卸载工具,例如 Stud,我们可以支持在 HAProxy 前面加载的插件或扩展。

实现

负责人

主要负责人

phillip-toohill

其他贡献者

dlundquist

工作项

更新 haproxy ‘haproxy.conf’ 和 jinja 模板以处理新的配置。更新 namespace_driver 方法以进行新的操作。测试。

依赖项

测试

Tempest 测试

  • 将 TLS 添加到现有的 LBaaS tempest 测试

功能测试

  • 测试以验证 SSL 终止

API 测试

文档影响

用户文档

记录重构参考实现的行为和功能。

开发人员文档

记录重构参考实现的行为和功能。

参考资料

https://haproxy.cn/ https://blueprints.launchpad.net/neutron/+spec/lbaas-api-and-objmodel-improvement https://blueprints.launchpad.net/neutron/+spec/lbaas-refactor-haproxy-namespace-driver-to-new-driver-interface https://blueprints.launchpad.net/neutron/+spec/lbaas-ssl-termination