REST API を使用してポリシーを構成する

このページでは、REST API を使用して Binary Authorization ポリシーを構成する方法について説明します。このタスクは、Google Cloud CLI または Google Cloud Console でも行うことができます。この手順は Binary Authorization の設定の一部です。

概要

ポリシーとは、コンテナ イメージのデプロイを規定する一連のルールです。

REST API を使用してポリシーを構成する場合、サービスと gcloud のやり取りで使用される YAML 構造と同じ構造の JSON 形式で値を入力します。詳細については、ポリシー YAML リファレンスをご覧ください。

ポリシーを構成するには、次のことを行う必要があります。

  • ポリシー JSON ファイルをエクスポートする
  • 除外イメージを追加する(省略可)
  • デフォルト ルールを設定する
  • クラスタ固有のルールを追加する(省略可)
  • ポリシー JSON ファイルをインポートする

実際のほとんどのポリシーでは、コンテナ イメージをデプロイする準備ができていることを必要なすべての認証者が確認しているかどうかチェックします。その場合は、ポリシーの構成時に認証者を作成する必要があります。

デフォルト プロジェクトの設定

デフォルトの Google Cloud プロジェクトを設定します(まだ行っていない場合)。

PROJECT_ID=PROJECT_ID
gcloud config set project ${PROJECT_ID}

PROJECT_ID はプロジェクトの ID です。

ポリシーをエクスポートする

このセクションは、GKE、GKE クラスタ、Cloud Run、Anthos Service Mesh に該当する内容です。

ローカル システムの JSON ファイルにポリシーをエクスポートします。

curl \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "x-goog-user-project: ${PROJECT_ID}" \
    "https://binaryauthorization.googleapis.com/v1/projects/${PROJECT_ID}/policy" \
    -o "/tmp/policy.json"

デフォルトでは、このファイルの内容は次のようになっています。

{
  "name": "projects/PROJECT_ID/policy",
  "admissionWhitelistPatterns": [
    {
      "namePattern": "gcr.io/google_containers/*"
    },
    {
      "namePattern": "gcr.io/google-containers/*"
    },
    {
      "namePattern": "k8s.gcr.io/**"
    },
    {
      "namePattern": "gcr.io/stackdriver-agents/*"
    }
  ],
  "globalPolicyEvaluationMode": "ENABLE",
  "defaultAdmissionRule": {
    "evaluationMode": "ALWAYS_ALLOW",
    "enforcementMode": "ENFORCED_BLOCK_AND_AUDIT_LOG"
  }
}

ポリシー エクスポートのデフォルトの admissionWhitelistPatterns リストには、このガイドとは異なるイメージパスが表示されることがあります。

除外イメージを管理する

このセクションは、GKE、GKE クラスタ、Cloud Run、Anthos Service Mesh に該当する内容です。

除外イメージは、ポリシールールの適用が免除されるコンテナ イメージです。Binary Authorization では、除外イメージのデプロイが常に許可されます。

除外イメージは、admissionWhitelistPatterns にイメージのレジストリのパスを記述することで指定します。このパスは、Container Registry などのイメージ レジストリを参照します。システム ポリシー評価モードで除外されたイメージの後で、Enforcer が admissionWhitelistPatterns の除外イメージを処理します。

除外イメージを追加するには、ポリシー JSON ファイル内の admissionWhitelistPatterns リストに namePattern ノードを追加します。

{
  "name": "projects/PROJECT_ID/policy",
  "admissionWhitelistPatterns": [
    {
      "namePattern": "MATCHING_PATTERN"
    }
  ],
  ...
}

MATCHING_PATTERN は、レジストリ内で完全に一致する単一イメージへのパスを表します。ワイルドカード記号(***)を使用した場合は、パターンに一致する任意のイメージへのパスになります。

Cloud Run

このセクションは Cloud Run に該当する内容です。

タグを含むイメージ名を直接指定することはできません。たとえば、IMAGE_PATH:latest は指定できません。

