GKE を使用して Binary Authorization ポリシーを構成する
このクイックスタートでは、Binary Authorization ポリシーで基本的なルールを構成してテストする方法について説明します。
このクイックスタートでは、ポリシーのデフォルト ルールを表示して構成します。デフォルト ルールでは、すべてのイメージのデプロイが許可されます。これをテストするには、Google Kubernetes Engine(GKE)クラスタにコンテナ イメージをデプロイします。次に、すべてのイメージのデプロイを禁止するデフォルトのルールを設定して、イメージのデプロイを試みます。
始める前に
- Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Artifact Registry, Binary Authorization API を有効にします。
- Google Cloud CLI をインストールします。
-
gcloud CLI を初期化するには:
gcloud init
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Artifact Registry, Binary Authorization API を有効にします。
- Google Cloud CLI をインストールします。
-
gcloud CLI を初期化するには:
gcloud init
kubectl
をインストールします。
Binary Authorization の適用を有効にしたクラスタを作成する
次に、Binary Authorization を有効にした GKE クラスタを作成します。このクラスタで、デプロイしたコンテナ イメージを実行します。
Google Cloud コンソール
Google Cloud コンソールで [Kubernetes クラスタ] ページに移動します。
Google Cloud プロジェクトの GKE クラスタのリストが表示されます。
[クラスタを作成] をクリックします。
[名前] フィールドに「
test-cluster
」と入力します。[ロケーション タイプ] オプションで [ゾーン] を選択します。
[ゾーン] プルダウン リストから
us-central1-a
を選択します。[セキュリティ] リンクをクリックして、[セキュリティ] パネルを表示します。
[セキュリティ] パネルで、[Binary Authorization の有効化] チェックボックスをオンにします。
[適用のみ] を選択します。
[作成] をクリックします。
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 コンソール
デフォルト ポリシーを表示するには、次の操作を行います。
Google Cloud コンソールで [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" } }
適用ポリシーをテストする
クラスタにサンプル コンテナ イメージをデプロイすることで、適用ポリシーをテストできます。
このクイックスタートでは、Container Registry のパス gcr.io/google-samples/hello-app
にあるサンプル コンテナ イメージを使用します。これは Google が作成した公開コンテナ イメージで、「Hello, World!」というサンプル アプリケーションが含まれています。
Google Cloud コンソール
ポリシーをテストするには、次の手順を行います。
Google Cloud コンソールで [Kubernetes クラスタ] ページに移動します。
[デプロイ] をクリックします。
デプロイの詳細を入力するよう求められます。
[既存のコンテナ イメージ] を選択します。
コンテナ イメージのパスとして「
gcr.io/google-samples/hello-app:1.0
」と入力します。[続行] をクリックします。
[アプリケーション名] フィールドに「
hello-server
」と入力します。[デプロイ] をクリックします。
kubectl
ポリシーをテストするには、次の手順を行います。
ローカルの
kubeconfig
ファイルを更新します。gcloud container clusters get-credentials \ --zone us-central1-a \ test-cluster
これにより、GKE でクラスタにアクセスするために必要な認証情報とエンドポイント情報が提供されます。
イメージをデプロイします。
kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
ここで、Binary Authorization でデプロイが許可されたことを確認します。
Google Cloud コンソール
イメージがデプロイされたことを確認するには、Google Cloud コンソールで GKE の [ワークロード] ページに移動します。
デプロイのワークロードに、イメージが正常にデプロイされたことを示す緑色のアイコンが表示されます。
kubectl
イメージがデプロイされたことを確認するには、次の手順を行います。
kubectl get pods
このコマンドを実行すると、デプロイが成功したことを示す次のようなメッセージが出力されます。
NAME READY STATUS RESTARTS AGE hello-server-579859fb5b-h2k8s 1/1 Running 0 1m
デプロイを削除して次の手順に進みます。
Google Cloud コンソール
デプロイを削除するには、次の手順を行います。
Google Cloud コンソールで GKE の [ワークロード] ページに戻ります。
hello-server
ワークロードを選択します。[削除] をクリックします。
kubectl
デプロイを削除するには、次の操作を行います。
kubectl delete deployment hello-server
すべてのイメージを禁止するように適用ポリシーを構成する
次に、すべてのイメージのデプロイを許可せず、ブロックするようにポリシーを変更します。
Google Cloud コンソール
ポリシーを変更するには、次の手順を行います。
Google Cloud コンソールの [Binary Authorization] ページに戻ります。
[ポリシーの編集] をクリックします。
[すべてのイメージを禁止] を選択します。
[ポリシーを保存] をクリックします。
gcloud
ポリシーを変更するには、次の手順を行います。
ポリシーの YAML ファイルをエクスポートします。
gcloud container binauthz policy export > /tmp/policy.yaml
テキスト エディタで、
evaluationMode
をALWAYS_ALLOW
からALWAYS_DENY
に変更します。ポリシーの YAML ファイルが次のように表示されます。
globalPolicyEvaluationMode: ENABLE defaultAdmissionRule: evaluationMode: ALWAYS_DENY enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG name: projects/PROJECT_ID/policy
ポリシーの YAML ファイルを Binary Authorization にあらためてインポートします。
gcloud container binauthz policy import /tmp/policy.yaml
REST API
ポリシーを変更するには、次の手順を行います。
テキスト ファイルを作成し、更新したポリシーを JSON 形式で記述します。
cat > /tmp/policy.json << EOM { "name": "projects/${PROJECT_ID}/policy", "globalPolicyEvaluationMode": "ENABLE", "defaultAdmissionRule": { "evaluationMode": "ALWAYS_DENY", "enforcementMode": "ENFORCED_BLOCK_AND_AUDIT_LOG" } } EOM
更新されたポリシーを 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 コンソール
イメージをデプロイします。
Google Cloud コンソールで [Kubernetes クラスタ] ページに移動します。
[デプロイ] をクリックします。
デプロイの詳細を入力するよう求められます。
[既存のコンテナ イメージ] を選択します。
コンテナ イメージのパスとして「
gcr.io/google-samples/hello-app:1.0
」と入力します。[続行] をクリックします。
[アプリケーション名] フィールドに「
hello-server
」と入力します。[デプロイ] をクリックします。
kubectl
イメージをデプロイします。
kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
ポリシーがブロックされたことを確認できます。
Google Cloud コンソール
イメージがデプロイされなかったことを確認するには、次の手順を行います。
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 で作成したクラスタを削除します。
コンソール
クラスタを削除するには、次の手順を行います。
Google Cloud コンソールで [Kubernetes クラスタ] ページに移動します。
test-cluster
クラスタを選択し、[削除] をクリックします。
gcloud
クラスタを削除するには、次の手順を行います。
gcloud container clusters delete \ --zone=us-central1-a \ test-cluster
次のステップ
built-by-cloud-build
認証者を使用して、Cloud Build によってビルドされたイメージのみをデプロイする(プレビュー)。- 証明書を要求するエンドツーエンドのチュートリアルについては、以下をご覧ください。
- DevOps に関するリソースを読む。また、研究プログラムについて確認する。