すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:Pod セキュリティポリシーの設定

最終更新日:Jun 23, 2026

クラスターのコンプライアンス要件を満たし、セキュリティを強化するために、ポリシーガバナンス機能を有効にします。この機能は、Kubernetes コンテナアプリケーション向けのセキュリティポリシーライブラリを提供します。これには、Infra (インフラストラクチャ層リソース)、Compliance (Kubernetes コンプライアンス標準)、PSP (PodSecurityPolicy 機能の拡張)、K8s-general (一般ポリシー) などのカテゴリが含まれます。Container Service for Kubernetes (ACK) コンソールでコンテナアプリケーションのセキュリティポリシーを有効化またはカスタマイズして、Pod のデプロイと更新が安全かつ制御されていることを確認できます。

ポリシーガバナンス

Kubernetes v1.21 以降、PodSecurityPolicy (PSP) は非推奨となりました。これに対応して、ACK は元の PSP ベースのポリシー管理機能をアップグレードしました。Open Policy Agent (OPA) ポリシーを使用する Gatekeeper アドミッションコントローラー上に構築され、ACK はポリシーガバナンスステータス統計、ログレポート、ログ検索などの機能でこの機能を強化しています。ACK には、幅広い Kubernetes アプリケーションシナリオに合わせたルールを持つ豊富なポリシーライブラリも含まれています。これらのポリシーは、ACK コンソールのユーザーフレンドリなインターフェイスを通じて設定でき、ポリシーガバナンスの使用を簡素化します。

前提条件

  • クラスターは Kubernetes 1.16 以降を実行している必要があります。クラスターをアップグレードするには、「ACK クラスターの手動アップグレード」をご参照ください。

  • RAM ユーザーを使用してポリシーを管理する場合、RAM ユーザーに次の権限があることを確認してください:

    • cs:DescribePolicies:ポリシーライブラリ内のポリシーを一覧表示します。

    • cs:DescribePolicyDetails:ポリシーテンプレートの詳細を取得します。

    • cs:DescribePolicyGovernanceInCluster:クラスターのポリシーガバナンスの詳細を取得します。

    • cs:DescribePolicyInstances:クラスターにデプロイされているポリシーインスタンスを一覧表示します。

    • cs:DescribePolicyInstancesStatus:クラスター内の異なるポリシータイプに対するポリシーインスタンスのデプロイステータスを取得します。

    • cs:DeployPolicyInstance:指定されたクラスターにポリシーインスタンスをデプロイします。

    • cs:DeletePolicyInstance:指定されたクラスターのポリシーインスタンスを削除します。

    • cs:ModifyPolicyInstance:指定されたクラスターのポリシーインスタンスを変更します。

    カスタム RAM ポリシーの作成方法の詳細については、「RAM を使用したクラスターとクラウドリソースへのアクセス権限の付与」をご参照ください。

ポリシーガバナンスコンポーネント

ACK は、マネージドバージョンと非マネージドバージョンの 2 種類のポリシーガバナンスコンポーネントを提供しています。1 つのクラスターで一度に有効にできるのは 1 種類のみです。次の表は、2 つのバージョンを比較したものです。

項目

マネージドバージョン

非マネージドバージョン

デプロイモード

コントロールプレーンデプロイ:ACK はクラスターのコントロールプレーン上にコンポーネントをデプロイし、完全に管理します。

データプレーンデプロイ:コンポーネントはクラスター内のワークロードとしてデプロイされ、デフォルトで kube-system 名前空間にインストールされ、ワーカーノードの Pod リソースを消費します。

対象クラスター

Auto Mode クラスター v1.30 以降

ACK マネージドクラスターおよびACK 専用クラスター v1.16 以降

起動パラメーター設定

システムがコンポーネントの起動パラメーターを設定し、カスタマイズはできません。

コンポーネントの起動パラメーターをカスタマイズできます。

コアコンポーネントのインストール

  • managed-gatekeeper

  • managed-policy-template-controller

