クイックスタート: 除外イメージ

このドキュメントでは、Binary Authorization ポリシーでイメージを除外する方法について説明します。

このドキュメントでは、ポリシーを更新して、Container Registry と Artifact Registry からコンテナ イメージを除外します。デプロイ時には、Binary Authorization 執行者により、除外イメージの Google Kubernetes Engine(GKE)クラスタへのデプロイが許可されます。執行者は、除外イメージが他のポリシールールを適用する前に、除外イメージを許可します。

イメージの証明書を要求するようにポリシーを構成する方法については、次の詳細なチュートリアルをご覧ください。

始める前に

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

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

  3. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

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

    API を有効にする

  5. Cloud SDK をインストールして初期化します。
  6. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

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

  7. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

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

    API を有効にする

  9. Cloud SDK をインストールして初期化します。
  10. Cloud Shell を使用していない場合は、kubectl をインストールします。

Binary Authorization を有効にしたクラスタの作成

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

Google Cloud Console

  1. Cloud Console で GKE の [クラスタ] ページに移動します。

    GKE に移動

    Google Cloud プロジェクトの GKE クラスタのリストが表示されます。

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

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

    標準クラスタのテンプレートの [名前] フィールド

  4. [ロケーション タイプ] オプションで [ゾーン] を選択します。

  5. [ゾーン] プルダウン リストから us-central1-a を選択します。

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

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

    [バイナリ承認を有効化] オプション

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

gcloud

--enable-binauthz フラグを指定して gcloud container clusters create を実行します。

gcloud container clusters create \
    --enable-binauthz \
    --zone us-central1-a \
    test-cluster

デフォルトのポリシーを表示する

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

Cloud Console

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

  1. Cloud Console で [Binary Authorization] ページに移動します。

    Binary Authorization に移動

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

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

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

gcloud

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

gcloud container binauthz policy export

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

admissionWhitelistPatterns:
- namePattern: gcr.io/google_containers/*
- namePattern: gcr.io/google-containers/*
- namePattern: k8s.gcr.io/*
- namePattern: gke.gcr.io/*
- namePattern: gcr.io/stackdriver-agents/*
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"

REST API は以下を返します。

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

除外イメージのみを許可する

ポリシーを変更して、除外イメージに記載されているものを除くすべてのイメージのデプロイを禁止します。

Cloud Console

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

  1. Cloud Console で [Binary Authorization] ページに戻ります。

    Binary Authorization に移動

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

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

  4. [デプロイルールからイメージを除外] で [イメージパス] を展開します。

  5. [イメージパスを追加] をクリックします。

    Container Registry

    [新しいイメージパス] に、Container Registry リポジトリから次のパスを貼り付けます。

    gcr.io/google-samples/hello-app:1.0
    

    Artifact Registry

    [新しいイメージパス] に、Artifact Registry リポジトリから次のパスを貼り付けます。

    us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
    
  6. [完了] をクリックしてイメージパスを保存します。

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

gcloud

Container Registry と Artifact Registry からのサンプル イメージを許可するようにポリシーを変更するには、次の操作を行います。

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

    gcloud container binauthz policy export  > /tmp/policy.yaml
    
  2. テキスト エディタで、evaluationModeALWAYS_ALLOW から ALWAYS_DENY に変更し、除外イメージを admissionWhitelistPatterns に追加します。

    Container Registry と Artifact Registry からの次のサンプル イメージを除外するには、ポリシー YAML ファイルを次のように変更します。

    admissionWhitelistPatterns:
    - namePattern: gcr.io/google-samples/hello-app:1.0
    - namePattern: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
    globalPolicyEvaluationMode: ENABLE
    defaultAdmissionRule:
      evaluationMode: ALWAYS_DENY
      enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
    name: projects/<var>PROJECT_ID</var>/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",
      "admissionWhitelistPatterns": [
        {
          "namePattern": "gcr.io/google-samples/hello-app:1.0"
        },
        {
          "namePattern": "us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0"
        }
      ],
      "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"
    

ポリシーのテスト

Exempt image 許可リストに追加したイメージをデプロイしてポリシーをテストするには、次のようにします。

  1. 除外イメージをクラスタにデプロイします。 

    Cloud Console

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

    1. Cloud Console で GKE の [クラスタ] ページに移動します。

      GKE に移動

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

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

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

    4. コンテナ イメージのパスを入力します。

      Container Registry

      Container Registry からイメージをデプロイするには、次のように入力します。

      gcr.io/google-samples/hello-app:1.0
      

      Artifact Registry

      Artifact Registry からイメージをデプロイするには、次のように入力します。

      us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
      
    5. [続行] をクリックします。

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

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

    kubectl

    Container Registry

    Container Registry からイメージをデプロイします。

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

    Artifact Registry

    Artifact Registry からイメージをデプロイします。

    kubectl run hello-server --image us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080
    
  2. イメージのデプロイが許可されたことを確認します。

    Cloud Console

    イメージがデプロイされたことを確認する手順は次の通りです。

    1. GKE ページに移動します。

    GKE に移動

    1. [ワークロード] ページに移動します。

    hello-server ワークロードと、実行中であることを示す緑色のアイコンが表示されます。

    kubectl

    イメージのデプロイが許可されたことを確認するには、次のコマンドを入力します。

    kubectl get pods
    

    イメージが実行されていることを確認します。

  3. Pod を削除します。

    Cloud Console

    GKE の [ワークロード] ページで、次の操作を行います。

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

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

    3. リソースの削除を求めるプロンプトが表示されたら、[削除] をクリックします。

    kubectl

    kubectl delete pod hello-server
    

クリーンアップ

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

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

Console

クラスタを削除する手順は次の通りです。

  1. Cloud Console で GKE の [クラスタ] ページに移動します。

    GKE に移動

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

gcloud

クラスタを削除するには、次のコマンドを入力します。

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

次のステップ