本文說明如何強化使用 Google Distributed Cloud (僅限軟體) 建立的裸機叢集安全性。
使用 SELinux 保護容器
您可以啟用 SELinux 來保護容器,Red Hat Enterprise Linux (RHEL) 支援這項功能。如果主機執行的是 RHEL,且您想為叢集啟用 SELinux,就必須在所有主機上啟用 SELinux。詳情請參閱「使用 SELinux 保護容器」。
使用 seccomp
限制容器
安全運算模式 (seccomp
) 適用於 Google Distributed Cloud 1.11 以上版本。使用 seccomp
設定檔執行容器可限制容器可對核心發出的系統呼叫,進而提升叢集安全性。這可降低核心漏洞遭人利用的風險。
預設 seccomp
設定檔包含容器可執行的系統呼叫清單。清單中未列出的系統呼叫都會遭到禁止。seccomp
在 1.11 以上版本的叢集中預設為啟用。也就是說,所有系統容器和客戶工作負載都會使用容器執行階段的預設 seccomp
設定檔執行。即使容器和工作負載未在設定檔中指定 seccomp
設定檔,仍會受到 seccomp
限制。
如何停用seccomp
叢集或特定工作負載
只有在建立或升級叢集時,才能停用 seccomp
。
bmctl update
無法用來停用這項功能。如要在叢集中停用 seccomp
,請在叢集的設定檔中新增下列 clusterSecurity
區段:
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: example
namespace: cluster-example
spec:
...
clusterSecurity:
enableSeccomp: false
...
萬一某些工作負載需要執行預設會遭到 seccomp
封鎖的系統呼叫,您不必在整個叢集上停用 seccomp
,您可以改為挑選特定工作負載,在 unconfined mode
中執行。在 unconfined mode
中執行工作負載,可讓該工作負載免受 seccomp
設定檔對叢集其餘部分施加的限制。
如要在 unconfined mode
中執行容器,請在 Pod 資訊清單中新增下列 securityContext
區段:
apiVersion: v1
kind: Pod
....
spec:
securityContext:
seccompProfile:
type: Unconfined
....
不要以 root
使用者身分執行容器
根據預設,容器中的程序會以 root
執行。這可能會造成安全問題,因為如果程序脫離容器,該程序就會以主機電腦上的 root
身分執行。因此,建議您以非超級使用者身分執行所有工作負載。
以下各節說明以非根使用者身分執行容器的兩種方式。
方法 #1:在 Dockerfile
中新增 USER
指令
這個方法會使用 Dockerfile
,確保容器不會以 root
使用者身分執行。在 Dockerfile
中,您可以指定容器內程序應以哪個使用者身分執行。下列 Dockerfile
程式碼片段說明如何執行這項操作:
....
#Add a user with userid 8877 and name nonroot
RUN useradd −u 8877 nonroot
#Run Container as nonroot
USER nonroot
....
在本例中,Linux 指令 useradd -u
會在容器內建立名為 nonroot
的使用者。這位使用者的使用者 ID (UID) 為 8877
。
Dockerfile
中的下一行會執行 USER nonroot
指令。這個指令指定從映像檔中的這一點開始,指令會以 nonroot
使用者的身分執行。
授予 UID 8877
權限,容器程序才能為 nonroot
正常執行。
方法 2:在 Kubernetes 資訊清單檔案中新增 securityContext 欄位
這個方法會使用 Kubernetes 資訊清單檔案,確保容器不會以 root
使用者身分執行。安全設定是針對 Pod 指定,而這些安全設定會套用至 Pod 中的所有容器。
以下範例顯示特定 Pod 的資訊清單檔案摘錄內容:
apiVersion: v1
kind: Pod
metadata:
name: name-of-pod
spec:
securityContext:
runAsUser: 8877
runAsGroup: 8877
....
runAsUser
欄位指定 Pod 中所有容器的所有程序,都以使用者 ID 8877
執行。runAsGroup
欄位指定這些程序的主要群組 ID (GID) 為 8877
。請記得授予 UID 8877
必要且足夠的權限,確保容器程序能正常執行。
這可確保容器內的程序以 UID 8877
執行,該 UID 的權限比 root 少。
Google Distributed Cloud 軟體專屬的系統容器可協助安裝及管理叢集。這些容器使用的 UID 和 GID 可由叢集規格中的 startUIDRangeRootlessContainers
欄位控制。startUIDRangeRootlessContainers
是選填欄位,如未指定,值為 2000
。startUIDRangeRootlessContainers
的允許值為 1000
至 57000
。startUIDRangeRootlessContainers
值只能在升級期間變更。系統容器會使用 startUIDRangeRootlessContainers
到 startUIDRangeRootlessContainers
+ 2999 範圍內的 UID 和 GID。
以下範例顯示叢集資源的資訊清單檔案摘錄:
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: name-of-cluster
spec:
clusterSecurity:
startUIDRangeRootlessContainers: 5000
...
選擇 startUIDRangeRootlessContainers
的值,確保系統容器使用的 UID 和 GID 空間不會與指派給使用者工作負載的空間重疊。
如何停用無 Root 模式
從 Google Distributed Cloud 1.10 版開始,Kubernetes 控制平面容器和系統容器預設會以非根使用者身分執行。Google Distributed Cloud 會在 2000
到 4999
的範圍內,為這些使用者指派 UID 和 GID。不過,如果這些 UID 和 GID 已分配給環境中執行的程序,這項指派作業可能會導致問題。
從 1.11 版開始,升級叢集時可以停用無根模式。停用無根模式後,Kubernetes 控制層容器和系統容器會以超級使用者身分執行。
如要停用無根模式,請按照下列步驟操作:
在叢集的設定檔中新增下列
clusterSecurity
區段:apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: example namespace: cluster-example spec: ... clusterSecurity: enableRootlessContainers: false ...
升級叢集。詳情請參閱「升級叢集」。
限制工作負載自行修改的能力
特定 Kubernetes 工作負載 (尤其是系統工作負載) 有權自行修改。舉例來說,部分工作負載會自動垂直擴充。雖然方便,但如果攻擊者已入侵節點,就能在叢集中進一步擴大影響範圍。舉例來說,攻擊者可能會讓節點上的工作負載變更,以同一個命名空間中權限較高的服務帳戶身分執行。
理想情況下,工作負載不應獲得修改自身的權限。如果需要自行修改,您可以套用 Gatekeeper 或 Policy Controller 限制 (例如開放原始碼 Gatekeeper 程式庫中的 NoUpdateServiceAccount),藉此限制權限。這個程式庫提供多項實用的安全性政策。
部署政策時,通常必須允許管理叢集生命週期的控制器略過政策。這是必要步驟,因為控制器需要變更叢集,例如套用叢集升級。舉例來說,如果您在叢集上部署 NoUpdateServiceAccount
政策,就必須在 Constraint
中設定下列參數:
parameters:
allowedGroups:
- system:masters
allowedUsers: []
停用 kubelet 唯讀通訊埠
從 1.15.0 版開始,Google Distributed Cloud 預設會停用通訊埠 10255
,也就是 kubelet 唯讀通訊埠。如果任何客戶工作負載設定為從這個不安全的 kubelet 連接埠讀取資料 10255
,都應遷移至安全的 kubelet 連接埠 10250。
只有以 1.15.0 以上版本建立的叢集,才會預設停用這個連接埠。即使叢集升級至 1.15.0 以上版本,以低於 1.15.0 版本建立的叢集仍可存取 kubelet 唯讀埠 10255
。
這項變更的原因是 kubelet 會透過未經驗證的 10255
連接埠洩漏低敏感度資訊。這類資訊包括在節點上執行的所有 Pod 的完整設定資訊,對攻擊者來說相當有價值。此外,這項服務也會公開指標和狀態資訊,提供業務相關的洞察資料。
CIS Kubernetes 基準建議停用 kubelet 唯讀埠。
維護
叢集啟動並執行後,請務必監控安全性公告並升級叢集,這是重要的安全措施。
監控安全性公告
GKE 安全團隊會針對高嚴重性和重大嚴重性安全漏洞發布安全性公告。
這些公告採用常見的 Google Cloud 安全漏洞編號架構,並連結至主要Google Cloud 公告頁面和版本資訊。
使用這個 XML 資訊動態饋給,訂閱 Google Kubernetes Engine (GKE) 和相關產品的安全公告。
如果需要客戶採取行動來解決這些高嚴重性和重大安全漏洞,Google 會透過電子郵件與客戶聯絡。此外,Google 也可能會透過支援管道,與簽訂支援合約的客戶聯絡。
如要進一步瞭解 Google 如何管理 GKE 和 GKE Enterprise 的安全漏洞和修補程式,請參閱「安全性修補程式」。
升級叢集
Kubernetes 會定期推出新的安全防護功能,並提供安全修補程式。Google Distributed Cloud 版本會納入 Kubernetes 安全性強化功能,以解決可能影響叢集的安全漏洞。
您有責任確保叢集維持在最新狀態。請參閱各版本的版本資訊。為盡量降低叢集的安全性風險,請規劃每月更新至新的修補程式版本,並每四個月更新至次要版本。
升級叢集的優點之一,就是系統會自動重新整理叢集 kubeconfig 檔案。kubeconfig 檔案會驗證使用者是否可存取叢集。使用 bmctl
建立叢集時,kubeconfig 檔案會新增至叢集目錄。預設名稱和路徑為 bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig
。升級叢集時,系統會自動更新該叢集的 kubeconfig 檔案。否則,kubeconfig 檔案會在建立一年後失效。
如要瞭解如何升級叢集,請參閱升級叢集。
搭配 Cloud Interconnect 或 Cloud VPN 使用 VPC Service Controls
Cloud Interconnect 提供低延遲、高可用性的連線,可讓您在內部部署裸機和Google Cloud 虛擬私有雲 (VPC) 網路之間可靠地轉移資料。如要進一步瞭解 Cloud Interconnect,請參閱專屬互連網路佈建總覽。
Cloud VPN 可以透過 IPsec VPN 連線,以安全的方式將您的對等互連網路連結至虛擬私有雲 (VPC) 網路。如要進一步瞭解 Cloud VPN,請參閱 Cloud VPN 總覽。
VPC Service Controls 可搭配 Cloud Interconnect 或 Cloud VPN,為叢集提供額外的安全防護。VPC Service Controls 有助於降低資料遭竊的風險。您可以透過 VPC Service Controls 將專案加入服務範圍內,如此一來,源自服務範圍外的要求就無法存取相關資源及服務。如要進一步瞭解服務範圍,請參閱「服務範圍詳細資料與設定」。
如要全面保護使用 Google Distributed Cloud 建立的叢集,您必須使用受限 VIP,並將下列 API 新增至服務範圍:
- Artifact Registry API (
artifactregistry.googleapis.com
) - Resource Manager API (
cloudresourcemanager.googleapis.com
) - Compute Engine API (
compute.googleapis.com
) - Connect gateway API (
connectgateway.googleapis.com
) - Google Container Registry API (
containerregistry.googleapis.com
) - GKE Connect API (
gkeconnect.googleapis.com
) - GKE Hub API (
gkehub.googleapis.com
) - GKE On-Prem API (
gkeonprem.googleapis.com
) - Identity and Access Management (IAM) API (
iam.googleapis.com
) - Cloud Logging API (
logging.googleapis.com
) - Cloud Monitoring API (
monitoring.googleapis.com
) - 作業 API 的設定監控 (
opsconfigmonitoring.googleapis.com
) - Service Control API (
servicecontrol.googleapis.com
) - Cloud Storage API (
storage.googleapis.com
)