GKE Enterprise 提供一致的平台,可建構及交付安全服務,並在各層級內建安全功能,這些功能可單獨運作,也能共同運作,針對安全問題提供深層防禦機制。本教學課程將使用 Google Cloud上的 Anthos 範例部署項目,介紹 GKE Enterprise 的部分強大安全性功能。Anthos 範例部署作業會部署實際的 GKE Enterprise 實作環境,其中包含 GKE 叢集、服務網格,以及具有多個微服務的 Bank of GKE Enterprise 應用程式。
目標
本教學課程透過下列任務介紹 GKE Enterprise 的一些安全性功能:
使用 Config Sync 在服務網格中強制執行雙向傳輸層安全標準 (mTLS),確保端對端通訊安全。
設定安全防護機制,確保不會使用 Policy Controller 誤部署具有特權容器的 Pod。
費用
部署 Bank of Anthos 應用程式時,系統會根據 Google Cloud 定價頁面列出的價格,收取 GKE Enterprise 隨用隨付費用 (除非您已購買訂閱方案)。
您也必須支付執行 Bank of Anthos 應用程式時產生的其他 Google Cloud 費用,例如 Compute Engine VM 和負載平衡器的費用。
完成教學課程或探索部署作業後,建議您清除資源,以免產生額外費用。
事前準備
本教學課程是探索 Anthos 教學課程的後續內容。開始本教學課程前,請按照該頁面的指示設定專案,並安裝 Anthos 範例部署。
設定 Cloud Shell 環境
在本教學課程中,您將使用 Cloud Shell 指令列和編輯器,變更叢集設定。
如要初始化本教學課程的 Shell 環境,Anthos 範例部署作業會提供指令碼,執行下列操作:
安裝所有缺少的指令列工具,以便互動式處理及驗證部署作業的變更:
為「
anthos-sample-cluster1
」設定 Kubernetes 內容複製 Config Sync 用於將設定變更同步至叢集的存放區。您提交並推送至上游存放區的變更,會由 Config Sync 同步至基礎架構。這是建議的基礎架構變更最佳做法。
如要設定環境,請按照下列步驟操作:
確認您有有效的 Cloud Shell 工作階段。您可以點選教學課程專案中的Google Cloud 主控台,然後按一下「啟用 Cloud Shell」
,啟動 Cloud Shell。
建立要使用的目錄:
mkdir tutorial cd tutorial
下載初始化指令碼:
curl -sLO https://github.com/GoogleCloudPlatform/anthos-sample-deployment/releases/latest/download/init-anthos-sample-deployment.env
將初始化指令碼匯入 Cloud Shell 環境:
source init-anthos-sample-deployment.env
輸出:
/google/google-cloud-sdk/bin/gcloud /google/google-cloud-sdk/bin/kubectl Your active configuration is: [cloudshell-13605] export PROJECT as anthos-launch-demo-1 export KUBECONFIG as ~/.kube/anthos-launch-demo-1.anthos-trial-gcp.config Fetching cluster endpoint and auth data. kubeconfig entry generated for anthos-sample-cluster1. Copying gs://config-management-release/released/latest/linux_amd64/nomos... \ [1 files][ 40.9 MiB/ 40.9 MiB] Operation completed over 1 objects/40.9 MiB. Installed nomos into ~/bin. Cloned ACM config repo: ./anthos-sample-deployment-config-repo
將目錄變更為設定存放區,並在後續教學課程中將其做為工作目錄:
cd anthos-sample-deployment-config-repo
在服務網格中強制執行 mTLS
為因應全球擴張,您的資訊長已下令,所有使用者資料在傳輸過程中都必須加密,以保護私密資訊,確保符合區域資料隱私權和加密法規。
因此,您目前的流量是否都安全無虞?
前往專案中的「Cloud Service Mesh」頁面,您已在該專案中部署 Anthos 範例部署作業:
按一下服務清單中的「transactionhistory」transactionhistory。如「探索 GKE Enterprise」一節所述,服務詳細資料頁面會顯示這項服務的所有遙測資訊。
在「transactionhistory」頁面中,選取「導覽」選單的「Connected Services」。您可以在這裡查看服務的傳入和輸出連線。未解鎖的鎖頭圖示代表在這個通訊埠上發現部分流量並未使用雙向傳輸層安全標準 (mTLS)。
mTLS 是一種安全通訊協定,可確保兩個服務之間的流量安全無虞,且雙向皆可信任。每項服務只接受來自已驗證服務的加密流量。如您所見,Cloud Service Mesh 清楚顯示網格中有未加密的流量。Cloud Service Mesh 會使用不同顏色,指出未加密流量是否混合使用純文字和 mTLS (橘色),或只使用純文字 (紅色)。
只要幾個步驟,就能透過 GKE Enterprise 達成法規遵循要求。您不必在原始碼層級進行變更,也不必重建及重新部署應用程式來解決這個情況,而是可以透過設定使用 Config Sync,以宣告方式套用新的加密政策,從中央 Git 存放區自動部署新設定。
在本節中,您將執行下列操作:
調整 Git 存放區中的政策設定,強制服務透過 mTLS 使用加密通訊。
Config Sync 會自動從存放區擷取政策變更,並調整 Cloud Service Mesh 政策。
確認叢集上已發生政策變更,且叢集已設定為與存放區同步。
確認 Config Sync 設定
nomos
指令是指令列工具,可讓您與 Config Management Operator 互動,並從本機或 Cloud Shell 執行其他實用的 Config Sync 工作。如要確認 Config Sync 是否已在叢集上正確安裝及設定,請執行nomos status
:nomos status
輸出:
Connecting to clusters... Current Context Sync Status Last Synced Token Sync Branch Resource Status ------- ------- ----------- ----------------- ----------- --------------- * anthos-sample-cluster1 SYNCED abef0b01 master Healthy
輸出內容會確認 Config Sync 已設定為將叢集同步至設定存放區的主分支。第一欄中的星號表示目前環境已設為
anthos-sample-cluster1
。如果沒有看到這個選項,請將目前的內容切換為anthos-sample-cluster1
:kubectl config use-context anthos-sample-cluster1
輸出:
Switched to context "anthos-sample-cluster1".
確認您位於
master
分支版本中:git checkout master
輸出:
Already on 'master' Your branch is up to date with 'origin/master'.
驗證上游設定存放區:
git remote -v
輸出:
origin https://source.developers.google.com/.../anthos-sample-deployment-config-repo (fetch) origin https://source.developers.google.com/.../anthos-sample-deployment-config-repo (push)
請確認您仍在
anthos-sample-deployment-config-repo
目錄中,然後執行下列指令來檢查 Git 設定。初始化指令碼會將這個輔助函式納入環境,並執行git config
指令來檢查現有的 git configuser.email
和user.name
值。如未設定這些值,函式會根據目前有效的 Google Cloud 帳戶,在存放區層級設定預設值。init_git
輸出內容 (範例):
Configured local git user.email to user@example.com Configured local git user.name to user
現在可以將政策變更提交至存放區。將這些提交內容推送至上游存放區 (來源) 時,Config Sync 會確保這些變更套用至您設定管理的叢集。
更新政策,加密所有服務流量
Cloud Service Mesh 的設定是透過 YAML 檔案以宣告方式指定。如要加密所有服務流量,您需要修改 YAML,指定服務可接受的流量類型,以及指定服務傳送至特定目的地的流量類型。
您需要查看的第一個 YAML 檔案是
namespaces/istio-system/peer-authentication.yaml
,這是網格層級的驗證政策,用於指定網格中所有服務預設接受的流量類型。cat namespaces/istio-system/peer-authentication.yaml
輸出:
apiVersion: "security.istio.io/v1beta1" kind: "PeerAuthentication" metadata: name: "default" namespace: "istio-system" spec: mtls: mode: PERMISSIVE
如您所見,
PeerAuthentication
mTLS 模式為PERMISSIVE
,表示服務會接受純文字 HTTP 和 mTLS 流量。將 mTLS 模式設為
STRICT
,修改namespaces/istio-system/peer-authentication.yaml
,僅允許服務間的加密通訊:cat <<EOF> namespaces/istio-system/peer-authentication.yaml apiVersion: "security.istio.io/v1beta1" kind: "PeerAuthentication" metadata: name: "default" namespace: "istio-system" spec: mtls: mode: STRICT EOF
接著,請查看
namespaces/istio-system/destination-rule.yaml
中的「目的地規則」。這項設定會指定將流量傳送至指定目的地的規則,包括流量是否經過加密。請注意,TLSmode 為DISABLE
,也就是說,流量會以純文字形式傳送至所有相符主機。cat namespaces/istio-system/destination-rule.yaml
輸出:
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: annotations: meshsecurityinsights.googleapis.com/generated: "1561996419000000000" name: default namespace: istio-system spec: host: '*.local' trafficPolicy: tls: mode: DISABLE
修改
namespaces/istio-system/destination-rule.yaml
,讓 Istio 設定流量政策,為叢集中所有相符的主機啟用 TLS,方法是使用 TLSmodeISTIO_MUTUAL
:cat <<EOF> namespaces/istio-system/destination-rule.yaml apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: annotations: meshsecurityinsights.googleapis.com/generated: "1561996419000000000" name: default namespace: istio-system spec: host: '*.local' trafficPolicy: tls: mode: ISTIO_MUTUAL EOF
將變更推送至存放區
您即將推送設定變更,但建議您先進行幾項檢查,再最終提交更新。
執行
nomos vet
,確保設定有效:nomos vet
如果沒有輸出內容,表示沒有驗證錯誤。
推送變更後,Config Sync 會立即擷取變更並套用至系統。為避免出現非預期結果,建議您檢查設定的目前即時狀態,確認自您編輯後未發生變更。使用
kubectl
檢查destinationrule
是否反映叢集的 mTLS 已停用:kubectl get destinationrule default -n istio-system -o yaml
輸出:
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule ... spec: host: '*.local' trafficPolicy: tls: mode: DISABLE
現在,請將這些變更提交並推送至上游存放區。下列指令會使用
watchmtls
輔助函式,該函式是由init
指令碼提供給環境。這個輔助函式會執行nomos status
和您稍早嘗試的kubectl
指令。它會監控叢集中的變更,直到您按下Ctrl+C
鍵為止。監控畫面,直到變更套用至叢集並完成同步為止。git commit -am "enable mtls" git push origin master && watchmtls
您也可以在 GKE Enterprise 的 Cloud Service Mesh 頁面中查看變更。
您應該會看到紅色的「已解鎖」鎖頭圖示已變更。鎖頭圖示顯示為橘色 (混合流量),而非綠色 (完全加密的流量),是因為系統預設會查看過去一小時的資料,其中包含 mTLS 和純文字。一小時後再回來查看,應該會看到綠色鎖頭,表示您已成功加密所有服務流量。
使用 Policy Controller 設定防護措施
您的安全團隊擔心執行具有權限的容器 (具備根存取權的容器) 時,可能會發生潛在的根攻擊。雖然目前的設定不會部署任何具備特殊權限的容器,但您仍希望盡可能防範所有可能危害效能,甚至是客戶資料的威脅媒介。
儘管團隊盡心盡力,但您仍可能在日後的設定更新中,透過持續交付程序,無意間發現自己容易受到根層級攻擊。您決定設定安全防護措施,防範這類危險。
套用防護機制
防護措施是自動化管理控制項,可強制執行政策,保護您的環境。Policy Controller 支援定義及強制執行原生 Kubernetes 物件未涵蓋的自訂規則。Policy Controller 會檢查、稽核及強制執行您套用的防護措施,確保符合貴機構獨特的安全性、法規遵循和管理需求。
使用 Policy Controller
Policy Controller 以名為 Gatekeeper 的開放原始碼政策引擎為基礎,每當叢集中的資源建立、更新或刪除時,系統就會使用這項引擎強制執行政策。這些政策是透過Policy Controller 範本庫或其他 Gatekeeper 限制範本的限制條件定義。
Google Cloud 上的 Anthos 部署範例已安裝 Policy Controller,並啟用 Policy Controller 範本程式庫。實作安全防護措施時,您可以利用程式庫中現有的受限容器限制,充分發揮這項優勢。
對具備權限的容器套用政策限制
為解決安全團隊的疑慮,您套用了K8sPSPPrivilegedContainer
限制。這項限制會禁止 Pod 執行特殊權限容器。
使用 Cloud Shell 終端機,以程式庫限制中的文字建立新的
constraint.yaml
檔案,如下所示:cat <<EOF> ~/tutorial/anthos-sample-deployment-config-repo/cluster/constraint.yaml apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sPSPPrivilegedContainer metadata: name: psp-privileged-container spec: match: kinds: - apiGroups: [""] kinds: ["Pod"] excludedNamespaces: ["kube-system"] EOF
使用
nomos vet
驗證更新後的設定是否有效,再套用設定。nomos vet
只要沒有錯誤,指令就會以無訊息的方式傳回。
修訂並推送變更,以套用政策。您可以使用
nomos status
和watch
指令,確認變更已套用至叢集。完成後,按下Ctrl+C
鍵即可結束手錶指令。git add . git commit -m "add policy constraint for privileged containers" git push && watch nomos status
輸出:
Connecting to clusters... Current Context Sync Status Last Synced Token Sync Branch Resource Status ------- ------- ----------- ----------------- ----------- --------------- * anthos-sample-cluster1 SYNCED f2898e92 master Healthy
測試政策
套用政策後,您可以嘗試使用具備特殊權限的容器執行 Pod,藉此測試政策。
在 Cloud Shell 終端機中,使用下列指令在教學課程目錄
nginx-privileged.yaml
中建立新檔案,並加入這個範例規格的內容:cat <<EOF> ~/tutorial/nginx-privileged.yaml apiVersion: v1 kind: Pod metadata: name: nginx-privileged-disallowed labels: app: nginx-privileged spec: containers: - name: nginx image: nginx securityContext: privileged: true EOF
嘗試使用
kubectl apply
啟動 Pod。kubectl apply -f ~/tutorial/nginx-privileged.yaml
輸出:
Error from server ([denied by psp-privileged-container] Privileged container is not allowed: nginx, securityContext: {"privileged": true}): error when creating "~/nginx-privileged.yaml": admission webhook "validation.gatekeeper.sh" denied the request: [denied by psp-privileged-container] Privileged container is not allowed: nginx, security Context: {"privileged": true}
這項錯誤顯示,監控 Kubernetes 環境的 Gatekeeper 准入控制器強制執行了新政策。由於 Pod 規格中存在特殊權限容器,因此系統禁止執行 Pod。
您可以套用版本控管政策,透過 Policy Controller 設定防護措施,這項概念非常實用,因為可標準化、統一及集中管理叢集,並在部署後主動監控環境,強制執行政策。
您可以在 Gatekeeper 存放區中找到許多其他類型的政策,做為環境的防護措施。
進一步探索部署作業
本教學課程已說明如何使用部分 GKE Enterprise 安全性功能,但您仍可透過部署作業,在 GKE Enterprise 中探索及執行更多操作。您可以試試其他教學課程,或繼續自行探索 Anthos 範例部署作業,然後按照下一節的清除說明操作。 Google Cloud
清除所用資源
探索 Bank of Anthos 應用程式後,您可以清除在 Google Cloud 上建立的資源,這樣資源就不會占用配額,您日後也無須為其付費。
選項 1:您可以刪除專案。 不過,如果想保留專案,可以使用選項 2 刪除部署作業。
選項 2:如要保留目前的專案,可以使用
terraform destroy
刪除範例應用程式和叢集。
刪除專案 (選項 1)
如要避免付費,最簡單的方法就是刪除您在本教學課程中建立的專案。
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
刪除部署作業 (選項 2)
這個方法會刪除 Bank of Anthos 應用程式和叢集,但不會刪除專案。在 Cloud Shell 中執行下列指令:
變更為裝載安裝指令碼的目錄:
cd bank-of-anthos/iac/tf-anthos-gke
刪除範例和叢集:
terraform destroy
系統出現提示時,請輸入專案 ID。
如要重新部署,請確認符合「事前準備」一節所述的所有需求。
後續步驟
如要進一步瞭解,請參閱 GKE Enterprise 說明文件。
體驗更多教學課程
如要瞭解如何使用 Anthos 範例部署項目管理服務,請參閱「使用 GKE Enterprise 管理服務」。
探索 Google Cloud 的參考架構、圖表和最佳做法。 歡迎瀏覽我們的雲端架構中心。
進一步瞭解 GKE Enterprise
如要進一步瞭解 GKE Enterprise,請參閱技術總覽。
請參閱設定指南,瞭解如何在實際的正式版環境中設定 GKE Enterprise。
如要進一步瞭解如何運用 Cloud Service Mesh 執行更多工作,請參閱 Cloud Service Mesh 說明文件。
如要進一步瞭解 Policy Controller,請參閱 Policy Controller 指南
如要進一步瞭解聲明式集中設定和政策管理,請參閱 Config Sync 說明文件和 Policy Controller 說明文件。