概要
このラボでは、内部 RFC 1918 IP アドレスを使用する標準クラスタを作成し、そこに API アクセスのための承認済みネットワークを追加してから、Pod のセキュリティを確保するためのネットワーク ポリシーを構成します。
注: このラボでは、GKE Standard モードを使用します。ラボでは、クラスタ ネットワーク ポリシーについて説明します。これらのポリシーは GKE Autopilot でデフォルトで有効になっています。目標
このラボでは、次のタスクの実行方法について学びます。
- 内部 RFC 1918 IP アドレスを使用する標準クラスタを作成してテストする。
- 承認済みネットワークがコントロール プレーンにアクセスできるようクラスタを構成する。
- クラスタ ネットワーク ポリシーを構成する。
設定と要件
各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。
-
[ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。
左側の [ラボの詳細] パネルには、以下が表示されます。
- [Google Cloud コンソールを開く] ボタン
- 残り時間
- このラボで使用する必要がある一時的な認証情報
- このラボを行うために必要なその他の情報(ある場合)
-
[Google Cloud コンソールを開く] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウで開く] を選択します)。
ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。
ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
-
必要に応じて、下のユーザー名をコピーして、[ログイン] ダイアログに貼り付けます。
{{{user_0.username | "Username"}}}
[ラボの詳細] パネルでもユーザー名を確認できます。
-
[次へ] をクリックします。
-
以下のパスワードをコピーして、[ようこそ] ダイアログに貼り付けます。
{{{user_0.password | "Password"}}}
[ラボの詳細] パネルでもパスワードを確認できます。
-
[次へ] をクリックします。
重要: ラボで提供された認証情報を使用する必要があります。Google Cloud アカウントの認証情報は使用しないでください。
注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
-
その後次のように進みます。
- 利用規約に同意してください。
- 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
- 無料トライアルには登録しないでください。
その後、このタブで Google Cloud コンソールが開きます。
注: Google Cloud のプロダクトやサービスのリストを含むメニューを表示するには、左上のナビゲーション メニューをクリックするか、[検索] フィールドにサービス名またはプロダクト名を入力します。
最初のログイン手順を完了すると、プロジェクト ダッシュボードが表示されます。
Google Cloud Shell の有効化
Google Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。
Google Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。
-
Google Cloud コンソールで、右上のツールバーにある [Cloud Shell をアクティブにする] ボタンをクリックします。

-
[続行] をクリックします。
環境がプロビジョニングされ、接続されるまでしばらく待ちます。接続した時点で認証が完了しており、プロジェクトに各自のプロジェクト ID が設定されます。次に例を示します。

gcloud は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。
- 次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list
出力:
Credentialed accounts:
- @.com (active)
出力例:
Credentialed accounts:
- google1623327_student@qwiklabs.net
- 次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project
出力:
[core]
project =
出力例:
[core]
project = qwiklabs-gcp-44776a13dea667a6
注:
gcloud ドキュメントの全文については、
gcloud CLI の概要ガイド
をご覧ください。
タスク 1. 標準クラスタを作成する
このタスクでは、内部 RFC 1918 IP アドレスを使用する標準クラスタを作成します。
クラスタ内のすべてのワーカーノードに、内部 RFC 1918 IP アドレスのみを割り当てます。これにより、そのワークロードが公共のインターネットから隔離され、パブリック IP アドレスが割り当てられなくなります。
標準クラスタを設定する
-
ナビゲーション メニュー(
)で、[Kubernetes Engine] > [クラスタ] をクリックします。
- [作成] をクリックし、クラスタの [Standard クラスタに切り替え] を選択します。
- クラスタに「
standard-cluster」という名前を付けます。
- ゾーンとして を選択します。
- 左側のペインの [ノードプール] で [default-pool] をクリックします。
- [ノード数] に「2」と入力します。

- 左側のペインの [クラスタ] で、[ネットワーキング] をクリックします。
- [承認済みネットワークを有効にする] が選択されていないことを確認します。
- [コントロール プレーンのデフォルトのプライベート エンドポイント サブネットをオーバーライドする] チェックボックスをオンにします。
- [プライベート エンドポイント サブネット] で、[デフォルト] を選択します。

