クイックスタート: すべて許可とすべて禁止

このクイックスタートでは、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. 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"
  }
}

ポリシーのテスト

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

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

Cloud Console

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

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

    GKE に移動

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

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

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

    [デプロイの作成] ページのスクリーンショット

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

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

    [Configure Deployment] ページのスクリーンショット

  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 でデプロイが許可されたことを確認します。

Cloud Console

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

GKE に移動

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

デプロイ成功メッセージのスクリーンショット

kubectl

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

kubectl get pods

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

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

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

Cloud Console

デプロイを削除する手順は次の通りです。

  1. Cloud Console で GKE の [ワークロード] ページに戻ります。

    GKE に移動

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

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

kubectl

デプロイを削除する手順は次の通りです。

kubectl delete deployment hello-server

すべてのイメージを禁止するポリシーの構成

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

Cloud Console

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

  1. Cloud Console で [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 がイメージのデプロイをブロックします。

Cloud Console

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

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

    GKE に移動

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

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

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

    [デプロイの作成] ページのスクリーンショット

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

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

    [Configure Deployment] ページのスクリーンショット

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

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

kubectl

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

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

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

Cloud Console

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

Cloud Console で 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 で作成したクラスタを削除します。

Console

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

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

    GKE に移動

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

gcloud

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

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

次のステップ