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

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

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

始める前に

  1. アカウントにログインします。 Google Cloud を初めて使用する場合は、 アカウントを作成して、 実際のシナリオでプロダクトがどのように機能するかを評価してください。 Google Cloud新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. If you're using an existing project for this guide, verify that you have the permissions required to complete this guide. If you created a new project, then you already have the required permissions.

  4. Verify that billing is enabled for your Google Cloud project.

  5. Enable the Artifact Registry, Binary Authorization APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  6. Google Cloud CLI をインストールします。

  7. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

  8. gcloud CLI を初期化するには、次のコマンドを実行します:

    gcloud init
  9. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  10. If you're using an existing project for this guide, verify that you have the permissions required to complete this guide. If you created a new project, then you already have the required permissions.

  11. Verify that billing is enabled for your Google Cloud project.

  12. Enable the Artifact Registry, Binary Authorization APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  13. Google Cloud CLI をインストールします。

  14. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

  15. gcloud CLI を初期化するには、次のコマンドを実行します:

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

必要なロール

GKE で Binary Authorization ポリシーを構成するために必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

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

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

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

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

Google Cloud コンソール

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

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

    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. コンソールで [Binary Authorization] ページに移動します。 Google Cloud

    [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"
  }
}

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

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

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

Google Cloud コンソール

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

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

    GKE に移動

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

    コンソールで、デプロイの詳細を入力するよう求められます。

  3. [デプロイ名] フィールドに「hello-server」と入力します。

  4. [次へ: コンテナの詳細] をクリックします。

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

  6. コンテナ イメージのパスとして「us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0」と入力します。

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

kubectl

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

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

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

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

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

    kubectl run hello-server --image us-docker.pkg.dev/google-samples/containers/gke/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. コンソールで GKE の [**ワークロード**] ページに戻ります。Google Cloud

    GKE に移動

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

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

kubectl

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

kubectl delete deployment hello-server

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

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

Google Cloud コンソール

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

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

    [Binary Authorization] に移動

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

  3. [Disallow All Images](すべての画像を禁止)を選択します。

  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. コンソールで GKE の [**クラスタ**] ページに移動します。Google Cloud

    GKE に移動

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

    コンソールで、デプロイの詳細を入力するよう求められます。

  3. [デプロイ名] フィールドに「hello-server」と入力します。

  4. [次へ: コンテナの詳細] をクリックします。

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

  6. コンテナ イメージのパスとして「us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0」と入力します。

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

kubectl

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

kubectl run hello-server --image us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080

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

Google Cloud コンソール

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

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

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. コンソールで GKE の [**クラスタ**] ページに移動します。Google Cloud

    GKE に移動

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

gcloud

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

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

次のステップ