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

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

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

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

Azure Policy for Kubernetesを展開すると、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 clustersにはAzure Policy for Kubernetes add-onがインストールされているはずです
    • GCP:GKEクラスターにはAzure Policy拡張機能がインストールされているはずです
    • AWS/Arc-enabled Kubernetes: Azure Arc enabled 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リソースを制限するパラメータが含まれています。 例えば、コンテナに対してイミュータブル(読み取り専用)のルート ファイルシステムを強制する必要があるポリシーには、excludedContainers、excludedImages、excludedNamespacesの各パラメーターが含まれます。

コンテナの除外はコンテナ名と一致します。 イメージ除外では、値が * で終わる場合、myregistry.azurecr.io/istio:* のようなプレフィックス一致がサポートされます。 信頼できないレジストリから画像を意図せず除外しないように、完全に限定された画像名を使用してください。

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

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

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

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

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

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

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

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

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

  6. 該当するポリシー割り当ての三点メニューを選択し、「 効果とパラメータの管理」を選択します。

    三点メニューを選択してから「エフェクトとパラメータの管理」を選択するスクリーンショットです。

  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

次のステップ