このページでは、タグを使用して Google Kubernetes Engine(GKE)で Cloud Next Generation Firewall のネットワーク ファイアウォール ポリシーを選択的に適用する方法について説明します。請求管理や条件付き IAM ポリシーなど、他の目的で GKE でタグを使用する方法については、タグを使用して GKE リソースを管理するをご覧ください。
Tag について
Tag は、組織レベルまたはプロジェクト レベルで Google Cloud リソースにアノテーションを付けて管理できる Key-Value です。タグを使用してリソースを整理し、ファイアウォールや IAM ポリシーなどの条件付きでポリシーを適用できます。IAM アクセス制御を使用して、タグをアタッチ、作成、更新、削除できるユーザーを定義できます。
Tag の詳細については、Resource Manager ドキュメントの Tag の概要をご覧ください。
Tag を使用してネットワーク ファイアウォール ポリシーを適用する
Tag を使用すると、グローバルまたはリージョンのネットワーク ファイアウォール ポリシーを GKE ノードに条件付きで適用できます。ネットワーク ファイアウォール ポリシーで使用するタグには、GCE_FIREWALL
という目的を指定する必要があります。ファイアウォールの目的タグを GKE クラスタまたはノードプールに適用すると、GKE は対応する Compute Engine 仮想マシン(VM)にこれらのタグを自動的にアタッチします。
ネットワーク ファイアウォール ポリシーのタグによりネットワーク タグを使用する必要はなくなります。これは、誰でも Virtual Private Cloud ファイアウォール ルールの適用のために基盤となる Compute Engine VM にアタッチできるメタデータであり、IAM アクセス制御はサポートされません。現在、VPC ファイアウォール ルールでネットワーク タグを使用している場合は、ネットワーク ファイアウォール ポリシーに移行し、安全なファイアウォール タグを使用することをおすすめします。詳細な比較については、このドキュメントのネットワーク タグと Tag を比較するをご覧ください。
ネットワーク ファイアウォール ポリシー ワークフローの Tag
GKE でネットワーク ファイアウォール ポリシーのタグを使用するには、次の操作を行います。
タグを作成します。
- 組織レベルまたはプロジェクト レベルでタグキーを定義します(
env
など)。 - キーで使用可能なタグ値(
dev
、staging
、prod
など)を定義します。 ネットワーク ファイアウォール ポリシーで使用するタグを指定します。
- 組織レベルまたはプロジェクト レベルでタグキーを定義します(
ファイアウォール タグを操作するアクセス権をユーザーに付与します。
特定の GKE クラスタまたはノードプールに Key-Value ペアであるタグを適用します。GKE は、ファイアウォール ポリシーの適用のために基盤となる Compute Engine VM にタグを自動的にアタッチします。
準備
作業を始める前に、次のことを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、
gcloud components update
を実行して最新のバージョンを取得する。
要件と制限事項
- ネットワーク ファイアウォール ポリシーのタグは、GKE バージョン 1.28 以降でサポートされています。1.28 より前の GKE バージョンを使用している場合は、代わりに VPC ファイアウォール ルールを含むネットワーク タグを使用してください。
- GKE クラスタとタグは、同じ VPC ネットワークに関連付けられている必要があります。
- Standard クラスタでは、各ノードプールは最大 5 つのアタッチされたファイアウォール タグをサポートします。
- Autopilot クラスタは、最大 5 つのファイアウォール タグをサポートします。
- GKE では、
gke-managed
接頭辞を使用するタグキーは拒否されます。 - クラスタまたはノードプールに適用する前に、タグの Key-Value ペアを作成する必要があります。
IAM のロールと権限
GKE でファイアウォール ポリシーにタグを使用するために必要な権限を取得するには、管理者に次の IAM ロールを付与するよう依頼してください。
-
タグに対して必要な権限をユーザーと GKE サービス エージェントに付与するには:
-
プロジェクトに対するプロジェクト IAM 管理者(
roles/resourcemanager.projectIamAdmin
) -
組織に対する組織管理者(
roles/resourcemanager.organizationAdmin
)
-
プロジェクトに対するプロジェクト IAM 管理者(
- タグを作成して管理するには:
組織またはプロジェクトに対するタグ管理者(
roles/resourcemanager.tagAdmin
) - リソースにタグをアタッチするには:
プロジェクトに対するタグユーザー(
roles/resourcemanager.tagUser
)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
タグを作成する
クラスタまたはノードに適用するタグが必要です。タグを作成するには、Cloud NGFW Firewall のドキュメントのファイアウォールにタグを使用するをご覧ください。
たとえば、プロジェクト スコープのファイアウォール タグを作成するには、次のコマンドを実行します。
タグキーを作成します。
gcloud resource-manager tags keys create TAG_KEY \ --parent=projects/PROJECT_ID \ --purpose=GCE_FIREWALL \ --purpose-data=network=PROJECT_ID/NETWORK_NAME
次のように置き換えます。
TAG_KEY
: タグキーの名前(例:env
)PROJECT_ID
: 実際の Google Cloud プロジェクト IDNETWORK_NAME
: タグで使用する VPC ネットワークの名前
タグキーの ID を取得します。
gcloud resource-manager tags keys describe PROJECT_ID/TAG_KEY \ --format="value(name)"
出力は
tagKeys/KEY_ID
です。ここで、KEY_ID
はキーの数値 ID です。後で使用できるように、この ID をメモしておきます。タグキーにタグ値を追加します。
gcloud resource-manager tags values create TAG_VALUE \ --parent=tagKeys/KEY_ID
TAG_VALUE
は、そのタグキーに使用可能な値(dev
など)の名前に置き換えます。
gcloud CLI コマンドのタグ構文
gcloud CLI を使用してタグを参照する場合は、次のいずれかの構文を使用して Key-Value ペアをフォーマットする必要があります。
タグの構文 | |
---|---|
tagKeys/KEY_ID=tagValues/VALUE_ID |
次のように置き換えます。
例: |
ORGANIZATION_ID/TAG_KEY=TAG_VALUE |
次のように置き換えます。
例: |
PROJECT_ID/TAG_KEY=TAG_VALUE |
次のように置き換えます。
例: |
PROJECT_NUMBER/TAG_KEY=TAG_VALUE |
次のように置き換えます。
例: |
ファイアウォール ポリシーを使用したターゲットタグ
タグを作成したら、ファイアウォール ポリシールールで特定の Key-Value ペアを参照できます。手順については、ファイアウォールに Tag を使用するをご覧ください。
サービス エージェントに IAM 権限を付与する
スケールアップ イベント中に GKE が新しいノードにタグを自動的にアタッチするには、対応する IAM ロールを Google Cloud マネージド サービス アカウント(サービス エージェントとも呼ばれる)に付与する必要があります。
Kubernetes Engine サービス エージェントにタグユーザーのロール(
roles/resourcemanager.tagUser
)を付与します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \ --role=roles/resourcemanager.tagUser \ --condition=None
PROJECT_NUMBER
は、クラスタの Google Cloud プロジェクト番号に置き換えます。プロジェクト番号を確認するには、次のコマンドを実行します。gcloud projects describe PROJECT_ID --format="value(projectNumber)"
Key-Value ペアのタグに対するタグ保留管理者のロール(
roles/resourcemanager.tagHoldAdmin
)を Kubernetes Engine サービス エージェントに付与します。gcloud resource-manager tags values add-iam-policy-binding PROJECT_ID/TAG_KEY/TAG_VALUE \ --member=serviceAccount:service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \ --role=roles/resourcemanager.tagHoldAdmin
このロールにより、Key-Value ペアが GKE でまだ使用されている場合、サービス エージェントはタグの削除を防ぐことができます。
Google API サービス エージェントにタグユーザー ロール(
roles/resourcemanager.tagUser
)を付与します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER@cloudservices.gserviceaccount.com \ --role=roles/resourcemanager.tagUser \ --condition=None
プロジェクト外のタグに追加の IAM ロールを付与する
組織またはクラスタ プロジェクトとは異なるプロジェクトによって所有されるタグを使用するには、次の追加手順を行います。
親リソースのタグに対する Kubernetes Engine サービス エージェントのアクセス権をタグユーザー ロール(
roles/resourcemanager.tagUser
)に付与します。gcloud resource-manager tags keys add-iam-policy-binding PARENT_RESOURCE/TAG_KEY \ --member=serviceAccount:service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \ --role=roles/resourcemanager.tagUser \ --condition=None
次のように置き換えます。
PARENT_RESOURCE
: そのタグを所有するリソースのプロジェクト ID または組織 IDPROJECT_NUMBER
: クラスタ プロジェクトのプロジェクト番号
親リソースのタグに対するタグユーザーのロール(
roles/resourcemanager.tagUser
)を Google API サービス エージェントのアクセス権に付与します。gcloud resource-manager tags keys add-iam-policy-binding PARENT_RESOURCE/TAG_KEY \ --member=serviceAccount:PROJECT_NUMBER@cloudservices.gserviceaccount.com \ --role=roles/resourcemanager.tagUser \ --condition=None
タグ Key-Value ペアに対するタグ保留管理者のロール(
roles/resourcemanager.tagHoldAdmin
)を Kubernetes Engine サービス エージェントに付与します。gcloud resource-manager tags values add-iam-policy-binding PARENT_RESOURCE/TAG_KEY/TAG_VALUE \ --member=serviceAccount:service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \ --role=roles/resourcemanager.tagHoldAdmin
Autopilot クラスタにファイアウォール タグをアタッチする
ファイアウォール タグは、クラスタレベルで Autopilot クラスタに適用します。GKE は、これらのクラスタレベルのタグをすべてのノードに自動的に適用します。
新しい Autopilot クラスタの作成時にタグをアタッチする
次のコマンドを実行します。
gcloud beta container clusters create-auto CLUSTER_NAME \
--location=LOCATION \
--autoprovisioning-resource-manager-tags=TAG1,TAG2,...
次のように置き換えます。
CLUSTER_NAME
: 新しいクラスタの名前。LOCATION
: クラスタの Compute Engine のリージョン。TAG1,TAG2,...
: アタッチする Key-Value ペアのカンマ区切りのセット。コマンドのタグ構文のセクションで説明されているように、各 Key-Value ペアではサポートされている構文を使用する必要があります。例:example-project/env=dev,1234567901/team=sre
。
既存の Autopilot クラスタにタグをアタッチする
次のコマンドを実行します。
gcloud beta container clusters update CLUSTER_NAME \
--location=LOCATION \
--autoprovisioning-resource-manager-tags=TAG1,TAG2,...
クラスタのタグを更新すると、GKE はすべてのノードの既存のタグを上書きします。
Standard クラスタとノードプールにファイアウォール タグを適用する
タグをアタッチするために使用する方法は、次のように、クラスタ内の他のノードプールがタグを継承するかどうかによって異なります。
Standard クラスタのファイアウォール タグ | |
---|---|
--autoprovisioning-resource-manager-tags |
クラスタレベルの設定 GKE は、クラスタ内のすべての新しい自動プロビジョニングされたノードプールにタグを適用します。 既存のクラスタでこのフラグを使用する場合、GKE はクラスタ内の既存のノードプールにタグを適用しません。既存のノードプールには、更新前に適用されていたタグが保持されます。既存のノードプールのタグを更新するには、 |
--resource-manager-tags |
ノードプール レベルの設定 GKE は、指定されたノードプールにタグを適用します。クラスタの作成時にこのフラグを使用すると、GKE は GKE が作成するデフォルトのノードプールにタグを適用します。自動プロビジョニングされたノードプールでこのフラグを使用すると、GKE はノードプール上の既存のタグを上書きします。 |
ファイアウォール タグを Standard クラスタにアタッチする
新規または既存の Standard クラスタにタグをアタッチできます。クラスタ全体にタグをアタッチすると、GKE ではこれらのタグはクラスタレベルで設定されていると見なされます。
ノード自動プロビジョニングを使用して新しい Standard クラスタにタグをアタッチする
GKE はデフォルトで、新しい自動プロビジョニングされたノードにクラスタレベルのタグを使用します。GKE がクラスタに作成するデフォルトのノードプールは、自動的にはプロビジョニングされず、それらのタグは取得されません。
gcloud beta container clusters create CLUSTER_NAME \
--location=LOCATION \
--autoprovisioning-resource-manager-tags=TAG1,TAG2,... \
--enable-autoprovisioning \
--max-cpu=MAX_CPU \
--max-memory=MAX_MEMORY
次のように置き換えます。
CLUSTER_NAME
: 新しいクラスタの名前LOCATION
: クラスタの Compute Engine のリージョンまたはゾーンTAG1,TAG2,...
: アタッチする Key-Value ペアのカンマ区切りのセット。コマンドのタグ構文のセクションで説明されているように、各 Key-Value ペアではサポートされている構文を使用する必要があります。例:example-project/env=dev,1234567901/team=sre
。MAX_CPU
: クラスタの最大コア数MAX_MEMORY
: クラスタの最大メモリ容量(GB)
既存のクラスタでノードの自動プロビジョニングを有効にするときにタグをアタッチする
GKE は、これらのタグを新しい自動プロビジョニングされたノードプールにのみ適用されます。既存のノードプールには、更新前に設定されていたタグが保持されます。
クラスタにタグをアタッチします。
gcloud beta container clusters update CLUSTER_NAME \ --location=LOCATION \ --autoprovisioning-resource-manager-tags=TAG1,TAG2,...
クラスタでノードの自動プロビジョニングを有効にします。
gcloud beta container clusters update CLUSTER_NAME \ --location=LOCATION \ --enable-autoprovisioning \ --max-cpu=MAX_CPU \ --max-memory=MAX_MEMORY
ノードプールにファイアウォール タグをアタッチする
ノードの自動プロビジョニングを使用するかどうかにかかわらず、新規または既存のノードプールにタグをアタッチできます。GKE は、これらのタグをノードプール レベルの設定と見なします。
デフォルトのノードプールにタグをアタッチする
GKE は、クラスタの作成時に --resource-manager-tags
フラグを使用して指定したタグを GKE がクラスタに作成したデフォルトのノードプールにアタッチします。
gcloud beta container clusters create CLUSTER_NAME \
--location=LOCATION \
--resource-manager-tags=TAG1,TAG2,...
次のように置き換えます。
CLUSTER_NAME
: 新しいクラスタの名前LOCATION
: クラスタの Compute Engine のリージョンまたはゾーンTAG1,TAG2,...
: アタッチする Key-Value ペアのカンマ区切りのセット。コマンドのタグ構文のセクションで説明されているように、各 Key-Value ペアではサポートされている構文を使用する必要があります。例:example-project/env=dev,1234567901/team=sre
。
新しいノードプールにタグをアタッチする
ノードプールの作成時に --resource-manager-tags
フラグを使用すると、GKE は指定したタグをそのノードプールにアタッチします。
gcloud beta container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--location=LOCATION \
--resource-manager-tags=TAG1,TAG2,...
次のように置き換えます。
NODE_POOL_NAME
: 新しいノードプールの名前CLUSTER_NAME
: クラスタの名前。LOCATION
: クラスタの Compute Engine のリージョンまたはゾーンTAG1,TAG2,...
: アタッチする Key-Value ペアのカンマ区切りのセット。コマンドのタグ構文のセクションで説明されているように、各 Key-Value ペアではサポートされている構文を使用する必要があります。例:example-project/env=dev,1234567901/team=sre
。
既存のノードプールにタグをアタッチする
--resource-manager-tags
フラグを使用して既存のノードプールのタグを更新すると、GKE はそのノードプールの既存のタグを上書きします。このコマンドを使用すると、自動プロビジョニングされたノードプールのタグを更新できます。
gcloud beta container node-pools update NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--location=LOCATION \
--resource-manager-tags=TAG1,TAG2,...
NODE_POOL_NAME
は、更新するノードプールの名前に置き換えます。
既存のクラスタとノードプールで自動プロビジョニング設定を切り替える
クラスタレベルでタグを更新すると、GKE はこの新しいタグをクラスタ内のすべての新しいノードプールに適用し、既存のノードプールにアタッチされたタグを保持します。
既存のノードプールを更新してノードの自動プロビジョニングを有効または無効にする場合は、タグに対する次の影響を考慮してください。
- ノードの自動プロビジョニングを有効または無効にすると、ノードプールは既存のタグを保持します。GKE は、ノードの再作成中でも、これらのタグをクラスタレベルのタグで上書きしません。
- 特定のノードプールのタグを手動で更新すると、GKE は既存のタグをそのノードプールに指定したタグで上書きします。
クラスタのファイアウォール タグを確認する
Autopilot クラスタのタグを一覧表示します。
gcloud beta container clusters describe CLUSTER_NAME \ --location=LOCATION \ --format="value(nodePoolAutoConfig.resourceManagerTags)"
特定のノードプールのタグを一覧表示します。
gcloud beta container node-pools describe NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --format="value(config.resourceManagerTags)"
クラスタとノードプールからファイアウォール タグを設定解除する
クラスタとノードプールからファイアウォール タグを削除するには、タグの値を空にしてリソースを更新します。
Autopilot クラスタからタグを設定解除する
次のコマンドを実行します。
gcloud beta container clusters update CLUSTER_NAME \
--location=LOCATION \
--autoprovisioning-resource-manager-tags=
ノードプールからタグを設定解除する
クラスタレベルのノードの自動プロビジョニング タグを設定解除するには:
gcloud beta container clusters update CLUSTER_NAME \ --location=LOCATION \ --autoprovisioning-resource-manager-tags=
GKE は、新しい自動プロビジョニングされたノードプールにタグをアタッチしません。
ノードプール タグを設定解除するには:
gcloud beta container node-pools update NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --resource-manager-tags=
GKE は、そのノードプールから既存のタグを削除します。
タグのキーと値を削除する
タグキーまたは値を削除するには、すべてのリソースからタグを切り離します。その後、Resource Manager ドキュメントのタグの削除をご覧ください。
ネットワーク タグと Tag を比較する
ファイアウォール ポリシーの適用に Tag を使用すると、ネットワーク タグと比較して、セキュリティとユーザビリティが大幅に向上します。同様に、ネットワーク ファイアウォール ポリシーは、組織、フォルダ、プロジェクト、ネットワークの全体でファイアウォール ルールを適用することで、VPC ファイアウォール ルールの機能を改善します。
ネットワーク ファイアウォール ポリシーで Tag を使用すると、組織全体の GKE 環境へのアクセスをより安全かつスケーラブルに管理できます。ネットワーク タグを使用してネットワーク ファイアウォール ポリシーを適用することはできませんが、タグと同じクラスタ内でネットワーク タグを使用できます。
タグとネットワーク タグの詳細な比較については、Cloud NGFW ドキュメントのタグとネットワーク タグの比較をご覧ください。
自動プロビジョニングされるノードプールの機能の違い
Autopilot クラスタと、ノードの自動プロビジョニングを使用しない Standard ノードプールでは、ネットワーク タグと Tag が同様の動作を示します。次の表は、ネットワーク タグと Standard クラスタ内の自動プロビジョニング ノードプール内の Tag の機能の違いを示しています。
アクション | ネットワーク タグの動作 | Tag の動作 |
---|---|---|
GKE がノードプールを自動プロビジョニングする | GKE がクラスタレベルのネットワーク タグを適用する | GKE がクラスタレベルのタグを適用する |
自動プロビジョニングされたノードプールのタグまたはネットワーク タグを更新する |
|
クラスタレベルのタグが存在するかどうかにかかわらず、GKE はノードプールの既存のタグを上書きします |
クラスタ全体のタグまたはネットワーク タグを更新する | GKE は、クラスタ内の自動プロビジョニングされた新規および既存のノードプールのネットワーク タグを上書きします。 | GKE は、新しい自動プロビジョニングされたノードプールに新しいクラスタレベルのタグを適用します。既存の自動プロビジョニングされたノードプールでは、更新前に使用していたタグが保持されます。 |