ACK コンソールの アドオン管理 ページでは、マネージドバージョンのコンポーネントカードにマネージドアイコンimageが表示されます。
  • gatekeeper

  • policy-template-controller

  • ログ収集コンポーネント (logtail-ds または loongcollector)

ポリシーログ収集

ACK マネージドクラスターのコントロールプレーンコンポーネントのログを収集する機能を使用してログを収集し、指定された Log Service プロジェクトに送信します。

クラスターにログ収集コンポーネントをインストールしてログを収集し、指定された Log Service プロジェクトに送信します。

ポリシーライブラリ

ACK の事前定義済みセキュリティポリシーのすべてのポリシー

注意事項

  • この機能は Linux ノードにのみ適用されます。

  • この機能はカスタムポリシーをサポートしていません。すべてのルールは、組み込みの ACK ポリシーライブラリから取得する必要があります。

手順 1:ポリシーガバナンスのインストールまたはアップグレード

  1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。

  2. クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、Security > ポリシーのガバナンス をクリックします。

  3. Policy ページで、画面の指示に従ってコンポーネントをインストールまたはアップグレードします。

    ポリシーガバナンス機能を有効にするには、次のコンポーネントをインストールする必要があります。これらのコンポーネントは無料ですが、Pod リソースを消費します。

    • gatekeeper:OPA ポリシーエンジンに基づく Kubernetes ポリシーアドミッションコントローラーです。クラスターで OPA ポリシーを管理および適用し、名前空間ラベル管理などの機能を実装するのに役立ちます。

      説明

      ACK が提供する gatekeeper コンポーネントを使用する必要があります。他のソースから gatekeeper コンポーネントをインストールした場合は、それをアンインストールしてから、ACK が提供するバージョンを再インストールしてください。gatekeeper コンポーネントのリリースノートの詳細については、「gatekeeper」をご参照ください。

    • ログ収集コンポーネント:ポリシー制約によって拒否またはフラグが立てられたリクエストのイベントを収集および取得します。

    • policy-template-controller:Alibaba Cloud ポリシーテンプレートに基づいて開発された Kubernetes コントローラーです。異なるポリシーテンプレートからデプロイされたポリシーインスタンスと、クラスターの全体的なガバナンスステータスをより良く管理するのに役立ちます。

手順 2:ポリシーガバナンスの使用

エントリポイント

  1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。

  2. クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、Security > ポリシーのガバナンス をクリックします。

  3. Policy ページで、プロンプトが表示された場合は画面の指示に従ってコンポーネントをインストールまたはアップグレードし、必要に応じて操作を実行します。

ポリシー適用ステータスの表示

概要 タブをクリックして、クラスターの現在のポリシーガバナンスステータスを表示します。

  • ポリシー概要セクションには、高リスクおよび中リスクの保護ポリシーの総数、有効化されたポリシーの数、および有効化が推奨されるポリシーのリストが表示されます。

  • 過去 7 日間の拒否されたリクエストとアラートの統計。

  • 過去 7 日以内のポリシー適用レコードが表示されます。 テーブルには、デフォルトで、過去 7 日間に拒否されたリクエストまたはアラートの最新 100 件のログが表示されます。 より多くの監査ログを表示するには、過去 7 日間の操作 の横にある 未知 アイコンをクリックし、表示されたポップアップウィンドウで Log Service リンクをクリックすると、Log Service コンソールの指定された Logstore ですべてのログを表示できます。 ページ下部にある [過去 7 日間のポリシー適用レコード] テーブルには、各ポリシーの 適用時間、ポリシータイプ、ポリシー名、ポリシーの説明、リスクレベル、アクション、および 詳細 が表示されます。 検索ボックスとフィルターボタンを使用して、特定のレコードを検索できます。

ポリシーインスタンスの作成と管理

マイポリシー タブをクリックし、ポリシーインスタンスの作成 をクリックします。ポリシーインスタンスの作成 ダイアログボックスで、パラメーターを設定します。

パラメーター

説明

ポリシータイプ

