快速入门:通过持续验证监控 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. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  4. To initialize the gcloud CLI, run the following command:

    gcloud init
  5. 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.

  6. Verify that billing is enabled for your Google Cloud project.

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

    gcloud services enable container.googleapis.com binaryauthorization.googleapis.com
  8. Install the Google Cloud CLI.

  9. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  10. To initialize the gcloud CLI, run the following command:

    gcloud init
  11. 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.

  12. Verify that billing is enabled for your Google Cloud project.

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

    gcloud services enable container.googleapis.com binaryauthorization.googleapis.com
  14. 安装 kubectl 命令行工具
  15. 如果您的 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

后续步骤