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