ポリシータイプを選択します。有効な値:

  • infra:インフラストラクチャ層リソースに関連するポリシー。

  • compliance:Alibaba Cloud Kubernetes セキュリティ強化など、Kubernetes コンプライアンス標準に基づいてカスタマイズされたポリシー。

  • psp:Pod Security Policy (PSP) の機能を置き換えるポリシー。

  • k8s-general:セキュリティのベストプラクティスに基づいて Kubernetes リソース設定にセキュリティ制約を適用する一般ポリシー。

詳細については、「ACK の事前定義済みセキュリティポリシー」をご参照ください。

ポリシー名

選択したポリシータイプに基づいて、ドロップダウンリストからデプロイしたいポリシーテンプレートの名前を選択します。

操作

  • Deny:ポリシーに違反するリソースのデプロイをブロックします。

  • Alert:ポリシーに違反するリソースのデプロイを許可しますが、アラートログを生成します。

範囲

ポリシーインスタンスが適用されるクラスター内の名前空間を選択します。

パラメーター

  • テキストボックスが空の場合、ルールにパラメーターは不要です。

  • テキストボックスにパラメーターテンプレートが含まれている場合、パラメーターの説明に基づいて指定された形式でパラメーターを設定します。

ポリシーとインスタンスの表示

マイポリシー タブをクリックして、クラスターでデプロイ可能なすべてのポリシーを表示します。

  • リストの右上隅で表示されるポリシーをフィルターできます。有効化されたポリシーが最初に表示されます。[インスタンス] 列には、クラスターに対応するポリシーでデプロイされたインスタンスの数が表示されます。

    [インスタンス] 列の値が空の場合、そのポリシーはクラスターにデプロイされていません。Actions 列の 有効 をクリックしてパラメーターを設定し、ポリシーインスタンスをデプロイできます。

  • Actions 列の 編集 をクリックして、ポリシーインスタンスの設定を変更します。

    ポリシーに複数のインスタンスがある場合は、Actions 列の ポリシーインスタンスを表示 をクリックし、目的のインスタンスで 編集 をクリックして変更します。

  • クラスターにデプロイされているポリシーのすべてのインスタンスを削除するには、Actions 列の 削除 をクリックします。

ポリシーの説明とテンプレートの例の詳細については、「ACK の事前定義済みセキュリティポリシー」をご参照ください。

関連操作

削除保護の有効化

手順 1:ポリシーガバナンスのインストールまたはアップグレードで説明されているように ポリシーガバナンス機能を有効にすると、重要なビジネスや機密データに関わる名前空間やサービスの削除保護を有効にして、誤削除を防ぐこともできます。削除保護が有効になっている場合、対応するリソースを削除する前に手動で無効にする必要があります。

このセクションでは、既存の名前空間に対して削除保護を有効にする方法を示します。他のリソースについてもプロセスは同様です。

  • 既存の名前空間の削除保護を有効にする

    1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。

    2. クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、名前空間とクォータ をクリックします。

    3. 名前空間のリストで、管理したい名前空間を見つけ、アクション 列の 編集 をクリックし、ダイアログボックスの画面の指示に従って削除保護を有効にします。

  • 既存のサービスの削除保護を有効にする

    1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。

    2. クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、ネットワーク > サービス をクリックします。

    3. 「サービス」のリストで、管理するサービスを見つけ、アクション 列の image をクリックし、削除保護の有効化 をクリックします。その後、ダイアログボックスの画面の指示に従って削除保護を有効にします。

ack-policy-external-provider によるクロスリソース検証

デフォルトでは、Gatekeeper はレビュー中のオブジェクトのみに基づいてポリシー決定を行います。ただし、複雑なセキュリティシナリオでは、正確な適用のためにポリシーが他のクラスターリソースの状態を確認する必要があることがよくあります。

マネージドコンポーネント ack-policy-external-provider は、Gatekeeper の外部データソースとして機能し、ポリシー開発者が Rego コード内から Kubernetes リソースをクエリできるようにします。この機能は、組み込みの CRD 削除保護ポリシーなどの高度なポリシーに必要です。

重要

