Share via


保護您的 Kubernetes 資料平面強化

此頁面說明如何使用適用於雲端的 Microsoft Defender 之一組專用於 Kubernetes 資料平面強化的安全性建議。

提示

如需可能針對 Kubernetes 叢集和節點顯示的安全性建議清單,請參閱建議參考資料表的容器建議一節。

設定工作負載保護

適用於雲端的 Microsoft Defender 包含一組建議,一旦安裝適用於 Kubernetes 的 Azure 原則即可使用。

必要條件

啟用 Kubernetes 資料平面強化

您可以透過下列兩種方式之一來啟用適用於 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 原則] 設定,您可以依照下列步驟,在訂用帳戶中的所有叢集上加以啟用:

  1. 登入 Azure 入口網站

  2. 瀏覽至 [適用於雲端的 Microsoft Defender]>[環境設定]

  3. 選取相關的訂用帳戶。

  4. 在 Defender 計劃頁面上,確定容器已切換為 [開啟]

  5. 選取設定

    Screenshot showing the settings button in the Defender plan.

  6. 在 [設定與監視] 頁面中,將 [適用於 Kubernetes 的 Azure 原則] 切換為 [開啟]

    Screenshot showing the toggles used to enable or disable the extensions.

為 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 原則部署至指定的叢集

  1. 從建議頁面,搜尋建議相關的建議:

    • 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"Screenshot showing the Azure Kubernetes service clusters recommendation.

      提示

      建議包含在不同的安全性控制項中,而且您在下一個步驟中選取哪一個控制項並不重要。

  2. 從任何安全性控制項,選取建議以查看您可以安裝附加元件的資源。

  3. 選取相關叢集,然後選取 [修復]

    Screenshot that shows how to select the cluster to remediate.

檢視和設定建議組合

適用於 Kubernetes 的 Azure 原則安裝完成後大約 30 分鐘,適用於雲端的 Defender 會顯示叢集的健全狀態以提供下列建議,每個建議都位於相關安全性控制項中,如下所示:

注意

如果您是第一次安裝適用於 Kubernetes 的 Azure 原則,這些建議會顯示為建議清單中的新增項目。

提示

某些建議有必須透過 Azure 原則自訂才能有效使用的參數。 例如,若要利用容器映像只能從信任的登錄部署建議,您必須定義信任的登錄。 如果您未針對需要設定的建議輸入必要參數,您的工作負載將會顯示為狀況不良。

建議名稱 安全性控制項 需要設定
應強制執行容器 CPU 和記憶體限制 保護應用程式防範 DDoS 攻擊
容器映像只能從信任的登錄部署 補救弱點
應強制容器使用最低特殊權限 Linux 功能 管理存取權與權限
容器只能使用允許的 AppArmor 設定檔 修復安全性設定
服務僅應在允許的連接埠上接聽 限制未經授權的網路存取
應限制主機網路與連接埠的使用 限制未經授權的網路存取
Pod HostPath 磁碟區掛接的使用應限定於已知清單 管理存取權與權限
應避免具有權限提升的容器 管理存取權與權限 No
應避免容器共用敏感性主機命名空間 管理存取權與權限 No
應強制容器使用不可變 (唯讀) 的根檔案系統 管理存取權與權限 No
Kubernetes 叢集應只能經由 HTTPS 存取 加密傳輸中的資料 No
Kubernetes 叢集應停用自動掛接 API 認證 管理存取權與權限 No
Kubernetes 叢集不應使用預設命名空間 實作安全性最佳做法 No
Kubernetes 叢集不應授與 CAPSYSADMIN 安全性功能 管理存取權與權限 No
應避免特殊權限容器 管理存取權與權限 No
應避免以根使用者的身分執行容器 管理存取權與權限 No

如需哪些參數需要自訂的相關建議,您必須設定參數:

若要設定參數

  1. 登入 Azure 入口網站

  2. 瀏覽至 [適用於雲端的 Microsoft Defender]>[環境設定]

  3. 選取相關的訂用帳戶。

  4. 從適用於雲端的 Defender 功能表,選取 [安全性原則]

  5. 選取相關指派。 預設指派是 ASC default

  6. 開啟 [參數] 索引標籤,並視需要修改值。

    Screenshot showing where to modify the parameters for one of the recommendations in the Kubernetes data plane hardening protection bundle.

  7. 選取 [檢閱 + 儲存]

  8. 選取 [儲存]。

若要強制執行任何建議

  1. 開啟建議詳細資料頁面,然後選取 [拒絕]

    Screenshot showing the Deny option for Azure Policy parameter.

    設定範圍的窗格隨即開啟。

  2. 設定範圍,然後選取 [變更為拒絕]

若要查看哪些建議適用於您的叢集

  1. 開啟「適用於雲端的 Defender」的資產詳細目錄頁面,並將資源類型篩選設定為 Kubernetes 服務

  2. 選取要調查的叢集,並檢閱可用的建議。

當您檢視工作負載保護集中的建議時,受影響的 Pod (「Kubernetes 元件」) 數目會列在叢集旁。 如需特定 Pod 清單,請選取叢集,然後選取 [採取動作]

Screenshot showing where to view the affected pods for a Kubernetes recommendation.

若要測試強制執行,請使用下列兩個 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 資料平面強化。

如需相關資料,請參閱下列頁面: