暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何集成 Istio 和 SPIRE 以实现安全的工作负载身份

原创 Ellison 2023-12-21
549

了解如何为 Kubernetes 工作负载颁发和证明从 SPIRE 到 Istio sidecar 的身份证书。

默认情况下,Istio 为网格中运行的工作负载提供强身份。

Istio 控制平面 (Istiod) 和 Istio 代理(在 Envoy 代理容器内的每个 pod 上运行)协同工作,对 X.509 证书进行签名、分发和轮换到工作负载(见图 A)。

无花果。A – Istio 证书和身份机制

当 Istio 拥有如此强大的证书和身份机制时,为什么 DevSecOps 人员应该研究 Istio-SPIRE 集成?

让我们看看原因,然后我将向您展示一个简单的演示,其中两个工作负载使用 SPIFFE ID 相互进行身份验证。

但在继续之前,如果您是新手或想更新您的理解,请阅读 SPIFFE 和 SPIRE 的介绍:SPIFFE/SPIRE:简介。

为什么 Istio-SPIRE 对 Kubernetes 工作负载有意义

SPIRE 是 SPIFFE 标准的生产就绪实现,可为部署在异构环境中的工作负载提供标识。

将 SPIRE 等专用身份机制与 Istio 结合使用,具有灵活性、可扩展性和增加深度防御粒度的优势。

  • 虽然 Istio 主要使用基于 Kubernetes 元数据的属性,如命名空间、服务帐户和标签,但 SPIRE 工作负载身份验证的范围超出了它们。使用 SPIRE,DevSecOps 可以根据以下属性等设置精细标识:
    • 节点特性 – 主机、硬件
    • 环境元数据 – 云提供商、区域、网络配置
    • 特定于供应商的标签 – AWS 中的实例类型或实例 ID
  • 无论工作负载部署在何处,SPIRE 都会提供工作负载标识。通过在 VM 中部署 Istio sidecar 和 SPIRE 代理,它可以轻松安全地向网格中的服务验证 VM 工作负载。
  • SPIRE 允许信任域之间的联盟。例如,假设您有几个聚类,每个聚类具有不同的值。当您想要安全地验证来自具有不同值的集群的工作负载时,Istio 根 CA 可能无法颁发证书。在这里,DevSecOps 可以使用 Istio-SPIRE,因为 SPIRE 可以使用信任捆绑包在信任域之间建立信任和联合通信。trustDomaintrustDomain

当您在网格中运行 SPIRE 代理和服务器时,证书和私钥分发流程如下所示:


Istio-SPIRE 证书和私钥分发流程

请注意,SPIRE 代理在每个节点上作为守护程序运行。SPIRE 服务器可以位于同一节点或不同节点中,也可以完全位于不同的集群中。

现在让我们看看如何使用 Istio 实现 SPIRE,并使用 SPIRE 控制管理器为网格中的工作负载发布身份。

Istio-SPIRE:先决条件

有两种方法可以在 SPIRE 服务器中注册工作负载:手动和自动。

我使用自动方法,将 SPIRE 控制管理器与 SPIRE 服务器一起部署,该服务器会自动为每个与 ClusterSPIFFEID 自定义资源中定义的选择器匹配的新 pod 注册新条目。

我在本地使用单个集群、2 节点设置,并在每个节点中部署一个服务。这是它最终的样子:

Kubernetes 集群中的 spire 服务器和代理

要执行此演示,您只需要 Istioctl 和 Kubectl 命令行工具。您可以在此处查看用于演示的 YAML。

Steps to Integrate SPIRE With Istio

  • Step #1: Install SPIRE to Kubernetes
  • 步骤 #2:申请为工作负载生成证书ClusterSPIFFEID
  • 步骤#3:安装自定义Istio
  • 步骤 #4:将工作负载部署到支持 Istio 的命名空间中
  • 步骤#5:启动Pod之间的通信

在开始之前,请确保集群中安装 Istio。SPIRE 服务器必须在 Istio 之前部署在集群中,以便 Istio 入口网关可以从 SPIRE 服务器获取其证书。有关更多详细信息,请查看下面的步骤#3。


步骤#1:将SPIRE安装到Kubernetes

应用 spire-quickstart.yaml 安装 SPIRE。该配置包含安装 SPIRE 所需的一切。它包括命名空间、SPIRE 服务器和代理、群集角色配置、用于验证群集的 Webhook 和 SPIRE 控制管理器的定义。

默认情况下,该配置随 Istio 一起提供,您可以在 中找到它。应用它来在集群中安装 SPIRE:/istio-(your_version)/samples/security/spire





1

kubectl apply -f spire-quickstart.yaml