ack-policy-external-provider コンポーネントは gatekeeper と一緒に使用する必要があります。クラスターに gatekeeper がデプロイされていることを確認してください。

ack-policy-external-provider のインストールと設定

  1. ACK クラスターページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、Add-ons をクリックします。

  2. ack-policy-external-provider を検索し、画面の指示に従って設定を完了します。

    • ProviderPodNumber:コンポーネントインスタンスの数。

    • ProtectedKinds:保護したい CRD に対応するリソースタイプを追加します。

      CRD の削除保護では、リソースタイプのインスタンスがクラスターに存在するかどうかを確認する必要があります。最小権限の原則に従い、ack-policy-external-provider はデフォルトで必要なクエリ権限を持っておらず、手動で設定する必要があります。

      ProviderPodNumber (レプリカ数、デフォルト:1) を設定します。ProtectedKinds セクションに、リソースタイプ名 (pods、policies、customresources など) を入力します。[追加] をクリックして複数のエントリを追加するか、[削除] をクリックしてエントリを削除します。[OK] をクリックします。

API 定義とパラメーター

ack-policy-external-provider は、標準の Gatekeeper 外部データプロバイダーを実装しています。Rego ポリシーテンプレートでは、external_data 関数を呼び出し、provider: ack-policy-external-data-provider を指定することで、このコンポーネントにリソースクエリリクエストを送信できます。

リクエストパラメーターは JSON 形式で定義されます。以下にいくつかの例を示します。

// 例 1
{
  "action": "ListK8sResource",
  "namespaced": false,
  "group": "",
  "version": "v1",
  "resource": "persistentvolumeclaims"
  "requestID": review.uid,
  "userInfo": review.userInfo,
  "requestFrom": "PVCProtector",
  "labelSelector": "protected",
  "limit": 1
}
// 例 2
{
  "action": "GetK8sResource",
  "namespaced": true,
  "namespace": "default",
  "group": "apps",
  "version": "v1",
  "resource": "deployments",
  "requestID": review.uid,
  "userInfo": review.userInfo,
  "requestFrom": "FinOpsPolicy",
  "labelSelector": "protected",
  "limit": 1
}

次の表は、コアパラメーターを説明しています。

パラメーター

説明

必須

action

操作タイプ。サポートされている値は ListK8sResource と GetK8sResource です。

はい

group

ターゲットリソースの API グループ。

はい

version

ターゲットリソースの API バージョン。

いいえ

resource

ターゲットリソースの複数形名 (例:persistentvolumeclaims)。

はい

namespaced

ターゲットリソースが名前空間内にあるかどうか。true または false。

クラスター全体のリソースには false を使用します。

はい

namespace

namespaced が true の場合、クエリの対象となる名前空間を指定します。

いいえ

name

action が GetK8sResource の場合、取得するリソースの名前を指定します。

いいえ

labelSelector

Kubernetes のラベルセレクター構文に従って、ラベルに基づいてリソースをフィルターします。

いいえ

limit

ListK8sResource によって返されるリソースの最大数。

いいえ

requestID

リクエストの一意の ID。 review.uid を使用することを推奨します。

いいえ

userInfo

リクエストを開始したユーザーに関する情報。 review.userInfo を使用することを推奨します。

いいえ

requestFrom

リクエストソースの識別子で、通常はポリシーテンプレートの名前です。ログトレースに使用されます。

はい

例:CRD 削除の防止

この例では、ack-policy-external-provider を使用して、一般的な高度なポリシーを実装する方法を示します。それは、関連するカスタムリソース (CR) インスタンスがまだ存在する場合に、カスタムリソース定義 (CRD) の削除を禁止することです。

このポリシーは組み込みルールであり、手動でのデプロイは不要です。このセクションはデモンストレーションのみを目的としています。
  • ポリシーロジック

    • トリガー:Gatekeeper が DELETE CRD 操作を検出します。

    • クエリ:Rego ポリシーは external_data を使用して ack-policy-external-provider を呼び出します。

    • チェック:リクエストパラメーターに基づき、ack-policy-external-provider コンポーネントはクラスターをクエリして、対応する CR インスタンスが存在するかどうかを確認します。

    • 決定:クエリ結果が少なくとも 1 つの CR インスタンスを返した場合、ack-policy-external-provider は結果を Rego ポリシーに返し、ポリシーは最終的にこの削除操作を deny (拒否) します。

  • ポリシーテンプレート (ConstraintTemplate)

    ポリシーロジックを定義します。

    apiVersion: templates.gatekeeper.sh/v1beta1
    kind: ConstraintTemplate
    metadata:
      name: blockcrddeletion
      annotations:
        meta.helm.sh/release-name: gatekeeper
        meta.helm.sh/release-namespace: kube-system
        metadata.gatekeeper.sh/version: 1.0.0
      labels:
        app.kubernetes.io/managed-by: Helm
    spec:
      crd:
        spec:
          names:
            kind: BlockCrdDeletion
          validation:
            legacySchema: true
      targets:
      - target: admission.k8s.gatekeeper.sh
        rego: |
          package block_crd_deletion
          violation[{"msg": msg}] {
            before(input.review.operation)
            response := handle(input.review)
            msg := after(response)
          }
    
          before(operation) {
            operation == "DELETE"
          }
    
          handle(review) = response {
            customrequest := {
              "action": "ListK8sResource",
              "namespaced": false,
              "group": review.object.spec.group,
              "version": "",
              "resource": review.object.spec.names.plural,
              "requestID": review.uid,
              "userInfo": review.userInfo,
              "requestFrom": "BlockCrdDeletion",
              "labelSelector": "protected",
              "limit": 1
            }
            request_keys := [json.marshal(customrequest)]
            response := external_data({
              "provider": "ack-policy-external-data-provider",
              "keys": request_keys
            })
          }
    
          after(response) = msg {
            count(response.responses[0]) > 0
            msg := sprintf(
              "The CRD %v is not allowed to be deleted. Reason: It is not allowed to delete a CRD object when it contains a collection of custom resources. Current existing custom resources: %v, etc.",
              [input.review.name, response.responses[0][0]]
            )
          }
  • ポリシーインスタンス (Constraint)

    テンプレートを特定のリソースに適用します。この例では、ポリシーをすべての CRD に適用します。

    apiVersion: constraints.gatekeeper.sh/v1beta1
    kind: BlockCrdDeletion
    metadata:
      name: block-crd-deletion-rule
    spec:
      enforcementAction: deny
      match:
        kinds:
        - apiGroups:
          - '*'
          kinds:
          - CustomResourceDefinition
  • 結果の検証

    1. テスト用の CRD と対応する CR インスタンスを作成します。

      # CRD の作成
      apiVersion: apiextensions.k8s.io/v1
      kind: CustomResourceDefinition
      metadata:
        name: simplestthings.example.com
      spec:
        group: example.com
        scope: Namespaced
        names:
          plural: simplestthings
          singular: simplestthing
          kind: SimplestThing
        versions:
          - name: v1
            served: true
            storage: true
            schema:
              openAPIV3Schema:
                type: object
                properties:
                  spec:
                    type: object
                    properties:
                      message:
                        type: string
      ---
      # CR インスタンスの作成
      apiVersion: example.com/v1
      kind: SimplestThing
      metadata:
        name: my-simple-thing
        namespace: default
        labels:
          protected: "false"
      spec:
        message: "Hello"
    2. CRD の削除を試みます。

      kubectl delete crd simplestthings.example.com
    3. ポリシーが削除をブロックし、明確なエラーメッセージを返すことを確認します。

      期待される出力:

      Error from server (Forbidden): admission webhook "delete.validation.gatekeeper.sh" denied the request: [block-crd-deletion-rule] The CRD simplestthings.example.com is not allowed to be deleted. Reason: It is not allowed to delete a CRD object when it contains a collection of custom resources. Current existing custom resources: my-simple-thing, etc.

関連トピック

検査機能を使用すると、ワークロード設定のセキュリティリスクをスキャンできます。詳細については、「クラスターワークロードをチェックするための検査の設定」をご参照ください。