Defender for Cloudで Kubernetes データ プレーンのセキュリティ強化を構成する

Kubernetes データ プレーンのセキュリティ強化は、特権コンテナーの制限、リソース制限の適用、ネットワーク アクセスの制限など、クラスターで実行されているワークロードにセキュリティで保護された構成を適用するのに役立ちます。

Microsoft Defender for Cloudでは、Azure Policy for Kubernetesを使ってこれらの構成を評価・強制することでデータプレーン強化が実装されています。 Azure Policyは、自動プロビジョニングが有効になっているときに、Defender for Containers の一部としてデプロイされます。

Defender for Containers プランの設定で Kubernetes のAzure Policyがオフになっている場合は、関連する推奨事項を修復することでデプロイできます。 また、Azure CLIを使ってDefender for Containersコンポーネントをデプロイしたり、Enablement時に自動プロビジョニングを無効にしたり特定のクラスタを自動プロビジョニングから除外した場合、HelmでDefender for Containersコンポーネントをデプロイすることで手動でAzure Policyをデプロイすることもできます。

Kubernetes のAzure Policyがデプロイされると、Defender for Cloudはクラスター構成に基づいてデータ プレーンのセキュリティ強化に関する推奨事項を生成します。 このページでは、これらの推奨事項を確認し、ポリシー パラメーターを構成し、クラスターに適用する方法を示します。

前提条件

開始するには、次の点を確認します。

推奨事項を修復して Kubernetes のAzure Policyを有効にする

もしAzure Policy for Kubernetesがデプロイされていないか、Defender for Containersのプラン設定でオフにされている場合、Defender for Cloudでクラスタタイプに合った推奨をリメディでインストールできます。

  1. Azure portal にサインインする

  2. Microsoft Defender for Cloud>Recommendations に移動します。

  3. 関連する推奨事項を検索します。

    • Azure: Azure Kubernetes Service クラスターには、Kubernetes 用のAzure Policy アドオンがインストールされている必要があります
    • GCP: GKE クラスターには、Azure Policy拡張機能がインストールされている必要があります
    • AWS/Arc 対応 Kubernetes: Azure Arc 対応 Kubernetes クラスターには、Azure Policy拡張機能がインストールされている必要があります

    Azure Kubernetes サービス クラスターの推奨事項を示すスクリーンショット。

  4. レコメンデーションを選択します。

  5. [ アクションの実行 ] タブで、[ 修正] を選択します。

    [修正] ボタンが強調表示されている推奨事項のスクリーンショット。

  6. 選択したリソースを修復するには、[ 修正 ] を選択します。

  7. 推奨事項ごとに繰り返します。

データ プレーンのセキュリティ強化に関する推奨事項

Kubernetes のAzure Policyをデプロイした後、Defender for Cloudはクラスター構成を評価し、データ プレーンのセキュリティ強化に関する推奨事項を生成します。 このプロセスには最大 30 分かかることがあります。

Defender センサーなどのMicrosoftコンポーネントは、既定で kube-system 名前空間にデプロイされ、非準拠としてマークされません。 他の名前空間にインストールされているサード パーティ製コンポーネントにフラグが設定されている可能性があります。 特定の名前空間を除外するには、Azureポリシーの除外を構成します。

次の表に、一般的なデータ プレーンのセキュリティ強化に関する推奨事項を示します。

推奨事項の名前 セキュリティ コントロール 構成が必要
コンテナーの CPU とメモリの制限を強制する必要がある DDoS 攻撃からのアプリケーションの保護 Yes
コンテナー イメージは信頼されたレジストリからのみデプロイする必要がある 脆弱性の修復 Yes
コンテナーで最小限の特権を持つ Linux 機能を適用する必要がある アクセスおよびアクセス許可の管理 Yes
コンテナーでは、許可されている AppArmor プロファイルのみを使用する セキュリティ構成の修復 Yes
サービスは許可されたポートでのみリッスンする必要がある 承認されていないネットワーク アクセスの制限 Yes
ホスト ネットワークとポートの使用を制限する必要がある 承認されていないネットワーク アクセスの制限 Yes
ポッド HostPath ボリューム マウントの使用は既知のリストに制限する必要がある アクセスおよびアクセス許可の管理 Yes
特権エスカレーションを含むコンテナーは避ける必要がある アクセスおよびアクセス許可の管理 No
機密性の高いホストの名前空間を共有するコンテナーは避ける必要がある アクセスおよびアクセス許可の管理 No
コンテナーで不変 (読み取り専用) のルート ファイル システムを適用する必要がある アクセスおよびアクセス許可の管理 No
Kubernetes クラスターは HTTPS 経由でのみアクセス可能である必要がある 転送中のデータを暗号化する No
Kubernetes クラスターで API 資格情報の自動マウントを無効にする必要がある アクセスおよびアクセス許可の管理 No
Kubernetes クラスターで既定の名前空間を使用しないでください セキュリティのベストプラクティスを実装する No
Kubernetes クラスターでCAP_SYS_ADMIN機能を付与しないでください アクセスおよびアクセス許可の管理 No
特権コンテナーの使用を避ける アクセスおよびアクセス許可の管理 No
コンテナーをルート ユーザーとして実行しない アクセスおよびアクセス許可の管理 No

