跳至主要内容

使用 Kubernetes 准入控制器强制执行工件证明

使用准入控制器在 Kubernetes 集群中强制执行工件证明。

关于 Kubernetes 准入控制器

工件证明 使您能够为构建的软件创建不可伪造的来源和完整性保证。反过来,使用您软件的人员可以验证软件的构建位置和方式。

Kubernetes 准入控制器是管理 Kubernetes API 服务器行为的插件。它们通常用于在 Kubernetes 集群中实施安全策略和最佳实践。

使用开源的 Sigstore 策略控制器 项目,您可以将准入控制器添加到 Kubernetes 集群中,以强制执行工件证明。这样,您可以确保只有具有有效证明的工件才能部署。

安装控制器,我们提供了两个 Helm Chart:一个用于部署 Sigstore 策略控制器,另一个用于加载 GitHub 信任根和默认策略。

关于信任根和策略

Sigstore 策略控制器主要通过信任根和策略进行配置,它们由自定义资源 TrustRootClusterImagePolicy 表示。TrustRoot 表示用于验证声明的公钥材料的可信分发渠道。ClusterImagePolicy 表示用于对镜像上的声明进行强制执行的策略。

TrustRoot 也可能包含一个TUF 存储库根,使您的集群能够持续安全地接收其可信公钥材料的更新。如果未指定,ClusterImagePolicy 将默认使用开源 Sigstore 公共实例的密钥材料。在验证为私有存储库生成的声明时,ClusterImagePolicy 必须引用 GitHub TrustRoot

Kubernetes 准入控制器入门

要设置用于强制执行 GitHub 工件声明的准入控制器,您需要

  1. 部署 Sigstore 策略控制器.
  2. 将 GitHub TrustRootClusterImagePolicy 添加到您的集群.
  3. 在您的命名空间中启用策略.

部署 Sigstore 策略控制器

我们将 Sigstore 策略控制器打包为GitHub 分发的 Helm Chart。在开始之前,请确保您具备以下先决条件

  • 版本 1.27 或更高版本的 Kubernetes 集群
  • Helm 3.0 或更高版本
  • kubectl

首先,安装部署 Sigstore 策略控制器的 Helm Chart

Bash
helm upgrade policy-controller --install --atomic \
  --create-namespace --namespace artifact-attestations \
  oci://ghcr.io/github/artifact-attestations-helm-charts/policy-controller \
  --version v0.10.0-github8

这会将策略控制器安装到 artifact-attestations 命名空间中。此时,尚未配置任何策略,它不会强制执行任何声明。

添加 GitHub TrustRootClusterImagePolicy

部署策略控制器后,您需要将 GitHub TrustRootClusterImagePolicy 添加到您的集群中。使用我们提供的 Helm Chart 执行此操作。确保将 MY-ORGANIZATION 替换为您的 GitHub 组织名称(例如,githuboctocat-inc)。

Bash
helm upgrade trust-policies --install --atomic \
 --namespace artifact-attestations \
 oci://ghcr.io/github/artifact-attestations-helm-charts/trust-policies \
 --version v0.6.1 \
 --set policy.enabled=true \
 --set policy.organization=MY-ORGANIZATION

您现在已将 GitHub 信任根和工件声明策略安装到您的集群中。此策略将拒绝未源自您的 GitHub 组织内的工件。

在您的命名空间中启用策略

警告

除非您指定此策略应应用于哪些命名空间,否则不会强制执行此策略。

集群中的每个命名空间都可以独立强制执行策略。要在命名空间中启用强制执行,您可以向命名空间添加以下标签

metadata:
  labels:
    policy.sigstore.dev/include: "true"

添加标签后,GitHub 工件声明策略将在命名空间中强制执行。

或者,您可以运行

Bash
kubectl label namespace MY-NAMESPACE policy.sigstore.dev/include=true

匹配镜像

默认情况下,使用 trust-policies Helm Chart 安装的策略将在将镜像接纳到集群之前验证所有镜像的声明。如果您只想对一部分镜像强制执行声明,则可以使用 Helm 值 policy.imagespolicy.exemptImages 指定要匹配的镜像列表。这些值可以设置为与镜像名称匹配的 glob 模式列表。globbing 语法使用 Go filepath 语义,并添加 ** 以匹配任何字符序列,包括斜杠。

例如,要对与模式 ghcr.io/MY-ORGANIZATION/* 匹配的镜像强制执行声明,并接纳没有有效声明的 busybox,您可以运行

Bash
helm upgrade trust-policies --install --atomic \
 --namespace artifact-attestations \
 oci://ghcr.io/github/artifact-attestations-helm-charts/trust-policies \
 --version v0.6.1 \
 --set policy.enabled=true \
 --set policy.organization=MY-ORGANIZATION \
 --set-json 'policy.exemptImages=["index.docker.io/library/busybox**"]' \
 --set-json 'policy.images=["ghcr.io/MY-ORGANIZATION/**"]'

所有模式都必须使用完全限定名称,即使镜像源自 Docker Hub 也是如此。在此示例中,如果我们要排除 busybox 镜像,则必须提供包含域和双星号 glob 的完整名称以匹配所有镜像版本:index.docker.io/library/busybox**

请注意,您打算接纳的任何镜像都必须policy.images 列表中具有匹配的 glob 模式。如果镜像与任何模式都不匹配,则将被拒绝。此外,如果镜像同时匹配 policy.imagespolicy.exemptImages,则将被拒绝。

高级用法

要查看您可以使用 Helm Chart 配置的完整选项集,您可以运行以下命令之一。对于策略控制器选项

Bash
helm show values oci://ghcr.io/github/artifact-attestations-helm-charts/policy-controller --version v0.10.0-github8

对于信任策略选项

Bash
helm show values oci://ghcr.io/github/artifact-attestations-helm-charts/trust-policies --version v0.6.1

有关 Sigstore 策略控制器的更多信息,请参阅Sigstore 策略控制器文档