使用 GKE 配置 Binary Authorization 政策

本快速入门介绍了如何在 Binary Authorization 政策中配置和测试基本规则

在本快速入门中,您将查看并配置政策中的默认规则。默认规则允许部署所有映像;您可以通过在 Google Kubernetes Engine (GKE) 集群上部署一个容器映像来对此进行测试。之后,您可以将默认规则设置为禁止部署所有映像并尝试部署一个映像进行测试。

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 启用 Artifact Registry, Binary Authorization API。

    启用 API

  5. 安装 Google Cloud CLI。
  6. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  7. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  8. 确保您的 Google Cloud 项目已启用结算功能

  9. 启用 Artifact Registry, Binary Authorization API。

    启用 API

  10. 安装 Google Cloud CLI。
  11. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  12. 安装 kubectl

创建启用了 Binary Authorization 强制执行的集群

现在,创建一个启用了 Binary Authorization 的 GKE 集群。这是您希望运行已部署的容器映像的集群。

Binary Authorization 可与 Autopilot 或 Standard 集群搭配使用。

Google Cloud 控制台

以下步骤可配置 Autopilot 集群。

  1. 在 Google Cloud 控制台中,进入 GKE Kubernetes 集群页面:

    转到 GKE

  2. 点击创建

  3. 创建 Autopilot 集群中,执行以下操作:

    1. 名称字段中,输入 test-cluster

    2. 区域菜单中,选择 us-central1

    3. 展开高级设置部分。

    4. 点击安全链接以显示安全面板。

    5. 安全性面板中,选中启用 Binary Authorization 复选框。

    6. 选择仅强制执行

    7. 点击下一步,然后点击 Next:Review and Create

    8. 如需开始创建集群,请点击创建

gcloud

运行 gcloud container clusters create,并启用 --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE 标志。

gcloud container clusters create \
    --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE \
    --zone us-central1-a \
    test-cluster

创建集群可能需要几分钟的时间。

默认政策

默认情况下,Binary Authorization 政策会配置为允许部署所有容器映像。

Google Cloud 控制台

如需查看默认政策,请执行以下操作:

  1. 转到 Google Cloud Console 中的 Binary Authorization 页面。

    转到 Binary Authorization

    控制台会显示政策详情。

  2. 点击修改政策

  3. 项目默认规则中,已选中允许所有映像选项。

gcloud

如需查看默认政策,请按如下方式导出 YAML 格式的政策文件:

gcloud container binauthz policy export

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

globalPolicyEvaluationMode: ENABLE
defaultAdmissionRule:
  evaluationMode: ALWAYS_ALLOW
  enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
name: projects/PROJECT_ID/policy

REST API

如需查看默认政策,请以 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"

该命令会生成以下输出:

{
  "name": "projects/PROJECT_ID/policy",
  "globalPolicyEvaluationMode": "ENABLE",
  "defaultAdmissionRule": {
    "evaluationMode": "ALWAYS_ALLOW",
    "enforcementMode": "ENFORCED_BLOCK_AND_AUDIT_LOG"
  }
}

测试强制执行政策

您可以通过尝试将示例容器映像部署到集群来测试强制执行政策。

在本快速入门中,您可以使用 Container Registry 内位于路径 gcr.io/google-samples/hello-app 中的示例容器映像。这是一个由 Google 创建的公共容器映像,其中包含一个“Hello, World!”示例应用。

Google Cloud 控制台

如需测试政策,请执行以下操作:

  1. 转到 Google Cloud 控制台中的 GKE 集群页面。

    转到 GKE

  2. 点击部署

    控制台会提示您输入部署详情。

  3. 选择现有容器映像

  4. 输入 gcr.io/google-samples/hello-app:1.0 作为容器映像路径。

  5. 点击继续

  6. 应用名称字段中输入 hello-server

  7. 点击部署

kubectl

如需测试政策,请执行以下操作:

  1. 更新本地 kubeconfig 文件:

    gcloud container clusters get-credentials \
        --zone us-central1-a \
        test-cluster
    

    这可以提供访问 GKE 中的集群所需的凭据和端点信息。

  2. 部署映像:

    kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
    

现在,验证 Binary Authorization 是否允许部署:

Google Cloud 控制台

如需验证映像是否已部署,请转到 Google Cloud 控制台中的 GKE 工作负载页面。

转到 GKE

部署的工作负载带有绿色图标,表明映像已成功部署。

kubectl

如需验证映像是否已部署,请执行以下操作:

kubectl get pods

该命令会输出类似于以下内容的消息,表示部署成功:

NAME                            READY     STATUS    RESTARTS   AGE
hello-server-579859fb5b-h2k8s   1/1       Running   0          1m

请务必删除该部署,以便继续执行下一步:

Google Cloud 控制台

如需删除部署,请执行以下操作:

  1. 返回 Google Cloud 控制台中的 GKE 工作负载页面。

    转到 GKE

  2. 选择 hello-server 工作负载。

  3. 点击删除

kubectl

如需删除部署,请执行以下操作:

kubectl delete deployment hello-server

将强制执行政策配置为禁止所有映像

现在,将政策修改为阻止(而不是允许)部署所有映像。

Google Cloud 控制台

如需修改政策,请执行以下操作:

  1. 返回 Google Cloud 控制台中的 Binary Authorization 页面。

    转到 Binary Authorization

  2. 点击修改政策

  3. 选择禁止所有映像

  4. 点击保存政策

gcloud

如需修改政策,请执行以下操作:

  1. 导出 YAML 格式的政策文件:

    gcloud container binauthz policy export  > /tmp/policy.yaml
    
  2. 在文本编辑器中,将 evaluationModeALWAYS_ALLOW 更改为 ALWAYS_DENY

    YAML 格式的政策文件应如下所示:

    globalPolicyEvaluationMode: ENABLE
    defaultAdmissionRule:
      evaluationMode: ALWAYS_DENY
      enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
    name: projects/PROJECT_ID/policy
    
  3. 将 YAML 格式的政策文件重新导入 Binary Authorization:

    gcloud container binauthz policy import /tmp/policy.yaml
    

REST API

如需修改政策,请执行以下操作:

  1. 创建一个使用更新后的政策的 JSON 格式的文本文件:

    cat > /tmp/policy.json << EOM
    {
      "name": "projects/${PROJECT_ID}/policy",
      "globalPolicyEvaluationMode": "ENABLE",
      "defaultAdmissionRule": {
        "evaluationMode": "ALWAYS_DENY",
        "enforcementMode": "ENFORCED_BLOCK_AND_AUDIT_LOG"
      }
    }
    EOM
    
  2. 将更新后的政策发送到 REST API:

    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"
    

重新测试政策

同样,可通过将示例容器映像部署到集群来测试政策。这次,Binary Authorization 会阻止映像的部署。

Google Cloud 控制台

部署映像:

  1. 转到 Google Cloud 控制台中的 GKE 集群页面。

    转到 GKE

  2. 点击部署

    控制台会提示您输入部署详情。

  3. 选择现有容器映像

  4. 输入 gcr.io/google-samples/hello-app:1.0 作为容器映像路径。

  5. 点击继续

  6. 应用名称字段中输入 hello-server

  7. 点击部署

kubectl

部署映像:

kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080

您现在可以验证政策是否被阻止:

Google Cloud 控制台

如需验证映像是否未部署,请执行以下操作:

返回 Google Cloud 控制台中的 GKE 工作负载页面。

转到 GKE

容器映像的工作负载带有红色图标,表明未能部署该映像。

kubectl

如需验证映像是否未部署,请执行以下命令:

kubectl get pods

该命令会输出以下消息,表明该映像未部署:

No resources found.

您可以进一步了解部署详情:

kubectl get event --template \
'{{range.items}}{{"\033[0;36m"}}{{.reason}}:{{"\033[0m"}}{{.message}}{{"\n"}}{{end}}'

您会看到类似于以下内容的响应:

FailedCreate: Error creating: pods POD_NAME is forbidden: admission webhook "imagepolicywebhook.image-policy.k8s.io" denied the request: Image IMAGE_NAME denied by Binary Authorization default admission rule. Denied by always_deny admission rule

在此输出中:

  • POD_NAME:Pod 的名称。
  • IMAGE_NAME:映像的名称。
  • ATTESTOR_NAME:证明者的名称。

清理

为避免因本页中使用的资源导致您的 Google Cloud 账号产生费用,请按照以下步骤操作。

删除您在 GKE 中创建的集群:

控制台

如需删除集群,请执行以下操作:

  1. 转到 Google Cloud 控制台中的 GKE 集群页面。

    转到 GKE

  2. 选择 test-cluster 集群,然后点击删除

gcloud

如需删除集群,请执行以下操作:

gcloud container clusters delete \
    --zone=us-central1-a \
    test-cluster

后续步骤