CIS 基準

本文將介紹 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