本文將介紹 CIS Kubernetes 基準。此外,這份文件也說明:
- 如何稽核基準的法規遵循情形
- GKE on AWS 設定,您無法自行實作建議。
使用 CIS 基準
網際網路安全中心 (CIS) 會發布最佳做法基準,提供安全性建議。CIS Kubernetes 基準提供一系列建議,協助您設定 Kubernetes 來支援功能強大的安全防護措施。基準與特定 Kubernetes 版本相關。《CIS Kubernetes Benchmark》是為開放原始碼 Kubernetes 發行版本編寫,盡可能適用於各種發行版本。
版本
請注意,不同基準測試的版本號碼可能不盡相同。
本文件參照以下版本:
Anthos 版本 | Kubernetes 版本 | CIS Kubernetes 基準版本 |
---|---|---|
1.14.0 | 1.25.3 | 1.23 |
CIS Kubernetes 基準
存取基準
如要查看 CIS Kubernetes 基準,請前往 CIS 網站。
建議等級
CIS Kubernetes 基準有兩個等級的建議。
等級 | 說明 |
---|---|
1 級 | 最佳化建議的目標: |
第 2 級 | 擴充第 1 級設定檔。 建議具有下列一或多項特徵: |
評估狀態
每項建議都會顯示評估狀態。評估狀態會指出特定建議是否可自動套用,或需要手動步驟才能導入。這兩種狀態同樣重要,且會根據下列定義判斷和支援:
計分 | 說明 |
---|---|
自動 | 代表技術控制項的評估建議,可完全自動化並驗證為通過/失敗狀態。建議會提供導入自動化功能所需的資訊。 |
手動 | 代表無法完全自動評估的技術控制項建議,需要手動驗證設定狀態是否符合預期。預期狀態可能因環境而異。 |
在 GKE on AWS 上執行評估
我們使用下列值,在 GKE on AWS 中指定 Kubernetes 建議的狀態:
狀態 | 說明 |
---|---|
通過 | 符合基準建議。 |
失敗 | 不符合基準建議。 |
等效控制措施 | 不完全符合基準建議中的條款,但 GKE on AWS 中有其他機制可提供同等的安全控管。 |
視環境而定 | GKE on AWS 不會設定與這項建議相關的項目。使用者的設定會決定環境是否符合基準建議。 |
GKE on AWS 的狀態
使用指定版本建立新叢集時,系統會根據 CIS Kubernetes 基準進行效能評估。
GKE on AWS 叢集狀態:
# | 建議 | 等級 | 狀態 |
---|---|---|---|
1 | 控制層安全性設定 | ||
1.1 | 控制層節點設定檔 | ||
1.1.1 | 確認 API 伺服器 Pod 規格檔案權限設為 644 或更嚴格的權限 (自動) |
第 1 級 | 通過 |
1.1.2 | 確保 API 伺服器 Pod 規格檔案擁有權已設為 root:root (自動) |
第 1 級 | 通過 |
1.1.3 | 確保控制器管理員 Pod 規格檔案權限設為 644 或更嚴格的權限 (自動) |
第 1 級 | 通過 |
1.1.4 | 確認控制器管理員 Pod 規格檔案擁有權已設為 root:root (自動) |
第 1 級 | 通過 |
1.1.5 | 確認排程器 Pod 規格檔案權限設為 644 或更嚴格的權限 (自動) |
第 1 級 | 通過 |
1.1.6 | 確認排程器 Pod 規格檔案擁有權已設為 root:root (自動) |
第 1 級 | 通過 |
1.1.7 | 確保 etcd Pod 規格檔案權限設為 644 或更嚴格的權限 (自動) |
第 1 級 | 通過 |
1.1.8 | 確認 etcd Pod 規格檔案擁有權已設為 root:root (自動) |
第 1 級 | 通過 |
1.1.9 | 確認容器網路介面檔案權限設為 644 或更嚴格的權限 (手動) |
第 1 級 | 等效控制措施 |
1.1.10 | 確保容器網路介面檔案擁有權設為 root:root (手動) |
第 1 級 | 等效控制措施 |
1.1.11 | 確認 etcd 資料目錄權限設為 700 或更嚴格的權限 (自動) |
第 1 級 | 等效控制措施 |
1.1.12 | 確保 etcd 資料目錄擁有權已設為 etcd:etcd (自動) |
第 1 級 | 等效控制措施 |
1.1.13 | 確保管理員. conf 檔案權限設為 600 或更嚴格的權限 (自動) |
第 1 級 | 等效控制措施 |
1.1.14 | 確認 admin. conf 檔案擁有權已設為 root:root (自動) |
第 1 級 | 等效控制措施 |
1.1.15 | 確保排程器 . conf 檔案權限設為 644 或更嚴格的權限 (自動) |
第 1 級 | 通過 |
1.1.16 | 確保排程器 . conf 檔案擁有權已設為 root:root (自動) |
第 1 級 | 通過 |
1.1.17 | 確保 controller-manager. conf 檔案權限設為 644 或更嚴格的權限 (自動) |
第 1 級 | 通過 |
1.1.18 | 確保控制層管理員 . conf 檔案擁有權已設為 root:root (自動) |
第 1 級 | 通過 |
1.1.19 | 確保 Kubernetes PKI 目錄和檔案擁有權已設為 root:root (自動) |
第 1 級 | 通過 |
1.1.20 | 確認 Kubernetes PKI 憑證檔案權限設為 644 或更嚴格的權限 (手動) |
第 1 級 | 通過 |
1.1.21 | 確認 Kubernetes PKI 金鑰檔案權限已設為 600 (手動) |
第 1 級 | 通過 |
1.2 | API 伺服器 | ||
1.2.1 | 確認 --anonymous-auth 引數已設為 false (手動) |
第 1 級 | 通過 |
1.2.2 | 確認未設定 --token-auth-file 參數 (自動) |
第 1 級 | 通過 |
1.2.3 | 確認未設定 -- DenyServiceExternalIPs (自動) |
第 1 級 | 通過 |
1.2.4 | 確認 --kubelet-https 引數設為 true (自動) |
第 1 級 | 通過 |
1.2.5 | 確認 --kubelet-client-certificate 和 --kubelet-client-key 引數已適當設定 (自動) |
第 1 級 | 通過 |
1.2.6 | 確認 --kubelet-certificate-authority 引數已適當設定 (自動) |
第 1 級 | 通過 |
1.2.7 | 確認 --authorization-mode 引數未設為 AlwaysAllow (自動) |
第 1 級 | 通過 |
1.2.8 | 確保 --authorization-mode 引數包含節點 (自動) |
第 1 級 | 通過 |
1.2.9 | 確認 --authorization-mode 引數包含 RBAC (自動) |
第 1 級 | 通過 |
1.2.10 | 確認已設定准入控制外掛程式 EventRateLimit (手動) | 第 1 級 | 警告 |
1.2.11 | 確保未設定 AlwaysAdmit 准入控制外掛程式 (自動) | 第 1 級 | 通過 |
1.2.12 | 確保已設定 AlwaysPullImages 准入控制外掛程式 (手動) | 第 1 級 | 警告 |
1.2.13 | 如果未使用 PodSecurityPolicy,請確保已設定許可控制外掛程式 SecurityContextDeny (手動) | 第 1 級 | 等效控制措施 |
1.2.14 | 確保已設定准入控制外掛程式 ServiceAccount (自動) | 第 1 級 | 通過 |
1.2.15 | 確保已設定准入控制外掛程式 NamespaceLifecycle (自動) | 第 1 級 | 通過 |
1.2.16 | 確保已設定 NodeRestriction 准入控制外掛程式 (自動) | 第 1 級 | 通過 |
1.2.17 | 確認 --secure-port 引數未設為 0 (自動) |
第 1 級 | 通過 |
1.2.18 | 確認 --profiling 引數已設為 false (自動) |
第 1 級 | 通過 |
1.2.19 | 確認已設定 --audit-log-path 引數 (自動) |
第 1 級 | 等效控制措施 |
1.2.20 | 確認 --audit-log-maxage 引數已設為 30 或適當的值 (自動) |
第 1 級 | 等效控制措施 |
1.2.21 | 確認 --audit-log-maxbackup 引數已設為 10 或適當的值 (自動) |
第 1 級 | 等效控制措施 |
1.2.22 | 確認 --audit-log-maxsize 引數已設為 100 或適當的值 (自動) |
第 1 級 | 等效控制措施 |
1.2.23 | 確認 --request-timeout 引數已適當設定 (手動) |
第 1 級 | 通過 |
1.2.24 | 確認 --service-account-lookup 引數設為 true (自動) |
第 1 級 | 通過 |
1.2.25 | 確認 --service-account-key-file 引數已適當設定 (自動) |
第 1 級 | 通過 |
1.2.26 | 確認 --etcd-certfile 和 --etcd-keyfile 引數已適當設定 (自動) |
第 1 級 | 通過 |
1.2.27 | 確認 --tls-cert-file 和 --tls-private-key-file 引數已適當設定 (自動) |
第 1 級 | 通過 |
1.2.28 | 確認 --client-ca-file 引數已適當設定 (自動) |
第 1 級 | 通過 |
1.2.29 | 確認 --etcd-cafile 引數已適當設定 (自動) |
第 1 級 | 通過 |
1.2.30 | 確認 --encryption-provider-config 引數已適當設定 (手動) |
第 1 級 | 通過 |
1.2.31 | 確認加密服務供應商設定正確無誤 (手動) | 第 1 級 | 通過 |
1.2.32 | 確保 API 伺服器只使用高強度加密密碼 (手動) | 第 1 級 | 通過 |
1.3 | 控制器管理員 | ||
1.3.1 | 確認 --terminated-pod-gc-threshold 引數已適當設定 (手動) |
第 1 級 | 通過 |
1.3.2 | 確認 --profiling 引數已設為 false (自動) |
第 1 級 | 通過 |
1.3.3 | 確認 --use-service-account-credentials 引數設為 true (自動) |
第 1 級 | 通過 |
1.3.4 | 確認 --service-account-private-key-file 引數已適當設定 (自動) |
第 1 級 | 通過 |
1.3.5 | 確認 --root-ca-file 引數已適當設定 (自動) |
第 1 級 | 通過 |
1.3.6 | 確認 RotateKubeletServerCertificate 引數設為 true (自動) | 第 2 級 | 通過 |
1.3.7 | 確認 --bind-address 引數已設為 127.0.0.1 (自動) |
第 1 級 | 通過 |
1.4 | 排程器 | ||
1.4.1 | 確認 --profiling 引數已設為 false (自動) |
第 1 級 | 通過 |
1.4.2 | 確認 --bind-address 引數已設為 127.0.0.1 (自動) |
第 1 級 | 通過 |
2 | Etcd 節點設定 | ||
2 | Etcd 節點設定 | ||
2.1 | 確認 --cert-file 和 --key-file 引數已適當設定 (自動) |
第 1 級 | 通過 |
2.2 | 確認 --client-cert-auth 引數設為 true (自動) |
第 1 級 | 通過 |
2.3 | 確認 --auto-tls 引數未設為 true (自動) |
第 1 級 | 通過 |
2.4 | 確認 --peer-cert-file 和 --peer-key-file 引數已適當設定 (自動) |
第 1 級 | 通過 |
2.5 | 確認 --peer-client-cert-auth 引數設為 true (自動) |
第 1 級 | 通過 |
2.6 | 確認 --peer-auto-tls 引數未設為 true (自動) |
第 1 級 | 通過 |
2.7 | 確保 etcd 使用專屬的憑證授權單位 (手動) | 第 2 級 | 通過 |
3 | 控制層設定 | ||
3.1 | 驗證和授權 | ||
3.1.1 | 不應為使用者啟用用戶端憑證驗證功能 (手動) | 第 2 級 | 等效控制措施 |
3.2 | Logging | ||
3.2.1 | 確保已建立最低稽核政策 (手動) | 第 1 級 | 通過 |
3.2.2 | 確保稽核政策涵蓋主要安全疑慮 (手動) | 第 2 級 | 等效控制措施 |
4 | 工作站節點安全設定 | ||
4.1 | 工作站節點設定檔 | ||
4.1.1 | 確認 kubelet 服務檔案權限設為 644 或更嚴格的權限 (自動) |
第 1 級 | 通過 |
4.1.2 | 確保 kubelet 服務檔案擁有權已設為 root:root (自動) |
第 1 級 | 通過 |
4.1.3 | 如果 Proxy kubeconfig 檔案存在,請確認權限設為 644 或更嚴格 (手動) |
第 1 級 | 通過 |
4.1.4 | 如果 Proxy kubeconfig 檔案存在,請確認擁有權設為 root:root (手動) |
第 1 級 | 通過 |
4.1.5 | 確保 --kubeconfig kubelet. conf 檔案權限設為 644 或更嚴格的權限 (自動) |
第 1 級 | 通過 |
4.1.6 | 確保 --kubeconfig kubelet. conf 檔案擁有權已設為 root:root (自動) |
第 1 級 | 通過 |
4.1.7 | 確認憑證授權單位檔案權限設為 644 或更嚴格的權限 (手動) |
第 1 級 | 通過 |
4.1.8 | 確認用戶端憑證授權單位檔案擁有權已設為 root:root (手動) |
第 1 級 | 通過 |
4.1.9 | 確認 kubelet --config 設定檔的權限設為 644 或更嚴格的權限 (自動) |
第 1 級 | 通過 |
4.1.10 | 確認 kubelet --config 設定檔擁有權已設為 root:root (自動) |
第 1 級 | 通過 |
4.2 | Kubelet | ||
4.2.1 | 確認 --anonymous-auth 引數已設為 false (自動) |
第 1 級 | 通過 |
4.2.2 | 確認 --authorization-mode 引數未設為 AlwaysAllow (自動) |
第 1 級 | 通過 |
4.2.3 | 確認 --client-ca-file 引數已適當設定 (自動) |
第 1 級 | 通過 |
4.2.4 | 確認 --read-only-port 引數已設為 0 (手動) |
第 1 級 | 失敗 |
4.2.5 | 確認 --streaming-connection-idle-timeout 引數未設為 0 (手動) |
第 1 級 | 通過 |
4.2.6 | 確認 --protect-kernel-defaults 引數設為 true (自動) |
第 1 級 | 失敗 |
4.2.7 | 確認 --make-iptables-util-chains 引數設為 true (自動) |
第 1 級 | 通過 |
4.2.8 | 確認未設定 --hostname-override 引數 (手動) |
第 1 級 | 通過 |
4.2.9 | 請確保 --event-qps 引數設為 0 或可確保適當擷取事件的層級 (手動) |
第 2 級 | 警告 |
4.2.10 | 確認 --tls-cert-file 和 --tls-private-key-file 引數已設為適當值 (手動) |
第 1 級 | 等效控制措施 |
4.2.11 | 確認 --rotate-certificates 引數未設為 false (自動) |
第 1 級 | 通過 |
4.2.12 | 確認 RotateKubeletServerCertificate 引數設為 true (手動) | 第 1 級 | 通過 |
4.2.13 | 確保 Kubelet 只使用強效加密密碼 (手動) | 第 1 級 | 通過 |
GKE on AWS 管理員叢集的失敗說明和對等控制措施:
# | 建議 | 等級 | 狀態 | 值 | 原因 |
---|---|---|---|---|---|
1.1.9 | 確認容器網路介面檔案權限設為 644 或更嚴格的權限 (手動) |
第 1 級 | 等效控制措施 | 755 |
AWS 上的 Anthos 叢集容器網路介面路徑為 /opt/cni/bin ,且權限設為 755 ,可供叢集正常運作。 |
1.1.10 | 確保容器網路介面檔案擁有權設為 root:root (手動) |
第 1 級 | 等效控制措施 | root:root |
AWS 上的 Anthos 叢集容器網路介面路徑為 /opt/cni/bin ,且擁有權設為 root:root 。 |
1.1.11 | 確認 etcd 資料目錄權限設為 700 或更嚴格的權限 (自動) |
第 1 級 | 等效控制措施 | 755 |
etcd 資料目錄 /opt/data/var/lib/etcd 具有預設 755 權限,但其子目錄為 700 。 |
1.1.12 | 確保 etcd 資料目錄擁有權已設為 etcd:etcd (自動) |
第 1 級 | 等效控制措施 | root:root |
etcd 容器會以 root 身分執行,且 etcd 資料目錄的擁有者為 root:root 。 |
1.1.13 | 確保管理員. conf 檔案權限設為 600 或更嚴格的權限 (自動) |
第 1 級 | 等效控制措施 | 未設定 | AWS 中的 Anthos 叢集不支援 kubeadm。 |
1.1.14 | 確認 admin. conf 檔案擁有權已設為 root:root (自動) |
第 1 級 | 等效控制措施 | 未設定 | AWS 中的 Anthos 叢集不支援 kubeadm。 |
1.2.10 | 確認已設定准入控制外掛程式 EventRateLimit (手動) | 第 1 級 | 警告 | 未設定 | Anthos clusters on AWS 不支援 Event Rate Limit 准入控制器,因為這是 Kubernetes Alpha 版功能。 |
1.2.12 | 確保已設定 AlwaysPullImages 准入控制外掛程式 (手動) | 第 1 級 | 警告 | 未設定 | 在非合作式多租戶叢集中,AlwaysPullImages 准入控制器可為私人登錄檔映像檔提供部分保護,但代價是容器登錄檔會成為整個叢集建立新 Pod 的單一故障點。AWS 上的 GKE 不會啟用 AlwaysPullImages 許可控制器,因此叢集管理員必須自行實作許可政策,以做出取捨。 |
1.2.13 | 如果未使用 PodSecurityPolicy,請確保已設定許可控制外掛程式 SecurityContextDeny (手動) | 第 1 級 | 等效控制措施 | 未設定 | Anthos clusters on AWS 會定義預設安全性政策。客戶可以透過安全環境設定安全性相關選項。進一步瞭解安全性總覽。 |
1.2.19 | 確認已設定 --audit-log-path 引數 (自動) |
第 1 級 | 等效控制措施 | 未設定 | AWS 中的 Anthos 叢集提供雲端稽核記錄選項。進一步瞭解 Cloud 稽核記錄。 |
1.2.20 | 確認 --audit-log-maxage 引數已設為 30 或適當的值 (自動) |
第 1 級 | 等效控制措施 | 未設定 | AWS 中的 Anthos 叢集提供雲端稽核記錄選項。進一步瞭解 Cloud 稽核記錄。 |
1.2.21 | 確認 --audit-log-maxbackup 引數已設為 10 或適當的值 (自動) |
第 1 級 | 等效控制措施 | 未設定 | AWS 中的 Anthos 叢集提供雲端稽核記錄選項。進一步瞭解 Cloud 稽核記錄。 |
1.2.22 | 確認 --audit-log-maxsize 引數已設為 100 或適當的值 (自動) |
第 1 級 | 等效控制措施 | 未設定 | AWS 中的 Anthos 叢集提供雲端稽核記錄選項。進一步瞭解 Cloud 稽核記錄。 |
3.1.1 | 不應為使用者啟用用戶端憑證驗證功能 (手動) | 第 2 級 | 等效控制措施 | AWS 上的 Anthos 叢集支援 OIDC,可做為連線至叢集的驗證機制之一。詳情請參閱「連結及驗證叢集」。 | |
3.2.2 | 確保稽核政策涵蓋主要安全疑慮 (手動) | 第 2 級 | 等效控制措施 | 未設定 | AWS 中的 Anthos 叢集提供雲端稽核記錄選項。進一步瞭解 Cloud 稽核記錄。 |
4.2.4 | 確認 --read-only-port 引數已設為 0 (手動) |
第 1 級 | 失敗 | 10255 | Anthos clusters on AWS 目前會將 --read-only-port 引數設為 10255,以便從 kubelet 收集指標。 |
4.2.6 | 確認 --protect-kernel-defaults 引數設為 true (自動) |
第 1 級 | 失敗 | false |
Anthos clusters on AWS 可讓 kubelet 設定必要的核心設定。 |
4.2.9 | 請確保 --event-qps 引數設為 0 或可確保適當擷取事件的層級 (手動) |
第 2 級 | 警告 | 未設定 | 事件是儲存在 etcd 中的 Kubernetes 物件。為避免 etcd 負載過重,這些記錄只會保留一小時,因此不適合做為安全稽核機制。如這個控制項建議,允許無限制的事件會使叢集暴露於不必要的 DoS 風險,並與使用准入 EventRateLimits 的建議相衝突。需要永久儲存的安全相關事件應傳送至記錄。 |
4.2.10 | 確認 --tls-cert-file 和 --tls-private-key-file 引數已設為適當值 (手動) |
第 1 級 | 等效控制措施 | 未設定 | Anthos clusters on AWS 會使用 serverTLSBootstrap 標記管理 kubelet 伺服器 TLS。 |
如何稽核基準
如要瞭解如何稽核每項建議,請參閱相關的 CIS 基準。不過,您可能希望自動執行部分檢查,簡化環境中這些控制項的驗證程序。以下列出的工具可協助您完成這項作業。
自動稽核 CIS Kubernetes 基準
您可以使用開放原始碼工具 kube-bench
,根據 CIS Kubernetes 基準測試叢集設定。
請務必指定適當版本,例如
kube-bench node --benchmark cis-1.23