REST API を使用したポリシーの構成

このページでは、コマンドラインで REST API を使用して Binary Authorization ポリシーを構成する方法について説明します。ここで説明するタスクは、コマンドラインgcloud コマンドまたは 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 です。

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

ローカル システムの 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"
  }
}

除外イメージを管理する

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

各ポリシーには、レジストリパスで指定された除外イメージの許可リストを含めることができます。このパスは、Container Registry 内の場所か、別のコンテナ イメージ レジストリの場所になります。有効にした場合、この許可リストはグローバル ポリシー評価モードで除外されたイメージに追加されます。

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

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

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

グローバル ポリシー評価モード

グローバル ポリシー評価モードは、ユーザーとして構成したポリシーを評価する前に、Binary Authorization グローバル ポリシーを評価するポリシー設定です。グローバル ポリシーは Google から提供されるものです。Google 管理のシステム イメージのリストは以降のポリシー評価から除外されます。この設定を有効にすると、Google Kubernetes Engine(GKE)で必要なイメージはポリシーの適用でブロックされません。グローバル ポリシーは、ユーザー ポリシーに加えて評価されます。

次のコマンドを使用すると、コマンドラインでグローバル ポリシーの内容を確認できます。

gcloud container binauthz policy export --project=binauthz-global-policy

グローバル ポリシー評価モードでは、Google 管理のシステム イメージのパスを許可リストに明示的に指定する必要はありません。これはデフォルトで無効になっています。

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

"globalPolicyEvaluationMode": "ENABLE"

グローバル ポリシー評価モードを無効にするには、以下を追加します。

"globalPolicyEvaluationMode": "DISABLE"

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

ルールはポリシーの一部として、コンテナ イメージをデプロイする際の制約を定義します。すべての承諾リクエストには 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 の形式で指定します。

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

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

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 は、ルールを location.name 形式で適用するクラスタのリソース ID です。その他のプロパティについては、デフォルト ルールの設定をご覧ください。クラスタ固有のルールの例については、サンプル ポリシーをご覧ください。

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

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

最後の手順は、Binary Authorization にポリシー JSON ファイルを再度インポートすることです。

ファイルをインポートするには、次のように入力します。

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"

次のステップ