
始める前に
- ラボでは、Google Cloud プロジェクトとリソースを一定の時間利用します
- ラボには時間制限があり、一時停止機能はありません。ラボを終了した場合は、最初からやり直す必要があります。
- 画面左上の [ラボを開始] をクリックして開始します
Use Terraform to set up the necessary infrastructure (Lab setup)
/ 50
Installing the hello server
/ 30
Deploy a second copy of the hello-clients app into the new namespace
/ 20
このラボでは、ネットワーク通信に詳細な制限を適用して、Kubernetes Engine のセキュリティを高める方法について説明します。
最小権限の原則は、重要なシステムを障害や悪意のある行為からより強固に保護するうえで、重要な設計上の考慮事項として広く知られています。この原則では、すべてのコンポーネントには、正当な目的に必要な情報とリソースのみに絞ってアクセス権を付与します。このドキュメントでは、Kubernetes Engine のネットワーク層内に最小権限の原則を実装する方法について説明します。
ネットワーク接続は、Kubernetes Engine インフラストラクチャの 2 つの層で制限できます。最初の詳細度の低いメカニズムは、ネットワーク、サブネットワーク、ホストレベルでのファイアウォール ルールの適用です。これらのルールは、Kubernetes Engine の外部で、VPC レベルで適用されます。
ファイアウォール ルールは強固なセキュリティ保護機構ですが、Kubernetes ではネットワーク ポリシーを使用して、より詳細なルールを定義できます。ネットワーク ポリシーは、クラスタ内通信を制限するために使用されます。ネットワーク ポリシーは、ホストのネットワーク Namespace に接続されている Pod には適用されません。
このラボでは、限定公開の Kubernetes Engine クラスタと、そのクラスタへのアクセスに使用する踏み台インスタンスをプロビジョニングします。踏み台インスタンスは、クラスタへのアクセス権を持つ単一のホストを提供します。このホストを限定公開の Kubernetes ネットワークと組み合わせて使用することで、クラスタが一般のインターネットの悪意のある行為にさらされないようにします。踏み台は、ユーザーにクラウド ネットワークへの VPN アクセスがない場合に特に役立ちます。
クラスタ内には、シンプルな HTTP サーバーと 2 つのクライアント Pod がプロビジョニングされます。ネットワーク ポリシーとラベル付けを使用して、クライアント Pod の 1 つからの接続のみを許可する方法について説明します。
このラボは、GKE Binary Authorization に関する理解を深めていただくために GKE Helmsman のエンジニアによって作成されました。デモは、Cloud Shell で gsutil cp -r gs://spls/gke-binary-auth/* .
cd gke-binary-auth-demo
コマンドを実行してデモを確認できます。アセットにぜひ貢献していただければ幸いです。
Dataplane V2 を使用して、限定公開で Standard モードの Kubernetes クラスタを定義します。Dataplane V2 はデフォルトで使用できるネットワーク ポリシーです。
クラスタが限定公開なので、インターネットからは API にもワーカーノードにもアクセスできません。代わりに、踏み台インスタンスを定義し、ファイアウォール ルールを使用して踏み台インスタンスにアクセスできるようにします。踏み台の IP アドレスは、クラスタの承認済みネットワークとして定義され、API へのアクセス権が付与されます。
クラスタ内で、次の 3 つのワークロードをプロビジョニングします。
こちらの説明をお読みください。ラボには時間制限があり、一時停止することはできません。タイマーは、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 の概要ガイドをご覧ください。
まず、Google Cloud リージョンとゾーンを設定します。
このラボでは以下の Google Cloud サービス API を使用します。これらはすでに有効になっています。
compute.googleapis.com
container.googleapis.com
cloudbuild.googleapis.com
また、Terraform の構成では 3 つのパラメータを使用して、Kubernetes Engine クラスタを作成する場所を指定します。
project ID
region
zone
わかりやすくするため、これらのパラメータは terraform
ディレクトリ内の terraform.tfvars
というファイルに指定されます。
terraform/terraform.tfvars
ファイルを生成するために、次のコマンドを実行します。y
」と入力します。これにより、必要なサービス API が有効になり、以下のキーで terraform/terraform.tfvars
ファイルが生成されます。
gcloud config list
の出力と一致することを確認します。yes
」と入力して環境をデプロイします。デプロイには数分かかります。
クラスタの作成が成功したことを示すメッセージが Terraform によって出力されます。
完了したタスクをテストする
[進行状況を確認] をクリックして、実行したタスクを確認します。Terraform に必要なインフラストラクチャが正常にデプロイされていれば、評価スコアが表示されます。
既存バージョンの kubectl と Kubernetes カスタム クライアントには、クライアントと Google Kubernetes Engine との間の認証を管理するためのプロバイダ固有のコードが含まれています。v1.26 以降、このコードが OSS kubectl の一部として含まれなくなります。GKE ユーザーは、別の認証プラグインをダウンロードし、それを使用して GKE 固有のトークンを生成することが必要になります。この新しい gke-gcloud-auth-plugin
バイナリは、Kubernetes client-go 認証情報プラグイン メカニズムを使って、GKE に対応できるよう kubectl の認証機能を拡張します。詳細については、こちらのブログ投稿をご覧ください。
kubectl での認証に、デフォルトのプロバイダ固有のコードではなく、新しいバイナリ プラグインが使用されるようにするには、以下の手順を踏みます。
gke-gcloud-auth-plugin
を VM にインストールします。export USE_GKE_GCLOUD_AUTH_PLUGIN=True
in ~/.bashrc
:成功すると、このメッセージが表示されます。
新しく作成されたクラスタが、踏み台に対する標準の kubectl
コマンドで使用できるようになります。
テスト アプリケーションは、hello-server
としてデプロイされている 1 つのシンプルな HTTP サーバーと 2 つのクライアント(一方には app=hello
というラベル、もう一方には app=not-hello
というラベルが付けられている)で構成されます。
これら 3 つのサービスはすべて、hello-app マニフェストを適用することでデプロイできます。
出力:
hello-client-allowed、hello-client-blocked、hello-server のデプロイごとに 1 つの Pod が実行されていることがわかります。
完了したタスクをテストする
[進行状況を確認] をクリックして、実行したタスクを確認します。シンプルな HTTP hello サーバーが正常にデプロイされていれば、評価スコアが表示されます。
Ctrl+C キーを押して終了します。
両方の Pod が hello-server
サービスに正常に接続できることがわかります。これは、アクセスを制限するためのネットワーク ポリシーをまだ定義していないためです。それぞれのウィンドウに、サーバーからの正常なレスポンスが表示されます。
次に、app=hello
というラベルが付いていないすべての Pod からの hello-server
Pod へのアクセスをブロックします。
使用するポリシー定義は、manifests/network-policy.yaml
に含まれています。
出力:
今回は、「ブロックされる」クライアントのログの末尾を示す次のような出力がウィンドウに表示されます。
ネットワーク ポリシーによって、ラベルが付いていない Pod からの hello-server
への通信が禁止されるようになりました。
前の例では、Pod のラベルに基づいて接続を制限するネットワーク ポリシーを定義しました。代わりに Namespace 全体にラベルを付けると、特にチームやアプリケーションに独自の Namespace が付与されている場合に便利です。
そこで、指定した Namespace からのトラフィックのみを許可するようにネットワーク ポリシーを変更し、hello-allowed
Pod をその新しい Namespace に移動します。
出力:
出力:
hello-allowed-client
Pod のログを確認します。この Pod が hello-server
に接続できなくなっていることがわかります。
Ctrl+C キーを押して終了します。
最後に、hello-client アプリの 2 番目のコピーを新しい Namespace にデプロイします。
出力:
完了したタスクをテストする
[進行状況を確認] をクリックして、実行したタスクを確認します。hello-client アプリの 2 番目のコピーが新しい Namespace に正常にデプロイされていれば、評価スコアが表示されます。
次に、2 つの新しい hello-app
クライアントのログを検証します。
hello-apps
Namespace 内の「hello」というラベルが付いたアプリのログを表示します。出力:
Kubernetes 1.10.x 以降、ネットワーク ポリシーで特定の Namespace 内の Pod へのアクセスを制限できなくなったため、いずれのクライアントも正常に接続できています。Pod のラベル、Namespace のラベル、あるいは両方の union(OR 結合)を許可リストに登録できます。ただし、Pod のラベルと Namespace のラベルの交差(AND 結合)を許可リストに登録することはまだできません。
このラボで使用したすべてのリソースは Qwiklabs によってシャットダウンされますが、次のクリーンアップ手順に従うことで、費用を抑えてクラウドにおけるマナーを保つことができます。
出力:
Terraform で使用している認証情報には、選択されているプロジェクトでリソースを作成するのに必要な権限がありません。gcloud config list
で表示されるアカウントに、リソースの作成に必要な権限があることを確認してください。権限がある場合は、gcloud auth application-default login
を実行してアプリケーションのデフォルト認証情報を生成し直してください。
Terraform で特定のリソースを更新中に、無効なフィンガープリントに関するエラーが表示されることがあります。
以下のエラーが表示された場合は、シンプルにコマンドを再実行してください。
きめの細かい制限をネットワーク通信に適用することで、Kubernetes Engine のセキュリティが向上しました。
このセルフペース ラボは、「Google Kubernetes Engine Best Practices: Security」クエストの一部です。クエストとは学習プログラムを構成する一連のラボのことで、完了すると成果が認められてバッジが贈られます。バッジは公開して、オンライン レジュメやソーシャル メディア アカウントにリンクできます。このラボの修了後、こちらのクエストに登録すれば、すぐにクレジットを受け取ることができます。受講可能なすべてのクエストについては、Google Cloud Skills Boost カタログをご覧ください。
デフォルトの GKE クラスタ構成の強化に進んでクエストを続けるか、以下の Google Cloud Skills Boost ラボをご確認ください。
Google Cloud トレーニングと認定資格を通して、Google Cloud 技術を最大限に活用できるようになります。必要な技術スキルとベスト プラクティスについて取り扱うクラスでは、学習を継続的に進めることができます。トレーニングは基礎レベルから上級レベルまであり、オンデマンド、ライブ、バーチャル参加など、多忙なスケジュールにも対応できるオプションが用意されています。認定資格を取得することで、Google Cloud テクノロジーに関するスキルと知識を証明できます。
Copyright 2024 Google LLC. 本ソフトウェアは「現状有姿」で提供されており、いかなる使用および目的に関しても保証および表明は伴いません。本ソフトウェアのご利用には、Google との契約が適用されます。
このコンテンツは現在ご利用いただけません
利用可能になりましたら、メールでお知らせいたします
ありがとうございます。
利用可能になりましたら、メールでご連絡いたします
1 回に 1 つのラボ
既存のラボをすべて終了して、このラボを開始することを確認してください