百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Cilium双向认证可能带来安全隐患 https双向认证原理

lipiwang 2024-10-20 10:10 10 浏览 0 评论

Kubernetes工作负载采用的新双向认证机制存在最终一致性问题,这可能带来安全隐患。

译自How Cilium’s Mutual Authentication Can Compromise Security,作者 Christian Posta 是 Solo.io 的全球首席技术官,支持客户和最终用户采用云原生技术。他是 Manning 和 O'Reilly 出版社的作者,开源贡献者,博客和 Envoy Proxy 极富盛名的演讲者,以及......

最近,Cilium 项目宣布了对一种新的互认机制的支持,这种机制可以通过一个简单的配置标志透明地部署到应用程序中。乍一看,这似乎是一种简单的方法,可以为使用 Cilium 的Kubernetes工作负载提供服务间的双向认证。然而,该设计存在一个不应被忽略的严重缺陷:

Cilium 中的整个双向认证基础最终是一致的。

安全实现的数据路径中的最终一致性可能会导致安全属性的故障,并在应被禁止的情况下导致流量在服务之间继续。

Cilium 的自定义双向认证机制透明地对服务之间的流量进行认证,并基于 Cilium 现有的扩展伯克利数据包过滤器(eBPF)数据平面。Cilium 使用 eBPF 来实现服务网络、网络策略和连接处理等功能。

Cilium 使用“无 TLS 的互认”(或 mTLess)来认证一个服务。我称之为“较少”,因为它没有使用 TLS 来完成 TLS 设计的目的:对两个对等体之间的传输进行认证、加密和完整性检查。Cilium 的双向认证实现与 mTLS 不同,正如我将在下面解释的那样。

当服务(或 Pod)A 想要与服务(或 Pod)B 通信时,Cilium 会尝试对这两个对等体进行认证,然后在一个特殊的节点本地“认证缓存”中标记该特定流量是否被允许。

图 1:初始连接将被丢弃,因为它未经认证。

当 Pod A 想要与 Pod B 通信时,它会通过正常的 Cilium eBPF 数据平面,但是 eBPF 代码将检查此连接是否已经通过检查节点本地认证缓存来进行了认证。在第一次尝试时,调用将不会被认证,所以 Cilium 将丢弃数据包。但这将触发后台机制,试图认证 Pod A 和 Pod B 之间的流量。如果成功,它将更新节点本地认证缓存。

期望的是,足够快的后台认证 Pod A 调用 Pod B 的机制,最初被丢弃的数据包将被重试,而不会造成太大的延迟。后台使用的机制是运行在不同节点上代表两个特定服务身份的 cilium-agent 之间的“无 TLS”连接(用 Go 编写)。所有这些都不会发生在 eBPF 数据平面上,而是在用户空间 Cilium 代理中。

图 2:如果 cilium-agent 之间成功建立了表示两个特定服务身份的 mTLS 连接,则流量被认为是经过认证的。

我将这个连接称为“无 TLS”,因为它用于测试认证并立即关闭,协商的所有会话密钥用于加密和完整性也被丢弃。也就是说,Cilium 不会在连接的整个生命周期内保留 mTLS 的安全属性;它只使用握手的认证部分。

图 3:握手之后,Cilium 结束无 TLS 连接。

如果这个无 TLS 连接成功(即握手成功),Cilium 将认为从 Pod A 到 Pod B 的流量是“经过认证的”。此时,节点本地认证缓存中的条目将被更新,以指示应允许从 Pod A 到 Pod B 的流量。

图 4:Cilium 更新认证缓存以指示 Pod A 经过认证可以调用 Pod B。

现在,当它重试连接数据包时,认证缓存将指示流量已认证,应允许连接并继续剩余的 eBPF 数据平面(实施网络和其他策略)。这个节点本地认证缓存确实展示了最终一致性的迹象,可能会失步,但这不是最令人担忧的最终一致性属性。

图 5:一旦缓存已更新并重试数据包,连接将流动。

Cilium 方法的大问题

