Skip to main content

使用 Kubernetes 准入控制器强制实施项目证明

使用准入控制器在 Kubernetes 群集中强制实施项目证明。

注意

在继续操作之前,请确保已为容器映像启用生成证明,包括在 attest-build-provenance 操作中设置 push-to-registry 属性,如“生成容器映像的生成证明”中所述。 这是策略控制器验证证明所必需的。

Kubernetes 准入控制器入门

若要设置准入控制器以强制实施 GitHub 项目证明,需要:

  1. 部署 Sigstore Policy Controller
  2. 将 GitHub TrustRootClusterImagePolicy 添加到群集
  3. 在命名空间中启用策略

部署 Sigstore Policy Controller

我们已将 Sigstore Policy Controller 打包为 GitHub 分布式 Helm 图表。 开始之前,请确保具备以下先决条件:

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

首先,安装部署 Sigstore Policy Controller 的 Helm 图表:

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

这会将 Policy Controller 安装到 artifact-attestations 命名空间中。 目前,尚未配置任何策略,也不会强制实施任何证明。

添加 GitHub TrustRootClusterImagePolicy

部署策略控制器后,需要将 GitHub TrustRootClusterImagePolicy 添加到群集。 使用我们提供的 Helm 图表来完成此操作。 确保将 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.2 \
 --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

匹配的图像

默认情况下,在允许图像进入群集之前,随 Helm 图表一起 trust-policies 安装的策略会验证所有图像的证明。 如果只想对图像子集强制执行证明,则可以使用 Helm 值 policy.imagespolicy.exemptImages 来指定作为匹配标准的图像列表。 这些值可以设置为一个与图像名称匹配的 glob 模式列表。 Glob 语法使用 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.2 \
 --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 中心,所有模式也必须使用完全限定的名称。 在此示例中,如果要豁免映像 busybox,则必须提供完整名称(包括域名和双星号 glob)以匹配所有映像版本:index.docker.io/library/busybox**

请注意,要接受的任何图像都必须在 policy.images 列表中具有匹配的 glob 模式。__ 如果图像与任何模式都不匹配,则将被拒绝。 此外,如果映像同时与 policy.imagespolicy.exemptImages 匹配,将会被拒绝。

高级用法

若要查看可以使用 Helm 图表配置的完整选项集,可以运行以下任一命令。 对于策略控制器选项:

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

对于信任策略选项:

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

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