- [プライベート ノードを有効にする] チェックボックスをオンにします。
注: Google Cloud は VPC ピアリングを使用して、クラスタの VPC とデフォルトの VPC ネットワークを接続します。
このオプションを表示するには、下にスクロールする必要がある場合があります。
この設定により、外部からクラスタにアクセスできるアドレスの範囲を定義できます。このチェックボックスをオフにすると、Google Cloud ネットワーク内からしか kubectl にアクセスできなくなります。このラボでは Google Cloud ネットワークからのみ kubectl にアクセスしますが、後でこの設定を変更します。
- [作成] をクリックします。
注: クラスタのデプロイが完了するまで数分待つ必要があります。
クラスタを検査する
- Cloud Shell で次のコマンドを入力して、新しいクラスタの詳細を確認します。
gcloud container clusters describe standard-cluster --zone {{{project_0.default_zone|ZONE}}}
以下の値は、クラスタの下にのみ表示されます。
- privateEndpoint: 内部 IP アドレス。ノードはこの内部 IP アドレスを使用してクラスタ コントロール プレーンと通信します。
- publicEndpoint: 外部 IP アドレス。外部サービスと管理者は外部 IP アドレスを使用してクラスタ コントロール プレーンと通信できます。
クラスタの公開範囲は、次のようにさまざまなレベルで制限できます。
- クラスタ全体を外部アクセス可能にする。
- クラスタ全体を内部アクセス可能にする。
- ノードを内部に設定し、クラスタ コントロール プレーンを一般公開にする。さらに、クラスタ コントロール プレーンにアクセスできる外部ネットワークを制限する。
パブリック IP アドレスを使用しない場合は、Cloud NAT などの NAT ゲートウェイを構成しない限り、ノード上で実行されるコードは公共のインターネットにアクセスできません。
内部アクセスが可能なクラスタは、ネットワーク内のリソースからのみアクセスされる内部 API などのサービスを提供するために使用できます。たとえば、そのリソースが自社のみで使用する非公開のツールである場合がこれに該当します。また、リソースが、フロントエンド サービスによってアクセスされるバックエンド サービスであり、外部の顧客やユーザーが直接アクセスするのはフロントエンド サービスだけである場合もこれに該当します。このようなケースでは、これらのクラスタを使用すると、アプリケーションの攻撃対象領域を効果的に減らすことができます。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
標準クラスタを作成する
タスク 2. クラスタのコントロール プレーンにアクセスできる承認済みネットワークを追加する
クラスタを作成した後に、Google Cloud の外部からクラスタにコマンドを発行する必要が生じる場合があります。たとえば、企業ネットワーク内からのみクラスタ コントロール プレーンにコマンドを発行できるように制限したものの、クラスタ作成時に承認済みネットワークを指定するのを忘れていた場合などがこれに該当します。
このタスクでは、クラスタ コントロール プレーン アクセス用の承認済みネットワークを追加します。
注: このタスクでは、特定のネットワーク アドレス範囲から Kubernetes コントロール プレーン API にアクセスできるようにします。GKE でこの接続を使用するのは IT スタッフと自動化されたプロセスであり、エンドユーザーが使用することはありません。
- Google Cloud コンソールのナビゲーション メニュー(
)で、[Kubernetes Engine] > [クラスタ] をクリックします。
- [standard-cluster] をクリックし、[クラスタの詳細] ページを開きます。
- [詳細] タブの [コントロール プレーン ネットワーキング] セクションで、[編集](
)をクリックします。
- [承認済みネットワークを有効にする] をオンにします。
- [承認済みネットワークを追加] をクリックします。
- [名前] にネットワーク名として「
Corporate」と入力します。
- [ネットワーク] に、クラスタ コントロール プレーンへの許可リストに登録されたアクセスを許可する CIDR 範囲を入力します。たとえば、
192.168.1.0/24 を使用できます。
- [完了] をクリックします。
- 次のパラメータが有効になっていることを確認します。
- コントロール プレーンの外部 IP アドレスを使用してアクセスする
- コントロール プレーンの内部 IP アドレスを使用して任意のリージョンからアクセスする
- コントロール プレーンの内部エンドポイントに承認済みネットワークを適用する
- 承認済みネットワークに Google Cloud の外部 IP アドレスを追加する
ここでは必要に応じて複数のネットワークを追加できますが、追加できる CIDR 範囲は 50 個までです。
注: このラボ環境外で実際に設定を行う場合の例としては、企業ファイアウォールの外部パブリック アドレスのみを許可リストに登録することなどが挙げられます。たとえば、企業ファイアウォールの IP アドレスが 8.8.8.14 の場合は、8.8.8.14/32 へのアクセスを許可リストに登録します。
- メニューの下部にある [変更を保存] をクリックします。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
クラスタのコントロール プレーンにアクセスできる承認済みネットワークを追加する
タスク 3. クラスタ ネットワーク ポリシーを作成する
このタスクでは、Pod 間の通信を制限するためのクラスタ ネットワーク ポリシーを作成します。いずれかの Pod が不正使用された場合にクラスタ内で水平展開攻撃が行われるのを防ぐうえで、ゼロトラスト ゾーンは重要になります。
GKE クラスタを作成する
- Cloud Shell で次のコマンドを入力して、ゾーンとクラスタ名の環境変数を設定します。
export my_zone={{{project_0.default_zone|ZONE}}}
export my_cluster=standard-cluster-1
- Cloud Shell で kubectl のタブ補完を構成します。
source <(kubectl completion bash)
- Cloud Shell で次のコマンドを入力して、Kubernetes クラスタを作成します。このコマンドを実行すると、これまでのラボで使用したパラメータにフラグ
--enable-network-policy が追加されます。このフラグにより、このクラスタでクラスタ ネットワーク ポリシーを使用できるようになります。
gcloud container clusters create $my_cluster --num-nodes 3 --enable-ip-alias --zone $my_zone --enable-network-policy
- Cloud Shell で次のコマンドを使用して、kubectl コマンドライン ツールのクラスタへのアクセスを設定します。
gcloud container clusters get-credentials $my_cluster --zone $my_zone
-
app=hello というラベルのシンプルなウェブサーバー アプリケーションを実行し、クラスタ内部でそのウェブ アプリケーションを公開します。
kubectl run hello-web --labels app=hello \
--image=gcr.io/google-samples/hello-app:1.0 --port 8080 --expose
Pod への着信トラフィックを制限する
hello-allow-from-foo.yaml というサンプルの NetworkPolicy マニフェスト ファイルを作成しましょう。このマニフェスト ファイルでは、app: foo というラベルが付いた Pod から app: hello というラベルが付いた Pod へのアクセスを許可する内向き(上り)ポリシーが定義されています。
-
hello-allow-from-foo.yaml というファイルを作成し、次のコマンドを実行して nano で開きます。
nano hello-allow-from-foo.yaml
- nano が開いたら、以下を
hello-allow-from-foo.yaml ファイルに貼り付けます。
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: hello-allow-from-foo
spec:
policyTypes:
- Ingress
podSelector:
matchLabels:
app: hello
ingress:
- from:
- podSelector:
matchLabels:
app: foo
-
Ctrl+O キーの次に Enter キーを押し、編集したファイルを保存します。
-
Ctrl+X キーを押して nano テキスト エディタを終了します。
-
内向きポリシーを作成します。
kubectl apply -f hello-allow-from-foo.yaml
- ポリシーが作成されたことを確認します。
kubectl get networkpolicy
出力:
NAME POD-SELECTOR AGE
hello-allow-from-foo app=hello 7s
内向きポリシーを検証する
-
app=foo というラベルが付いた一時 Pod「test-1」を実行し、その Pod でシェルを取得します。
kubectl run test-1 --labels app=foo --image=alpine --restart=Never --rm --stdin --tty
注: run コマンドと合わせて、ここで使用している kubectl のオプションについて理解しておくことが大切です。
--stdin(または -i): コンテナの STDIN に接続されたインタラクティブ セッションを作成します。
--tty(または -t): Pod 内の各コンテナに TTY を割り当てます。
--rm: Kubernetes に対して、起動タスクが完了したらすぐに削除される一時 Pod としてこれを扱うように指示します。これはインタラクティブ セッションであるため、ユーザーがセッションを終了するとすぐに削除されます。
--label(または -l): Pod に一連のラベルを追加します。
--restart: Pod の再起動ポリシーを定義します。
- hello-web:8080 エンドポイントに対してリクエストを発行して、着信トラフィックが許可されていることを確認します。
wget -qO- --timeout=2 http://hello-web:8080
出力:
If you don't see a command prompt, try pressing enter.
/ # wget -qO- --timeout=2 http://hello-web:8080
Hello, world!
Version: 1.0.0
Hostname: hello-web-8b44b849-k96lh
/ #
-
「exit」と入力し、Enter キーを押してシェルを終了します。
-
別の Pod を実行します。同じ Pod 名を使用しますが、ラベルには app=other という、有効なネットワーク ポリシーの podSelector と一致しないものを使用します。この Pod から hello-web アプリケーションにアクセスできないようにする必要があります。
kubectl run test-1 --labels app=other --image=alpine --restart=Never --rm --stdin --tty
- hello-web:8080 エンドポイントに対してリクエストを発行して、着信トラフィックが許可されていないことを確認します。
wget -qO- --timeout=2 http://hello-web:8080
このリクエストはタイムアウトします。
出力:
If you don't see a command prompt, try pressing enter.
/ # wget -qO- --timeout=2 http://hello-web:8080
wget: download timed out
/ #
- 「exit」と入力し、Enter キーを押してシェルを終了します。
Pod からの発信トラフィックを制限する
着信トラフィックと同じように、発信(下り)トラフィックも制限することができます。ただし、内部ホスト名(hello-web など)や外部ホスト名(www.example.com など)をクエリするには、下りネットワーク ポリシーで DNS 解決を許可する必要があります。DNS トラフィックは、TCP プロトコルおよび UDP プロトコルを使用するポート 53 で発生します。
NetworkPolicy マニフェスト ファイル foo-allow-to-hello.yaml を作成しましょう。このファイルでは、app: foo というラベルが付いた Pod が任意のポート番号で app: hello というラベルが付いた Pod と通信できるようにするポリシーと、app: foo というラベルが付いた Pod が DNS 解決に使用される UDP ポート 53 で任意のコンピュータと通信できるようにするポリシーを定義します。この DNS ポートが開いていない場合は、ホスト名を解決できません。
-
foo-allow-to-hello.yaml というファイルを作成し、次のコマンドを実行して nano で開きます。
nano foo-allow-to-hello.yaml
- nano が開いたら、以下を
foo-allow-to-hello.yaml ファイルに貼り付けます。
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: foo-allow-to-hello
spec:
policyTypes:
- Egress
podSelector:
matchLabels:
app: foo
egress:
- to:
- podSelector:
matchLabels:
app: hello
- to:
ports:
- protocol: UDP
port: 53
-
Ctrl+O キーの次に Enter キーを押し、編集したファイルを保存します。
-
Ctrl+X キーを押して nano テキスト エディタを終了します。
-
外向きポリシーを作成します。
kubectl apply -f foo-allow-to-hello.yaml
- ポリシーが作成されたことを確認します。
kubectl get networkpolicy
出力:
NAME POD-SELECTOR AGE
foo-allow-to-hello app=foo 7s
hello-allow-from-foo app=hello 5m
外向きポリシーを検証する
- hello-web-2 という新しいウェブ アプリケーションをデプロイし、クラスタ内部でそのアプリケーションを公開します。
kubectl run hello-web-2 --labels app=hello-2 \
--image=gcr.io/google-samples/hello-app:1.0 --port 8080 --expose
-
app=foo というラベルが付いた一時 Pod を実行して、コンテナ内でシェル プロンプトを取得します。
kubectl run test-3 --labels app=foo --image=alpine --restart=Never --rm --stdin --tty
- その Pod が hello-web:8080 への接続を確立できることを確認します。
wget -qO- --timeout=2 http://hello-web:8080
出力:
If you don't see a command prompt, try pressing enter.
/ # wget -qO- --timeout=2 http://hello-web:8080
Hello, world!
Version: 1.0.0
Hostname: hello-web
/ #
- この Pod が hello-web-2:8080 への接続を確立できないことを確認します。
wget -qO- --timeout=2 http://hello-web-2:8080
定義したどのネットワーク ポリシーでも app: hello-2 というラベルが付いた Pod へのトラフィックを許可していないため、このコマンドは失敗します。
- Pod が www.example.com などの外部ウェブサイトへの接続を確立できないことを確認します。
wget -qO- --timeout=2 http://www.example.com
ネットワーク ポリシーでは外部への http トラフィック(TCP ポート 80)を許可していないため、このコマンドは失敗します。
- 「exit」と入力し、Enter キーを押してシェルを終了します。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
ウェブサーバー アプリケーションを実行する
ラボを終了する
ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Google Cloud Skills Boost から削除され、アカウントの情報も消去されます。
ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。
星の数は、それぞれ次の評価を表します。
- 星 1 つ = 非常に不満
- 星 2 つ = 不満
- 星 3 つ = どちらともいえない
- 星 4 つ = 満足
- 星 5 つ = 非常に満足
フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。
フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。
Copyright 2020 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。