使用真正的 mTLS 连接,在成功握手后,您希望剩余的数据使用参与方之间协商的密钥(仅为参与方所知)进行加密。Cilium 中的一个流量的成功认证并不意味着它是加密的(它将是纯文本),也不保证流量将以只对相关方可见的方式加密。如果您想要加密,可以使用基于 WireGuard 的 Cilium 加密选项(或 IPSec),但这仅仅是两个 Kubernetes 节点之间的加密,而不是特定的经过认证的工作负载。在“无 TLS”连接检查和实际将敏感数据投入线路之间可能会发生很多事情。

如果这个无 TLS 连接成功(即握手成功),Cilium 将认为从 Pod A 到 Pod B 的流量是“经过认证的”。此时,节点本地认证缓存中的条目将被更新,以指示应允许从 Pod A 到 Pod B 的流量。

图6:流量使用在 A/B 和 B/C 之间不同的会话密钥进行加密。

图7:基于 WireGuard 的加密使用相同的密钥。

Cilium 最终一致的双向认证实现中的实际问题出现在 Cilium 的核心身份模型周围。在上述 TLS 握手中,我略过了细节,但是如果您阅读 Cilium 文档,您会看到用于“mTLess”的 X509 证书有一个可选的基于“面向所有人的安全生产身份框架(SPIFFE)”的身份模型。事实上,在部署实现 Cilium 双向认证所必需的组件时,您可以选择部署 SPIFFE 运行时环境(SPIRE),这是 Cilium 用来生成代表工作负载及其身份的证书的 SPIFFE 实现。

这个 SPIFFE 身份用于握手中使用的证书,但 SPIFFE 不是 Cilium 中用于构建的通用工作负载身份。SPIFFE 被用作一个独立的身份层,映射到 Cilium 现有的身份实现。Cilium 基于其 CiliumIdentity 概念构建所有网络策略。CiliumIdentity 实现将一个整数映射到一组 IP 地址(与一组 Pod 相关联的 Pod IP)。这个“整数”及其映射到 Pod IP 地址表示 Cilium 中的核心身份基元。

图8:Cilium 的核心身份基元基于整数,这些整数在每个节点上的本地缓存中映射到 IP 地址。

我们在我们的博客文章“基于网络缓存的身份可能会被误解?”中详细讨论了这个话题。由于这个问题,我们建议在考虑使用容器网络接口(CNI)和服务网格的网络安全时采用深度防御的姿态。

下面是问题的关键:

给定身份的所有 IP 的映射,对于集群中存在的每个身份,都存在于集群中每个节点上的本地缓存中。

图9:集群中每个身份的所有 IP,对于集群中的每个身份,都存在于每个节点上的单独缓存中。

图10:最终一致性可能会导致错误或过时的 IP 映射。

为了 Cilium 的双向认证和策略执行能够工作,这些缓存必须使用正确的 IP 到身份映射进行更新。然而,更新集群中所有节点上的单独缓存是一个最终一致的操作。当 Cilium 的 eBPF 数据平面尝试推断连接的策略时,它将参考其节点本地缓存中的 IP 到身份映射。如果该缓存过时或延迟,它将导致不正确的网络策略(这可能不合规,允许恶意活动,危及数据等)。无论您是否使用 WireGuard 或 IPSec 在节点之间加密流量,对于这个身份混淆场景来说都没有区别。

这个演示展示了在使用 Cilium 的双向认证时可能发生的违反网络策略的流量身份混淆:视频。

总结

所以总结一下:

  • Cilium 项目为 Kubernetes 工作负载引入了一种新的双向认证机制。
  • Cilium 中的双向认证建立在最终一致性之上,这可能会危及安全性。
  • Cilium 使用“mTLess”进行认证,但并没有对整个连接进行加密。
  • Cilium 的身份模型包括 SPIFFE,但其核心身份是基于整数的独立身份层。
  • 核心问题是 IP 到身份映射存储在每个节点上的本地缓存中,这可能导致最终一致的更新。
  • Cilium 的双向认证中的最终一致性可能会导致不正确的网络策略和安全漏洞。

