保護叢集中繼資料

總覽

GKE 使用執行個體中繼資料設定節點 VM,但中繼資料的某些部分可能屬於敏感資訊且應加以保護,以免受到叢集中執行的工作負載影響。

事前準備

如要準備這項工作,請執行下列步驟:

  • 確認您已啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 確認您已安裝 Cloud SDK
  • 設定預設的專案 ID
    gcloud config set project [PROJECT_ID]
  • 如果您使用區域叢集,請設定預設的運算區域
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 如果您使用地區叢集,請設定預設的運算地區
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud 更新到最新版本:
    gcloud components update

設定節點服務帳戶

由於每個節點的服務帳戶憑證會持續在工作負載中公開,因此您應確保以最低的必要權限設定服務帳戶。接著,將這個服務帳戶附加至節點,這樣攻擊者就無法藉由使用 Compute Engine API 直接存取節點執行個體來規避 GKE 的中繼資料保護。

請勿使用擁有 compute.instances.get 權限、Compute 執行個體管理員或其他類似權限的服務帳戶,因為這類帳戶會讓潛伏的攻擊者透過 Compute Engine API 取得執行個體中繼資料。最佳做法是使用服務帳戶權限來限制節點 VM 的權限,「而非透過存取範圍」制。詳情請參閱 Compute Engine 的服務帳戶說明文件。

如果您沒有節點服務帳戶,可以使用下列指令建立一個帳戶:

export NODE_SA_NAME=gke-node-sa
gcloud iam service-accounts create $NODE_SA_NAME \
  --display-name "Node Service Account"
export NODE_SA_EMAIL=$(gcloud iam service-accounts list --format='value(email)' \
  --filter='displayName:Node Service Account')

如要設定擁有必要角色和權限的服務帳戶,請執行下列指令。PROJECT 是您的專案 ID

export PROJECT=$(gcloud config get-value project)

gcloud projects add-iam-policy-binding $PROJECT \
  --member serviceAccount:$NODE_SA_EMAIL \
  --role roles/monitoring.metricWriter
gcloud projects add-iam-policy-binding $PROJECT \
  --member serviceAccount:$NODE_SA_EMAIL \
  --role roles/monitoring.viewer
gcloud projects add-iam-policy-binding $PROJECT \
  --member serviceAccount:$NODE_SA_EMAIL \
  --role roles/logging.logWriter

此外,如果您的叢集會從 Container Registry 中提取出私人映像檔,請新增 storage.objectViewer 角色:

gcloud projects add-iam-policy-binding $PROJECT \
  --member serviceAccount:$NODE_SA_EMAIL \
  --role roles/storage.objectViewer

停用舊版中繼資料 API

Compute Engine 的執行個體中繼資料伺服器所公開的舊版 /0.1//v1beta1/ 端點,並不會強制使用中繼資料查詢標頭。這是 /v1/ API 中的一項功能,可以讓潛伏的攻擊者更難以擷取執行個體中繼資料。除非有特別需求,否則我們建議您停用這些舊版 API。

建立停用舊版中繼資料 API 的新節點集區

建立服務帳戶之後,您可以使用 gcloud 指令列工具,建立停用舊版中繼資料 API 的新節點集區 (或在新叢集中建立預設的節點集區)。

若要建立停用舊版中繼資料 API 的新節點集區,請使用 --metadata disable-legacy-endpoints=true 標記。例如:

gcloud container node-pools create [POOL_NAME] \
  --service-account=$NODE_SA_EMAIL \
  --metadata disable-legacy-endpoints=true

您可以使用相同的標記建立新的叢集,並在「預設節點集區」中停用舊版中繼資料 API。例如:

gcloud container clusters create [CLUSTER_NAME] \
  --service-account=$NODE_SA_EMAIL \
  --metadata disable-legacy-endpoints=true

更新現有叢集以停用舊版中繼資料 API

建立停用舊版中繼資料 API 的新節點集區後,您可以遵循節點集區遷移指南中的說明,將現有的叢集更新為使用新的節點集區。

驗證舊版中繼資料 API 是否已停用

停用舊版執行個體中繼資料 API 後,傳送至 /0.1//v1beta1/ 中繼資料伺服器端點的要求會傳回 403 Forbidden

若要驗證是否已停用舊版中繼資料 API,可以在 Pod 中執行 curl 指令:

root@pod-name# curl -H 'Metadata-Flavor: Google' \
'http://metadata.google.internal/computeMetadata/v1/instance/attributes/disable-legacy-endpoints'
true
root@pod-name# curl 'http://metadata.google.internal/computeMetadata/v1beta1/instance/id'
... Error 403 (Forbidden) ... Legacy metadata endpoint accessed: /computeMetadata/v1beta1/instance/id Legacy metadata endpoints are disabled. Please use the /v1/ endpoint. ...

中繼資料隱藏功能

GKE 的「中繼資料隱藏功能」可以保護某些可能具有敏感內容的系統中繼資料,使其不會受到叢集中執行的工作負載影響。

在 Kubernetes 1.9.3 以上的版本中,您可以啟用「中繼資料隱藏功能」,防止使用者 Pod 存取叢集節點的特定 VM 中繼資料,例如 Kubelet 憑證和 VM 執行個體資訊。具體來說,中繼資料隱藏功能可以保護對於 kube-env (其中含有 Kubelet 憑證) 和 VM 的執行個體識別憑證的存取安全。

中繼資料隱藏功能防火牆會將來自使用者 Pod (「並非」HostNetwork 上執行的 Pod) 的流量傳送至叢集中繼資料伺服器,僅允許安全查詢。這道防火牆可防止使用者 Pod 利用 Kubelet 憑證進行權限提升攻擊,或使用 VM 身分進行執行個體升級攻擊。

限制

  • 中繼資料隱藏功能只能保護對於 kube-env 和節點的執行個體識別憑證的存取安全。
  • 中繼資料隱藏功能無法限制對於節點服務帳戶的存取權。
  • 中繼資料隱藏功能無法限制對於其他相關執行個體中繼資料的存取權。
  • 中繼資料隱藏功能無法限制對於其他舊版中繼資料 API 的存取權。

建立具備中繼資料隱藏功能的新叢集或節點集區

建立服務帳戶後,您可以使用 gcloud 指令列工具,建立啟用中繼資料隱藏功能的新叢集。

要建立啟用中繼資料隱藏功能的叢集,請在殼層或終端機視窗中執行下列指令:

gcloud beta container clusters create [CLUSTER_NAME] \
  --workload-metadata-from-node=SECURE \
  --service-account=$NODE_SA_EMAIL \
  --metadata disable-legacy-endpoints=true \
  [additional parameters and flags omitted]

其中:

  • [CLUSTER_NAME] 是要建立的叢集名稱。
  • --workload-metadata-from-node 設為 SECURE;將標記設為 EXPOSEDUNSPECIFIED 會停用中繼資料隱藏功能。

驗證中繼資料向叢集工作負載隱藏的識別憑證

隱藏中繼資料時,應無法透過節點的執行個體識別憑證要求簽名。要驗證要求是否會向使用者明確告知隱藏的中繼資料,可以在 Pod 中執行 curl 指令:

root@pod-name# curl -H "Metadata-Flavor: Google" \
'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://www.example.com'
This metadata endpoint is concealed.
本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Kubernetes Engine 說明文件