快速入门:通过持续验证监控 Pod 的安全性

了解如何使用基于检查的政策来开始进行 Binary Authorization 持续验证 (CV)。在本快速入门中,您将使用以下 CV 检查来持续验证正在运行的 Pod 是否满足以下条件:

  • 可信目录:检查与 Pod 关联的映像是否位于您在政策中指定的一个或多个可信目录中。
  • 映像新鲜度:检查 Pod 的映像是否是在政策中指定的天数内上传的。

准备工作

  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. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

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

  6. Enable the Binary Authorization and Google Kubernetes Engine APIs:

    gcloud services enable container.googleapis.com binaryauthorization.googleapis.com
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

    gcloud init
  9. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

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

  11. Enable the Binary Authorization and Google Kubernetes Engine APIs:

    gcloud services enable container.googleapis.com binaryauthorization.googleapis.com
  12. 安装 kubectl 命令行工具
  13. 如果您的 Binary Authorization 政策和 GKE 集群位于不同的项目中,请确保两个项目中都启用了 Binary Authorization。

创建平台政策

如需设置 CV GKE 平台政策,请执行以下操作:

  1. 创建平台政策 YAML 文件:

    cat << EOF > /tmp/my-policy.yaml
    gkePolicy:
      checkSets:
      - checks:
        - trustedDirectoryCheck:
            trustedDirPatterns:
            - us-central1-docker.pkg.dev/my-project/my-directory
          displayName: My trusted directory check
        - imageFreshnessCheck:
            maxUploadAgeDays: 30
          displayName: My image freshness check
        displayName: My trusted directory and image freshness check set
    EOF
    

    此政策会检查以下条件:

    • Pod 的映像存储在名为 us-central1-docker.pkg.dev/my-project/my-directory 的 Artifact Registry 代码库中。

    • Pod 的映像在过去 30 天内上传到 Artifact Registry 或 Container Registry 代码库。

  2. 创建平台政策:

    gcloud beta container binauthz policy create POLICY_ID \
        --platform=gke \
        --policy-file=/tmp/my-policy.yaml \
        --project=POLICY_PROJECT_ID
    

    请替换以下内容:

    • POLICY_ID:您选择的 ID
    • POLICY_PROJECT_ID:政策项目 ID

创建或更新集群

如需在集群上启用 CV,您可以创建新集群或更新现有集群。

  • 如需创建集群并启用基于检查的平台政策,请运行以下命令:

    gcloud beta container clusters create CLUSTER_NAME \
        --location=LOCATION \
        --binauthz-evaluation-mode=POLICY_BINDINGS \
        --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
        --project=CLUSTER_PROJECT_ID
    

    请替换以下内容:

    • CLUSTER_NAME:集群的名称
    • LOCATION:位置,例如:us-central1asia-south1
    • POLICY_PROJECT_ID:存储政策的项目的 ID
    • POLICY_ID:政策 ID
    • CLUSTER_PROJECT_ID:集群项目 ID

    等待集群创建完成。

  • 如需更新现有的已启用基于检查的政策的集群,请运行以下命令。

    gcloud beta container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --binauthz-evaluation-mode=POLICY_BINDINGS \
        --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
        --project=CLUSTER_PROJECT_ID
    

    请替换以下内容:

    • CLUSTER_NAME:集群的名称
    • LOCATION:位置,例如:us-central1asia-south1
    • POLICY_PROJECT_ID:存储政策的项目的 ID
    • POLICY_ID:政策 ID
    • CLUSTER_PROJECT_ID:集群项目 ID

    等待集群更新完成。

部署映像

  1. 获取 kubectl 的凭据:

    gcloud container clusters get-credentials CLUSTER_NAME
    
  2. 部署映像:

    kubectl run hello-app \
        --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
    

    映像 us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 符合新鲜度检查,因为它是在过去 30 天内上传到代码库的。但该映像不符合可信目录检查,因为它不在 us-central1-docker.pkg.dev/my-project/my-directory 中。 因此,CV 会在 Cloud Logging 中生成 TrustedDirectoryCheck 日志条目。

查看日志

日志条目会在部署 Pod 后的 24 小时内显示在 Cloud Logging 中,但也可能只需几个小时就显示。

