在 Kubernetes 上使用 Istio 时,如何确保 TCP 流量由 Envoy sidecar 代理?

How can I ensure that TCP traffic is proxied by the Envoy sidecar when using Istio on Kubernetes?

Kubernetes 上的 Istio 将 Envoy sidecar 与 Pods 一起注入 运行 并实现服务网格,但是 Istio 本身 cannot ensure traffic does not bypass this proxy;如果发生这种情况,则不再应用 Istio 安全策略。

因此,我试图了解这种绕过可能发生的所有方式(假设 Envoy 本身没有受到损害)并找到防止它们的方法,以便保证来自 Pod 的网络命名空间的 TCP 流量具有通过 Envoy(或者至少更有可能通过):

  1. 因为(在撰写本文时)Envoy 不支持 UDP(nearly there), UDP traffic won't be proxied, so use NetworkPolicy 以确保只允许 TCP 流量 to/from Pod(例如,避免 TCP 流量通过基于 UDP 的 VPN)
  2. 删除 NET_ADMIN 功能以防止 Pod 在其网络命名空间中重新配置捕获流量的 IPTables 规则
  3. 删除 NET_RAW 功能以防止 Pod 打开原始套接字并绕过 IPTables 使用的 netfilter 挂钩点

我所知道的唯一其他攻击媒介是内核漏洞 - 还有其他攻击媒介吗?也许还有 IPTables 无法识别或忽略的其他 L3/4 协议?

我知道 eBPF and Cilium 可用于在套接字级别强制执行此拦截,但我对在 Kubernetes 上使用 vanilla Istio 的情况感兴趣。

编辑:我还假设工作负载没有 Kubernetes API 服务器访问权限

Envoy 相对容易绕过,Cilium 就像 Istio 一样使用 envoy。所以将无法阻止绕过envoy的上游。

两者 Istio and Cilium 都有列出有关安全漏洞的 CVE 的网站。

在控制平面内,可以通过注释影响 sidecar 注入或 iptables 规则,因此一旦有人获得集群管理员权限,就没有任何防御措施。

您可以使用 calico 来锁定通信,因此唯一流动的流量就是您想要流动的流量。

Calico 还提供无缝 integration with Istio 以在 Istio 服务网格中实施网络策略。

当然,pods 中的应用程序和服务在设计时也应考虑到安全措施的最佳实践。


更新:

为了澄清,我建议使用 calico 作为零信任网络模型。没有它,您可以从应用程序窗格中弄乱特使,因为它们与管理界面位于同一网络上。因此,锁定应用程序 pod 和管理界面之间的通信是至关重要的漏洞修复。

即使没有 cluster-admin 的权限,您也可以仅使用 curl 命令从 app pod 影响 envoy。

Envoy 并非旨在用作防火墙。依赖它的服务网格如 Istio 或 Cilium 只有在你可以绕过接收端的策略时才会认为它是一个错误。

例如,任何 pod 都可以通过使用 curl localhost:15000/quitquitquit 终止其自己的 Envoy 并在端口 15001 上启动自定义代理来绕过任何 Istio 或 Cilium 策略,该代理允许在 Envoy 重新启动之前进行所有操作。

您可以修补那个特定的漏洞,但是由于抵抗此类攻击不是服务网格的设计目标,可能还有许多其他方法可以完成同样的事情.后续版本中也可能会添加绕过这些策略的新方法。

如果您希望在发起连接的那一端而不只是在接收端实际执行您的安全策略,请考虑使用 的网络策略实现设计目标,例如 Calico。