本頁面將逐步說明如何從 GKE 叢集安全地向 Kubernetes API 伺服器進行驗證。您可以確保只有授權使用者和應用程式能存取 Kubernetes 資源,藉此保護叢集。您將瞭解可用的驗證方式、建議的驗證方式,以及如何驗證使用者、應用程式和舊版系統。
如要瞭解如何向Google Cloud API 驗證 Kubernetes 工作負載,請參閱「Workload Identity Federation for GKE」。
本頁面適用於安全專家和作業人員,他們必須從 GKE 叢集安全地向 Kubernetes API 伺服器進行驗證。本頁面提供重要資訊,說明可用的驗證方式及實作方法。如要進一步瞭解 Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。
閱讀本頁內容前,請務必先熟悉下列概念:
事前準備
開始之前,請確認您已執行下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
驗證使用者
GKE 會透過 Google Cloud CLI 管理使用者驗證。gcloud CLI 會向Google Cloud驗證使用者身分、設定 Kubernetes 設定、取得叢集的 OAuth 存取權杖,並確保存取權杖維持最新狀態。
所有 GKE 叢集都會驗證 kubectl 提供的憑證,並擷取與使用者或服務帳戶身分相關聯的電子郵件地址,藉此接受使用者和服務帳戶身分 Google Cloud。因此,這些帳戶的憑證必須包含 userinfo.email OAuth 範圍,才能順利通過驗證。
使用 gcloud 為新叢集或現有叢集設定環境的 kubeconfig 時,gcloud 會將 gcloud 本身使用的憑證提供給 kubectl。舉例來說,如果您使用 gcloud auth login,系統會將您的個人憑證提供給 kubectl,包括 userinfo.email 範圍。這可讓 GKE 叢集驗證 kubectl 用戶端。
或者,您也可以選擇在 Compute Engine 執行個體上執行 kubectl,並設定使用Google Cloud 服務帳戶的憑證。不過,根據預設,Compute Engine 執行個體建立的憑證不會包含 userinfo.email 範圍。因此,您必須明確新增這個範圍,例如在建立 Compute Engine 執行個體時使用 --scopes 標記。
您可以使用 Identity and Access Management (IAM) 或 Kubernetes 角色式存取控管 (RBAC),授權叢集中的動作。
使用 OAuth 進行驗證
如要使用 OAuth 方法向叢集進行驗證,請執行下列操作:
使用憑證登入 gcloud CLI。這會開啟網路瀏覽器,完成 Google Cloud的驗證程序:
gcloud auth login擷取特定叢集的 Kubernetes 憑證:
gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION更改下列內容:
CLUSTER_NAME:叢集名稱。CONTROL_PLANE_LOCATION:叢集控制層的 Compute Engine 位置。如果是區域叢集,請提供區域;如果是可用區叢集,請提供可用區。
確認您已通過驗證:
kubectl cluster-info
使用者或 Google Cloud 服務帳戶通過驗證後,也必須取得授權,才能對 GKE 叢集執行任何動作。如要進一步瞭解如何設定授權,請參閱角色式存取控管。
驗證應用程式
您也可以從 Pod 中的應用程式向 API 伺服器進行驗證,不必與使用者互動,例如從 CI/CD 管道中的指令碼進行驗證。具體做法取決於應用程式的執行環境。
同一叢集中的應用程式
如果應用程式在同一個 GKE 叢集中執行,請使用 Kubernetes 服務帳戶進行驗證。
建立 Kubernetes 服務帳戶,並附加至 Pod。如果 Pod 已有 Kubernetes 服務帳戶,或您想使用命名空間的預設服務帳戶,請略過這個步驟。
使用 Kubernetes RBAC,將應用程式所需的權限授予 Kubernetes 服務帳戶。
以下範例會將
prod命名空間中資源的view權限,授予cicd-ns命名空間中名為cicd的服務帳戶:kubectl create rolebinding cicd-secret-viewer \ --namespace=prod \ --clusterrole=view \ --serviceaccount=cicd-ns:cicd在執行階段,當應用程式傳送 Kubernetes API 要求時,API 伺服器會驗證服務帳戶憑證。
Google Cloud中的應用程式
如果應用程式在目標叢集內 Google Cloud 但外部執行 (例如 Compute Engine VM 或其他 GKE 叢集),您應使用環境中可用的 IAM 服務帳戶憑證,向 API 伺服器進行驗證。
為環境指派 IAM 服務帳戶。如果應用程式是在 Compute Engine VM 中執行,請將 IAM 服務帳戶指派給執行個體。如果應用程式在其他 GKE 叢集執行,請使用 Workload Identity Federation for GKE,將 Pod 設為以 IAM 服務帳戶的身分執行。
下列範例使用
ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com做為 IAM 服務帳戶。授予 IAM 服務帳戶叢集存取權。
下列範例會授予
roles/container.developerIAM 角色,提供叢集內部 Kubernetes API 物件的存取權:gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/container.developer或者,您也可以使用 RBAC 授予 IAM 服務帳戶叢集存取權。從同一個叢集中的應用程式執行
kubectl create rolebinding指令,並使用--user=ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com,而非--service-account標記。擷取叢集憑證:
gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION系統會使用環境中設定的 IAM 服務帳戶,自動驗證應用程式。
其他環境中的應用程式
如果應用程式是從Google Cloud以外的環境進行驗證,就無法存取受管理的 IAM 服務帳戶憑證。如要擷取叢集憑證,您可以建立 IAM 服務帳戶、下載其金鑰,並在服務執行階段使用該金鑰,透過 gcloud CLI 擷取叢集憑證。
為應用程式建立 IAM 服務帳戶。如果已有 IAM 服務帳戶,請略過這個步驟。
下列指令會建立名為
ci-cd-pipeline的 IAM 服務帳戶:gcloud iam service-accounts create ci-cd-pipeline授予 IAM 服務帳戶叢集存取權。
下列指令會將
roles/container.developerIAM 角色授予ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.comIAM 服務帳戶:gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/container.developer您也可以使用 RBAC 授予 IAM 服務帳戶叢集存取權。從同一叢集中的應用程式執行
kubectl create rolebinding指令,並使用--user=ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com,而非--service-account旗標。為 IAM 服務帳戶建立並下載金鑰。在執行階段提供給應用程式:
gcloud iam service-accounts keys create gsa-key.json \ --iam-account=ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com在執行階段,於執行應用程式的環境中,使用 IAM 服務帳戶金鑰向 gcloud CLI 進行驗證:
gcloud auth activate-service-account ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com \ --key-file=gsa-key.json使用 gcloud CLI 擷取叢集憑證:
gcloud config set project PROJECT_ID gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION
沒有 gcloud 的環境
建議使用 gcloud CLI 擷取叢集憑證,因為這種方法可彈性因應叢集事件,例如控制層 IP 輪換或憑證輪換。不過,如果您無法在環境中安裝 gcloud CLI,仍可建立靜態 kubeconfig 檔案,向叢集進行驗證:
為應用程式建立 IAM 服務帳戶。如果您已有 IAM 服務帳戶,請略過這個步驟。
下列指令會建立名為
ci-cd-pipeline的 IAM 服務帳戶:gcloud iam service-accounts create ci-cd-pipeline授予 IAM 服務帳戶叢集存取權。
下列指令會將
roles/container.developerIAM 角色授予ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.comIAM 服務帳戶:gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/container.developer您也可以建立自訂 IAM 角色,精細控管授予的權限。
為 IAM 服務帳戶建立並下載金鑰。
在下列範例中,金鑰檔案名為
gsa-key.json:gcloud iam service-accounts keys create gsa-key.json \ --iam-account=ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com取得叢集的控制層端點:
gcloud container clusters describe CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --format="value(endpoint)"如果您使用 IP 型端點存取控制層,請取得叢集根憑證授權單位 (CA) 的 Base64 編碼公開憑證。如果您使用 DNS 型端點,則可略過這個步驟。
gcloud container clusters describe CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --format="value(masterAuth.clusterCaCertificate)"建立
kubeconfig.yaml檔案。請視應用程式存取控制層的方式,使用下列其中一種格式:以 DNS 為基礎的端點:
apiVersion: v1 kind: Config clusters: - name: CLUSTER_NAME cluster: server: https://ENDPOINT users: - name: ci-cd-pipeline-gsa user: exec: apiVersion: client.authentication.k8s.io/v1beta1 args: - --use_application_default_credentials command: gke-gcloud-auth-plugin installHint: Install gke-gcloud-auth-plugin for kubectl by following https://docs.cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl#install_plugin provideClusterInfo: true contexts: - context: cluster: CLUSTER_NAME user: ci-cd-pipeline-gsa name: CLUSTER_NAME-ci-cd current-context: CLUSTER_NAME-ci-cd更改下列內容:
CLUSTER_NAME:叢集名稱。ENDPOINT:您在上一個步驟中取得的endpoint值。
使用 DNS 型端點時,代管 DNS 型端點的 Google Front End (GFE) 服務會提供由 Google 公用 CA 簽署的憑證。您的用戶端可以使用內建程式庫驗證這項憑證。詳情請參閱「控制層連線的傳輸安全性」。
以 IP 為基礎的端點:
apiVersion: v1 kind: Config clusters: - name: CLUSTER_NAME cluster: server: https://ENDPOINT certificate-authority-data: CLUSTER_CA_CERTIFICATE users: - name: ci-cd-pipeline-gsa user: exec: apiVersion: client.authentication.k8s.io/v1beta1 args: - --use_application_default_credentials command: gke-gcloud-auth-plugin installHint: Install gke-gcloud-auth-plugin for kubectl by following https://docs.cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl#install_plugin provideClusterInfo: true contexts: - context: cluster: CLUSTER_NAME user: ci-cd-pipeline-gsa name: CLUSTER_NAME-ci-cd current-context: CLUSTER_NAME-ci-cd更改下列內容:
CLUSTER_NAME:叢集名稱。ENDPOINT:上一個步驟輸出內容中endpoint欄位的值。CLUSTER_CA_CERTICATE:叢集的 Base64 編碼公開憑證。
使用以 IP 為基礎的端點時,API 伺服器會提供由叢集根 CA 簽署的憑證。用戶端會使用
certificate-authority-data欄位中的公開 CA 憑證,驗證 API 伺服器憑證。詳情請參閱「控制層連線的傳輸安全性」。
在環境中,將
kubeconfig.yaml和gsa-key.json與應用程式一併部署。在執行階段,於執行應用程式的環境中設定下列環境變數:export KUBECONFIG=path/to/kubeconfig.yaml export GOOGLE_APPLICATION_CREDENTIALS=path/to/gsa-key.json應用程式現在可以向 Kubernetes API 傳送要求,並以 IAM 服務帳戶的身分通過驗證。
更新舊版驗證方式
在與 GKE 整合 OAuth 之前,預先佈建的 X.509 憑證或靜態密碼是唯一可用的驗證方法,但我們不再建議使用,且應停用。這些方法會增加叢集遭入侵的攻擊面,因此在執行 GKE 1.12 以上版本的叢集上,預設為停用。如果使用舊版驗證方式,建議關閉這些方式。
啟用後,具備 container.clusters.getCredentials 權限的使用者可以擷取用戶端憑證和靜態密碼。roles/container.admin、roles/owner 和 roles/editor 角色都具備這項權限,因此請謹慎使用這些角色。進一步瞭解 GKE 中的 IAM 角色。
停用使用靜態密碼的驗證
靜態密碼是 API 伺服器驗證的使用者名稱和密碼組合。在 GKE 中,這種驗證方式稱為基本驗證。
更新現有叢集並移除靜態密碼:
gcloud container clusters update CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--no-enable-basic-auth
停用用戶端憑證驗證
如果使用憑證驗證,用戶端會提出憑證,而 API 伺服器會以指定的憑證授權單位對該憑證進行驗證。在 GKE 中,叢集根憑證授權單位 (CA) 會簽署用戶端憑證。
用戶端憑證驗證會影響 Kubernetes API 伺服器的授權。如果叢集已啟用舊版屬性式存取控管 (ABAC) 授權,用戶端憑證預設可以驗證 API 伺服器並執行任何動作。另一方面,啟用角色式存取控管 (RBAC) 後,用戶端憑證必須獲得 Kubernetes 資源的特定授權。
如要建立叢集而不產生用戶端憑證,請使用 --no-issue-client-certificate 標記:
gcloud container clusters create CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION
--no-issue-client-certificate
目前無法從現有叢集中移除用戶端憑證。如要在現有叢集上停止使用用戶端憑證驗證,請務必在叢集上啟用 RBAC,並確保用戶端憑證在叢集上沒有任何授權。
該 API 用於運作叢集,無法停用。後續步驟
- 瞭解 Google Cloud Authentication。
- 瞭解 GKE 中的存取權控管機制。
- 瞭解 Google 服務帳戶。
- 瞭解 Workload Identity Federation for GKE。
- 瞭解如何強化叢集安全性