Skip to main content

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

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

关于 Kubernetes 准入控制器

项目证明使你能够为自己构建的软件创建不可伪造的来源和完整性保证。 反过来,使用软件的人员可以验证软件是在哪里以及如何构建的。

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

使用开放源代码 Sigstore Policy Controller 项目,可以将准入控制器添加到可以强制实施项目证明的 Kubernetes 群集。 通过这种方式,可以确保只能部署具有有效证明的项目。

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

关于信任根和策略

Sigstore Policy Controller 主要配置了信任根和策略,由自定义资源 TrustRootClusterImagePolicy 表示。 TrustRoot 表示用于验证证明的公钥材料的受信任分发渠道。 ClusterImagePolicy 表示用于对映像强制实施证明的策略。

TrustRoot 可能还包含 TUF 存储库根路径,使群集能够持续安全地接收对其受信任公钥材料的更新。 如果未指定,则默认情况下,ClusterImagePolicy 将使用开放源代码 Sigstore Public Good Instance 的密钥材料。 验证为专用存储库生成的证明时,ClusterImagePolicy 必须引用 GitHub TrustRoot

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.10.0-github9

这会将 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 组织的项目。

在命名空间中启用策略

Warning

在指定应将此策略应用于哪些命名空间之前,不会强制实施此策略。

群集中的每个命名空间都可以独立地强制实施策略。 若要在命名空间中启用强制措施,可以将以下标签添加到命名空间:

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 匹配,将会被拒绝。

如果 GitHub Enterprise 帐户在 GHE.com 上具有子域,必须为 GitHub 信任域指​​定一个值。 此值用于获取与托管 GitHub Enterprise 帐户的数据驻留区域相关联的可信材料。 可以通过使用 gh CLI 工具登录到企业帐户并运行以下命令来找到该值:

Bash
gh api meta --jq .domains.artifact_attestations.trust_domain

安装 trust-policies 图表时必须添加此值,如下所示:

Bash
--set-json 'policy.trust.githubTrustDomain="YOUR-GHEC-TRUST-DOMAIN"'

高级用法

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

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

对于信任策略选项:

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

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