快速入門導覽課程:透過持續驗證監控 Pod 安全性

瞭解如何透過以檢查為準的政策,開始使用二進位授權連續驗證 (CV)。在本快速入門導覽中,您將使用下列 CV 檢查,持續驗證執行中的 Pod 是否符合下列條件:

  • 受信任的目錄: 檢查與 Pod 相關聯的映像檔是否位於您在政策中指定的一或多個受信任目錄中。
  • 圖片新鮮度: 檢查 Pod 的圖片是否在政策中指定的天數內上傳。

事前準備

  1. 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
  2. 安裝 Google Cloud CLI。

  3. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  4. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  5. 建立或選取 Google Cloud 專案

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您已獲授角色,即可選取任何專案。
    • 建立專案:如要建立專案,您需要具備專案建立者角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色
    • 建立 Google Cloud 專案:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替換為您要建立的 Google Cloud 專案名稱。

    • 選取您建立的 Google Cloud 專案:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替換為 Google Cloud 專案名稱。

  6. 確認專案已啟用計費功能 Google Cloud

  7. 啟用二進位授權和 Google Kubernetes Engine API:

    啟用 API 時所需的角色

    如要啟用 API,您需要具備服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色

    gcloud services enable container.googleapis.com binaryauthorization.googleapis.com
  8. 安裝 Google Cloud CLI。

  9. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  10. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  11. 建立或選取 Google Cloud 專案

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您已獲授角色,即可選取任何專案。
    • 建立專案:如要建立專案,您需要具備專案建立者角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色
    • 建立 Google Cloud 專案:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替換為您要建立的 Google Cloud 專案名稱。

    • 選取您建立的 Google Cloud 專案:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替換為 Google Cloud 專案名稱。

  12. 確認專案已啟用計費功能 Google Cloud

  13. 啟用二進位授權和 Google Kubernetes Engine API:

    啟用 API 時所需的角色

    如要啟用 API,您需要具備服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色

    gcloud services enable container.googleapis.com binaryauthorization.googleapis.com
  14. 安裝 kubectl 指令列工具。
  15. 如果二進位授權政策和 GKE 叢集位於不同專案,請務必在這兩個專案中啟用二進位授權。

建立平台政策

如要設定 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 監控,或同時停用二進位授權和 CV。

在叢集中停用二進位授權

如要在叢集中停用 CV 和二進位授權強制執行功能,請執行下列指令:

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

更改下列內容:

  • CLUSTER_NAME:叢集名稱
  • LOCATION:叢集位置
  • CLUSTER_PROJECT_ID:叢集專案 ID

在叢集中停用以檢查為準的政策監控功能

如要在叢集中停用以檢查為準的政策,並使用 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

後續步驟