作為安全服務,Azure Kubernetes Service (AKS) 符合 SOC、ISO、PCI DSS 和 HIPAA 標準。 本文涵蓋以 CIS Kubernetes 基準為基礎,套用至 AKS 的安全性強化功能。 如需 AKS 安全性的詳細資訊,請參閱 Azure Kubernetes Service (AKS) 中應用程式和叢集的安全性概念。 如需 CIS 基準的詳細資訊,請參閱網際網路安全中心 (CIS) 基準。
Kubernetes CIS 基準
以下是根據 CIS Kubernetes 基準測試 v1.12.0 在 AKS 上的建議所得的結果。 這些結果適用於AKS 1.32.x至AKS 1.34.x。 如需支援時間表,請參閱支援的 Kubernetes 版本。
附註
除了 Kubernetes CIS 基準之外,還有 AKS CIS 基準 可供使用。
安全性層級
CIS 基準提供兩種安全性設定等級:
- L1 (或等級 1) 會建議可在任何系統上設定,且應該不會中斷服務或減少功能的基本安全性需求。
- L2 (或等級 2) 會針對需要更高安全性 (但可能會因此導致部份功能降低) 的環境建議安全性設定。
評量狀態
每個建議都包含評估狀態。 評量狀態會指出指定的建議是否可以自動化,或需要手動步驟才能實作。 這兩種狀態同樣重要,並且是透過以下方式決定和支援:
- 自動化:代表技術控制措施評量可完全自動化並驗證為通過/失敗狀態的建議。 建議包含實作自動化的必要資訊。
- 手動:代表無法完全自動化技術控件評估的建議,而且需要所有或一些手動步驟來驗證已設定的狀態是否如預期般設定。 預期的狀態可能會根據環境而有所不同。
如果未套用「自動化」建議,則自動化建議會影響基準分數,而「手動」建議則不會。
證明狀態
建議可以有下列其中一個證明狀態:
- 通過:已套用建議。
- 失敗:未套用建議。
- 不適用:建議與資訊清單檔權限需求相關,但那些需求與 AKS 不相關。 Kubernetes 叢集預設會使用資訊清單模型來部署控制平面 Pod,其依賴節點 VM 的檔案。 CIS Kubernetes 基準建議這些檔案必須具有特定權限需求。 AKS 叢集會使用 Helm 圖表來部署控制平面 Pod,而且不會依賴節點 VM 中的檔案。
- 視環境而定 - 建議會套用在使用者的特定環境中,且不受 AKS 控制。 自動化建議會影響基準分數,不論建議是否能套用至使用者的特定環境。
- 等效控制:建議已經以不同但等同的方式實施。
基準詳細資料
| CIS 識別碼 | 建議描述 | 評量狀態 | 層級 | 狀態 | 原因 |
|---|---|---|---|---|---|
| 1 | 控制平面元件 | ||||
| 1.1 | 控制平面節點設定檔 | ||||
| 1.1.1 | 確定 API 伺服器 Pod 規格檔案權限設為 600 或更嚴格 | 自動化 | L1 | N/A | 不適用,因為 AKS 是受控解決方案 |
| 1.1.2 | 確定 API 伺服器 Pod 規格檔案擁有權設定為 root: root |
自動化 | L1 | N/A | 不適用,因為 AKS 是受控解決方案 |
| 1.1.3 | 確定控制器管理員 Pod 規格檔案權限設為 600 或更嚴格 | 自動化 | L1 | N/A | 不適用,因為 AKS 是受控解決方案 |
| 1.1.4 | 確定控制器管理員 Pod 規格檔案擁有權設定為 root: root |
自動化 | L1 | N/A | 不適用,因為 AKS 是受控解決方案 |
| 1.1.5 | 確定排程器 Pod 規格檔案權限設為 600 或更嚴格 | 自動化 | L1 | N/A | 不適用,因為 AKS 是受控解決方案 |
| 1.1.6 | 確定排程器 Pod 規格檔案擁有權設定為 root: root |
自動化 | L1 | N/A | 不適用,因為 AKS 是受控解決方案 |
| 1.1.7 | 確定 etcd Pod 規格檔案權限設為 600 或更嚴格 | 自動化 | L1 | N/A | 不適用,因為 AKS 是受控解決方案 |
| 1.1.8 | 確定etcd Pod 規格檔案擁有權設定為 root: root |
自動化 | L1 | N/A | 不適用,因為 AKS 是受控解決方案 |
| 1.1.9 | 確定容器網路介面檔案權限設為 600 或更嚴格 | 手動 | L1 | N/A | 不適用,因為 AKS 是受控解決方案 |
| 1.1.10 | 確定容器網路介面檔案擁有權設定為 root: root |
手動 | L1 | N/A | 不適用,因為 AKS 是受控解決方案 |
| 1.1.11 | 確定 etcd 資料目錄權限設為 700 或更嚴格 | 自動化 | L1 | N/A | 不適用,因為 AKS 是受控解決方案 |
| 1.1.12 | 確定etcd資料目錄擁有權設定為 etcd:etcd |
自動化 | L1 | N/A | 不適用,因為 AKS 是受控解決方案 |
| 1.1.13 | 確定 admin.conf 檔案權限設為 600 或更嚴格 | 自動化 | L1 | N/A | 不適用,因為 AKS 是受控解決方案 |
| 1.1.14 | 確定 admin.conf 檔案擁有權設定為 root: root |
自動化 | L1 | N/A | 不適用,因為 AKS 是受控解決方案 |
| 1.1.15 | 確定 scheduler.conf 檔案權限設為 600 或更嚴格 | 自動化 | L1 | N/A | 不適用,因為 AKS 是受控解決方案 |
| 1.1.16 | 確定 scheduler.conf 檔案擁有權設定為 root: root |
自動化 | L1 | N/A | 不適用,因為 AKS 是受控解決方案 |
| 1.1.17 | 確定 controller-manager.conf 檔案權限設為 600 或更嚴格 | 自動化 | L1 | N/A | 不適用,因為 AKS 是受控解決方案 |
| 1.1.18 | 確定 controller-manager.conf 檔案擁有權設定為 root: root |
自動化 | L1 | N/A | 不適用,因為 AKS 是受控解決方案 |
| 1.1.19 | 確定 Kubernetes PKI 目錄和檔案擁有權已設定為 root: root |
自動化 | L1 | N/A | 不適用,因為 AKS 是受控解決方案 |
| 1.1.20 | 確定 Kubernetes PKI 憑證檔案權限設為 600 或更嚴格 | 手動 | L1 | N/A | 不適用,因為 AKS 是受控解決方案 |
| 1.1.21 | 確定 Kubernetes PKI 金鑰檔案權限設為 600 | 手動 | L1 | N/A | 不適用,因為 AKS 是受控解決方案 |
| 1.2 | API 伺服器 | ||||
| 1.2.1 | 確定 --anonymous-auth 引數設為 false |
手動 | L1 | 通過 | |
| 1.2.2 | 確定未設定 --token-auth-file 參數 |
自動化 | L1 | 失敗 | 由 AKS 自動輪替,目前已設定參數 |
| 1.2.3 | 確定未設定 --DenyServiceExternalIPs |
手動 | L1 | 失敗 | 客戶可以使用適用於 Kubernetes 的 Azure 原則來拒絕具有外部 IP 的服務。 |
| 1.2.4 | 確定已適當設定 --kubelet-client-certificate 和 --kubelet-client-key 引數 |
自動化 | L1 | 通過 | |
| 1.2.5 | 確定已適當設定 --kubelet-certificate-authority 引數 |
自動化 | L1 | 失敗 | Kubelet 服務憑證使用自我簽署憑證 |
| 1.2.6 | 確定 --authorization-mode 自變數未設定為 AlwaysAllow |
自動化 | L1 | 通過 | |
| 1.2.7 | 確定 --authorization-mode 引數包含 Node |
自動化 | L1 | 通過 | |
| 1.2.8 | 確定 --authorization-mode 引數包含 RBAC |
自動化 | L1 | 通過 | |
| 1.2.9 | 確定已設定許可控制項外掛程式 EventRateLimit | 手動 | L1 | 失敗 | 營運影響 |
| 1.2.10 | 確定未設定許可控制外掛程式 AlwaysAdmit | 自動化 | L1 | 通過 | |
| 1.2.11 | 確定已設定許可控制項外掛程式 AlwaysPullImages | 手動 | L1 | 失敗 | 營運影響 |
| 1.2.12 | 確定已設定許可控制項外掛程式 ServiceAccount | 自動化 | L2 | 通過 | |
| 1.2.13 | 確定已設定許可控制項外掛程式 NamespaceLifecycle | 自動化 | L2 | 通過 | |
| 1.2.14 | 確定已設定許可控制項外掛程式 NodeRestriction | 自動化 | L2 | 通過 | |
| 1.2.15 | 確定 --profiling 引數設為 false |
自動化 | L1 | 通過 | |
| 1.2.16 | 確定已設定 --audit-log-path 引數 |
自動化 | L1 | 通過 | |
| 1.2.17 | 確定 --audit-log-maxage 引數設為 30,或已適當設定 |
自動化 | L1 | 對等控制項 | AKS 會儲存稽核記錄 14 天,Deployment.yaml 的值為 0。 |
| 1.2.18 | 確定 --audit-log-maxbackup 引數設為 10,或已適當設定 |
自動化 | L1 | 對等控制項 | AKS 會儲存稽核記錄 14 天,Deployment.yaml 的值為 0。 |
| 1.2.19 | 確定 --audit-log-maxsize 引數設為 100,或已適當設定 |
自動化 | L1 | 通過 | |
| 1.2.20 | 確定已適當設定 --request-timeout 引數 |
手動 | L1 | 通過 | 未設定參數,這會設定預設值 = 60s (符合規範) |
| 1.2.21 | 確定 --service-account-lookup 引數設為 true |
自動化 | L1 | 通過 | 未設定參數,這會將預設值設定為 true (符合規範) |
| 1.2.22 | 確定已適當設定 --service-account-key-file 引數 |
自動化 | L1 | 通過 | |
| 1.2.23 | 確定已適當設定 --etcd-certfile 和 --etcd-keyfile 引數 |
自動化 | L1 | 通過 | |
| 1.2.24 | 確定已適當設定 --tls-cert-file 和 --tls-private-key-file 引數 |
自動化 | L1 | 通過 | |
| 1.2.25 | 確定已適當設定 --client-ca-file 引數 |
自動化 | L1 | 通過 | |
| 1.2.26 | 確定已適當設定 --etcd-cafile 引數 |
自動化 | L1 | 通過 | |
| 1.2.27 | 確定已適當設定 --encryption-provider-config 引數 |
手動 | L1 | 視環境而定 | 啟用 Azure KMS 時會設定引數 |
| 1.2.28 | 確定已適當設定加密供應商 | 手動 | L1 | 視環境而定 | 啟用 Azure KMS 時會設定引數 |
| 1.2.29 | 確定 API 伺服器只使用強式加密編譯進行加密 | 手動 | L1 | 通過 | AKS 支援來自 CIS 的 21 個建議強式加密套件中的 4 個強式加密套件子集 |
| 1.2.30 | 確定 --service-account-extend-token-expiration 參數已設定為 false |
自動化 | L1 | 視環境而定 | 當叢集上啟用 OIDC 時,此參數會設定為 false |
| 1.3 | 控制器管理員 | ||||
| 1.3.1 | 確定已適當設定 --terminated-pod-gc-threshold 引數 |
手動 | L1 | 通過 | AKS 會將預設值設定為 6000,而不是 12500 |
| 1.3.2 | 確定 --profiling 引數設為 false |
自動化 | L1 | 通過 | |
| 1.3.3 | 確定 --use-service-account-credentials 引數設為 true |
自動化 | L1 | 通過 | |
| 1.3.4 | 確定已適當設定 --service-account-private-key-file 引數 |
自動化 | L1 | 通過 | |
| 1.3.5 | 確定已適當設定 --root-ca-file 引數 |
自動化 | L1 | 通過 | |
| 1.3.6 | 確定 RotateKubeletServerCertificate 引數設為 true | 自動化 | L2 | 通過 | 參數已設定為 true,請參閱 Kubelet 服務憑證輪替 |
| 1.3.7 | 確定 --bind-address 引數設為 127.0.0.1 |
自動化 | L1 | 對等控制項 | Pod 的 IP 已使用 |
| 1.4 | 排程器 | ||||
| 1.4.1 | 確定 --profiling 引數設為 false |
自動化 | L1 | 通過 | |
| 1.4.2 | 確定 --bind-address 引數設為 127.0.0.1 |
自動化 | L1 | 對等控制項 | Pod 的 IP 已使用 |
| 2 | etcd |
||||
| 2.1 | 確定已適當設定 --cert-file 和 --key-file 引數 |
自動化 | L1 | 通過 | |
| 2.2 | 確定 --client-cert-auth 引數設為 true |
自動化 | L1 | 通過 | |
| 2.3 | 確定 --auto-tls 自變數未設定為 true |
自動化 | L1 | 通過 | 未設定參數,這會將預設值設定為 false (符合規範) |
| 2.4 | 確定已適當設定 --peer-cert-file 和 --peer-key-file 引數 |
自動化 | L1 | 通過 | |
| 2.5 | 確定 --peer-client-cert-auth 引數設為 true |
自動化 | L1 | 通過 | |
| 2.6 | 確定 --peer-auto-tls 自變數未設定為 true |
自動化 | L1 | 通過 | 未設定參數,這會將預設值設定為 false (符合規範) |
| 2.7 | 確定針對 etcd 使用唯一的憑證授權單位 |
手動 | L2 | 通過 |
適用於 api-server 的 --client-ca-file 與適用於 etcd 的 --trusted-ca-file 不同 |
| 3 | 控制平面設定 | ||||
| 3.1 | 驗證和授權 | ||||
| 3.1.1 | 使用者不應使用客戶端憑證驗證 | 手動 | L1 | 通過 | 當您部署 AKS 叢集時,預設會啟用本機帳戶。 您可以停用本機帳戶 (部分機器翻譯) 以停用使用用戶端憑證進行驗證。 |
| 3.1.2 | 服務帳號令牌驗證不應用於使用者 | 手動 | L1 | 通過 | AKS 針對傳送至叢集控制平面的要求,提供 Microsoft Entra 驗證的支援。 服務帳戶權杖的使用與否留待客戶決定 (以視需要強制執行最佳做法) |
| 3.1.3 | 不應該為使用者使用啟動程序權杖驗證 | 手動 | L1 | 通過 | 啟動程序權杖無法由使用者使用 |
| 3.2 | 記錄 | ||||
| 3.2.1 | 確定建立最小稽核原則 | 手動 | L1 | 通過 | |
| 3.2.2 | 確定稽核原則涵蓋重要安全性考量 | 手動 | L2 | 通過 | |
| 4 | 背景工作節點 | ||||
| 4.1 | 背景工作角色節點設定檔 | ||||
| 4.1.1 | 確定 kubelet 服務檔案權限設為 600 或更嚴格 | 自動化 | L1 | 通過 | |
| 4.1.2 | 確定 kubelet 服務檔案擁有權設定為 root: root |
自動化 | L1 | 通過 | |
| 4.1.3 | 如果 Proxy kubeconfig 檔案存在,請確保權限設為 600 或更嚴格 | 手動 | L1 | N/A | |
| 4.1.4 | 如果 Proxy kubeconfig 檔案存在,請確定擁有權設定為 root: root |
手動 | L1 | N/A | |
| 4.1.5 | 確定 --kubeconfig kubelet.conf 檔案權限設為 600 或更嚴格 |
自動化 | L1 | 通過 | |
| 4.1.6 | 確定 --kubeconfig kubelet.conf 檔案擁有權設定為 root: root |
自動化 | L1 | 通過 | |
| 4.1.7 | 確定憑證授權單位檔案權限設為 600 或更嚴格 | 手動 | L1 | 通過 | |
| 4.1.8 | 確定客戶端證書頒發機構單位的檔案擁有權設定為 root: root |
手動 | L1 | 通過 | |
| 4.1.9 | 如果正在使用 kubelet config.yaml 設定檔,請確保權限設為 600 或更嚴格 | 自動化 | L1 | 通過 | |
| 4.1.10 | 如果使用 kubelet config.yaml 組態檔,請確定檔案擁有權設定為 root: root |
自動化 | L1 | 通過 | |
| 4.2 | Kubelet | ||||
| 4.2.1 | 確定 --anonymous-auth 引數設為 false |
自動化 | L1 | 通過 | |
| 4.2.2 | 確定 --authorization-mode 自變數未設定為 AlwaysAllow |
自動化 | L1 | 通過 | |
| 4.2.3 | 確定已適當設定 --client-ca-file 引數 |
自動化 | L1 | 通過 | |
| 4.2.4 | 確定 --read-only-port 引數設為 0 |
手動 | L1 | 通過 | |
| 4.2.5 | 確定 --streaming-connection-idle-timeout 自變數未設定為 0 |
手動 | L1 | 通過 | |
| 4.2.6 | 確定 --make-iptables-util-chains 引數設為 true |
自動化 | L1 | 通過 | |
| 4.2.7 | 請確保 --hostname-override 參數未被設定 |
手動 | L1 | 通過 | |
| 4.2.8 | 確定 --eventRecordQPS 引數已設定為能確保適當事件擷取的層級 |
手動 | L2 | 通過 | |
| 4.2.9 | 確定已適當設定 --tls-cert-file 和 --tls-private-key-file 引數 |
手動 | L1 | 通過 | |
| 4.2.10 | 確定 --rotate-certificates 自變數未設定為 false |
自動化 | L1 | 通過 | |
| 4.2.11 | 確定 RotateKubeletServerCertificate 引數已設定為 true | 手動 | L1 | 通過 | |
| 4.2.12 | 確定 Kubelet 只使用強式加密編譯進行加密 | 手動 | L1 | 通過 | |
| 4.2.13 | 確定 Pod PID 上已設定限制 | 手動 | L1 | 通過 | |
| 4.2.14 | 確保 Kubelet 強制使用 RuntimeDefault seccomp 設定檔 |
手動 | L1 | 視環境而定 | AKS 預設為 Unconfined。 可以使用自訂節點配置來啟用 RuntimeDefault seccomp 設定檔。 |
| 4.3 | kube-proxy | ||||
| 4.3.1 | 確定 kube-proxy 計量服務繫結至 localhost | 自動化 | L1 | 失敗 | AKS 具有 kube-proxy 的中央 Prometheus 抓取,並會在偵測到 KubeProxyStale 時套用警示和自動補救。
metrics-bind-address 已針對該目的設定。 |
| 5 | 原則 | ||||
| 5.1 | RBAC 與服務帳戶 | ||||
| 5.1.1 | 確定僅於需要時才使用叢集管理員角色 | 自動化 | L1 | 視環境而定 | 使用適用於 Azure Container Service 的 Azure 原則內建原則定義 (部分機器翻譯) |
| 5.1.2 | 將存取密碼的次數降到最低 | 自動化 | L1 | 視環境而定 | |
| 5.1.3 | 將角色和 ClusterRoles 中使用萬用字元的次數降到最低 | 自動化 | L1 | 視環境而定 | 使用適用於 Azure Container Service 的 Azure 原則內建原則定義 (部分機器翻譯) |
| 5.1.4 | 將存取以建立 Pod 的次數降到最低 | 自動化 | L1 | 視環境而定 | |
| 5.1.5 | 確定預設服務帳戶未主動使用 | 自動化 | L1 | 視環境而定 | |
| 5.1.6 | 確定只會在必要時裝載服務帳戶權杖 | 自動化 | L1 | 視環境而定 | |
| 5.1.7 | 避免使用 system: masters group | 手動 | L1 | 視環境而定 | |
| 5.1.8 | 限制在 Kubernetes 叢集中使用 Bind、Impersonate 和 Escalate 許可權 | 手動 | L1 | 視環境而定 | |
| 5.1.9 | 將存取以建立永續性磁碟區的次數降到最低 | 手動 | L1 | 視環境而定 | |
| 5.1.10 | 將節點 Proxy 子資源的存取降到最低 | 手動 | L1 | 視環境而定 | |
| 5.1.11 | 將certificatesigningrequests物件的批准子資源存取降至最低 |
手動 | L1 | 視環境而定 | |
| 5.1.12 | 將 Webhook 組態物件的存取降至最低 | 手動 | L1 | 視環境而定 | |
| 5.1.13 | 將服務帳戶權杖建立的存取降至最低 | 手動 | L1 | 視環境而定 | |
| 5.2 | Pod 安全性標準 | ||||
| 5.2.1 | 確定叢集至少有一個作用中的原則控制機制已就緒 | 手動 | L1 | 視環境而定 | 使用適用於 Azure Container Service 的 Azure 原則內建原則定義 (部分機器翻譯) |
| 5.2.2 | 將具權限容器的許可數降到最低 | 手動 | L1 | 視環境而定 | 使用適用於 Azure Container Service 的 Azure 原則內建原則定義 (部分機器翻譯) |
| 5.2.3 | 針對想要共用主機處理序識別碼命名空間的容器,將其許可數降到最低 | 手動 | L1 | 視環境而定 | 使用適用於 Azure Container Service 的 Azure 原則內建原則定義 (部分機器翻譯) |
| 5.2.4 | 針對想要共用主機 IPC 識別碼命名空間的容器,將其許可數降到最低 | 手動 | L1 | 視環境而定 | 使用適用於 Azure Container Service 的 Azure 原則內建原則定義 (部分機器翻譯) |
| 5.2.5 | 針對想要共用主機網路命名空間的容器,將其許可數降到最低 | 手動 | L1 | 視環境而定 | 使用適用於 Azure Container Service 的 Azure 原則內建原則定義 (部分機器翻譯) |
| 5.2.6 | 針對使用 allowPrivilegeEscalation 的容器,將其許可數降到最低 | 手動 | L1 | 視環境而定 | 使用適用於 Azure Container Service 的 Azure 原則內建原則定義 (部分機器翻譯) |
| 5.2.7 | 將根容器的許可數降到最低 | 手動 | L2 | 視環境而定 | |
| 5.2.8 | 針對使用 NET_RAW 功能的容器,將其許可數降到最低 | 手動 | L1 | 視環境而定 | 使用適用於 Azure Container Service 的 Azure 原則內建原則定義 (部分機器翻譯) |
| 5.2.9 | 針對具備新增功能的容器,將其許可數降到最低 | 手動 | L1 | 視環境而定 | 使用適用於 Azure Container Service 的 Azure 原則內建原則定義 (部分機器翻譯) |
| 5.2.10 | 針對具備指派功能的容器,將其許可數降到最低 | 手動 | L2 | 視環境而定 | |
| 5.2.11 | 將 Windows HostProcess 容器的許可數降到最低 | 手動 | L1 | 視環境而定 | |
| 5.2.12 | 將 HostPath 磁碟區的許可數降到最低 | 手動 | L1 | 視環境而定 | 使用適用於 Azure Container Service 的 Azure 原則內建原則定義 (部分機器翻譯) |
| 5.2.13 | 針對使用 HostPorts 的容器,將其許可數降到最低 | 手動 | L1 | 視環境而定 | |
| 5.3 | 網路原則和 CNI | ||||
| 5.3.1 | 確定使用中的 CNI 支援網路原則 | 手動 | L1 | 通過 | |
| 5.3.2 | 確定所有命名空間都已定義網路原則 | 手動 | L2 | 視環境而定 | |
| 5.4 | 密碼管理 | ||||
| 5.4.1 | 偏好使用密碼作為檔案,而非將密碼作為環境變數 | 手動 | L2 | 視環境而定 | |
| 5.4.2 | 考量外部密碼儲存體 | 手動 | L2 | 視環境而定 | |
| 5.5 | 可延伸的許可控制項 | ||||
| 5.5.1 | 使用 ImagePolicyWebhook 許可控制器設定映像來源 | 手動 | L2 | 失敗 | 已實施的對等控制 |
| 5.6 | 一般原則 | ||||
| 5.6.1 | 使用命名空間在資源之間建立系統管理界限 | 手動 | L1 | 視環境而定 | |
| 5.6.2 | 確定 seccomp 設定檔已在 Pod 定義中設為 docker/default | 手動 | L2 | 視環境而定 | |
| 5.6.3 | 將資訊安全內容套用至 Pod 和容器 | 手動 | L2 | 視環境而定 | |
| 5.6.4 | 不應使用預設命名空間 | 手動 | L2 | 視環境而定 |
其他注意事項
- 安全性強化的作業系統是專門針對 AKS 所建置和維護,且無法在 AKS 平台外部獲得支援。
- 為了進一步減少受攻擊面區域,已在作業系統中停用一些不必要的核心模組驅動程式。
後續步驟
如需 AKS 安全性的詳細資訊,請參閱下列文章: