IPSEC 加密网络

https://blueprints.launchpad.net/tripleo/+spec/ipsec

本文档提出在 TripleO 云中使用 IPSEC 隧道来加密所有通信。

问题描述

在网络中实现所有内容加密对于某些用例来说是硬性要求。虽然“无处不在的 TLS”提供了对此的支持,但并非所有人都需要一个完整的 CA。IPSEC 提供了一种替代方案,它需要的组件更少(无需 CA),同时仍然满足安全要求。缺点是 IPSEC 隧道配置可能会非常冗长。

提议的变更

概述

如邮件列表中所述 [1],为了 OSP10,我们已经开发了一个在 TripleO 部署之上运行的 ansible 角色 [2]。

它执行以下操作:

  • 如果系统中不可用,则安装 IPSEC。

  • 设置防火墙规则。

  • 基于硬编码的网络集合,它发现每个网络的 IP 地址。

  • 基于硬编码的网络集合,它发现虚拟 IP 地址(包括 Redis VIP)。

  • 它为每个网络中的大多数 IP 建立 IPSEC 隧道。

    • 常规 IP 作为点对点 IPSEC 隧道处理。

    • 虚拟 IP 使用 road-warrior 配置处理。这意味着 VIP 的隧道监听任何连接。这简化了隧道配置,因为 VIP 持有者无需了解或配置每个隧道。

    • 与“无处不在的 TLS”类似,这侧重于服务到服务的通信,因此我们明确跳过租户网络。或者,就像原始 ansible 角色中的那样,跳过计算节点到计算节点之间的通信。这显著减少了我们需要设置的隧道数量,但将应用程序安全性留给部署者。

    • 隧道的身份验证通过预共享密钥 (PSK) 进行,该密钥在所有节点之间共享。

  • 最后,它创建一个 OCF 资源,该资源跟踪每个 VIP 并根据 VIP 的位置启动或关闭其相应的 IPSEC 隧道。

    • 虽然此资源仍然在存储库中 [3],但现在已经合并到上游 [4]。一旦此资源在资源代理的打包版本中可用,首选版本将是打包版本。

    • 此资源有效地处理 VIP 故障转移,通过检测 VIP 不再由该节点托管,它会干净地关闭 IPSEC 隧道并在 VIP 现在托管的位置启用它。

所有这些工作都已经包含在角色中,但是为了更好地与 TripleO 的当前状态集成,需要进行以下工作:

  • 支持可组合网络。

    • 现在可组合网络已经存在,我们不能再依赖角色中拥有的硬编码值。

    • 幸运的是,这是我们可以从 tripleo 动态库存中获取的信息。因此,我们需要添加有关可用网络和 VIP 的信息。

  • 可配置的网络跳过。

    • 为了解决租户网络跳过问题,我们需要以某种方式使其可配置。

  • 将 IPSEC 包作为镜像的一部分添加。

  • 以 TripleO 的方式配置防火墙规则。

    • 当前角色处理防火墙规则设置。但是,应该可以像其他服务配置防火墙规则一样配置这些规则(使用 tripleo.<service>.firewall_rules 条目)。这将需要使用可组合服务模板。

  • 如上所述,我们需要创建一个可组合服务模板。

    • 这可以使用最近添加的 external_deploy_tasks 部分的模板,它将类似于 Kubernetes 配置,并依赖于 config-download 机制 [5]。

替代方案

虽然部署者已经可以使用“无处不在的 TLS”。但有一些部署者已经在使用上述 ansible 角色。因此,这将为他们提供无缝的升级路径。

安全影响

这本身就是一项安全增强,因为它实现了网络加密。

PSK 被所有节点共享并非理想,可以通过每个网络的 PSK 来解决。但是,这项工作可以在后续迭代中完成。

其他最终用户影响

目前,部署者需要提供他们的 PSK。但是,这可以作为 TripleO 执行的任务的一部分进行自动化。

性能影响

与“无处不在的 TLS”一样,在网络中添加加密会产生性能影响。我们目前没有关于这种影响的具体数据。

其他部署者影响

这将作为可组合服务添加。因此,部署者需要通过环境文件启用它。

实现

负责人

主要负责人

jaosorior

工作项

  • 将 libreswan(IPSEC 的前端)包添加到 overcloud-full 镜像中。

  • 将所需的信息添加到动态库存中(网络和 VIP)

  • 基于库存,动态创建 IPSEC 隧道,而不是基于硬编码的网络。

  • 将 tripleo-ipsec ansible 角色作为 TripleO 伞形的一部分添加。

  • 创建可组合服务。

依赖项

  • 这需要 triple-ipsec 角色可用。为此,它将被移动到 TripleO 伞形下并打包成这样。

测试

鉴于这不需要额外的组件,我们可以将其作为我们的上游测试的一部分进行测试。要求是部署启用网络隔离。

参考资料

[1] http://lists.openstack.org/pipermail/openstack-dev/2017-November/124615.html [2] https://github.com/JAORMX/tripleo-ipsec [3] https://github.com/JAORMX/tripleo-ipsec/blob/master/files/ipsec-resource-agent.sh [4] https://github.com/ClusterLabs/resource-agents/blob/master/heartbeat/ipsec [5] https://github.com/openstack/tripleo-heat-templates/blob/master/extraconfig/services/kubernetes-master.yaml#L58