DevSecOps: Kubernetes版
当今的云环境在可伸缩性和安全性方面提出了新的挑战。
了解微软在Kubernetes生态系统中的开源贡献如何影响Azure产品,使客户能够充满信心地采用战略性新技术。hth华体会最新官方网站
视频记录
嗨,我是史蒂夫·拉斯克。我是Azure的PM架构师,我负责我们的容器注册表,比如ACR和MCR,以及我们今天要讨论的一些与供应链安全相关的开源项目。
我是Bridget Kromhout,我是Azure上游开源项目经理,我很高兴能了解更多关于供应链安全的知识。
所以我们想关注的一件事是,你如何确保供应链的安全,从它建立的地方开始,并确保当你部署它时,它实际上是由你信任的实体签署的?
现在,这个是关于保护我可能正在使用的公共内容,所以我们在这里所做的一个重点是,它不是一个特定于云的解决方案,而是开源的解决方案,我们实际上可以让微软的内容在其他云上运行,或者我可以在各种云上使用的本地或开源内容。
所以我们使用的技术必须是开源的,因为它们必须与云无关,与供应商无关,这样任何人都可以使用它们。
Steve,我认为你的观点是,许多客户正在为自己构建解决方案,这些解决方案为许多不同的位置消费内容,他们需要一个与供应商无关的开源解决方案来满足他们的安全性或遵从性,或者只是实现需求。
完全正确。我们的想法是,人们不再自己构建所有的东西,这是我们提高生产力的方式,我们正在使用所有这些额外的项目,所以我希望能够安全地将它们带到我的环境中,然后继续构建、增强、部署和验证它们。
其中一件事是,如果你考虑到有多少内容…当然,我们有包管理器来管理我所构建的东西,但是我要发布和部署的东西,注册表已经起到了主要作用。
每个云提供商都有一个,有很多项目可以在本地运行,在气隙环境、VNET环境、物联网环境等等。
所以这是我们一直在研究的一个方面,利用人们已经配置、管理的容器注册表,他们已经建立了私有网络,在[听不清00:02:43]复制的问题上,所以我们觉得核心基础设施是利用的关键,因为我们不希望客户不得不运行另一个服务,我们希望他们使用他们已经拥有的服务。
我认为在Kubernetes生态系统的背景下讨论这个问题可能也是一个有趣的观点,因为我认为我们得到了很多关于;你应该有SBOM,你应该…验证你的软件供应链,你应该验证各种各样的东西,但你如何将它们准确地粘到你的Kubernetes上?今天,我们将讨论它是如何工作的。
不仅仅是如何工作,还有人们如何保护它,因为它不仅仅是,“嘿,我可以从注册表中提取一些东西等等。”
它在人们试图锁定的环境中是安全的吗?让我们再深入一点,你检查机场的想法,如果是运输安全机构,而不是时间戳机构,你检查机场有人说,很好,你递给他们一个部署文件,说,我想被部署到那个飞机上,那个Kubernetes集群。
那个特工坐在那里,“很好,你给我这个Pod规格,但你是谁,我能相信你吗?”
现在我可以给他们一个签名,一个文件,上面写着:“这就是我。”但这份文件肯定不只是我家人的遗书,对吧?它必须是某种可信的文件。该代理配置了一个策略,该策略说明哪些是它们信任的文档,哪些是它们允许的实体。
太好了,我给了运输安全管理局的工作人员,那份文件,他们允许的众多文件之一,我可能会做一个数字表格。我们有时会把它们放在手机里。
无论哪种情况,在运输安全管理局的工作人员分析了他们允许你进入这个区域的政策之后,他们会加盖另一个签名,对吧?
我们会看到那个小蓝点或者绿色点或者数字点,所以现在当我进入机场的时候,你猜怎么着,我要通过扫描仪,对吧?就像我们的软件一样,它应该通过扫描仪,即使它已经被验证了。
所以在这个例子中,这个实体,集装箱,我们将引入它,但是这个人现在被允许进入机场,已经被扫描了,他们仍然有那个舱的规格。
他们现在在集结区,对吧?在机场的集结区,我说,“嘿,太好了,我该上飞机了。”
现在又有一个管理人员说:“等等,你不仅仅是要上飞机,我需要你证明你是谁。”
在这种情况下,代理44不关心你的驾照或护照,或你提供的任何其他文件,他们只关心;你被允许进入这种环境吗?你有我们运输安全管理局的邮票吗?如果你做得很好,我们就会让你加入,当然,44号探员会再给你盖章,上面写着,你升职了。
现在你可以登上Kubernetes飞机了。这里的类比是,每个晋升阶段都是独立的。当我从公共场所进入机场时,我没有回到机场安检处去拿一些文件来证明这一点,所有的东西都和我在一起。这也是我们看到客户在他们的环境中所做的事情。他们试图将他们的环境锁定在VNETS中,VNET上的任何洞都是…类比是潜艇上的一个洞。你只需要一个,不管你有5个还是10个,如果潜艇上只剩下一个洞,那就不安全了。
所以我们要确保你真的关闭了所有的公共入口和出口,以及那些签名,soms,无论什么,它可以在那个环境中被全面验证,没有外部连接。
当你说到独立的时候,我想,是不是有些数据必须在两者之间传递,那么你如何确保这种传递是安全的呢?
是的,那是有趣的地方,被提升的内容,那是我们想用注册表做的一部分,我们用RS工件工作实现的是,你可以把所有东西连接在一起它可以作为一个单元传播。
现在仅仅因为它是一个移动的单位并不一定意味着它没有被操纵。所以每一个东西,无论是图像,SBOM,还是扫描结果,每一个东西都是有签名的。所以你可以验证每一个被提升的人工制品,因为我们有位置独立的概念,也就是说,当我在机场办理登机手续时,我来自哪里并不重要。我是史蒂夫·拉斯克,我有一个身份,不管我是在华盛顿、德克萨斯还是纽约,我的身份与我在这些地方的位置无关,但我可以通过签名和与之相关的密钥来验证我的身份。
你说过,SBOM几次,你在这个演讲中到处抛出了一些SBOM。
我想确保我们在供应链的各个阶段明确了什么是SBOM。我知道我们会详细讨论它,但是你能解释一下在这种情况下,SBOM在这里的作用是什么,它到底是什么?
所以如果你想想供应链,有内容的创建,我正在构建这些映像,我正在构建这些映像中的软件包,然后我想要部署它们。
一个SBOM,一个软件物料清单,或者系统物料清单,这是公平的,因为这些组织也希望能够将SBOM用于硬件设备。所以它倾向于更多的系统材料清单,就像容器注册不再是真正的容器一样。
我喜欢用汤碗来类比。如果你看一碗汤,特别是如果它是液体,没有大块或蔬菜,你真的不知道里面有什么,除非你做一些DNA分析。
你真正想要的是;这是配料的清单,加入的构建系统,使用的包装是什么?编译器标志是什么?正在配置的环境是什么?
因为,到那时,特别是对于原生二进制文件,当所有东西都被组装起来的时候,组装的细节是非常重要的。安全扫描仪可以在事后查看系统的材料清单,了解进入其中的内容,因为这是重要的独特见解,
但希望藏物仍然…剧透警告。我们将讨论某种形式的验证,希望你不会只相信配方,你实际上能够看到人工制品,看到另一端出来的是什么。
老实说,这是两者的结合,我们很多人都希望能够实现快速部署。如果你拿机场做类比,登机口的代理人没有验证你的原因,是关于表现的,对吧?这是安全问题,我怎样才能尽快把东西送上飞机?如何快速将映像部署到Kubernetes集群上?我们不希望每次部署或更新映像时都重新扫描整个映像。
我们想做一些检查,说,“嘿,我是否在合理的政策范围内扫描了这个?”
因为,我周一所知道的与周三所知道的是不同的,但是SBOM仍然是对所构建的内容的静态分析。之后,我用我的食物为例,花生不在汤的物料清单中,但结果是有人发现了使用的设备,前一天正在制作花生酱,他们没有好好清洁。
所以周一他们认为一切正常,周三发现构建系统是在一个特定的构建节点上完成的,前一天还在制作花生酱,所以它被污染了,所以现在发现了一个漏洞,就是这个例子。
所以soms很重要,因为它们告诉你什么进去了,安全扫描结果是你不断更新的东西,发现的新信息,所以这是内容的创造,所以所有的建筑等等。
我们对公证人v2的想法是,我如何分发这些内容?因为我可能会在私有环境中构建,然后把它放在公共注册表上。我可能会把它从公共注册中心拉到我的私有环境中,然后我想一次又一次地推广它,这样我就可以让它通过[dev staging in prod 00:00:12:04]。
我们想要确保你需要验证的所有东西都可以随身携带,并且可以签名,所以这就是我们对公证v2的看法,它真正保护了内容的分发,从它建立到它被推广的时候。
现在,当然,对于Docker文件,你有[from statement 00:12:25],所以在构建中有一点重叠,你想要能够验证你正在构建的映像,在你的from语句中也是来自你信任的映像。
所以我想人们可能会有一个问题,当他们说,我怎么知道我有一个公证人,我的docker文件足够好吗?我怎么才能拿到你说的东西?
是的,所以你的想法是使用公证客户来验证你的签名。我们希望在这个行业里没有15种签约方式,对吧?这就是为什么我们真的在努力得到一个通用的签名格式。所以无论我是从Docker Hub, NVIDIA, Oracle,还是MCR,所有这些公共注册表和软件分销商那里拉东西。我可以使用这样一个客户端:“是的,这是用我已经决定信任的密钥签名的。”
因为这就是我们通过公证人所实现的,是一种工具,一种你可以用来验证签名的工具,来自你信任的实体,因为这是非常重要的部分,对吧?不是说它是签名的,因为坏代码也会签名,而是说它是由你信任的实体签名的,你可能决定我们要用来自微软的根密钥来签名所有微软软件,但可能会有单独的密钥用于官方支持的产品,而不是样本。hth华体会最新官方网站所以你可以说,我相信官方产品,但我不想要可能被生产出来的样品,你想知道样品是hth华体会最新官方网站由微软生产出来的,当你想委托那里的差异时,举个例子,即使是公众消费。
那么,人们在不同的环境中可以做出区别吗?在开发环境中,我可以拉入示例代码,并且我希望确保不会从生产环境中获得绿灯。
没错,这就是你在这个例子中看到的,对吧?运输安全管理局的工作人员相信一堆公共信息,对吧?50个州,很多国家,到44号探员的时候,44号探员说,“我不管你上面有什么,除非你有运输安全管理局探员的标签,否则你不能通过。”
顺便问一下,你曾经这样做过吗?我试着上错了航班,我想那是因为我的登机口换了,我没有注意,我正在接电话,我试图扫描我的登机方式,然后他们就像“哔!”
您不属于这里,您在正确的登台区域,但这不是您应该部署到的正确集群。
顺便说一下,这是修改过的。
是的。
就像,正在发生的事情。
你是不是很高兴你没有搭错飞机,飞错方向。
我很高兴44号探员在调查。
这是其中的一部分,对吧?您希望将其设置为策略,因为……您也将在部署环境中进行验证,但是如果您的部署环境正在验证您所构建的内容,他们已经在那里做了很多验证,那么您想说您的集群已经配置好了。这是高度关键的安全环境。
它必须签名,不只是用ACME密钥,而是ACME安全密钥,如果它来自Docker Hub或Microsoft?还不够好,因为它没有通过你想要的社区内部检查。
所以我很高兴你提出了所有这些政策因为这正是我所想的,机场的类比很有趣,但让我们看看我们实际会部署的一些东西。所以我们有了我们的Wabbit网络,一个小的软件供应商推出了一些东西,没有人真正听说过。它不像微软、Adobe或其他软件公司那么大,当然,你也有自己的传统公司,只是想把事情做好。
他们想要一些[听不清00:16:19]软件并部署它,他们可能会做一些快速的策略管理,这很好,他们说,“嘿,它有钥匙吗?”
好吧,不管怎样,他们部署了。这里有很多细节。一部分原因是他们想要的是安全的环境,对吧?这是潜艇的事。他们想确保环境被封锁,没有公共入口或出口。这是他们在本地时拥有的相同的私有环境,他们只是想在云中运行它。所以我们想要所有这些东西在这种情况下与图像一起传播的原因是,如果它们不这样做,那么政策管理,它现在想要参考系统的材料清单,它是如何进入的,因为它在防火墙之外,扫描结果,或源,或任何你认为重要的东西你想要用图像验证,在你部署它之前。
客户解决这个问题的方法是,他们有一个私人注册表,他们把它放在VNet中可用的环境中,然后他们有一个推广环境,他们这样做,当然他们在重复这个,不仅仅是开发阶段和生产,而是公司内部的不同小组。他们所做的是建立那些内容,那些注册表,但他们不想把相同的公共内容拉到每一个环境中。他们在公司内部建立了另一个登记处,这成为了公司内部每个人都可以从那里得到的共享场所,所以你可以把每个盒子都想象成机场,你有一个中转区。
我看着ACME火箭,我在想,哇,你说的气隙,可能连空气都没有,如果我们把这些东西送入太空,我们担心吗……基本上,我突然想到,嘿,如果我们在这里谈论星际探险,可能也有延迟问题。
所以这不仅仅是要确保你得到了你想要的形象。我想,特别是当我们谈论物联网和其他这样的用例时,其中一些是,我们不能不断地拉动东西,这如何应用?
我喜欢它,我从来没有想过这个问题,气隙真的。没有空气,他们在空间站上运行代码,他们在卫星上运行代码,他们是怎么把代码送到那里的?不仅是穿越海洋的游轮需要昂贵的卫星连接,或者是石油平台,还有真正的物理气隙环境。
这一直都是重点,对吧?我想消费公共内容,但我希望它在我的环境中,因为我需要它的时候。对于包管理器来说,这并不是什么大问题,因为如果我的构建失败了……是的,这真的很糟糕,我必须去修复它,但在某种程度上,这涉及到人类。当我的生产环境需要扩展以进行自我修复时,它不能想知道互联网是否在那里,或者它们是否在月球的阴暗面,对吧?
因此,您需要确保您所依赖的内容尽可能靠近您可用的信任边界。
所以如果我回过头来看大量的资源,它不仅仅是Docker节点,也不仅仅是Wabbit网络,它是NVIDIA,它是Oracle。那里有很多公共注册中心。
所以你可能会从Docker Hub拉一些东西,因为Wabbit网络太小了,所以你决定,“我相信来自Docker Hub的认证内容。,只是举个例子。
所以Docker Hub会在上面加上另一个签名,“这是经过认证的内容。”
因此,如果您信任来自Docker的认证内容,您可以知道,因为它上面有Docker认证签名,因此您不关心作为示例的Wabbit网络签名。
还有一些内容可能是为Spacely Sprockets准备的,但没有经过认证。现在你要把它带到你的环境中,你要在上面盖上ACME火箭的签名,对吗?
这是运输安全管理局的工作人员说"你可以进入我的区域"现在所有东西都必须有ACME火箭的钥匙。然后配置信任策略,对吧?这就是你刚才问的。我会说这些是我信任的来源,我会从我信任的这些来源配置密钥,如果你不在信任列表中,你就无法通过。
现在公司里有人说,“但我喜欢X公司,你能加上这一点吗?”有人会决定,是的,你把这个策略传递给他们,他们配置好了,然后他们也可以进来。
但这些是客户一直在问我们的界限,我如何控制进入的内容并对其进行验证?而且不止一次,对吧?这是每次黛比和她[听不清00:21:29]的最新消息进来时,你要对它进行扫描。您希望对其运行安全扫描,甚至可能进行功能测试验证,因为每次更新都有一些更改。这些变化会让你崩溃吗?这些变化会给你带来某种程度的不安全感吗?所以我们要确保一切都能被检查,尤其是在这个自动化的世界里,一切都在不断更新。
如果Cogswell Cogs被别人收购,我们真的不想消费他们的内容,会发生什么?
正确的。
或者我们对他们改变验证的方式不满意,所以我们不想再包括他们,但我们已经在我们的信任政策中有了他们。改变主意或者撤销,或者你所说的持续信任,是什么样子的?
有几种方法可以做到这一点,对吧?首先,这些东西。让我们举个例子,它是被收购的,而不是;这是六个月前发现的一个漏洞。
在这种情况下,它是由邪恶的代码获得的。你之前得到的软件被恶意代码获取,你还在运行,你不想撤销它,让它失败,因为它昨天还好好的。你的意思是,“我不想让任何新事物进入。”
假设邪恶的密码不会改变密钥,它仍然是用Cogswell Cogs密钥签名的。在这种情况下,你可以说,“我不想要任何来自Cogswell Cogs的更新。”
当你将内容推广到共享的内部注册表中时,你将不再允许conwell Cogs的更新进入。但在这里,在这种环境下,你不仅仅是在查科格斯韦尔·科格斯钥匙,对吧?这是用ACME密钥检查的,因为你在上面盖章,说:“我引入了这个内容,我扫描了它,我现在说这个内容[niche 00:00:23:19]是我的策略,在ACME Rockets环境中。”
所以所有内部的东西都不是在看科格斯韦尔的钥匙,而是在看ACME火箭的钥匙。当你想要信任不同的实体时,你得到了清晰的分离。
这将使整个软件供应链变得更容易分解,如果有什么东西你看着它说,“我们不能再做这个特定的部分了。”
我觉得解开它看起来有点吓人,这让它变得更容易。
是的,这就是为什么推广政策如此重要的原因,因为你可以选择何时以及如何移动你的内容,它给了你改变的机会,这是我们想要的。我们最初只是想从签名容器映像开始,我们意识到分离签名的基础设施非常重要,并且适用于其他事情。
所以如果你想象一下运输安全管理局的工作人员,当你去机场时,他们不让你进入安全区,你站在旁边,“嘿,你好,这是我的护照”,对吧?
如果您考虑如何进行漏洞利用,我有一个能够执行代码的路径,我有一个将代码放入环境的方法,通常这两者必须结合起来。例如,如果我要求Kubernetes部署运行来自错误代码的映像,如果签名绑定到映像中,那么映像必须到节点进行评估,它会将其踢出节点并说,“哦,你是错误的代码,我不相信你。”
但是代码已经存在了。
可能吧,伤害已经造成了。
太迟了,对吧?你在某个地方有一些钩子,在某个地方,嘿,推送事件发生了,发生了一些事情,漏洞就消失了。这是一个非常关键的部分,不仅仅是因为我们想确保你的Helm Charts和kube部署文件,如果你使用摘要或标签,这些不会因为你签署了它们而改变。
所以这是我们没有附加签名的另一个原因,但这也是因为我们想确保我们可以推广内容,但独立验证。
事实证明,我们用于分离签名的基础设施也适用于其他事情。当我们开始这个的时候,我们没有考虑SBOM,只是碰巧你可以在注册表中放入一个SBOM,使它成为附加的参考。你可以输入一个扫描结果,[00:25:50]扫描结果,你可以把它们放到注册表中。
顺便说一下,您可能希望签署您的soms并扫描结果,以便您也可以信任它们。事实证明,分离对象的整个图是非常有价值的,我可以在不同的环境中推广这些内容,并且我也得到了一个很好的生命周期管理。如果我删除了Net Monitor图像,我不需要其他所有的东西,我希望所有的东西都消失。如果你想把东西归档,那就归档吧。但是为不相关的内容提供一个SBOM,这不是很有趣,所以您希望将这些内容放在一起。
您在这里提到了基于OCI分布的注册表,您在谈论注册表中的功能
正确的。
那么,您是否想明确说明注册中心需要具备哪些条件,才能使您所描述的政策变更成为可能?
我们研究的其中一件事是,核心基础设施是什么?无论如何,在云环境或本地环境中,所有客户都已经拥有了一个注册表。
我们如何利用这个基础设施,使您不必再构建另一个存储解决方案?我们考虑的是,好吧,我是否需要建立更多的侧车服务,其他服务,或者我们是否可以扩展我们已经拥有的基础设施?
这就是我们一直在关注的ORAS工件,你可以以真正的本地方式建立这个图,我们真的不想把事情搞得一团糟。这些都是长期投资。我们觉得这是正确的设计,所以我们不只是把东西固定在一个非常脆弱的房子上。
我们会有后备支持,会有很多与此相关的东西,但我们觉得这是一个长期生态系统的开始,我们想要确保正确的设计和基础设施到位。
因此,正是OCI分布注册中心,通过ORAS工件清单支持,为您提供了执行引用类型的能力。
现在我们讨论了位置独立性,对吧?它来自哪里并不重要,它就在这里,它是由我信任的实体签署的吗?这是我们要做的事情的关键。
我们讲过。它们与我们所说的主体伪影有关,它们被提升,你可以做多个签名,所有这些都是。这就是我们刚才讲过的强化,对吧?有多个签名,因为我想信任Docker Hub签名或ACME签名,这是我想信任的,与其他签名无关。
所以当你说签名是可分离的,你能谈谈公证v2是如何防止特洛伊木马攻击的吗?
哦,是的,所以如果你考虑我们支持特洛伊木马防御的方式是。因为签名不是物理耦合的,你不必下载镜像,签名不是容器镜像上的一个层。事实上,我们做公证人的方式,我们不知道也不关心你附上的签名。你刚刚说,我想在注册表中签署另一个东西,它可以是Helm图表,可以是OCI图像,可以是ISEC模块,可以是Wasm。
整个想法是我们想要确保你可以在注册表中签名,当你在注册表中签名时,你会说,“我指着我正在签名的东西是什么?”
这里有一个指针,然后签名本身有编码说,不仅是指针,而且如果我看那个容器图像的细节,那就是signed有效载荷中的内容
你可以提取签名,引用,反向引用也是非常重要的,当你。你的部署图说。Net monitor V1,也许它为。Net monitor V1放了一个摘要,这就是你的部署脚本说的。
您的部署脚本没有什么特别的东西说,“这就是签名所在的位置。”
因此,ORAS工件工作有一个反向查找的概念,它说,“参考网络模型V1图像的东西是什么?”
公证客户将验证公证签名,这样就有了基础设施,我想根据我正在部署的东西查找签名,我可以得到签名,我可以得到soms,我可以得到扫描结果,对吧?你只是问我想要返回的引用类型是什么,那是分离的签名验证,或分离的SBOM验证。
我在想,当人们将工件部署到他们的环境中时,他们想知道工件是他们所期望的,他们也想知道没有任何东西被干扰,然后我猜你之前提到的,如果我们认为某些东西很好,然后我们发现它没有以前那么好怎么办?我们如何确保我们以后不会经历巨大的悲伤?
听着,这里没有什么是完美的解决方案,对吧?
在单子上签字并不能保证你以后会发现配料里没有花生,但事实是,他们没有很好地清洗。
当我们使用我们构建的好包时,我们认为一切都很好,SBOM签名不会改变这一点,事实上,如果你看看SolarWinds,它是由公司签名的,所以他们知道没有人在中间攻击,帮助他们快速识别,回去,这是一个构建系统问题。
这就是签名表明它是由信任实体建立的地方,它被部署和验证,然后在周一,当我认为没问题的时候,周三,我发现了一个问题,这就是安全扫描的地方,对吧?
安全扫描将会不断地寻找,不断地学习东西,如果他们发现一个特定的包是污染的周三,然后所有他们需要知道什么是包id,包括是谁签署的,现在其他的安全系统,你在您的生产节点上运行的过程,你的注册中心,不断运行说,“哦,我只是知道东西是用这个包,实际上是坏。”
你在注册表中的东西,就是从其中一个来源建立的。公证不能解决这个问题,没有签名解决方案。这时,安全扫描仪就会回来,说它们提供了另一层的安全保护。
让我们进入一个演示,我们要在这个演示中展示的是。我把钥匙放在钥匙库中。它是我公司使用的密钥,是我为内容签名的私钥,它甚至可能是我信任的公钥,记住,因为我们不想从公众那里获取公钥。我们希望私下存储它们,以确保我可以验证我想要的策略,我不想依赖于公共资源。
所以你把所有的钥匙都放在你今天使用的钥匙库里。我们不会取代他们。我们要确保
不管你选择的钥匙库是什么。
不管你用什么,我们都有Azure密钥库。会有AWS密钥库,会有HashiCorp密钥库,不管你用什么密钥库,你都没问题。
然后我们将使用CLI符号进行签名我们支持远程签名,因为你不想把你锁在保险库中的私钥,带到你的构建环境中,进行签名然后让一些代码窃取你的私钥,现在每个人都在用你的密钥签名。
我们希望将内容发送到远程密钥库中进行签名,这是标准做法。一旦东西签名了,我们会将它存储在注册表中,我们会将图像存储在注册表中,你可以对图像签名,你可以在你的构建环境中创建SBOM,你会对SBOM签名,你可能有一个扫描结果,你会对扫描结果签名并且知道那些结果是由你信任的策略创建的,现在注册表成为了所有你需要的东西的中心位置。
那可以是你选择使用的任何注册表?
是的。
所以现在我想部署到我的Kubernetes集群。Kubernetes集群不一定被锁定在注册表上,这可能是一个很好的策略,但你可能想要……所以你想说你的Kubernetes集群不一定被锁定在注册表上,但它被锁定在由你信任的实体签名的东西上。
我不知道你是怎么进入机场的集结区的,但你必须有签名才能登机。Kubernetes集群说:“我不管它是护照还是其他什么东西,除非你有ACME Rockets密钥,否则你不能进入集群。”
它可能是一个特定的ACME火箭的钥匙,对吧?可能是高安全环境和普通环境。
我们用Gatekeeper实现这个,好名字,对吧?它是看门人,除非你符合某些要求,否则你是不允许进去的。现在我们想要验证公证人的签名。你可能想要验证一些东西,可能是一组签名,可能是一个SBOM或其他东西。
我们有一个批准项目,它插入Gatekeeper来做这些验证,现在我可以在我的集群上设置一个策略,它可能来自一个或10个不同的注册中心,只要它是由你信任的实体签名的,那么你就可以进入,否则你就不能。
当你在验证的时候,你不仅仅是在验证你的签名是按照你想要的方式设置的,你也在验证那些公开的签名?
你想验证什么就验证什么,对吧?这是政策的一部分。当你将内容导入公司内部的共享注册表时,你会给它一个列表,这是结束签名,我信任的结束密钥,可能是Wabbit networks,可能是Docker Hub,但不是Cogswell Cogs,我们决定不再喜欢它们了。所以我们不再允许这些密钥了,所以这就是你通过策略进行的验证,当它到达你的生产Kubernetes集群时,你唯一信任的是ACME prod,它必须用ACME prod密钥签名。
verify是一种验证你给它的密钥列表的方式,然后那个策略由verify和Gatekeeper通过那个verify插件强制执行。
在特定环境的基础上呢?
对,没错
根据需要。
对,生产A可能需要某些东西,生产B可能需要不同的东西。戴夫:你可能会对允许进入的东西更宽松一些,所以这是你制定的特定环境政策。
我要做的是,为了展示我们没有什么可做的,我们基本上要取一个Kubernetes实例并创建一个命名空间。我们要部署一个公共形象,正好来自MCR我要将它部署到那个自由区命名空间,对吧?
所以事情会顺利进行,因为我们还没有制定任何政策,我们可以看到自由区在那里运行。
所以我看到了一个看门人,我已经看到了看门人的东西,这是来自政策,还是来自哪里?
我这里得到的基本上只是一个Kubernetes实例设置了Gatekeeper,实际上还没有配置公证人或批准。
这只是基线基础设施,所以现在我想用我们公司内部的密钥签名和验证,所以我想做的是,我们将为我想要创建的密钥创建一个策略,作为此流程的一部分。我已经有了一组配置,这就是如何在密钥库中为特定证书设置策略。
如果您已经有一个CA颁发的证书,我们的很多大客户都有,您可以使用您的CA,对吗?有多种方法可以做到这一点,我们只依赖X.509证书,我们相信这是客户告诉我们他们的生产环境所需要的。
有了密钥库中的那个密钥,不管是我创建的,还是我使用我已经在密钥库中的那个,我都想取出密钥id,这是将它存储在Azure密钥库中的引用。
然后我想配置Notation二进制文件,这就是我们讨论过的策略,我想告诉Notation,将Wabbit网络密钥添加到您的验证列表中,我们也会添加证书,因为这是它的公共和私人部分[听不清00:38:57]。
现在Notation知道如何签名和验证Wabbit网络密钥,但如果我看这个,因为我们用Azure密钥库插件配置了它,你看到的是,这是通往Azure密钥库的路径,它是通过Azure密钥库插件实现的。
我们觉得这真的非常重要,即使对我们来说,我们是Notary的维护者,我们想要确保Azure可以在没有任何依赖于符号维护者的情况下更新它的插件,如果其他云或供应商想要构建一个插件,他们不应该来Notary项目并检查他们的代码,为初始化或任何服务事件。所以我们建立了一个非常清晰的插件功能,这样他们就可以完全自助服务。
这听起来也很有用对于那些处于更机密的环境或者只是开发环境的人来说,X公司内部的秘密项目,他们不一定想把他们正在做的任何事情泄露到公共互联网上,所以这是一个插件的功能,在那里他们可以拥有它,完全关起门来。
我们,Notation项目永远不会知道这些密钥库提供商,是故意的,对吧?只要我们有适当的可扩展性,它们就可以插入,那么我们就不必为此做任何事情,对吧?我说的我们是指项目维护者。
现在我希望能够配置批准,让它知道,我应该信任哪些密钥才能允许部署?
所以我要在这里稍微摸索一下,我们要让这个体验更好一点。我要做的是询问密钥库,这里是Azure密钥库,我使用Azure CLI将公钥下载到文件笔中,然后将其导出到环境变量。
现在我得到了可用的公钥。让我们创建一个我们要保护的名称空间。我有一个demo命名空间,我要用那个密钥安装approve,来保护demo命名空间。
所以现在,我没有访问权限。如果我应用约束,我会看到这里的约束,如果我显示。你会注意到这里有一个拒绝约束,对于任何不匹配我们为demo命名空间设置的策略,对于demo命名空间中的pods,这就是我们保护环境的方式。
现在我有了这个策略,让我们看看是否可以运行相同的公共形象。
没有,对吧?我们制定了一个政策,除非由我们信任的实体签署,否则它不能被部署,所以失败是故意的,所以这很好
按预期失败。
按预期失败。现在我们来建立一个映像,这样我们就可以建立,签署,部署一些我们信任的东西。在这种情况下,我只是使用ACR任务在Azure中进行远程构建,并将内容流式传输到客户端。
所以我在做构建;Wabbit网络,Azure Services IO, Netmonitor V1…
那太好了,我可能会对它做一个安全扫描,不管我认为那是门,在我签名之前。然后我决定,“很好,现在让我签名吧。”
现在,如果我仔细看这里,发生的事情是我说,符号符号,我给了它一个密钥名,这是兔子网络的IO,对吧?这是我们添加的条目,但是如果你还记得我们配置Notation的时候,我说过密钥在key Vault中是关闭的,所以私钥不在这台机器上。
上面写着:“嘿,钥匙库,你能在这张图片上签名吗?用你手里的钥匙?”所有这些都发生在那个细节里。
现在,如果我尝试让Kube控件运行这个映像,它会正常工作,因为它用我信任的密钥签名。
很好,演示很顺利,因为它成功了?失败是故意的,工作也是故意的,对吧?
我们使注册中心能够理解内容图。我们希望能够把容器映像放进去,把签名作为分离引用,我们希望能够把SBOM作为分离引用,因为事实证明这种能力是普遍适用的,我们希望能够把SBOM的分离引用签名为图像的分离引用。
然后就像文件系统的建立一样,windows和Linux文件系统不知道所有不同的文件类型,这里有一个核心基础设施。你可以把东西保存在上面,我们在这里做同样的事情。
注册中心不需要知道它是签名、SBOM还是其他东西,它只是存储它,有一段数据表明它是工件类型,因此您可以确定这是SBOM、容器映像还是签名,因为这很重要。
你想让你的安全扫描器知道,当它们扫描容器图像时,相对于Helm图和Wasm,它们会以不同的方式看待它们,这就是这条数据的意义所在。
因此,所有这些都已设置好,并通过ORAS工件包启用,从而启用了此附加功能。
您在这里有一个工件包的链接,那么它本身是一个开源项目吗?如果有人认为,“哦,我希望工件效果以不同的方式运行,我希望规范以不同的方式进行澄清。”
绝对的。
这个社区是什么样的?
所以ORAS项目作为一个整体,OCI注册表作为存储,是一个CNCF项目,所以所有这些都在那里,我们接受贡献,你可以实现它,你可以添加…制作pr,无论它对你有意义。
它是CNCF下的一个完全开源的项目。所以这些是我们用来组合的项目列表,我们觉得重要的是不要把所有的东西都捆绑在一起,让它们分开,因为它们往往有更普遍的适用性。公证人v2是关于签名的,为了将分离的签名放入注册表,我们需要一种长期可扩展的方式来实现这一点。OCI构件是你如何在注册表中存储任何东西,ORAS构件是你如何知道有引用,这样你就可以管理它们的生命周期,我们实际上有理由去管理注册表中的内容。
然后是ORAS CLI实现,ORAS Go库,你可以在你的CLI中实现ORAS功能,我们想确保你可以…你不需要打破shell来做ORAS CLI,事实上,符号库使用ORAS Go库来实现注册表功能。
这是我们有引用类型的发行的实现,你可以独立运行这个,这是我们早期使用的。现在我们有了Azure,有了对ORAS工件的支持,zot项目也有对ORAS工件的支持。AWS和Docker都致力于支持ORAS构件,所以现在您开始看到注册中心开始实现这种丰富的功能。
然后批准是我们最新添加的关于我们如何能够有意义地验证所有这些不同的工件类型的东西,比如;无论是公证、REST验证还是其他验证。
这里有很多东西,我们正在努力……最终的结果是,我们希望确保它易于使用。因此,多个项目的目标是使广泛的东西具有适当的可用性水平,这是另一个反馈的好地方,所以如果你发现它太复杂了,这也是很好的。
谢谢!
