GKE を使用して Binary Authorization ポリシーを構成する

このクイックスタートでは、Binary Authorization ポリシーで基本的なルールを構成してテストする方法について説明します。

このクイックスタートでは、ポリシーのデフォルト ルールを表示して構成します。デフォルト ルールでは、すべてのイメージのデプロイが許可されます。これをテストするには、Google Kubernetes Engine(GKE)クラスタにコンテナ イメージをデプロイします。次に、すべてのイメージのデプロイを禁止するデフォルトのルールを設定して、イメージのデプロイを試みます。

始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Artifact Registry, Binary Authorization API を有効にします。

    API を有効にする

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  8. Google Cloud プロジェクトで課金が有効になっていることを確認します

  9. Artifact Registry, Binary Authorization API を有効にします。

    API を有効にする

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. kubectl をインストールします。

Binary Authorization の適用を有効にしたクラスタを作成する

次に、Binary Authorization を有効にした GKE クラスタを作成します。このクラスタで、デプロイしたコンテナ イメージを実行します。

Binary Authorization は、Autopilot クラスタまたは Standard クラスタで使用できます。

Google Cloud コンソール

次の手順では、Autopilot クラスタを構成します。

  1. Google Cloud コンソールで、GKE の [Kubernetes クラスタ] ページに移動します。

    GKE に移動

  2. [作成] をクリックします。

  3. [Autopilot クラスタの作成] で、次の操作を行います。

    1. [名前] フィールドに「test-cluster」と入力します。

    2. [リージョン] メニューで [us-central1] を選択します。

    3. [詳細設定] セクションを開きます。

    4. [セキュリティ] リンクをクリックして、[セキュリティ] パネルを表示します。

    5. [セキュリティ] パネルで、[Binary Authorization の有効化] チェックボックスをオンにします。

    6. [適用のみ] を選択します。

    7. [次へ] をクリックし、[次: 確認と変更] をクリックします。

    8. クラスタの作成を開始するには、[作成] をクリックします。

gcloud

--binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE フラグを指定して gcloud container clusters create を実行します。

gcloud container clusters create \
    --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE \
    --zone us-central1-a \
    test-cluster

クラスタの作成に数分かかる場合があります。

デフォルト ポリシー

デフォルトでは、Binary Authorization ポリシーはすべてのコンテナ イメージがデプロイされるように構成されています。

Google Cloud コンソール

デフォルト ポリシーを表示するには、次の操作を行います。

  1. Google Cloud コンソールで [Binary Authorization] ページに移動します。

    [Binary Authorization] に移動

    ポリシーの詳細が表示されます。

  2. [ポリシーの編集] をクリックします。

  3. [プロジェクトのデフォルト ルール] で、オプション [すべてのイメージを許可] が選択されています。

gcloud

デフォルト ポリシーを表示するには、ポリシーの YAML ファイルをエクスポートします。

gcloud container binauthz policy export

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

globalPolicyEvaluationMode: ENABLE
defaultAdmissionRule:
  evaluationMode: ALWAYS_ALLOW
  enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
name: projects/PROJECT_ID/policy

REST API

デフォルト ポリシーを表示するには、次のように 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"

このコマンドを実行すると、次の出力が生成されます。

{
  "name": "projects/PROJECT_ID/policy",
  "globalPolicyEvaluationMode": "ENABLE",
  "defaultAdmissionRule": {
    "evaluationMode": "ALWAYS_ALLOW",
    "enforcementMode": "ENFORCED_BLOCK_AND_AUDIT_LOG"
  }
}

適用ポリシーをテストする

クラスタにサンプル コンテナ イメージをデプロイすることで、適用ポリシーをテストできます。

このクイックスタートでは、Container Registry のパス gcr.io/google-samples/hello-app にあるサンプル コンテナ イメージを使用します。これは Google が作成した公開コンテナ イメージで、「Hello, World!」というサンプル アプリケーションが含まれています。

Google Cloud コンソール

ポリシーをテストするには、次の手順を行います。

  1. Google Cloud コンソールで [Kubernetes クラスタ] ページに移動します。

    GKE に移動

  2. [デプロイ] をクリックします。

    デプロイの詳細を入力するよう求められます。

  3. [既存のコンテナ イメージ] を選択します。

  4. コンテナ イメージのパスとして「gcr.io/google-samples/hello-app:1.0」と入力します。

  5. [続行] をクリックします。

  6. [アプリケーション名] フィールドに「hello-server」と入力します。

  7. [デプロイ] をクリックします。

kubectl

ポリシーをテストするには、次の手順を行います。

  1. ローカルの kubeconfig ファイルを更新します。

    gcloud container clusters get-credentials \
        --zone us-central1-a \
        test-cluster
    

    これにより、GKE でクラスタにアクセスするために必要な認証情報とエンドポイント情報が提供されます。

  2. イメージをデプロイします。

    kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
    

ここで、Binary Authorization でデプロイが許可されたことを確認します。

Google Cloud コンソール

イメージがデプロイされたことを確認するには、Google Cloud コンソールで GKE の [ワークロード] ページに移動します。

GKE に移動

デプロイのワークロードに、イメージが正常にデプロイされたことを示す緑色のアイコンが表示されます。

kubectl

イメージがデプロイされたことを確認するには、次の手順を行います。

kubectl get pods

このコマンドを実行すると、デプロイが成功したことを示す次のようなメッセージが出力されます。

NAME                            READY     STATUS    RESTARTS   AGE
hello-server-579859fb5b-h2k8s   1/1       Running   0          1m

デプロイを削除して次の手順に進みます。

Google Cloud コンソール

デプロイを削除するには、次の手順を行います。

  1. Google Cloud コンソールで GKE の [ワークロード] ページに戻ります。

    GKE に移動

  2. hello-server ワークロードを選択します。

  3. [削除] をクリックします。

kubectl

デプロイを削除するには、次の操作を行います。

kubectl delete deployment hello-server

すべてのイメージを禁止するように適用ポリシーを構成する

次に、すべてのイメージのデプロイを許可せず、ブロックするようにポリシーを変更します。

Google Cloud コンソール

ポリシーを変更するには、次の手順を行います。

  1. Google Cloud コンソールの [Binary Authorization] ページに戻ります。

    [Binary Authorization] に移動

  2. [ポリシーの編集] をクリックします。

  3. [すべてのイメージを禁止] を選択します。

  4. [ポリシーを保存] をクリックします。

gcloud

ポリシーを変更するには、次の手順を行います。

  1. ポリシーの YAML ファイルをエクスポートします。

    gcloud container binauthz policy export  > /tmp/policy.yaml
    
  2. テキスト エディタで、evaluationModeALWAYS_ALLOW から ALWAYS_DENY に変更します。

    ポリシーの YAML ファイルが次のように表示されます。

    globalPolicyEvaluationMode: ENABLE
    defaultAdmissionRule:
      evaluationMode: ALWAYS_DENY
      enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
    name: projects/PROJECT_ID/policy
    
  3. ポリシーの YAML ファイルを Binary Authorization にあらためてインポートします。

    gcloud container binauthz policy import /tmp/policy.yaml
    

REST API

ポリシーを変更するには、次の手順を行います。

  1. テキスト ファイルを作成し、更新したポリシーを JSON 形式で記述します。

    cat > /tmp/policy.json << EOM
    {
      "name": "projects/${PROJECT_ID}/policy",
      "globalPolicyEvaluationMode": "ENABLE",
      "defaultAdmissionRule": {
        "evaluationMode": "ALWAYS_DENY",
        "enforcementMode": "ENFORCED_BLOCK_AND_AUDIT_LOG"
      }
    }
    EOM
    
  2. 更新されたポリシーを REST API に送信します。

    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"
    

ポリシーの再テスト

クラスタにサンプル コンテナ イメージをデプロイして、ポリシーを再度テストします。今度は、Binary Authorization がイメージのデプロイをブロックします。

Google Cloud コンソール

イメージをデプロイします。

  1. Google Cloud コンソールで [Kubernetes クラスタ] ページに移動します。

    GKE に移動

  2. [デプロイ] をクリックします。

    デプロイの詳細を入力するよう求められます。

  3. [既存のコンテナ イメージ] を選択します。

  4. コンテナ イメージのパスとして「gcr.io/google-samples/hello-app:1.0」と入力します。

  5. [続行] をクリックします。

  6. [アプリケーション名] フィールドに「hello-server」と入力します。

  7. [デプロイ] をクリックします。

kubectl

イメージをデプロイします。

kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080

ポリシーがブロックされたことを確認できます。

Google Cloud コンソール

イメージがデプロイされなかったことを確認するには、次の手順を行います。

Google Cloud コンソールで GKE の [ワークロード] ページに戻ります。

GKE に移動

コンテナ イメージのワークロードに、イメージのデプロイが失敗したことを示す赤色のアイコンが表示されます。

kubectl

次のコマンドを実行して、イメージがデプロイされたことを確認します。

kubectl get pods

このコマンドを実行すると、イメージがデプロイされなかったことを示す次のメッセージが出力されます。

No resources found.

次のコマンドによってデプロイの詳細を確認できます。

kubectl get event --template \
'{{range.items}}{{"\033[0;36m"}}{{.reason}}:{{"\033[0m"}}{{.message}}{{"\n"}}{{end}}'

次のようなレスポンスが表示されます。

FailedCreate: Error creating: pods POD_NAME is forbidden: admission webhook "imagepolicywebhook.image-policy.k8s.io" denied the request: Image IMAGE_NAME denied by Binary Authorization default admission rule. Denied by always_deny admission rule

この出力で:

  • POD_NAME: Pod の名前。
  • IMAGE_NAME: イメージの名前。
  • ATTESTOR_NAME: 認証者の名前。

クリーンアップ

このページで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の操作を行います。

GKE で作成したクラスタを削除します。

コンソール

クラスタを削除するには、次の手順を行います。

  1. Google Cloud コンソールで [Kubernetes クラスタ] ページに移動します。

    GKE に移動

  2. test-cluster クラスタを選択し、[削除] をクリックします。

gcloud

クラスタを削除するには、次の手順を行います。

gcloud container clusters delete \
    --zone=us-central1-a \
    test-cluster

次のステップ