Kubernetes データ プレーンのセキュリティ強化を保護する

このページでは、Kubernetes データ プレーンのセキュリティ強化に特化した、Microsoft Defender for Cloud のセキュリティの推奨事項を使用する方法について説明します。

ヒント

表示される可能性がある、Kubernetes クラスターおよびノードに関するセキュリティの推奨事項の一覧については、コンテナーの推奨事項に関する記事をご覧ください。

ワークロード保護を設定する

Microsoft Defender for Cloud には、Kubernetes 用の Azure Policy のインストールを完了すると使用可能になる推奨事項のバンドルが含まれています。

前提条件

Kubernetes データ プレーンのセキュリティ強化を有効にする

Kubernetes 用の Azure Policy は、次の 2 つの方法のいずれかで有効にすることができます:

プラン/コネクタ設定を使用し、現在および将来のすべてのクラスターに対して Azure Policy for Kubernetes を有効にする

Note

この設定を有効にすると、Kubernetes 用のAzure Policy のポッドがクラスターにインストールされます。 そうすることで、ポッドが使用する CPU とメモリの量の割り当てが少なくなります。 この割り当てが最大容量に達する可能性はありますが、リソースの残りの CPU とメモリには影響しません。

注意

クラスター管理者がクラスター自体に新しい IAM ロールの権限を追加する必要がある EKS における制限のため、コネクタを介した AWS に対する有効化はサポートされていません。

Azure サブスクリプションまたはオンプレミスに対する有効化

Microsoft Defender for Containers を有効にすると、Azure Kubernetes Service と、関連するサブスクリプション内の Azure Arc 対応 Kubernetes クラスターに対して、既定で "Kubernetes 用の Azure Policy" 設定が有効になります。 初期構成で設定を無効にした場合でも、後で手動で有効にすることができます。

コンテナー プランで "Azure Policy for Kubernetes" 設定を無効にした場合は、以下の手順に従って、サブスクリプション内のすべてのクラスターで有効にすることができます。

  1. Azure portal にサインインします。

  2. [Microsoft Defender for Cloud]>[Environment settings](環境設定) に移動します。

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

  4. [Defender プラン] ページで、[コンテナー] が [オン] に切り替えられていることを確認します。

  5. [設定] を選択します。

    Defender プランの設定ボタンを示すスクリーンショット。

  6. [設定と監視] ページで、''Azure Policy for Kubernetes'' を [オン] に切り替えます。

    拡張機能を有効または無効にするために使用されるトグルを示すスクリーンショット。

GCP プロジェクトに対する有効化

GCP コネクタで Microsoft Defender for Containers を有効にすると、関連するプロジェクトの Google Compute Engine に対して "Azure Policy Extension for Azure Arc" 設定が既定で有効になります。 初期構成で設定を無効にした場合でも、後で手動で有効にすることができます。

GCP コネクタで "Azure Policy Extension for Azure Arc" 設定を無効にした場合は、以下の手順に従って GCP コネクタで有効にすることができます。

既存のクラスターに Azure Policy for Kubernetes をデプロイする

[推奨事項] ページから、既存の Kubernetes クラスターで Azure Policy for Kubernetes を手動構成できます。 有効にすると、堅牢化に関する推奨事項が使用可能になります (一部の推奨事項では、堅牢化に別の構成が必要です)。

Note

AWS の場合、コネクタを使って大規模にオンボードすることはできませんが、Azure Arc 対応 Kubernetes クラスターに Kubernetes 拡張機能向け Azure ポリシー拡張機能をインストールするという推奨事項を使って、すべての既存クラスターまたは特定のクラスターにこれをインストールできます。

Azure Policy for Kubernetes を指定したクラスターにデプロイするには:

  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". Azure Kubernetes サービス クラスターの推奨事項を示すスクリーンショット。

      ヒント

      この推奨事項は異なるセキュリティ コントロールに含まれていますが、次の手順ではどれを選択してもかまいません。

  2. いずれかのセキュリティ コントロールから、推奨事項を選択して、アドオンをインストールできるリソースを確認します。

  3. 関連するクラスターを選択し、[修復] を選択します。

    修復するクラスターを選択する方法を示すスクリーンショット。

推奨事項のバンドルを表示して構成する

Azure Policy for Kubernetes のインストールが完了してから約 30 分後、Defender for Cloud は、図に示すように関連するセキュリティ コントロールで、それぞれ以下の推奨事項に関するクラスターの正常性状態を表示します:

Note

Azure Policy for Kubernetes を初めてインストールしている場合、これらの推奨事項は、推奨事項の一覧に新しく追加されたものとして表示されます。

ヒント

一部の推奨事項にはパラメーターが含まれており、それらを効果的に使用するために、Azure Policy を使用してカスタマイズする必要があります。 たとえば、コンテナー イメージは信頼されたレジストリからのみデプロイする必要がありますというレコメンデーションのメリットを得るには、信頼されたレジストリを定義する必要があります。 構成を必要とする推奨事項に必要なパラメーターを入力していない場合、ワークロードは異常と表示されます。

Note

Defender センサーや Azure Monitor エージェント (AMA) などの Microsoft コンポーネントは、既定で kube-system 名前空間にデプロイされます。 このセットアップにより、それらがデータ プレーンの推奨事項内で非準拠としてマークされなくなります。 しかし、別の名前空間にインストールされているサード パーティ ベンダー ツールは、非準拠としてフラグが設定される場合があります。 これらの推奨事項からサード パーティ ベンダーを除外するには、それらの名前空間を除外リストに追加します。

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

カスタマイズする必要があるパラメーターが含まれた推奨事項では、次のようにパラメーターを設定する必要があります。

パラメーターを設定するには:

  1. Azure portal にサインインします。

  2. [Microsoft Defender for Cloud]>[Environment settings](環境設定) に移動します。

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

  4. Defender for Cloud のメニューから、[セキュリティ ポリシー] を選択します

  5. 関連する割り当てを選択します。 既定の割り当ては ASC default です。

  6. [パラメーター] タブを開き、必要に応じて値を変更します。

    Kubernetes データ プレーンの保護強化バンドルで推奨事項の 1 つのパラメーターを変更する場所を示すスクリーンショット。

  7. [確認と保存] を選択します。

  8. [保存] を選択します。

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

  1. 推奨事項の詳細ページを開き、 [拒否] を選択します。

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

    スコープを設定するペインが開きます。

  2. スコープを設定して [拒否に変更] を選択します。

クラスターに適用される推奨事項を確認するには:

  1. Defender for Cloud の資産インベントリ ページを開き、リソースの種類フィルターを [Kubernetes サービス] に設定します。

  2. 調査するクラスターを選択し、クラスターで利用可能な推奨事項を確認します。

ワークロード保護セットからの推奨事項を表示すると、影響を受けるポッド ("Kubernetes components") の数がクラスターの横に表示されます。 特定のポッドの一覧を表示するには、クラスターを選択し、 [アクションの実行] を選択します。

Kubernetes の推奨事項の影響を受けるポッドを表示する場所を示すスクリーンショット。

適用をテストするには、次の 2 つの Kubernetes デプロイを使用します

  • 1 つは、ワークロード保護の推奨事項のバンドルに準拠した正常なデプロイ用です。

  • もう 1 つは、推奨事項の "いずれか" に準拠していない異常なデプロイ用です。

例の .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 データ プレーンのセキュリティ強化を構成する方法について説明しました。

関連資料については、次のページを参照してください。