使用 REST API 配置政策

本页面介绍了如何使用 REST API 在命令行中配置 Binary Authorization 政策。作为替代方案,您还可以使用命令行中的 gcloud 命令或使用 Google Cloud Console 执行这些任务。这个步骤是设置 Binary Authorization 的一部分。

概览

政策是一组规则,用于管理一个或多个容器映像的部署。

使用 REST API 配置政策时,您需要以 JSON 格式填充值,它们的结构与 gcloud 与该服务的交互中所用的 YAML 结构相同。如需了解详情,请参阅 YAML 格式政策参考文档

配置政策时,您需要执行以下操作:

  • 导出 JSON 格式的政策文件
  • 添加任何其他豁免映像(可选)
  • 设置默认规则
  • 添加任何针对集群的规则(可选)
  • 导入 JSON 格式的政策文件

大多数实际政策都会进行检查,了解是否所有必需的证明者都已验证容器映像已准备好进行部署。在这种情况下,您还必须在配置政策时创建证明者

设置默认项目

设置默认 Google Cloud 项目(如果尚未设置):

PROJECT_ID=PROJECT_ID
gcloud config set project ${PROJECT_ID}

其中,PROJECT_ID 是项目 ID。

导出政策

将政策导出为本地系统上的 JSON 文件:

curl \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "x-goog-user-project: ${PROJECT_ID}" \
    "https://binaryauthorization.googleapis.com/v1/projects/${PROJECT_ID}/policy" \
    -o "/tmp/policy.json"

默认情况下,该文件包含以下内容:

{
  "name": "projects/PROJECT_ID/policy",
  "admissionWhitelistPatterns": [
    {
      "namePattern": "gcr.io/google_containers/*"
    },
    {
      "namePattern": "gcr.io/google-containers/*"
    },
    {
      "namePattern": "k8s.gcr.io/*"
    },
    {
      "namePattern": "gcr.io/stackdriver-agents/*"
    }
  ],
  "globalPolicyEvaluationMode": "ENABLE",
  "defaultAdmissionRule": {
    "evaluationMode": "ALWAYS_ALLOW",
    "enforcementMode": "ENFORCED_BLOCK_AND_AUDIT_LOG"
  }
}

管理豁免映像

豁免映像是一种无需遵守政策规则的容器映像。Binary Authorization 始终允许部署豁免映像。

每个政策都有一个由注册表路径指定的豁免映像许可名单。此路径可以是 Container Registry 中或另一个容器映像注册表中的位置。如果启用,此许可名单不包括那些由全局政策评估模式豁免的映像。

如需添加豁免映像,请在 JSON 格式的政策文件中的 admissionWhitelistPatterns 列表下添加一个 namePattern 节点:

{
  "name": "projects/PROJECT_ID/policy",
  "admissionWhitelistPatterns": [
    {
      "namePattern": "MATCHING_PATTERN"
    }
  ],
  ...
}

其中,MATCHING_PATTERN 是指向完全匹配的单个映像的路径,或者是指向与使用通配符符号 (*) 的模式匹配的任何映像的路径。

全局政策评估模式

全局政策评估模式这种政策设置会使 Binary Authorization 先评估全局政策,然后再评估用户配置的政策。全局政策由 Google 提供,Binary Authorization 不会对 Google 维护的一系列系统映像进行进一步政策评估。启用此设置后,Google Kubernetes Engine (GKE) 所需的映像不会因政策强制执行而被阻止。全局政策会在用户政策之外进行评估。

您可以在命令行中使用以下命令查看全局政策的内容:

gcloud container binauthz policy export --project=binauthz-global-policy

借助全局政策评估模式,您就不必在许可名单中明确指定指向 Google 维护的系统映像的路径。此模式在默认情况下处于停用状态。

如需启用全局政策评估模式,请将以下顶级节点添加到 JSON 格式的政策文件中:

"globalPolicyEvaluationMode": "ENABLE"

如需停用全局政策评估模式,请添加以下代码:

"globalPolicyEvaluationMode": "DISABLE"

设置默认规则

规则是政策的一部分,用于规定容器映像必须满足哪些限制条件才能部署。每个准入请求都有一个关联的 GKE 集群。如果请求与针对集群的规则不匹配,则使用默认规则。

默认规则在政策的 defaultAdmissionRule 节点中指定。如需详细了解此规则的各个部分,请参阅 YAML 格式政策参考文档中的 ADMISSION_RULE如需查看默认规则的示例,请参阅示例政策

如需设置默认规则,请根据需要修改 JSON 格式的政策文件中的 defaultAdmissionRule 节点:

  "defaultAdmissionRule": {
    "evaluationMode": "EVAL_MODE",
    "enforcementMode": "ENFORCEMENT_MODE"
    requireAttestationsBy: [
      ATTESTOR,
      ...
    ]
  }

其中:

  • EVAL_MODE 用于指定在允许部署某个容器映像之前 Binary Authorization 评估的限制条件类型。
  • ENFORCEMENT_MODE 用于指定在容器映像不符合该规则中定义的限制条件时执行的操作。
  • ATTESTOR 用于指定必须由哪些证明者(如果需要)先对容器映像签名,然后才能进行部署。使用指向证明者的完全限定路径,格式为 projects/PROJECT_ID/attestors/ATTESTOR_NAME

如果您的规则需要进行检查,了解是否所有必需的证明者都已对容器映像签名,您必须先创建证明者,然后再完成此步骤。

设置针对集群的规则(可选)

一个集群还可以有一条或多条针对集群的规则。这种类型的规则只适用于指定的 GKE 集群。如果集群没有自己的规则,则使用默认规则。针对集群的规则是政策的可选部分。

针对集群的规则在 JSON 格式的政策文件内的 clusterAdmissionRules 节点中定义。如需详细了解此规则的各个部分,请参阅 YAML 格式政策参考文档中的 ADMISSION_RULE如需查看示例,请参阅示例政策中的使用针对集群的规则

如需添加针对集群的规则,请执行以下操作:

在 JSON 格式的政策文件中,添加 clusterAdmissionRules 节点:

"clusterAdmissionRules": {
    "us-central1-a.test-cluster": {
      "evaluationMode": "REQUIRE_ATTESTATION",
      "requireAttestationsBy": [
        "ATTESTOR",
        ...
      ],
      "enforcementMode": "ENFORCED_BLOCK_AND_AUDIT_LOG"
    }
  },

其中,CLUSTER_SPECIFIER 是要应用该规则的集群的资源 ID,格式为 location.name,其他属性如上文的设置默认规则中所述。如需查看针对集群的规则示例,请参阅示例政策

如果您的规则需要进行检查,了解是否所有必需的证明者都已对容器映像签名,您必须先创建证明者,然后再完成此步骤。

导入 JSON 格式的政策文件

最后一步是将 JSON 格式的政策文件重新导入 Binary Authorization。

如需导入该文件,请输入以下命令:

curl -X PUT \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "x-goog-user-project: ${PROJECT_ID}" \
    --data-binary @/tmp/policy.json  \
    "https://binaryauthorization.googleapis.com/v1/projects/${PROJECT_ID}/policy"

后续步骤