始める前に
- ラボでは、Google Cloud プロジェクトとリソースを一定の時間利用します
- ラボには時間制限があり、一時停止機能はありません。ラボを終了した場合は、最初からやり直す必要があります。
- 画面左上の [ラボを開始] をクリックして開始します
Create a Kubernetes Cluster with Binary Authorization
/ 20
Update Binary Authorization Policy to add Disallow all images rule at project level and allow at cluster level
/ 10
Update cluster specific policy to Disallow all images
/ 10
Create a Nginx pod to verify cluster admission rule is applied for disallow all images (denies to create)
/ 10
Update BA policy to denying images except from whitelisted artifact registries (your project artifact registry)
/ 10
Update BA policy to modify cluster specific rule to allow only images that have been approved by attestors
/ 20
Tear Down (delete cluster)
/ 20
Create a Kubernetes Cluster with Binary Authorization
/ 20
Update Binary Authorization Policy to add Disallow all images rule at project level and allow at cluster level
/ 10
Update cluster specific policy to Disallow all images
/ 10
Create a Nginx pod to verify cluster admission rule is applied for disallow all images (denies to create)
/ 10
Update BA policy to denying images except from whitelisted artifact registries (your project artifact registry)
/ 10
Update BA policy to modify cluster specific rule to allow only images that have been approved by attestors
/ 20
Tear Down (delete cluster)
/ 20
Kubernetes クラスタを実行する際のセキュリティ上の重要事項のひとつとして、各 Pod 内で実行されているコンテナ イメージとその出所を把握できなければならないという点があります。コンテナの由来を明確にするためには、コンテナのソースを信頼できる出所までトレースできる必要があります。また、組織がアーティファクト(コンテナ)を作成する際に適切なプロセスに従う必要があります。
主な懸念事項を以下に示します。
イメージの出所が厳密に管理されていない場合、セキュリティの観点からは次のようなリスクが生じます。
こうした懸念にシステム オペレーターが対処できるように、Google Cloud には Binary Authorization と呼ばれる機能が用意されています。GKE と連携して機能するこの Google Cloud のマネージド サービスは、デプロイ時のセキュリティ管理を強化して、信頼されたコンテナ イメージのみがデプロイされるようにします。Binary Authorization を使用すると、アーティファクト レジストリを許可リストに登録したり、イメージへの信頼できる機関による署名を必須にしたり、さらにそれらのポリシーを一元的に適用したりできます。ポリシーの適用により、承認されたイメージまたは適切であると確認されたイメージのみがビルドとリリースのプロセスに組み込まれるため、コンテナの環境をより厳密に管理できます。
このラボでは、Binary Authorization 機能が有効な Kubernetes Engine クラスタをデプロイして、承認済みのアーティファクト レジストリを許可リストに登録する方法や、署名付きのコンテナを作成して実行するプロセスについて説明します。
このラボは、GKE Binary Authorization に関する理解を深めていただくために GKE Helmsman のエンジニアによって作成されました。Google Cloud はアセットへの協力を歓迎しています。
Binary Authorization API と Container Analysis API は、オープンソース プロジェクトの Grafeas と Kritis に基づいています。
たとえば次のような、シンプルなコンテナ デプロイ パイプラインがあったとします。
この場合、コンテナは少なくとも次の 4 つのステップを通過します。
コンテナ ビルド パイプラインでは、各ステップが正常に完了したことを示す(「証明」する)追加のプロセスを挿入することが可能です。たとえば、単体テスト、ソース管理の分析の確認、ライセンスの確認、脆弱性分析などが実行されたことを確認できます。各ステップに、そのステップが完了したことを示す署名を行う権限、すなわち「証明書の認証局」としての役割を割り当てることもできます。「証明書の認証局」とは、正しい PGP 鍵とその「証明書」を Container Analysis API に登録する権限を持つ、人物またはシステムです。
ステップごとに異なる PGP 鍵を使用することで、各証明ステップをそれぞれ異なる人物、システム、またはパイプラインのビルドステップが実行できるようになります。(a) 各 PGP 鍵は、Container Analysis API に保存されている「証明書のメモ」に関連付けられています。ビルドステップによってイメージへの「署名」が行われると、そのイメージに関する JSON メタデータのスニペットに PGP による署名が行われて、その署名付きのスニペットが Container Analysis API に「メモの記録」として送信されます。
(b) コンテナ イメージがビルドされて必要な証明書が一元的に保存されると、ポリシー決定プロセスの一部として証明書のクエリを実行できるようになります。この場合、Kubernetes アドミッション コントローラが Pod の create または update の API リクエストを受け取ると次の処理が行われます。
こちらの説明をお読みください。ラボには時間制限があり、一時停止することはできません。タイマーは、Google Cloud のリソースを利用できる時間を示しており、[ラボを開始] をクリックするとスタートします。
このハンズオンラボでは、シミュレーションやデモ環境ではなく実際のクラウド環境を使って、ラボのアクティビティを行います。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。
このラボを完了するためには、下記が必要です。
[ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるダイアログでお支払い方法を選択してください。 左側の [ラボの詳細] ペインには、以下が表示されます。
[Google Cloud コンソールを開く] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウで開く] を選択します)。
ラボでリソースがスピンアップし、別のタブで [ログイン] ページが表示されます。
ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
必要に応じて、下のユーザー名をコピーして、[ログイン] ダイアログに貼り付けます。
[ラボの詳細] ペインでもユーザー名を確認できます。
[次へ] をクリックします。
以下のパスワードをコピーして、[ようこそ] ダイアログに貼り付けます。
[ラボの詳細] ペインでもパスワードを確認できます。
[次へ] をクリックします。
その後次のように進みます。
その後、このタブで Google Cloud コンソールが開きます。
Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。
Google Cloud コンソールの上部にある「Cloud Shell をアクティブにする」アイコン をクリックします。
ウィンドウで次の操作を行います。
接続した時点で認証が完了しており、プロジェクトに各自の Project_ID、
gcloud は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。
出力:
出力:
gcloud ドキュメントの全文については、gcloud CLI の概要ガイドをご覧ください。
一部の Compute Engine リソースは、リージョン内やゾーン内に存在します。リージョンとは、リソースを実行できる特定の地理的なロケーションです。1 つのリージョンには 1 つ以上のゾーンがあります。
次のコマンドを実行して、ラボのリージョンとゾーンを設定します(最適なリージョンとゾーンを使用できます)。
create.sh の GKE_VERSION 変数を defaultClusterVersion に変更します。my-cluster-1 は、作成したいクラスタの名前に自由に置き換えてかまいません。この create スクリプトが完了すると、次のようなメッセージが出力されます。
このスクリプトによって行われる処理は次のとおりです。
container、containerregistry、containeranalysis、binaryauthorization が有効になります。kubectl を使用できるようにします。警告は無視してかまいません。
このスクリプトが失敗すると次のような出力が返されます。
および / または
このスクリプトが成功すると次のような出力が返されます。
[進行状況を確認] をクリックして、実行したタスクを確認します。Binary Authorization の有効な Kubernetes クラスタが正常に作成されている場合は、評価スコアが表示されます。
Binary Authorization のポリシー構成 UI にアクセスするには、次の手順に沿って操作します。
gcloud で Binary Authorization のポリシー構成にアクセスする手順は次のとおりです。
gcloud beta container binauthz policy export > policy.yaml を実行します。policy.yaml を必要に応じて編集します。gcloud beta container binauthz policy import policy.yaml を実行します。これから編集するポリシーは「デフォルト」のポリシーです。デフォルトのポリシーは、クラスタ固有のポリシーを構成しない限り、Google Cloud プロジェクトのすべての GKE クラスタに適用されます。
おすすめの方法は、クラスタごとに固有のポリシーを作成してオペレーションが成功するように構成(必要に応じてレジストリを許可リストに登録するなど)し、デフォルトのプロジェクト レベルのポリシーを、すべてのイメージを禁止するように設定することです。その場合、このプロジェクトで新しいクラスタを作成するたびにそのクラスタに固有のポリシーを構成する必要があります。
デフォルトのポリシールールは [すべてのイメージを許可] です。この場合、クラスタで Binary Authorization が有効になっていない場合と同様に動作します。
デフォルトのルールを [すべてのイメージを禁止] に変更すると、除外されたレジストリ イメージのパスに一致しないイメージがブロックされます。[次のすべての認証によって承認されたイメージのみを許可] に変更すると、必要な証明書がないイメージがブロックされます。
次に、このポリシーを次のように編集します。
[デフォルトのルール] を [すべてのイメージを禁止] に変更します。
[GKE と Anthos のデプロイ向けの追加設定] で、[固有のルールを作成] をクリックします。
プルダウンから [GKE クラスタ] を選択し、[変更] をクリックします。
[GKE クラスタ固有のルール] で、[固有のルールを追加] をクリックします。
[GKE クラスタ固有のルールの追加] フィールドに、使用しているロケーションとクラスタ名を location.clustername という形式で入力します(たとえば、ゾーン名が my-cluster-1 の場合は
クラスタのデフォルト ルールとして [すべてのイメージを許可] を選択します。
[追加] をクリックします。
[進行状況を確認] をクリックして、実行したタスクを確認します。Binary Authorization ポリシーが正常に更新されて、プロジェクト レベルの「すべてのイメージを禁止」ルールとクラスタレベルの「すべてのイメージを許可」ルールが追加されている場合は、評価スコアが表示されます。
実際の構成をシミュレートするために、プロジェクト内に限定公開の Google Container Registry(GCR)コンテナ イメージを作成します。
nginx プロジェクトから nginx コンテナを pull して、変更しないまま現在の GCR リポジトリに push します。
Cloud Shell で、latest の nginx コンテナを pull します。
Do you want to continue (Y/n)? というプロンプトが表示されたら、「Y」と入力します。
ポリシーによるイメージの禁止が想定どおりに機能することを実証するために、まず、クラスタ固有の allow ルールが適用されており、すべてのコンテナの実行が許可されることを確認します。
nginx Pod を 1 つ起動します。「pod/nginx created」というメッセージが表示されます。
出力:
失敗した場合は、クラスタ固有のルールのリージョンと名前を再確認してやり直します。
[Binary Authorization] ページで [ポリシーを編集] をクリックします。
GKE クラスタ固有のルールの右にあるその他アイコン(3 つの点)、[編集] の順にクリックします。
次に、[すべてのイメージを禁止] を選択し、[送信] をクリックします。
ポリシーが次のようになります。
[進行状況を確認] をクリックして、実行したタスクを確認します。Binary Authorization ポリシーが正常に更新されて、クラスタレベルのルールが [すべてのイメージを禁止] に変更されている場合は、評価スコアが表示されます。
nginx Pod を作成します。今回は、ポリシーが原因でこの Pod を実行できなかったという内容のメッセージが API サーバーから返されます。
Binary Authorization ポリシーによってイメージがブロックされた日時を確認するには、オペレーション スイートの GKE 監査ログに移動して、このアクティビティに関連するエラー メッセージでフィルタします。
nginx Pod の実行のブロックに対応するエラーが表示されます。[進行状況を確認] をクリックして、実行したタスクを確認します。クラスタ アドミッション ルールの確認が正常に行われた場合は、評価スコアが表示されます。
この nginx コンテナのみに実行を許可したい場合はどうすればよいでしょうか。最も簡単な方法は、このコンテナのソースであるレジストリを許可リストに登録することです。
次のコマンドの出力をイメージパスとして使用します。
イメージパスの出力をバッファにコピーします。
ナビゲーション メニュー > [セキュリティ] > [Binary Authorization] に移動します。
Binary Authorization ポリシーを編集します。[カスタム除外ルール] イメージパスが表示されてから、[イメージ パターンを追加] をクリックします。
先ほどコピーしたイメージパスを貼り付けます。次の図は、パスの例を示しています。
今度はこの Pod を起動できるはずです。これにより、レジストリの許可リストが正常に機能していることがわかります。
[進行状況を確認] をクリックして、実行したタスクを確認します。Binary Authorization ポリシーが正常に更新されて、アーティファクト レジストリが許可リストに登録されている場合は、評価スコアが表示されます。
コンテナ イメージ レジストリを許可リストに登録することは、望ましくないコンテナ イメージがクラスタ内で実行されるのを防ぐための最初のステップとして効果的ですが、コンテナが正しくビルドされていることを確認するためにできることは他にもあります。
たとえば、特定のコンテナ イメージのデプロイが承認されているかどうかを暗号によって確認できます。これには「証明書の認証局」を使用します。証明書の認証局は、特定のステップが完了したことを証明するために、コンテナ イメージの SHA256 ハッシュを記述するメタデータのスニペットに PGP 鍵で署名して、それを一元的なメタデータ リポジトリ(Container Analysis API)に送信します。
その後、コンテナ イメージの実行が許可されているかどうかをアドミッション コントローラが確認します。これは、イメージに証明書が存在することを要件とする Binary Authorization ポリシーを調べることによって行われます。このとき、完了したステップを示す署名付きメタデータ スニペットが Container Analysis API に保持されているかどうかが確認されます。この情報により、アドミッション コントローラは、その Pod の実行を許可すべきかどうかを判断します。
次に、コンテナ イメージに手動の証明書を適用します。人間の「証明書の認証局」として、コンテナ イメージへの署名に必要なすべてのステップを実行し、クラスタ内で実行されるイメージに証明書が存在することを要求するポリシーを作成して、署名したイメージが Pod で正常に実行されることを確認します。
まず、証明書の認証局を Container Analysis メモとして Container Analysis API に登録します。そのためには、ATTESTATION メモを作成して Container Analysis API に送信します。
ATTESTATION メモのペイロードを作成します。ATTESTATION メモを Container Analysis API に送信します。作成されたメモは、前のコマンドの出力に表示されますが、次のコマンドでも表示できます。
この証明書の認証局はイメージ メタデータへの暗号署名に PGP 鍵を使用するため、新しい PGP 鍵を作成して公開 PGP 鍵をエクスポートします。
Enter キーを押して空のパスフレーズを使用し、表示される警告を承諾します。
公開 PGP 鍵を抽出します。
次に、Binary Authorization API で「認証者」を作成して公開 PGP 鍵を追加します。
出力は次のようになります。
これまでのステップと次以降のステップを実行するのは 1 回だけですが、このステップは新しいコンテナ イメージを作成するたびに実行する必要があります。
nginx:latest の nginx イメージは、すでにビルドされて使用できる状態になっています。このイメージに対して、独自のプロセスによってビルドされた独自のイメージの場合と同様に、手動の証明書を適用します。これにより、イメージをビルドする手間を省くことができます。
次に、Binary Authorization ポリシーを変更して、許可リストのパターンに一致しないすべてのイメージで証明書の存在を必須にします。
編集します。現在のクラスタ名の横にあるその他アイコン(3 つの点)をクリックして、クラスタ固有ルールの [編集] を選択します。
すべてのイメージを禁止] の代わりに、[証明書を要求: 次の認証者によって検証されたイメージのみを許可します] を選択します。認証者の追加] をクリックし、[認証者リソース ID により追加] をクリックします。コピー / 貼り付けバッファの内容を projects/${PROJECT_ID}/attestors/${ATTESTOR} という形式で入力し、[認証者の追加]、[送信]、[ポリシーを保存] の順にクリックします。デフォルトのポリシーは [すべてのイメージを禁止] のままですが、クラスタ固有のルールでは証明書が要求されています。
お疲れさまでした。コンテナ イメージに手動の証明書を適用し、GKE クラスタ内でそのイメージに対してポリシーを適用できました。
[進行状況を確認] をクリックして、実行したタスクを確認します。Binary Authorization ポリシーが正常に更新されて、認証者によって承認されているイメージのみを許可するようにクラスタ固有のルールが変更されている場合は、評価スコアが表示されます。
ユーザー側から見ると、Binary Authorization ポリシーがイメージを誤ってブロックする可能性や、アドミッション コントローラ Webhook の正常な機能を妨げるその他の問題が発生する可能性があります。
こうした「緊急事態」に対処するために、「ブレークグラス」機能が用意されています。これにより、特殊なアノテーションを使用して、ポリシーの適用をスキップして Pod を実行するようにアドミッション コントローラに通知できます。
ただし、そのような場合、アクティビティの発生から数秒で対応を開始できます。ログは Stackdriver で確認できます。
nginx コンテナを実行するには、次のコマンドを使用します。Google Cloud コンソールで、ナビゲーション メニュー > [ロギング] > [ログ エクスプローラ] ページに移動します。
クエリビルダー ボックスに次のコードを入力し、[クエリを実行] をクリックします。
前述のアノテーションによって Pod が許可された場合は、イベントが表示されます。このフィルタからシンクを作成して、このフィルタに一致するログを外部の宛先に送信できます。
このラボで作成したすべてのリソースは Qwiklabs によって削除されますが、実際の環境をクリーンアップする方法を学習しておきましょう。
このラボの始めに独自のクラスタ名を指定した場合はその名前を使用してください。この例で使用されている名前は my-cluster-1 です。
出力の最後の行が次のようになります。
gcloud container clusters list コマンドを使用します。クラスタが削除されるまで待ちます。
[進行状況を確認] をクリックして、実行したタスクを確認します。クラスタが正常に削除された場合は、評価スコアが表示されます。
以下のコマンドで残りのリソースを削除します。
[Do you want to continue (Y/n)] というメッセージが表示されたら、「Y」と入力します。
認証者を削除します。
kubectl delete <podname> を使用して Pod を削除してから Pod 作成コマンドを再送信します。gcloud container clusters list コマンドを実行します。--enable-network-policy、--accelerator、--enable-tpu、--enable-metadata-concealment など)、Binary Authorization ポリシーの許可リストにレジストリをさらに追加しないと Pod を実行できない可能性があります。kubectl describe pod <podname> を使用してイメージ仕様でレジストリパスを確認し、gcr.io/example-registry/* という形式で許可リストに追加してポリシーを保存します。このラボでは、Binary Authorization を使用して Kubernetes Engine クラスタをデプロイし、環境を保護する方法について学習しました。
マニュアルの最終更新日: 2025 年 2 月 27 日
ラボの最終テスト日: 2025 年 2 月 27 日
Copyright 2026 Google LLC.本ソフトウェアは「現状有姿」で提供されており、いかなる使用および目的に関しても保証および表明は伴いません。本ソフトウェアのご利用には、Google との契約が適用されます。
このコンテンツは現在ご利用いただけません
利用可能になりましたら、メールでお知らせいたします
ありがとうございます。
利用可能になりましたら、メールでご連絡いたします
1 回に 1 つのラボ
既存のラボをすべて終了して、このラボを開始することを確認してください
ラボを開始するには、この簡単な手順を完了してください。