更新 Binary Authorization 政策

本文档介绍如何在 Binary Authorization 政策豁免映像

在本文档中,您可以更新政策以从 Binary Authorization 强制执行的 Container Registry 和 Artifact Registry 中豁免容器映像,并设置默认规则以禁止部署所有其他容器。

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry, Binary Authorization APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Artifact Registry, Binary Authorization APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. 如果您未使用 Cloud Shell,请安装 kubectl

创建启用了 Binary Authorization 的集群

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

Google Cloud 控制台

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

    转到 GKE

    控制台会显示 Google Cloud 项目中的 GKE 集群列表。

  2. 点击创建集群

  3. 名称字段中输入 test-cluster

    标准集群模板中的“名称”字段

  4. 位置类型选项中选择区域

  5. 区域下拉列表中选择 us-central1-a

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

  7. 安全性面板中,选择启用 Binary Authorization

    “启用 Binary Authorization”选项

  8. 选择仅强制执行

  9. 点击创建

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/<var>PROJECT_ID</var>/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"

REST API 会返回以下内容:

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

仅允许豁免映像

本部分介绍如何修改政策以豁免映像,并禁止部署所有其他映像。

Google Cloud 控制台

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

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

    转到 Binary Authorization

  2. 点击修改政策

  3. 选择禁止所有映像

  4. 不受部署规则约束的映像下,展开映像路径

  5. 点击添加映像路径

    Container Registry

    新映像路径中,粘贴 Container Registry 代码库中的以下路径:

    gcr.io/google-samples/hello-app:1.0
    

    Artifact Registry

    新映像路径中,粘贴 Artifact Registry 代码库中的以下路径:

    us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
    
  6. 点击完成以保存映像路径。

  7. 点击保存政策

gcloud

如需修改政策以允许 Container Registry 和 Artifact Registry 中的示例映像,请执行以下操作:

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

    gcloud container binauthz policy export  > /tmp/policy.yaml
    
  2. 在文本编辑器中,将 evaluationModeALWAYS_ALLOW 更改为 ALWAYS_DENY,并将豁免映像添加到 admissionWhitelistPatterns

    如需从 Container Registry 和 Artifact Registry 中豁免以下示例映像,请按如下所示修改 YAML 格式的政策文件:

    admissionWhitelistPatterns:
    - namePattern: gcr.io/google-samples/hello-app:1.0
    - namePattern: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
    globalPolicyEvaluationMode: ENABLE
    defaultAdmissionRule:
      evaluationMode: ALWAYS_DENY
      enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
    name: projects/<var>PROJECT_ID</var>/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",
      "admissionWhitelistPatterns": [
        {
          "namePattern": "gcr.io/google-samples/hello-app:1.0"
        },
        {
          "namePattern": "us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0"
        }
      ],
      "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"
    

测试政策

如需通过部署您添加到 Exempt image 许可名单的映像来测试政策,请执行以下操作:

  1. 将豁免映像部署到集群。

    Google Cloud 控制台

    部署豁免映像:

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

      转到 GKE

    2. 点击部署

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

    3. 选择现有容器映像

    4. 输入容器映像路径。

      Container Registry

      如需从 Container Registry 部署映像,请输入以下命令:

      gcr.io/google-samples/hello-app:1.0
      

      Artifact Registry

      如需从 Artifact Registry 部署映像,请输入以下命令:

      us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
      
    5. 点击继续

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

    7. 点击部署

    kubectl

    Container Registry

    从 Container Registry 部署映像:

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

    Artifact Registry

    从 Artifact Registry 部署映像:

    kubectl run hello-server --image us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080
    
  2. 验证系统是否允许部署该映像:

    Google Cloud 控制台

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

    1. 转到 GKE 页面。

    转到 GKE

    1. 转到工作负载页面。

    hello-server 工作负载带有绿色图标,表明它正在运行。

    kubectl

    如需验证系统是否允许部署该映像,请输入以下命令:

    kubectl get pods
    

    您会看到该映像正在运行。

  3. 删除 Pod。

    Google Cloud 控制台

    在 GKE 工作负载页面中,执行以下操作:

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

    2. 点击删除

    3. 当系统提示您删除资源时,点击删除

    kubectl

    kubectl delete pod hello-server
    

清理

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

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

控制台

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

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

    转到 GKE

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

gcloud

如需删除集群,请输入以下命令:

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

后续步骤