保護您的 Kubernetes 資料平面強化
此頁面說明如何使用適用於雲端的 Microsoft Defender 之一組專用於 Kubernetes 資料平面強化的安全性建議。
提示
如需可能針對 Kubernetes 叢集和節點出現的安全性建議清單,請檢閱容器建議。
設定工作負載保護
適用於雲端的 Microsoft Defender 包含一組建議,一旦安裝適用於 Kubernetes 的 Azure 原則即可使用。
必要條件
- 新增 Azure 原則的必要 FQDN/應用程式規則。
- (針對非 AKS 叢集) 將現有的 Kubernetes 叢集連線到 Azure Arc。
啟用 Kubernetes 資料平面強化
您可以透過下列兩種方式之一來啟用適用於 Kubernetes 的 Azure 原則:
- 使用方案/連接器設定為目前和未來所有的叢集啟用
- 在現有的叢集上部署適用於 Kubernetes 的 Azure 原則
使用方案/連接器設定為目前和未來所有的叢集啟用適用於 Kubernetes 的 Azure 原則
注意
當您啟用此設定時,適用於 Kubernetes Pod 的 Azure 原則會安裝在叢集上。 此舉會為要使用的 Pod 配置少量的 CPU 和記憶體。 此分配可能會達到最大容量,但不影響資源上其餘的 CPU 和記憶體。
注意
不支援透過連接器為 AWS 啟用,因為 EKS 中有相關限制要求叢集管理員為叢集本身的新 IAM 角色新增權限。
為 Azure 訂用帳戶或內部部署啟用
當您啟用適用於容器的 Microsoft Defender 時,對於 Azure Kubernetes Service 以及相關訂用帳戶中已啟用 Azure Arc 的 Kubernetes 叢集,依預設會啟用「適用於 Kubernetes 的 Azure 原則」設定。 如果您在初始設定上停用該設定,後續可用手動方式加以啟用。
如果您在容器方案下停用了 [適用於 Kubernetes 的 Azure 原則] 設定,您可以依照下列步驟,在訂用帳戶中的所有叢集上加以啟用:
登入 Azure 入口網站。
瀏覽至 [適用於雲端的 Microsoft Defender]>[環境設定]。
選取相關的訂用帳戶。
在 Defender 計劃頁面上,確定容器已切換為 [開啟]。
選取設定。
在 [設定與監視] 頁面中,將 [適用於 Kubernetes 的 Azure 原則] 切換為 [開啟]。
為 GCP 專案啟用
當您在 GCP 連接器上啟用適用於容器的 Microsoft Defender 時,依預設會為相關專案中的 Google Kubernetes Engine 啟用「適用於 Azure Arc 的 Azure 原則延伸模組」設定。 如果您在初始設定上停用該設定,後續可用手動方式加以啟用。
如果您在 GCP 連接器下停用了 [適用於 Azure Arc 的 Azure 原則延伸模組] 設定,您可以依照下列步驟,在您的 GCP 連接器上加以啟用。
在現有的叢集上部署適用於 Kubernetes 的 Azure 原則
您可以透過 [建議] 頁面,在現有的 Kubernetes 叢集上手動設定適用於 Kubernetes 的 Azure 原則。 啟用之後,即會提供強化建議 (部分建議需要另行設定才能運作)。
注意
對於 AWS,無法使用連接器執行大規模上線,但可以使用下列建議將其安裝在所有現有的叢集上或特定叢集上:已啟用 Azure Arc 的 Kubernetes 叢集應安裝適用於 Kubernetes 的 Azure 原則延伸模組。
若要將適用於 Kubernetes 的 Azure 原則部署至指定的叢集:
從建議頁面,搜尋建議相關的建議:
Azure -
"Azure Kubernetes Service clusters should have the Azure Policy add-on for Kubernetes installed"
GCP -
"GKE clusters should have the Azure Policy extension"
。AWS 和內部部署 -
"Azure Arc-enabled Kubernetes clusters should have the Azure policy extension for Kubernetes extension installed"
。提示
建議包含在不同的安全性控制項中,而且您在下一個步驟中選取哪一個控制項並不重要。
從任何安全性控制項,選取建議以查看您可以安裝附加元件的資源。
選取相關叢集,然後選取 [修復]。
檢視和設定建議組合
適用於 Kubernetes 的 Azure 原則安裝完成後大約 30 分鐘,適用於雲端的 Defender 會顯示叢集的健全狀態以提供下列建議,每個建議都位於相關安全性控制項中,如下所示:
注意
如果您是第一次安裝適用於 Kubernetes 的 Azure 原則,這些建議會顯示為建議清單中的新增項目。
提示
某些建議有必須透過 Azure 原則自訂才能有效使用的參數。 例如,若要利用容器映像只能從信任的登錄部署建議,您必須定義信任的登錄。 如果您未針對需要設定的建議輸入必要參數,您的工作負載將會顯示為狀況不良。
注意
Microsoft Defender 感測器和 Azure 監視器代理程式 (AMA) 等元件預設會部署在 kube 系統命名空間中。 此設定可確保它們不會在數據平面建議中標示為不符合規範。 不過,安裝在不同命名空間中的第三方廠商工具可能會標示為不符合規範。 若要從這些建議中排除第三方廠商,您可以將其命名空間新增至排除清單。
建議名稱 | 安全性控制項 | 需要設定 |
---|---|---|
應強制執行容器 CPU 和記憶體限制 | 保護應用程式防範 DDoS 攻擊 | 是 |
容器映像只能從信任的登錄部署 | 補救弱點 | 是 |
應強制容器使用最低特殊權限 Linux 功能 | 管理存取權與權限 | 是 |
容器只能使用允許的 AppArmor 設定檔 | 修復安全性設定 | 是 |
服務僅應在允許的連接埠上接聽 | 限制未經授權的網路存取 | 是 |
應限制主機網路與連接埠的使用 | 限制未經授權的網路存取 | 是 |
Pod HostPath 磁碟區掛接的使用應限定於已知清單 | 管理存取權與權限 | 是 |
應避免具有權限提升的容器 | 管理存取權與權限 | No |
應避免容器共用敏感性主機命名空間 | 管理存取權與權限 | No |
應強制容器使用不可變 (唯讀) 的根檔案系統 | 管理存取權與權限 | No |
Kubernetes 叢集應只能經由 HTTPS 存取 | 加密傳輸中的資料 | No |
Kubernetes 叢集應停用自動掛接 API 認證 | 管理存取權與權限 | No |
Kubernetes 叢集不應使用預設命名空間 | 實作安全性最佳做法 | No |
Kubernetes 叢集不應授與 CAPSYSADMIN 安全性功能 | 管理存取權與權限 | No |
應避免特殊權限容器 | 管理存取權與權限 | No |
應避免以根使用者的身分執行容器 | 管理存取權與權限 | No |
如需哪些參數需要自訂的相關建議,您必須設定參數:
若要設定參數:
登入 Azure 入口網站。
瀏覽至 [適用於雲端的 Microsoft Defender]>[環境設定]。
選取相關的訂用帳戶。
從適用於雲端的 Defender 功能表,選取 [安全性原則]。
選取相關指派。 預設指派是
ASC default
。開啟 [參數] 索引標籤,並視需要修改值。
選取 [檢閱 + 儲存]。
選取 [儲存]。
若要強制執行任何建議:
若要查看哪些建議適用於您的叢集:
開啟「適用於雲端的 Defender」的資產詳細目錄頁面,並將資源類型篩選設定為 Kubernetes 服務。
選取要調查的叢集,並檢閱可用的建議。
當您檢視工作負載保護集中的建議時,受影響的 Pod (「Kubernetes 元件」) 數目會列在叢集旁。 如需特定 Pod 清單,請選取叢集,然後選取 [採取動作]。
若要測試強制執行,請使用下列兩個 Kubernetes 部署:
其中一個適用於符合工作負載保護建議組合規範的良好部署。
另一個適用於不符合「任何」建議規範的狀況不良部署。
依現況部署範例 .yaml 檔案,或使用這些檔案作為您自行修復工作負載的參考。
良好的部署範例 .yaml 檔案
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-healthy-deployment
labels:
app: redis
spec:
replicas: 3
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
annotations:
container.apparmor.security.beta.kubernetes.io/redis: runtime/default
spec:
containers:
- name: redis
image: <customer-registry>.azurecr.io/redis:latest
ports:
- containerPort: 80
resources:
limits:
cpu: 100m
memory: 250Mi
securityContext:
privileged: false
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
runAsNonRoot: true
runAsUser: 1000
---
apiVersion: v1
kind: Service
metadata:
name: redis-healthy-service
spec:
type: LoadBalancer
selector:
app: redis
ports:
- port: 80
targetPort: 80
狀況不良的部署範例 .yaml 檔案
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-unhealthy-deployment
labels:
app: redis
spec:
replicas: 3
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
hostNetwork: true
hostPID: true
hostIPC: true
containers:
- name: redis
image: redis:latest
ports:
- containerPort: 9001
hostPort: 9001
securityContext:
privileged: true
readOnlyRootFilesystem: false
allowPrivilegeEscalation: true
runAsUser: 0
capabilities:
add:
- NET_ADMIN
volumeMounts:
- mountPath: /test-pd
name: test-volume
readOnly: true
volumes:
- name: test-volume
hostPath:
# directory location on host
path: /tmp
---
apiVersion: v1
kind: Service
metadata:
name: redis-unhealthy-service
spec:
type: LoadBalancer
selector:
app: redis
ports:
- port: 6001
targetPort: 9001
下一步
在本文中,您已了解如何設定 Kubernetes 資料平面強化。
如需相關資料,請參閱下列頁面: