クイックスタート

このクイックスタートでは、Binary Authorization でシンプルなポリシーを構成してテストする方法を示します。

このクイックスタートでは、デフォルト ポリシーを表示してテストし、Container Registry から Google Kubernetes Engine(GKE)クラスタへのすべてのコンテナ イメージのデプロイを拒否します。これは実際のポリシーではありません。実際のポリシーでは、環境内にコンテナ イメージをデプロイするには、通常は認証者による証明書を必要とします。

必要な証明書を用意してポリシーを構成する方法を説明するチュートリアルについては、CLI で使ってみるまたは Console で使ってみるをご覧ください。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

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

    [プロジェクトの選択] ページに移動

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

  4. Cloud SDK をインストールして初期化します。
  5. kubectl をインストールします。

必要な API を有効にする

GKE、Container Analysis、Binary Authorization の API を有効にします。

gcloud

  1. gcloud コマンドで、使用するデフォルトの Google Cloud プロジェクトを設定します。

    PROJECT_ID=PROJECT_ID
    gcloud config set project ${PROJECT_ID}
    

    ここで PROJECT_ID はプロジェクトの名前です。

  2. 必要な API を有効にします。

    gcloud services enable \
        container.googleapis.com \
        containeranalysis.googleapis.com \
        binaryauthorization.googleapis.com
    

Console

必要な API を有効にします。

API を有効にする

このオペレーションが完了するまで数分かかる場合があります。

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

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

gcloud

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

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

Console

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

    GKE ページに移動

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

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

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

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

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

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

  6. [可用性、ネットワーキング、セキュリティ、その他の機能] をクリックします。

  7. [セキュリティ] セクションで [Enable Binary Authorization] を選択します。

    [Enable Binary Authorization] オプション

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

デフォルト ポリシー

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

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

Console

デフォルト ポリシーを表示するには:

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

    Binary Authorization ページに移動

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

    デフォルト ルールを示すポリシータブのスクリーンショット

  2. [ポリシーの構成] をクリックします。ポリシーが存在する場合は、[ポリシーの編集] をクリックします。

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

    デフォルト ルールのタイプを選択するオプションのスクリーンショット

ポリシーをテストする

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

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

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
    

Console

ポリシーをテストするには:

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

    GKE ページに移動

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

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

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

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

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

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

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

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

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

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

kubectl

イメージがデプロイされたことを確認するには:

kubectl get pods

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

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

Console

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

GKE ページに移動

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

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

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

kubectl

デプロイを削除するには:

kubectl delete deployment hello-server

Console

デプロイを削除するには:

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

    GKE ページに移動

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

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

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

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

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"
    

Console

ポリシーを変更するには:

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

    Binary Authorization ページに移動

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

  3. [すべての画像を禁止] を選択します。

    デフォルト ルールのタイプを選択するオプションのスクリーンショット

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

ポリシーを再テストする

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

kubectl

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

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

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 get pods

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

No resources found.

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

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

ポリシーによってデプロイが拒否されたことがわかります。

FailedCreate:Error creating: pods "hello-server-579859fb5b-lvfgd" is forbidden:
image policy webhook backend denied one or more images: Denied by default admission
rule. Overridden by evaluation mode

Console

イメージがデプロイされなかったことを確認するには:

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

GKE ページに移動

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

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

クリーンアップ

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

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

gcloud

クラスタを削除するには:

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

Console

クラスタを削除するには:

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

    GKE ページに移動

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

次のステップ