クラスターの推奨事項を表示する

特定のクラスターのデータ プレーンのセキュリティ強化に関する推奨事項を表示するには:

  1. Azure portal にサインインする

  2. Defender for Cloud>Inventory に移動します。

  3. リソースの種類のフィルターを Kubernetes サービス に設定し、[ 適用] を選択します。

    リソースの種類フィルターを使用して kubernetes サービスを選択するスクリーンショット。

  4. 関連するクラスターを選択します。

  5. 使用可能な推奨事項を確認します。 データ プレーンのセキュリティ強化に関する推奨事項には、影響を受ける Kubernetes コンポーネントの数が表示されます。

  6. 影響を受けるリソースを表示する推奨事項を選択します。

    [リソース正常性] ページから推奨事項を選択するスクリーンショット。

  7. [ アクションの実行 ] タブを選択して、修復オプションを確認します。

    推奨事項の修復手順を表示するために使用される [アクションの実行] タブのスクリーンショット。

ポリシー パラメーターを構成する

一部の推奨事項には、基盤となるAzure Policyで評価されるKubernetesリソースを制限するパラメータが含まれています。 例えば、コンテナにはexcludedContainersexcludedImagesパラメータを含む不可excludedNamespacesです。 コンテナの除外はコンテナ名と一致します。 画像除外は、値が *で終わる場合(例: myregistry.azurecr.io/istio:*)で終わる接頭辞マッチングをサポートします。 信頼できないレジストリから画像を意図せず除外しないように、完全に限定された画像名を使用してください。

他の推奨事項では、パラメータ設定が効果的であることが求められます。 たとえば、コンテナーイメージは信頼できるレジストリからのみデプロイされるべきです。これは、信頼できるレジストリの一覧を定義する必要があることを意味します。

必要なパラメーターが構成されていない場合、リソースは異常として表示されます。

ポリシー パラメーターを構成するには:

  1. Azure portal にサインインする

  2. Microsoft Defender for Cloud>Environment settings に移動します。

  3. 関連するサブスクリプションを選択します。

  4. [セキュリティ ポリシー] を選択します

    [セキュリティ ポリシー] ページのスクリーンショット。

  5. [標準] タブ 、関連するセキュリティ標準を選択します。

  6. 関連するポリシーの割り当ての 3 ドット メニューを選択し、[ 効果とパラメーターの管理] を選択します。

    [3 ドット] メニューを選択し、[効果とパラメーターの管理] を選択したスクリーンショット。

  7. 必要なパラメーター値を更新します。

    パラメーター パネルのスクリーンショット。

  8. 保存を選びます。

データ プレーンのセキュリティ強化ポリシーを適用する

既定では、ポリシーは監査モードでリソースを評価します。 ポリシーを適用するには、その効果を [拒否] に設定します。

推奨事項を適用するには:

  1. Azure portal にサインインする

  2. Microsoft Defender for Cloud>Recommendations に移動します。

  3. 関連するデータ プレーンのセキュリティ強化に関する推奨事項を検索して選択します。

  4. [ アクションの実行 ] タブで、[ 拒否] を選択します。

    Azure Policy のパラメーター拒否オプションを示すスクリーンショット

  5. スコープを設定します。

  6. 拒否に変更を選択します。

ポリシーの適用をテストする

テスト ワークロードをデプロイすることで、データ プレーンのセキュリティ強化ポリシーを検証できます。

  • データプレーンの強化要件に準拠したデプロイメント
  • 複数のポリシーに違反する非準拠の展開

ポリシーの適用設定に応じて、準拠しているワークロードが正常にデプロイされ、準拠していないワークロードにフラグが設定またはブロックされていることを確認するには、次の YAML ファイルの例をデプロイします。

準拠している展開の例

以下のデプロイでは、信頼されたコンテナレジストリを使用し、CPUおよびメモリの制限を適用し、権限のエスカレーションを無効化し非rootユーザーとして実行する制限的なセキュリティコンテキストを適用します。

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

非準拠のデプロイの例

以下の展開は、特権コンテナをrootとして実行し、ホストネットワークや共有名前空間の有効化、ホストパスボリュームのマウントなど、複数のデータプレーン強化ポリシーを意図的に違反しています。

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

  • Azure CLI

次のステップ