GKE でファイアウォール ポリシーを選択的に適用する


このページでは、タグを使用して 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 でネットワーク ファイアウォール ポリシーのタグを使用するには、次の操作を行います。

  1. タグを作成します。

    1. 組織レベルまたはプロジェクト レベルでタグキーを定義します(env など)。
    2. キーで使用可能なタグ値(devstagingprod など)を定義します。
    3. ネットワーク ファイアウォール ポリシーで使用するタグを指定します。

  2. ファイアウォール タグを操作するアクセス権をユーザーに付与します。

  3. 特定の 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 サービス エージェントに付与するには:
  • タグを作成して管理するには: 組織またはプロジェクトに対するタグ管理者roles/resourcemanager.tagAdmin
  • リソースにタグをアタッチするには: プロジェクトに対するタグユーザーroles/resourcemanager.tagUser

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

タグを作成する

クラスタまたはノードに適用するタグが必要です。タグを作成するには、Cloud NGFW Firewall のドキュメントのファイアウォールにタグを使用するをご覧ください。

たとえば、プロジェクト スコープのファイアウォール タグを作成するには、次のコマンドを実行します。

  1. タグキーを作成します。

    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 プロジェクト ID
    • NETWORK_NAME: タグで使用する VPC ネットワークの名前
  2. タグキーの ID を取得します。

    gcloud resource-manager tags keys describe PROJECT_ID/TAG_KEY \
        --format="value(name)"
    

    出力は tagKeys/KEY_ID です。ここで、KEY_ID はキーの数値 ID です。後で使用できるように、この ID をメモしておきます。

  3. タグキーにタグ値を追加します。

    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

次のように置き換えます。

  • KEY_ID: 数値のキー ID
  • VALUE_ID: 数値 ID

例: tagKeys/123456789=tagValues/987654321

ORGANIZATION_ID/TAG_KEY=TAG_VALUE

次のように置き換えます。

  • ORGANIZATION_ID: 数値の Google Cloud 組織 ID
  • TAG_KEY: 作成したタグキーの名前
  • TAG_VALUE: 作成したタグ値の名前

例: 12345678901/env=dev

PROJECT_ID/TAG_KEY=TAG_VALUE

次のように置き換えます。

  • PROJECT_ID: 実際の Google Cloud プロジェクト ID
  • TAG_KEY: 作成したタグキーの名前
  • TAG_VALUE: 作成したタグ値の名前

例: example-project/env=dev

PROJECT_NUMBER/TAG_KEY=TAG_VALUE

次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクトの数値識別子
  • TAG_KEY: 作成したタグキーの名前
  • TAG_VALUE: 作成したタグ値の名前

例: 11223344556/env=dev

ファイアウォール ポリシーを使用したターゲットタグ

タグを作成したら、ファイアウォール ポリシールールで特定の Key-Value ペアを参照できます。手順については、ファイアウォールに Tag を使用するをご覧ください。

サービス エージェントに IAM 権限を付与する

スケールアップ イベント中に GKE が新しいノードにタグを自動的にアタッチするには、対応する IAM ロールを Google Cloud マネージド サービス アカウント(サービス エージェントとも呼ばれる)に付与する必要があります。

  1. 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)"
    
  2. 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 でまだ使用されている場合、サービス エージェントはタグの削除を防ぐことができます。

  3. 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 ロールを付与する

組織またはクラスタ プロジェクトとは異なるプロジェクトによって所有されるタグを使用するには、次の追加手順を行います。

  1. 親リソースのタグに対する 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 または組織 ID
    • PROJECT_NUMBER: クラスタ プロジェクトのプロジェクト番号
  2. 親リソースのタグに対するタグユーザーのロール(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
    
  3. タグ 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 フラグを使用します。

--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 は、これらのタグを新しい自動プロビジョニングされたノードプールにのみ適用されます。既存のノードプールには、更新前に設定されていたタグが保持されます。

  1. クラスタにタグをアタッチします。

    gcloud beta container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --autoprovisioning-resource-manager-tags=TAG1,TAG2,...
    
  2. クラスタでノードの自動プロビジョニングを有効にします。

    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=

ノードプールからタグを設定解除する

  1. クラスタレベルのノードの自動プロビジョニング タグを設定解除するには:

    gcloud beta container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --autoprovisioning-resource-manager-tags=
    

    GKE は、新しい自動プロビジョニングされたノードプールにタグをアタッチしません。

  2. ノードプール タグを設定解除するには:

    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 は、クラスタ内の自動プロビジョニングされた新規および既存のノードプールのネットワーク タグを上書きします。 GKE は、新しい自動プロビジョニングされたノードプールに新しいクラスタレベルのタグを適用します。既存の自動プロビジョニングされたノードプールでは、更新前に使用していたタグが保持されます。

次のステップ