要在 Cloud Logging 中查看日志,请使用以下过滤条件:

logName:"binaryauthorization.googleapis.com%2Fcontinuous_validation"
"policyName"

hello-app Pod 的日志类似于以下内容。有些字段可能会因项目 ID、集群名称等而异。

{
  "insertId": "637c2de7-0000-2b64-b671-24058876bb74",
  "jsonPayload": {
    "podEvent": {
      "endTime": "2022-11-22T01:14:30.430151Z",
      "policyName": "projects/1234567890/platforms/gke/policies/my-policy",
      "images": [
        {
          "result": "DENY",
          "checkResults": [
            {
              "explanation": "TrustedDirectoryCheck at index 0 with display name \"My trusted directory check\" has verdict NOT_CONFORMANT. Image is not in a trusted directory",
              "checkSetName": "Default check set",
              "checkSetIndex": "0",
              "checkName": "My trusted directory check",
              "verdict": "NON_CONFORMANT",
              "checkType": "TrustedDirectoryCheck",
              "checkIndex": "0"
            }
          ],
          "image": "us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0"
        }
      ],
      "verdict": "VIOLATES_POLICY",
      "podNamespace": "default",
      "deployTime": "2022-11-22T01:06:53Z",
      "pod": "hello-app"
    },
    "@type": "type.googleapis.com/google.cloud.binaryauthorization.v1beta1.ContinuousValidationEvent"
  },
  "resource": {
    "type": "k8s_cluster",
    "labels": {
      "project_id": "my-project",
      "location": "us-central1-a",
      "cluster_name": "my-cluster"
    }
  },
  "timestamp": "2022-11-22T01:44:28.729881832Z",
  "severity": "WARNING",
  "logName": "projects/my-project/logs/binaryauthorization.googleapis.com%2Fcontinuous_validation",
  "receiveTimestamp": "2022-11-22T03:35:47.171905337Z"
}

日志条目会显示违反政策行为的相关信息,包括以下字段:

  • policyName:CV 发现违规行为时使用的平台政策
  • checkResults:包含以下字段的结果块:

    • explanation:错误消息
    • checkSetName:检查集的 displayName
    • checkSetIndex:检查集在政策中的索引
    • checkName:检查的名称
    • checkIndex:检查在检查集中的索引
    • verdict:生成日志条目的判定结果,在本例中为 NOT_CONFORMANT,因为不符合检查。

某些检查可以包含其他信息,以帮助您了解不符合检查的原因。

由于映像符合新鲜度检查,因此新鲜度检查不会显示在日志中。

清理

为避免因本页面中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的 Google Cloud 项目。

本部分介绍了如何清理本指南前面部分配置的 CV 监控。

您可以在集群中停用 CV 监控或 Binary Authorization 和 CV。

在集群中停用 Binary Authorization

如需在集群中同时停用 CV 和 Binary Authorization 强制执行,请运行以下命令:

gcloud beta container clusters update CLUSTER_NAME \
    --binauthz-evaluation-mode=DISABLED \
    --location=LOCATION \
    --project=CLUSTER_PROJECT_ID

请替换以下内容:

  • CLUSTER_NAME:集群的名称
  • LOCATION:集群位置
  • CLUSTER_PROJECT_ID:集群项目 ID

在集群中停用基于检查的政策监控

如需在集群中停用使用基于检查的政策的 CV,并使用 Binary Authorization 强制执行政策重新启用强制执行,请运行以下命令:

gcloud beta container clusters update CLUSTER_NAME  \
    --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE \
    --location=LOCATION \
    --project="CLUSTER_PROJECT_ID"

请替换以下内容:

  • CLUSTER_NAME:集群的名称
  • LOCATION:集群位置
  • CLUSTER_PROJECT_ID:集群项目 ID

请注意,--binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE 等效于旧标志 --enable-binauthz

删除政策

如需删除政策,请运行以下命令。无需删除基于检查的平台政策即可停用基于检查的政策审核。

gcloud beta container binauthz policy delete POLICY_ID \
    --platform=gke \
    --project="POLICY_PROJECT_ID"

请替换以下内容:

  • POLICY_ID:政策的 ID
  • POLICY_PROJECT_ID:政策项目 ID

后续步骤