如上所述,我在本地使用 2 节点设置。这意味着每个节点上都有一个 SPIRE 代理,并且它们与之通信的 SPIRE 服务器。您可以使用以下命令查看命名空间中的部署:spire





1

kubectl get all -n spire




SPIRE 代理 pod house 、spiffe-csi-driver 和 containers,而 SPIRE 服务器 pod 有 和 在其中。spire-agentnode-driver-registrarspire-serverspire-control-manager

步骤 #2:应用 ClusterSPIFFEID 为工作负载生成证书

应用 cluster-spiffe-id.yaml(如下所示)以通过 SPIRE 控制管理器为工作负载生成证书。

YAML的






1

apiVersion: spire.spiffe.io/v1alpha1

2

kind: ClusterSPIFFEID

3

metadata:

4

  name: spiffe-id

5

spec:

6

  spiffeIDTemplate: "spiffe://{{ .TrustDomain }}/ns/{{ .PodMeta.Namespace }}/sa/{{ .PodSpec.ServiceAccountName }}"

7

  podSelector:

8

    matchLabels:

9

      spiffe.io/spire-managed-identity: "true"



在 yaml 中,我们提供了一个匹配项,即每当 Pod 带有标签时,spiffe.io/spire-managed-identity: “true”SPIRE 控制管理器就会为该工作负载提供 SPIFFE ID。您还可以设置自定义 .我在这里使用了默认的。应用 yaml:spiffeIDTemplate





1

kubectl apply -f cluster-spiffe-id.yaml



步骤#3:安装自定义Istio

由于我们希望 Istio Ingress Gateway 从 SPIRE 控制管理器获取证书,因此我们在 custom-istio.yaml 中用上述步骤中使用的标签 — — 进行注释。我用来部署:ingressGatewaysspiffe.io/spire-managed-identity: “true”istioctlcustom-istio.yaml





1

istioctl install --skip-confirmation -f custom-istio.yaml



要验证 Istio Ingress Gateway 是否已向 SPIRE 注册, 请进入 SPIRE 服务器 pod 内的 SPIRE 服务器容器并检查条目:exec






1

kubectl exec -t spire-server-d456d6b54-q9b5g -n spire -c spire-server -- ./bin/spire-server entry show



您可以在 SPIRE 服务器中查看该条目及其 SPIFFE ID。istio-ingressgateway-service-account

步骤 #4:将工作负载部署到支持 Istio 的命名空间中

我正在将两个服务和 部署到启用 istio 注入的命名空间中。我已经用 的匹配标签注释了这两个服务,就像我在步骤 #3 中所做的那样,以便 SPIRE 控制管理器为它们生成工作负载标识。echoserver-servicesleepns1clusterSPIFFEID

此外,我还对这两个服务进行了注释,因为它们需要 SPIFFE CSI 驱动程序卷来访问正在部署的相应代理套接字。SPIRE 注入模板在 custom-istio.yaml 中定义。inject.istio.io/templates: “sidecar, spire”

注意:SPIRE 代理使用 SPIFFE CSI 驱动程序在 pod 中注入 Unix 域套接字,以便 Envoy 代理可以从 SPIRE 获取身份。您可以向 CSI 驱动程序添加卷,而不是注释服务。但是,正如我上面所示,注释是更简单的入门方法。

让我们部署包含上述配置的 workload.yaml





1

kubectl apply -f workload.yaml



我们可以看到工作负载运行良好。现在让我们验证工作负载是否收到了 SPIFFE ID,就像我们在步骤 #3 中验证 Istio Ingress Gateway 一样。跑:






1

kubectl exec -t spire-server-d456d6b54-q9b5g -n spire -c spire-server -- ./bin/spire-server entry show



您可以看到 SPIRE 服务器注册表中分别有三个条目分别用于 Istio Ingress Gateway、Echo 服务和 Sleep 服务。

步骤#5:启动Pod之间的通信并验证SPIRE身份验证

使用以下命令进入 pod 并:execsleepcurlechoserver-service






1

kubectl exec deploy/sleep-depl-ns1 -n ns1 -- curl -s http://echoserver-service-ns1.ns1.svc.cluster.local



如果连接成功,除其他信息外,它将返回 Envoy 集群详细信息和客户端证书,该证书是一个 SPIFFE ID,后跟一个哈希值(见下图)。

与 Istio-SPIRE 集成的零信任网络

SPIRE 通过为工作负载颁发和证明身份,为零信任网络奠定了基础。

Istio-SPIRE 集成使 SPIRE 成为网格中运行的服务的身份提供者。它为 DevSecOps 人员提供了灵活性,允许他们根据精细属性和信任域的联合来设置身份。

尝试一下,看看它是如何工作的。

文章转载自Ellison,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论