使用 GKE 設定二進位授權政策

本快速入門導覽課程說明如何設定及測試二進位授權政策中的基本規則

在本快速入門導覽課程中,您將查看及設定政策中的預設規則。預設規則允許部署所有映像檔。您可以在 Google Kubernetes Engine (GKE) 叢集上部署容器映像檔,藉此進行測試。接著,您將預設規則設為禁止部署所有映像檔,並嘗試部署映像檔。

事前準備

  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. Verify 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. 如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI

  7. 如要初始化 gcloud CLI,請執行下列指令:

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

    Go to project selector

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

  10. Enable the Artifact Registry, Binary Authorization APIs.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. 如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI

  13. 如要初始化 gcloud CLI,請執行下列指令:

    gcloud init
  14. 安裝 kubectl
  15. 建立啟用二進位授權強制執行功能的叢集

    現在,請建立啟用二進位授權的 GKE 叢集。這是要執行已部署容器映像檔的叢集。

    二進位授權適用於 Autopilot 或 Standard 叢集。

    Google Cloud 控制台

    下列步驟會設定 Autopilot 叢集。

    1. 在 Google Cloud 控制台中,前往 GKE「Kubernetes clusters」(Kubernetes 叢集) 頁面:

      前往 GKE

    2. 點選「建立」

    3. 在「建立 Autopilot 叢集」中,執行下列步驟:

      1. 在「Name」(名稱) 欄位中輸入 test-cluster

      2. 在「Region」(區域) 選單中選取「us-central1」。

      3. 展開「進階設定」部分。

      4. 按一下「安全性」連結,即可顯示「安全性」面板。

      5. 在「安全性」面板中,勾選「啟用二進位授權」核取方塊。

      6. 選取「僅限強制執行」

      7. 依序點選「下一步」和「下一步:檢閱並建立」

      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
    

    建立叢集可能需要幾分鐘的時間。

    預設政策

    根據預設,二進位授權政策會允許部署所有容器映像檔。

    Google Cloud 控制台

    如要查看預設政策,請按照下列步驟操作:

    1. 前往 Google Cloud 控制台的「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"
      }
    }
    

    測試違規處置政策

    您可以嘗試將範例容器映像檔部署至叢集,測試強制執行政策。

    在本快速入門導覽課程中,您會使用位於 Artifact Registry us-docker.pkg.dev/google-samples/containers/gke/hello-app 路徑的範例容器映像檔。這是 Google 建立的公開容器映像檔,內含「Hello, World!」範例應用程式。

    Google Cloud 控制台

    如要測試政策,請按照下列步驟操作:

    1. 前往Google Cloud 控制台中的 GKE「Clusters」(叢集) 頁面。

      前往 GKE

    2. 按一下 [Deploy] (部署)

      控制台會提示您輸入部署作業的詳細資料。

    3. 選取「現有容器映像檔」

    4. 輸入 us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 做為容器映像檔路徑。

    5. 按一下「繼續」

    6. 在「Application Name」(應用程式名稱) 欄位中輸入 hello-server

    7. 按一下 [Deploy] (部署)

    kubectl

    如要測試政策,請按照下列步驟操作:

    1. 更新本機 kubeconfig 檔案:

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

      這會提供在 GKE 中存取叢集所需的憑證和端點資訊。

    2. 部署映像檔:

      kubectl run hello-server --image us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080
      

    現在,請驗證二進位授權是否允許部署。

    Google Cloud 控制台

    如要確認映像檔已部署,請前往 Google Cloud 控制台的 GKE「Workloads」(工作負載) 頁面。

    前往 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「Workloads」(工作負載) 頁面。

      前往 GKE

    2. 選取 hello-server 工作負載。

    3. 點選「刪除」。

    kubectl

    如要刪除部署作業,請執行下列步驟:

    kubectl delete deployment hello-server
    

    設定強制執行政策,禁止顯示所有圖片

    現在,請修改政策,禁止部署所有圖片,而非允許。

    Google Cloud 控制台

    如要修改政策,請按照下列步驟操作:

    1. 返回 Google Cloud 控制台的「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 檔案匯回二進位授權:

      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"
      

    重新測試政策

    再次將範例容器映像檔部署至叢集,測試政策。 這次,二進位授權會禁止部署映像檔。

    Google Cloud 控制台

    部署映像檔:

    1. 前往Google Cloud 控制台中的 GKE「Clusters」(叢集) 頁面。

      前往 GKE

    2. 按一下 [Deploy] (部署)

      控制台會提示您輸入部署作業的詳細資料。

    3. 選取「現有容器映像檔」

    4. 輸入 us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 做為容器映像檔路徑。

    5. 按一下「繼續」

    6. 在「Application Name」(應用程式名稱) 欄位中輸入 hello-server

    7. 按一下 [Deploy] (部署)

    kubectl

    部署映像檔:

    kubectl run hello-server --image us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080
    

    現在可以確認政策是否遭到封鎖:

    Google Cloud 控制台

    如要確認映像檔未部署,請執行下列操作:

    返回Google Cloud 控制台的 GKE「Workloads」(工作負載) 頁面。

    前往 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「Clusters」(叢集) 頁面。

      前往 GKE

    2. 選取 test-cluster 叢集,然後按一下「刪除」

    gcloud

    如要刪除叢集,請按照下列步驟操作:

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

    後續步驟