ポリシー評価サービスを使用する

このページでは、ポリシー評価サービスの Google Cloud CLI コマンドを使用して、イメージまたは Kubernetes リソースが継続的検証チェックベースのプラットフォーム ポリシーに準拠しているかどうかを迅速に評価する方法について説明します。

概要

ポリシー評価サービスは、継続的検証(CV)チェックベースのプラットフォーム ポリシーで使用できる Binary Authorization の機能です。ポリシー評価サービスは、指定したコンテナ イメージが CV プラットフォーム ポリシーに準拠しているかどうかをオンデマンドで評価します。ポリシー評価サービスは、gcloud CLI コマンドと projects.platforms.gke.policies.evaluate メソッドで使用できます。

CV は、少なくとも 24 時間に 1 回、ポリシー違反の有無をチェックします。このため、CV が有効になった後または Kubernetes リソースがデプロイされてから CV イベントが Logging に表示されるまでに最長で 24 時間ほどかかることがあります。また、CV でポリシー違反が検出されるとログエントリが生成されます。Kubernetes リソースがポリシーを遵守している場合は、ログエントリは生成されません。

ポリシー評価サービスは、イメージがポリシーに準拠しているかどうか、またはイメージがポリシーに違反しているかどうかを示す判定結果を出力します。

ポリシー評価サービスを使用すると、イメージがポリシーに準拠しているかどうかをすばやく判断できます。

このサービスを使用する場合は、イメージ URL を直接指定するか、Kubernetes リソース内で指定します。また、GKE CV チェックベースのポリシーの名前も指定します。

ポリシー評価サービス サービスを使用することで、CV を使用する前にポリシーを開発し、準拠していない Kubernetes リソースをデバッグできます。

この機能は、GKE CV チェックベースのポリシーのみをサポートしています。

イメージにはイメージ ダイジェストを IMAGE_URL@IMAGE_DIGEST の形式で指定する必要があります。ただし、次の場合は除きます。

  • 信頼できるディレクトリのチェック: 指定したディレクトリにイメージがある場合、チェックに合格します。
  • イメージ許可リストの除外: 他のすべてのチェックでは IMAGE_URL@IMAGE_DIGEST 形式のイメージ ダイジェストが必要です。

始める前に

  1. Install the Google Cloud CLI.
  2. To initialize the gcloud CLI, run the following command:

    gcloud init

必要なロール

ポリシー評価サービスを使用するために必要な権限を取得するには、ポリシー プロジェクトに対するポリシー評価者roles/binaryauthorization.policyEvaluator)IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

ポリシーで特定のチェックが使用されている場合は、次のチェック固有の必須ロールを付与するよう管理者に依頼してください。

チェックベースのプラットフォーム ポリシーを評価する

ポリシー評価サービスは、単一のイメージ URL か、JSON 形式または YAML 形式の Kubernetes リソースで指定されたイメージを評価します。

Kubernetes リソースを使用してチェックベースのプラットフォーム ポリシーを評価する

gcloud CLI で、Kubernetes リソースを使用してポリシーを評価するには、次のコマンドを実行します。

後述のコマンドデータを使用する前に、次のように置き換えます。

  • POLICY_ID: プラットフォーム ポリシーの ID。ポリシーが別のプロジェクトにある場合、完全なリソース名 projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID を使用できます。
  • POD_SPECIFICATION_PATH: Pod 仕様のパス。

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud beta container binauthz policy evaluate POLICY_ID \
    --resource=POD_SPECIFICATION_PATH

Windows(PowerShell)

gcloud beta container binauthz policy evaluate POLICY_ID `
    --resource=POD_SPECIFICATION_PATH

Windows(cmd.exe)

gcloud beta container binauthz policy evaluate POLICY_ID ^
    --resource=POD_SPECIFICATION_PATH

プラットフォームを指定するポリシー(gke に設定する必要があります)を評価するには、次のコマンドを実行します。

後述のコマンドデータを使用する前に、次のように置き換えます。

  • POLICY_ID: プラットフォーム ポリシーの ID。ポリシーが別のプロジェクトにある場合、完全なリソース名 projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID を使用できます。
  • POD_SPECIFICATION_PATH: Pod 仕様のパス。

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud beta container binauthz policy evaluate POLICY_ID \
    --platform=gke \
    --resource=POD_SPECIFICATION_PATH

Windows(PowerShell)

gcloud beta container binauthz policy evaluate POLICY_ID `
    --platform=gke `
    --resource=POD_SPECIFICATION_PATH

Windows(cmd.exe)

gcloud beta container binauthz policy evaluate POLICY_ID ^
    --platform=gke ^
    --resource=POD_SPECIFICATION_PATH

イメージの URL を使用してチェックベースのプラットフォーム ポリシーを評価する

イメージの URL を使用してポリシーを評価するには、次のコマンドを実行します。

後述のコマンドデータを使用する前に、次のように置き換えます。

  • POLICY_ID: プラットフォーム ポリシーの ID。ポリシーが別のプロジェクトにある場合、完全なリソース名 projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID を使用できます。
  • IMAGE_URL: Pod 仕様のパス。

次のコマンドを実行します。

Linux、macOS、Cloud Shell

gcloud beta container binauthz policy evaluate POLICY_ID \
    --image=IMAGE_URL

Windows(PowerShell)

gcloud beta container binauthz policy evaluate POLICY_ID `
    --image=IMAGE_URL

Windows(cmd.exe)

gcloud beta container binauthz policy evaluate POLICY_ID ^
    --image=IMAGE_URL

--image フラグを使用すると、Namespace とサービス アカウントは暗黙的に空とみなされます。評価するポリシーが kubernetesNamespace または kubernetesServiceAccount をスコープとするチェックセットを使用している場合、返される結果は正確でない可能性があります。

コマンド出力を確認する

コマンド出力には、Pod の適合性状態を示す最上位の判定結果が含まれます。返される準拠状態は次のとおりです。

  • CONFORMANT: Kubernetes リソースがプラットフォーム ポリシーに準拠している。
  • NON_CONFORMANT: Kubernetes リソースがプラットフォーム ポリシーに準拠していない。
  • ERROR: 評価がエラーで終了した。

レスポンスで返される結果には、Kubernetes リソースに含まれている各イメージの準拠状態に関する詳細情報も含まれています。

ImageResults ブロックには、人が読める形式の explanation フィールドが含まれています。このフィールドには、イメージが許可または禁止された理由が示されます。

Pod 仕様がポリシーを遵守していない場合や評価が失敗した場合、スクリプトを簡単に作成できるように、このコマンドはゼロ以外の終了コードを返します。

次の出力例は 2 つのケースを示しています。最初のケースでは、Kubernetes リソースがポリシーに準拠しています。2 番目のケースでは、リソースがポリシーに準拠していません。

準拠している場合の判定結果

このセクションでは、Pod がプラットフォーム ポリシーに準拠している場合のポリシー評価サービス チェックの出力について説明します。

results:
- imageResults:
  - checkSetResult:
      checkResults:
        results:
        - displayName: My trusted directory check
          evaluationResult:
            verdict: CONFORMANT
          explanation: Image is in a trusted directory
          type: TrustedDirectoryCheck
      displayName: Default check set
      scope: {}
    imageUri: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
    verdict: CONFORMANT
  kubernetesNamespace: default
  kubernetesServiceAccount: default
  podName: my-pod
  verdict: CONFORMANT
verdict: CONFORMANT

出力では、次のような評価に対して CONFORMANT の判定結果が返されます。

  • Check: イメージが個々のチェック(この場合は信頼できるディレクトリ チェック)に準拠しています。
  • CheckSet: イメージは CheckSet 内の各チェックに準拠しています。
  • Policy: イメージはポリシーに準拠しています。

イメージがポリシーに準拠しているため、終了コード 0 が返されます。

準拠していない場合の判定結果

このセクションでは、Pod がプラットフォーム ポリシーに準拠していない場合のポリシー評価サービス チェックの出力について説明します。

results:
- imageResults:
  - checkSetResult:
      checkResults:
        results:
        - displayName: My trusted directory check
          evaluationResult:
            verdict: NON_CONFORMANT
          explanation: Image isn't in a trusted directory
          type: TrustedDirectoryCheck
      displayName: Default check set
      scope: {}
    imageUri: us-docker.pkg.dev/untrusted-directory/containers/gke/hello-app:1.0
    verdict: NON_CONFORMANT
  kubernetesNamespace: default
  kubernetesServiceAccount: default
  podName: my-pod
  verdict: NON_CONFORMANT
verdict: NON_CONFORMANT

出力では、イメージが個々のチェック(この場合は信頼できるディレクトリ チェック、すべてのチェックのセット)に準拠していないため、最上位の判定結果は NON_CONFORMANT になり、ゼロ以外の終了コードが返されます

ポリシー評価サービスをテストする

このセクションでは、ポリシー評価サービスのテスト方法について説明します。信頼できるディレクトリ チェックを含むチェックベースのプラットフォーム ポリシーを作成します。最初のテストでは、ポリシーに準拠する Pod 仕様を評価します。2 番目のテストでは、ポリシーに準拠していない Pod 仕様を評価します。

信頼できるディレクトリ チェックを含むポリシーを作成するには、次のコマンドを実行します。

  1. プラットフォーム ポリシー ファイルを作成します。

    cat << EOF > my-policy.yaml
    gkePolicy:
      checkSets:
      - checks:
        - displayName: "My trusted directory check"
          trustedDirectoryCheck:
            trustedDirPatterns:
            - "us-docker.pkg.dev/google-samples/containers/gke/"
        displayName: "My default check set"
    EOF
    
  2. ポリシーを作成します。

    後述のコマンドデータを使用する前に、次のように置き換えます。

    • POLICY_ID: 選択したプラットフォーム ポリシー ID。ポリシーが別のプロジェクトにある場合、完全なリソース名 projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID を使用できます。
    • POLICY_PATH: ポリシー ファイルのパス。
    • POLICY_PROJECT_ID: ポリシー プロジェクト ID。

    次のコマンドを実行します。

    Linux、macOS、Cloud Shell

    gcloud beta container binauthz policy create POLICY_ID \
        --platform=gke \
        --policy-file=POLICY_PATH \
        --project=POLICY_PROJECT_ID

    Windows(PowerShell)

    gcloud beta container binauthz policy create POLICY_ID `
        --platform=gke `
        --policy-file=POLICY_PATH `
        --project=POLICY_PROJECT_ID

    Windows(cmd.exe)

    gcloud beta container binauthz policy create POLICY_ID ^
        --platform=gke ^
        --policy-file=POLICY_PATH ^
        --project=POLICY_PROJECT_ID

    gcloud beta container binauthz policy create POLICY_ID \
    --platform=gke \
    --policy-file=my-policy.yaml
    

準拠するイメージを評価する

このセクションでは、このガイドの前半で作成したポリシーに準拠する Pod 仕様を評価します。Pod 仕様は、信頼できるディレクトリ チェックで trustedDirPatterns に指定されたディレクトリのイメージを参照しているため、評価では Pod 仕様が CONFORMANT であることを示す判定が生成されます。

  1. Pod 仕様を作成します。

    cat << EOF > my-conforming-pod.json
    {
      "apiVersion": "v1",
      "kind": "Pod",
      "metadata": {
        "name": ""
      },
      "spec": {
        "containers": [
          {
            "image": "us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0"
          }
          ]
      }
    }
    EOF
    
  2. 次のコマンドを実行して、ポリシー評価サービスを使用します。

    後述のコマンドデータを使用する前に、次のように置き換えます。

    • POLICY_ID: プラットフォーム ポリシーの ID。ポリシーが別のプロジェクトにある場合、完全なリソース名 projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID を使用できます。
    • my-conforming-pod.json: Pod 仕様のパス。

    次のコマンドを実行します。

    Linux、macOS、Cloud Shell

    gcloud beta container binauthz policy evaluate POLICY_ID \
        --image=my-conforming-pod.json

    Windows(PowerShell)

    gcloud beta container binauthz policy evaluate POLICY_ID `
        --image=my-conforming-pod.json

    Windows(cmd.exe)

    gcloud beta container binauthz policy evaluate POLICY_ID ^
        --image=my-conforming-pod.json

準拠していないイメージを評価する

このセクションでは、このガイドの前半で作成したポリシーに準拠していない Pod 仕様を評価します。Pod 仕様は、信頼できるディレクトリ チェックの trustedDirPatterns で指定されたディレクトリにないイメージを参照しているため、評価では Pod 仕様が NON_CONFORMANT 状態であることを示す判定結果が生成されます。

準拠していないイメージを評価するには、次のコマンドを実行します。

  1. Pod 仕様を作成します。

    cat << EOF > my-non-conforming-pod.json
    {
      "apiVersion": "v1",
      "kind": "Pod",
      "metadata": {
        "name": ""
      },
      "spec": {
        "containers": [
          {
            "image": "us-docker.pkg.dev/untrusted-directory/containers/gke/hello-app:1.0"
          }
        ]
      }
    }
    EOF
    
  2. 次のコマンドを実行して、ポリシー評価サービスを使用します。

    後述のコマンドデータを使用する前に、次のように置き換えます。

    • POLICY_ID: プラットフォーム ポリシーの ID。ポリシーが別のプロジェクトにある場合、完全なリソース名 projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID を使用できます。
    • my-non-conforming-pod.json: Pod 仕様のパス。

    次のコマンドを実行します。

    Linux、macOS、Cloud Shell

    gcloud beta container binauthz policy evaluate POLICY_ID \
        --image=my-non-conforming-pod.json

    Windows(PowerShell)

    gcloud beta container binauthz policy evaluate POLICY_ID `
        --image=my-non-conforming-pod.json

    Windows(cmd.exe)

    gcloud beta container binauthz policy evaluate POLICY_ID ^
        --image=my-non-conforming-pod.json

次のステップ