タグを含むイメージ名を指定する場合は、次のようにワイルドカードを使用してイメージ名を指定する必要があります。

  • *: 単一イメージのすべてのバージョン。例: us-docker.pkg.dev/myproject/container/hello@*
  • **: プロジェクト内のすべてのイメージ。例: us-docker.pkg.dev/myproject/**

パス名を使用して IMAGE_PATH@DIGEST の形式でダイジェストを指定できます。

システム ポリシー評価モード

このセクションは、GKE と GKE クラスタに該当する内容です。

システム ポリシー評価モードは、Binary Authorization に構成するポリシーを評価する前に、システム ポリシーを評価するポリシーの設定です。Google はシステム ポリシーを管理しており、そこで GKE が使用する Google 管理のシステム イメージのリストを除外します。システム ポリシーに記述されているイメージが、ポリシーの適用でブロックされることはありません。この設定を有効にしない場合は、除外イメージのリストをご自身で管理する必要があります。除外イメージを管理する方法をご覧ください。

システム ポリシーの内容を表示するには、次のコマンドを使用します。

gcloud alpha container binauthz policy export-system-policy

システム ポリシー評価モードを有効にするには、次の最上位ノードをポリシー JSON ファイルに追加します。

"globalPolicyEvaluationMode": "ENABLE"

システム ポリシー評価モードを無効にするには、以下を追加します。

"globalPolicyEvaluationMode": "DISABLE"

特定のリージョンに関連付けられたシステム ポリシーは、次のようにエクスポートできます。

gcloud alpha container binauthz policy export-system-policy \
  --location=REGION > /tmp/policy.yaml

REGION は、エクスポートするシステム ポリシーに関連付けられているリージョン(または「global」)に置き換えます。例: asia-east1europe-west1us-central1

--location を省略するか、--location=global を指定した場合、このコマンドは、最後のリージョン グループ内のリージョンからシステム ポリシーを出力します。システム ポリシーへのほとんどの変更は追加であるため、出力には、現在すべてのリージョンで許可されているシステム イメージのセットが表示されます。

デフォルト ルールを設定する

このセクションは、GKE、GKE クラスタ、Cloud Run、Anthos Service Mesh に該当する内容です。

ルールはポリシーの一部として、コンテナ イメージをデプロイする際の制約を定義します。すべての承諾リクエストには GKE クラスタが関連付けられています。リクエストがクラスタ固有のルールに一致しない場合、デフォルト ルールが使用されます。

デフォルト ルールは、ポリシーの defaultAdmissionRule ノードで定義されます。このルールの各部分の詳細については、ポリシー YAML リファレンスのADMISSION_RULE をご覧ください。デフォルト ルールの例については、サンプル ポリシーをご覧ください。

デフォルト ルールを設定するには、必要に応じてポリシー JSON ファイルの defaultAdmissionRule ノードを編集します。

  "defaultAdmissionRule": {
    "evaluationMode": "EVAL_MODE",
    "enforcementMode": "ENFORCEMENT_MODE"
    requireAttestationsBy: [
      ATTESTOR,
      ...
    ]
  }

ここで

  • EVAL_MODE は、Binary Authorization がコンテナ イメージのデプロイを許可する前に評価する制約のタイプを指定します。
  • ENFORCEMENT_MODE は、コンテナ イメージがルールで定義された制約を遵守していない場合に実行されるアクションを指定します。
  • ATTESTOR は、デプロイする前にコンテナ イメージに署名する必要がある認証者を指定します(必要な場合)。認証者の完全修飾パスを projects/PROJECT_ID/attestors/ATTESTOR_NAME の形式で指定します。

ルールで必要なすべての認証者がコンテナ イメージに署名しているかどうか確認する場合は、この手順を行う前に、認証者を作成する必要があります。

クラスタ固有のルールを設定する(省略可)

このセクションは、GKE と GKE クラスタに該当する内容です。

1 つのクラスタには、1 つ以上のクラスタ固有のルールを設定できます。このタイプのルールは、指定した GKE クラスタにのみ適用されます。クラスタに独自のルールがない場合は、デフォルトのルールが使用されます。クラスタ固有のルールはポリシーのオプション部分です。

クラスタ固有のルールは、ポリシー JSON ファイルの clusterAdmissionRules ノードで定義されます。このルールの各部分の詳細については、ポリシー YAML リファレンスのADMISSION_RULE をご覧ください。例については、サンプル ポリシークラスタ固有のルールを使用するをご覧ください。

クラスタ固有のルールを追加するには:

ポリシー JSON ファイルで、clusterAdmissionRules ノードを追加します。

"clusterAdmissionRules": {
    "us-central1-a.test-cluster": {
      "evaluationMode": "REQUIRE_ATTESTATION",
      "requireAttestationsBy": [
        "ATTESTOR",
        ...
      ],
      "enforcementMode": "ENFORCED_BLOCK_AND_AUDIT_LOG"
    }
  },

CLUSTER_SPECIFIER は、ルールが適用されるクラスタのリソース ID です。

  • GKE、GKE 接続クラスタと GKE on AWS の場合、形式は CLUSTER_LOCATION.CLUSTER_NAME です(例: us-central1-a.test-cluster)。
  • GKE on Bare Metal と GKE on VMware の場合、形式は、FLEET_MEMBERSHIP_LOCATION.FLEET_MEMBERSHIP_ID です(例: global.test-membership)。

他のプロパティについては、このガイドで前述したデフォルト ルールを設定するをご覧ください。クラスタ固有のルールの例については、サンプル ポリシーをご覧ください。

ルールで必要なすべての認証者がコンテナ イメージに署名しているかどうか確認する場合は、この手順を行う前に、認証者を作成する必要があります。

ポリシー JSON ファイルをインポートする

このセクションは、GKE、GKE クラスタ、Cloud Run、Anthos Service Mesh に該当する内容です。

次のコマンドを入力して、ポリシー JSON ファイルを Binary Authorization に再度インポートします。

curl -X PUT \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "x-goog-user-project: ${PROJECT_ID}" \
    --data-binary @/tmp/policy.json  \
    "https://binaryauthorization.googleapis.com/v1/projects/${PROJECT_ID}/policy"

次のステップ