要正确使用依赖于 IP 地址映射的身份的 CNI,请考虑在顶部分层服务网格(如 Istio Ambient)的深度防御姿态。Istio Ambient 实现了一个无 sidecar 的服务网格,在服务之间的数据路径上使用 mTLS(无论其 IP 地址如何)。在像 Istio 这样的服务网格中,身份模型使用 SPIFFE 定义,并植根于负责签署用于认证流量的证书的证书颁发机构。

相关推荐

前端入门——css 网格轨道详细介绍

上篇前端入门——cssGrid网格基础知识整体大概介绍了cssgrid的基本概念及使用方法,本文将介绍创建网格容器时会发生什么?以及在网格容器上使用行、列属性如何定位元素。在本文中,将介绍:...

Islands Architecture(孤岛架构)在携程新版首页的实践

一、项目背景2022,携程PC版首页终于迎来了首次改版,完成了用户体验与技术栈的全面升级。作为与用户连接的重要入口,旧版PC首页已经陪伴携程走过了22年,承担着重要使命的同时,也遇到了很多问题:维护/...

HTML中script标签中的那些属性

HTML中的<script>标签详解在HTML中,<script>标签用于包含或引用JavaScript代码,是前端开发中不可或缺的一部分。通过合理使用<scrip...

CSS 中各种居中你真的玩明白了么

页面布局中最常见的需求就是元素或者文字居中了,但是根据场景的不同,居中也有简单到复杂各种不同的实现方式,本篇就带大家一起了解下,各种场景下,该如何使用CSS实现居中前言页面布局中最常见的需求就是元...

CSS样式更改——列表、表格和轮廓

上篇文章主要介绍了CSS样式更改篇中的字体设置Font&边框Border设置,这篇文章分享列表、表格和轮廓,一起来看看吧。1.列表List1).列表的类型<ulstyle='list-...

一文吃透 CSS Flex 布局

原文链接:一文吃透CSSFlex布局教学游戏这里有两个小游戏,可用来练习flex布局。塔防游戏送小青蛙回家Flexbox概述Flexbox布局也叫Flex布局,弹性盒子布局。它决定了...

css实现多行文本的展开收起

背景在我们写需求时可能会遇到类似于这样的多行文本展开与收起的场景:那么,如何通过纯css实现这样的效果呢?实现的难点(1)位于多行文本右下角的展开收起按钮。(2)展开和收起两种状态的切换。(3)文本...

css 垂直居中的几种实现方式

前言设计是带有主观色彩的,同样网页设计中的css一样让人摸不头脑。网上列举的实现方式一大把,或许在这里你都看到过,但既然来到这里我希望这篇能让你看有所收获,毕竟这也是前端面试的基础。实现方式备注:...

WordPress固定链接设置

WordPress设置里的最后一项就是固定链接设置,固定链接设置是决定WordPress文章及静态页面URL的重要步骤,从站点的SEO角度来讲也是。固定链接设置决定网站URL,当页面数少的时候,可以一...

面试发愁!吃透 20 道 CSS 核心题,大厂 Offer 轻松拿

前端小伙伴们,是不是一想到面试里的CSS布局题就发愁?写代码时布局总是对不齐,面试官追问兼容性就卡壳,想跳槽却总被“多列等高”“响应式布局”这些问题难住——别担心!从今天起,咱们每天拆解一...

3种CSS清除浮动的方法

今天这篇文章给大家介绍3种CSS清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先,这里就不讲为什么我们要清楚浮动,反正不清除浮动事多多。下面我就讲3种常用清除浮动的...

2025 年 CSS 终于要支持强大的自定义函数了?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!1.什么是CSS自定义属性CSS自...

css3属性(transform)的一个css3动画小应用

闲言碎语不多讲,咱们说说css3的transform属性:先上效果:效果说明:当鼠标移到a标签的时候,从右上角滑出二维码。实现方法:HTML代码如下:需要说明的一点是,a链接的跳转需要用javasc...

CSS基础知识(七)CSS背景

一、CSS背景属性1.背景颜色(background-color)属性值:transparent(透明的)或color(颜色)2.背景图片(background-image)属性值:none(没有)...

CSS 水平居中方式二

<divid="parent"><!--定义子级元素--><divid="child">居中布局</div>...

取消回复欢迎 发表评论: