タグを使用したグローバル ネットワーク ファイアウォール ポリシー

1. はじめに

ネットワーク ファイアウォール ポリシー

ファイアウォールは、安全なクラウド環境のための基本的な構成要素です。以前は、VPC ファイアウォールについては変更せずに、組織レベルとフォルダレベルでファイアウォール ポリシーを導入しました。このバージョンでは、ファイアウォール ポリシーの構造を VPC レベルまで拡張し、現在のファイアウォール ポリシーのサポートにいくつかの機能強化を加えます。これは、Google Cloud のリソース階層全体で統合されたファイアウォール サポートと、ファイアウォール ポリシー制御を安全かつ柔軟かつスケーラブルな方法で管理するための一貫したユーザー エクスペリエンスを提供するためです。

ネットワーク ファイアウォール ポリシーは、ファイアウォール ルールのコンテナとして機能します。ネットワーク ファイアウォール ポリシーで定義されたルールは、ポリシーが VPC ネットワークに関連付けられるまで適用されません。各 VPC ネットワークには、1 つのネットワーク ファイアウォール ポリシーを関連付けることができます。ネットワーク ファイアウォール ポリシーは、ファイアウォール ルールで IAM によって管理されるタグ(またはタグのみ)をサポートします。これは現在のネットワーク タグを置き換え、ワークロードに ID を提供するために使用できます。

ネットワーク ファイアウォール ポリシーをネットワーク間で共有し、IAM によって管理されるタグと統合することで、ファイアウォールの構成と管理が大幅に簡素化されます。

ネットワーク ファイアウォール ポリシーの導入により、Google Cloud のファイアウォール ポリシーは次のコンポーネントで構成されるようになりました。

  1. 階層型ファイアウォール ポリシー
  2. VPC ファイアウォール ルール
  3. ネットワーク ファイアウォール ポリシー(グローバルリージョン

階層型ファイアウォール ポリシーは、リソース階層内の組織ノードとフォルダノードでサポートされていますが、VPC ファイアウォール ルールとネットワーク ファイアウォール ポリシーは VPC レベルで適用されます。VPC ファイアウォール ルールとネットワーク ファイアウォール ポリシーの大きな違いは、VPC ファイアウォール ルールは 1 つの VPC ネットワークにのみ適用できるのに対し、ネットワーク ファイアウォール ポリシーは 1 つの VPC または VPC グループにアタッチできることです。また、バッチ アップデートなどのメリットもあります。

最後に、すべての VPC ネットワークに付属する暗黙のファイアウォール ルールがあります。

  • アクションが allow、宛先が 0.0.0.0/0 の下り(外向き)ルール
  • アクションが deny、送信元が 0.0.0.0/0 の上り(内向き)ルール

デフォルトでは、次の図に強制適用シーケンスを示します。

abae4597af782b2b.png

VPC ファイアウォール ルールとグローバル ネットワーク ファイアウォール ポリシーの適用順序は入れ替えることができます。適用順序は、gcloud コマンドでいつでも指定できます。

タグ

ネットワーク ファイアウォール ポリシールールに統合されたタグは、Google Cloud リソース階層の組織レベルで定義された Key-Value ペアのリソースです。このようなタグには、名前が示すように、誰がタグに対して何をできるかを指定する IAM アクセス制御が含まれます。たとえば IAM 権限では、どのプリンシパルが値をタグに割り当てることができるかと、どのプリンシパルがタグをリソースにアタッチできるかを指定できます。リソースにタグが適用されると、ネットワーク ファイアウォール ルールで、そのタグを使用してトラフィックを許可または拒否できるようになります。

タグは Google Cloud の継承リソースモデルに従います。つまり、タグとその値は親から階層全体にわたって受け渡されます。そのため、タグを 1 か所で作成して、リソース階層全体の他のフォルダやプロジェクトで使用できます。タグとアクセス制限について詳しくは、こちらのページをご覧ください。

ネットワーク タグは、Compute Engine インスタンスに追加できる文字列です。タグをネットワーク タグと混同しないでください。インスタンスに関連付けられ、インスタンスが廃止されると消えます。VPC ファイアウォール ルールにはネットワーク タグを含めることができますが、クラウド リソースとはみなされないため、IAM アクセス制御の対象ではありません。

このドキュメントでは、タグと IAM によって管理されるタグを同じ意味で使用することに注意してください。

作成するアプリの概要

この Codelab は 2 つのパートに分かれています。最初のパートでは、単一の VPC ネットワークを使用したネットワーク ファイアウォール ポリシーとタグについて説明します。2 番目のパートでは、以下の図に示すように、ピアリングされた VPC ネットワーク間でタグを使用する方法を紹介します。したがって、この Codelab には 1 つのプロジェクトが必要で、複数の VPC ネットワークを作成できる必要があります。

b9acf9823df8be04.jpeg

学習内容

  • ネットワーク ファイアウォール ポリシーの作成方法
  • ネットワーク ファイアウォール ポリシーでタグを作成して使用する方法
  • VPC ネットワーク ピアリングでタグを使用する方法

必要なもの

  • Google Cloud プロジェクト
  • インスタンスのデプロイとネットワーキング コンポーネントの構成に関する知識
  • VPC ファイアウォール構成に関する知識

2. 始める前に

変数を作成/更新する

この Codelab では、Cloud Shell での gcloud 構成の実装に役立つ $variables を使用します。

Cloud Shell で、次のコマンドを実行します。

gcloud config set project [project-id]
export project_id=`gcloud config list --format="value(core.project)"`
export org_id=[org]
export region=us-central1
export zone=us-central1-a
export prefix=fwpolicy

3. VPC ネットワークとサブネットを作成する

VPC ネットワーク

fwpolicy-vpc1 を作成します。

gcloud compute networks create $prefix-vpc1 --subnet-mode=custom 

サブネット

選択したリージョンにそれぞれのサブネットを作成します。

gcloud compute networks subnets create $prefix-vpc1-subnet \
   --range=10.0.0.0/24 --network=$prefix-vpc1 --region=$region

Cloud NAT

fwpolicy-pc1 の Cloud Router と Cloud NAT ゲートウェイを作成します。

gcloud compute routers create $prefix-vpc1-cr \
  --region=$region --network=$prefix-vpc1

gcloud compute routers nats create $prefix-vpc1-cloudnat \
   --router=$prefix-vpc1-cr --router-region=$region \
   --auto-allocate-nat-external-ips \
   --nat-all-subnet-ip-ranges

4. インスタンスを作成する

IAP 設定の一部としてまだ定義されていない場合に、IAP 範囲からの上り(内向き)SSH トラフィックを許可するファイアウォール ルールを作成します。

gcloud compute firewall-rules create allow-ssh-ingress-from-iap-vpc1 \
  --direction=INGRESS \
  --action=allow \
  --network=$prefix-vpc1 \
  --rules=tcp:22 \
  --source-ranges=35.235.240.0/20

fwpolicy-vpc1 クライアント インスタンスと web-server インスタンスを作成します。

gcloud compute instances create $prefix-vpc1-www \
   --subnet=$prefix-vpc1-subnet --no-address --zone $zone \
   --metadata startup-script='#! /bin/bash
apt-get update
apt-get install apache2 -y
a2ensite default-ssl
a2enmod ssl
# Read VM network configuration:
md_vm="http://169.254.169.254/computeMetadata/v1/instance/"
vm_hostname="$(curl $md_vm/name -H "Metadata-Flavor:Google" )"
filter="{print \$NF}"
vm_network="$(curl $md_vm/network-interfaces/0/network \
-H "Metadata-Flavor:Google" | awk -F/ "${filter}")"
vm_zone="$(curl $md_vm/zone \
-H "Metadata-Flavor:Google" | awk -F/ "${filter}")"
# Apache configuration:
echo "Page on $vm_hostname in network $vm_network zone $vm_zone" | \
tee /var/www/html/index.html
systemctl restart apache2'

gcloud compute instances create $prefix-vpc1-client \
    --subnet=$prefix-vpc1-subnet --no-address --zone $zone

VPC ファイアウォール ルールが定義されておらず(このセクションの冒頭で IAP の構成時に作成している SSH 許可ルールを除く)、すべての上り(内向き)トラフィックが拒否されるため、クライアント インスタンスはそれぞれのウェブサーバーにアクセスできません。リクエストがタイムアウトすることを確認するために、新しいウィンドウを開いて fwpolicy-vpc1-client インスタンスへの SSH セッションを開始し、ウェブサーバーの curl を試します。

user@fwpolicy-vpc1-client$ curl fwpolicy-vpc1-www --connect-timeout 2

予想される出力:

curl: (28) Connection timed out after 2001 milliseconds

必要に応じて、Cloud Shell で fwpolicy-vpc1 に VPC ファイアウォール ルールが定義されていないことを確認します。

gcloud compute firewall-rules list --filter="network:$prefix-vpc1"

5. グローバル ネットワーク ファイアウォール ポリシー

グローバル ネットワーク ファイアウォール ポリシーを作成します。

gcloud compute network-firewall-policies create \
   $prefix-example --description \
   "firewall-policy-description" --global

ウェブ トラフィックを許可するルールを追加します。

gcloud compute network-firewall-policies rules create 500 \
    --action allow \
    --description "allow-web" \
    --layer4-configs tcp:80,tcp:443 \
    --firewall-policy $prefix-example \
    --src-ip-ranges 10.0.0.0/16 \
    --global-firewall-policy --enable-logging

ネットワーク ファイアウォール ポリシーの説明を取得して、ルールが正常に added されたことを確認します。

gcloud compute network-firewall-policies describe \
    $prefix-example --global

想定される出力(出力の先頭までスクロールすると、暗黙的なルールも表示されます):

creationTimestamp: '2022-09-23T12:46:53.677-07:00'
description: "firewall-policy-description"
fingerprint: Np1Rup09Amc=
id: '7021772628738421698'
kind: compute#firewallPolicy
name: fwpolicy-example
ruleTupleCount: 13
rules:
- action: allow
  description: allow-web
  direction: INGRESS
  disabled: false
  enableLogging: true
  kind: compute#firewallPolicyRule
  match:
    layer4Configs:
    - ipProtocol: tcp
      ports:
      - '80'
    - ipProtocol: tcp
      ports:
      - '443'
    srcIpRanges:
    - 10.0.0.0/16
  priority: 500
  ruleTupleCount: 5
...

ネットワーク ファイアウォール ポリシーを fwpolicy-vpc1 に関連付けます。

gcloud compute network-firewall-policies associations create \
     --firewall-policy $prefix-example \
     --network $prefix-vpc1 \
     --name $prefix-vpc1-association \
     --global-firewall-policy

fwpolicy-vpc1 ネットワークに正常に適用されたことを確認します。

gcloud compute networks get-effective-firewalls $prefix-vpc1

予想される出力(階層型ファイアウォール ポリシーが優先されている場合は、関連するルールが一番上に表示されます)。

TYPE                     FIREWALL_POLICY_NAME     PRIORITY    ACTION     DIRECTION  IP_RANGES
network-firewall-policy  fwpolicy-example      500         ALLOW      INGRESS    10.0.0.0/16
network-firewall-policy  fwpolicy-example      2147483645  GOTO_NEXT  INGRESS    ::/0
network-firewall-policy  fwpolicy-example      2147483647  GOTO_NEXT  INGRESS    0.0.0.0/0
network-firewall-policy  fwpolicy-example      2147483644  GOTO_NEXT  EGRESS     ::/0
network-firewall-policy  fwpolicy-example      2147483646  GOTO_NEXT  EGRESS     0.0.0.0/0

fwpolicy-vpc1 ウェブサーバーにも正常に適用されたことを確認します。

gcloud compute instances network-interfaces \
   get-effective-firewalls $prefix-vpc1-www --zone $zone

予想される出力は前のコマンドと同様です(fwpolicy-vpc1 の有効なファイアウォール)。

TYPE                     FIREWALL_POLICY_NAME     PRIORITY    ACTION     DIRECTION  IP_RANGES
network-firewall-policy  fwpolicy-example      500         ALLOW      INGRESS    10.0.0.0/16
network-firewall-policy  fwpolicy-example      2147483645  GOTO_NEXT  INGRESS    ::/0
network-firewall-policy  fwpolicy-example      2147483647  GOTO_NEXT  INGRESS    0.0.0.0/0
network-firewall-policy  fwpolicy-example      2147483644  GOTO_NEXT  EGRESS     ::/0
network-firewall-policy  fwpolicy-example      2147483646  GOTO_NEXT  EGRESS     0.0.0.0/0

vpc1-client SSH セッションに戻り、curl を再度試します(以下のコマンドでは fwpolicy が接頭辞として使用されていることを前提としています。別の名前を使用する場合は、それに応じて curl コマンドを調整してください)。

user@vpc1-client$ curl fwpolicy-vpc1-www --connect-timeout 2
Page on vpc1-www in network vpc1 zone us-central1-a

Cloud Shell で、ネットワーク ファイアウォール ポリシーが fwpolicy-vpc1 に適用されていることを確認します。

gcloud compute network-firewall-policies describe \
   $prefix-example --global

想定される出力(出力の先頭までスクロール):

---
associations:
- attachmentTarget: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/fwpolicy-vpc1
  name: fwpolicy-vpc1-association
...

6. IAM によって管理されるタグ

タグは、組織、フォルダ、プロジェクトに添付できる Key-Value ペアです。詳しくは、タグの作成と管理必要な権限をご覧ください。

tagAdmin ロールを使用すると、新しいタグの作成、既存のタグの更新、削除を行うことができます。このロールを付与できるのは組織管理者です。Cloud Shell で、IAM ポリシーを更新してユーザーに tagAdmin ロールを追加します。権限のリファレンスページで、各事前定義ロールに含まれる権限を確認してください。

gcloud organizations add-iam-policy-binding $org_id \
  --member user:[user@example.com] --role roles/resourcemanager.tagAdmin

以下のコマンドを実行して、resourcemanager.tagAdmin ロールを持つユーザーを確認します。

gcloud organizations get-iam-policy $org_id --flatten=bindings \
  --filter=bindings.role:roles/resourcemanager.tagAdmin

新しいタグキーを作成します。

gcloud resource-manager tags keys create tags-vpc1 \
   --parent organizations/$org_id \
   --purpose GCE_FIREWALL \
   --purpose-data network=$project_id/$prefix-vpc1

予想される出力:

Waiting for TagKey [tags-vpc1] to be created...done.                                                                                                                
createTime: '2022-09-23T20:49:01.162228Z'
etag: PwvmFuHO4wK1y6c5Ut2n5w==
name: tagKeys/622132302133
namespacedName: ORGANIZATION_ID/tags-vpc1
parent: organizations/ORGANIZATION_ID
purpose: GCE_FIREWALL
purposeData:
  network: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/6749205358365096383
shortName: tags-vpc1
updateTime: '2022-09-23T20:49:03.873776Z'

新しいタグ値を作成します。

gcloud resource-manager tags values create web-servers \
   --parent=$org_id/tags-vpc1

gcloud resource-manager tags values create web-clients \
   --parent=$org_id/tags-vpc1

タグの値が正常に作成されたことを確認します。

gcloud resource-manager tags values list \
   --parent=$org_id/tags-vpc1

予想される出力:

NAME                    SHORT_NAME   DESCRIPTION
tagValues/349564376683  web-servers
tagValues/780363571446  web-clients

Cloud Shell で、既存のネットワーク ファイアウォール ポリシールールの説明を取得して、タグが使用されていないことを確認します。

gcloud compute network-firewall-policies rules describe 500 \
    --firewall-policy $prefix-example \
    --global-firewall-policy

予想される出力:

---
action: allow
description: allow-web
direction: INGRESS
disabled: false
enableLogging: true
kind: compute#firewallPolicyRule
match:
  layer4Configs:
  - ipProtocol: tcp
    ports:
    - '80'
  - ipProtocol: tcp
    ports:
    - '443'
  srcIpRanges:
  - 10.0.0.0/16
priority: 500
ruleTupleCount: 5

Cloud Shell で、vpc1-tags/web-clients タグキーからのトラフィックのみを許可するようにルールを更新し、vpc1-tags/web-servers タグキーを持つインスタンスにルールをインストールします。

gcloud compute network-firewall-policies rules update 500 \
    --firewall-policy $prefix-example \
    --src-secure-tags $org_id/tags-vpc1/web-clients \
    --target-secure-tags $org_id/tags-vpc1/web-servers \
    --global-firewall-policy

Cloud Shell で既存のネットワーク ファイアウォール ポリシールールの説明を取得して、タグが正常に適用され、Effective としてレポートされていることを確認します。

gcloud compute network-firewall-policies rules describe 500 \
    --firewall-policy $prefix-example \
    --global-firewall-policy

予想される出力:

---
action: allow
description: allow-web
direction: INGRESS
disabled: false
enableLogging: false
kind: compute#firewallPolicyRule
match:
  layer4Configs:
  - ipProtocol: tcp
    ports:
    - '80'
  - ipProtocol: tcp
    ports:
    - '443'
  srcIpRanges:
  - 10.0.0.0/16
  srcSecureTags:
  - name: tagValues/479619031616
    state: EFFECTIVE
priority: 500
ruleTupleCount: 7
targetSecureTags:
- name: tagValues/230424970229
  state: EFFECTIVE

Cloud Shell で、ルールが vpc1 に適用されたことを確認します。

gcloud compute networks get-effective-firewalls $prefix-vpc1

予想される出力:

network-firewall-policy  fwpolicy-example      500         ALLOW      INGRESS    10.0.0.0/16
network-firewall-policy  fwpolicy-example      2147483645  GOTO_NEXT  INGRESS    ::/0
network-firewall-policy  fwpolicy-example      2147483647  GOTO_NEXT  INGRESS    0.0.0.0/0
network-firewall-policy  fwpolicy-example      2147483644  GOTO_NEXT  EGRESS     ::/0
network-firewall-policy  fwpolicy-example      2147483646  GOTO_NEXT  EGRESS     0.0.0.0/0

ネットワーク ファイアウォール ポリシーがまだ VPC ネットワークに関連付けられているにもかかわらず、タグがインスタンスに追加されていないため、ウェブ トラフィックを許可するルールがウェブサーバーに適用されなくなったことを確認します。

gcloud compute instances network-interfaces \
   get-effective-firewalls $prefix-vpc1-www --zone $zone

予想される出力(優先度 500 のファイアウォール ルールは表示されません):

network-firewall-policy  fwpolicy-example      2147483645  GOTO_NEXT  INGRESS    ::/0
network-firewall-policy  fwpolicy-example      2147483647  GOTO_NEXT  INGRESS    0.0.0.0/0
network-firewall-policy  fwpolicy-example      2147483644  GOTO_NEXT  EGRESS     ::/0
network-firewall-policy  fwpolicy-example      2147483646  GOTO_NEXT  EGRESS     0.0.0.0/0

特定のタグとユーザーにタグユーザーのロールを付与します。権限のリファレンスページで、各事前定義ロールに含まれる権限を確認してください。

gcloud resource-manager tags keys add-iam-policy-binding \
  $org_id/tags-vpc1 \
  --member user:[email] --role roles/resourcemanager.tagUser

gcloud projects add-iam-policy-binding $project_id \
  --member user:[email] --role roles/resourcemanager.tagUser

ロールが正常に追加されたことを確認します。

gcloud resource-manager tags keys get-iam-policy $org_id/tags-vpc1

gcloud projects get-iam-policy $project_id --flatten=bindings \
   --filter=bindings.role:roles/resourcemanager.tagUser

予想される出力:

bindings:
- members:
  - user:[user]
  role: roles/resourcemanager.tagUser
...

fwpolicy-vpc1-www インスタンスにタグを適用します。

gcloud resource-manager tags bindings create \
  --location $zone \
  --tag-value $org_id/tags-vpc1/web-servers \
  --parent \
//compute.googleapis.com/projects/$project_id/zones/$zone/instances/$prefix-vpc1-www

予想される出力:

Waiting for TagBinding for parent [//compute.googleapis.com/projects/PROJECT_ID/zones/us-central1-a/instances/38369703403698502] and tag value [tagValues/34
9564376683] to be created with [operations/rctb.us-central1-a.6144808968019372877]...done.                                                                            
done: true
metadata:
  '@type': type.googleapis.com/google.cloud.resourcemanager.v3.CreateTagBindingMetadata
name: operations/rctb.us-central1-a.6144808968019372877
response:
  '@type': type.googleapis.com/google.cloud.resourcemanager.v3.TagBinding
  name: tagBindings/%2F%2Fcompute.googleapis.com%2Fprojects%2FPROJECT_NUMBER%2Fzones%2Fus-central1-a%2Finstances%2F38369703403698502/tagValues/349564376683
  parent: //compute.googleapis.com/projects/PROJECT_NUMBER/zones/us-central1-a/instances/38369703403698502
  tagValue: tagValues/349564376683

バインディングを確認します。

gcloud resource-manager tags bindings list --location $zone --effective --parent //compute.googleapis.com/projects/$project_id/zones/$zone/instances/$prefix-vpc1-www 

予想される出力:

namespacedTagKey: ORGANIZATION_ID/tags-vpc1
namespacedTagValue: ORGANIZATION_ID/tags-vpc1/web-servers
tagKey: tagKeys/622132302133
tagValue: tagValues/349564376683

有効なファイアウォール ルールを再度確認します。

gcloud compute instances network-interfaces \
   get-effective-firewalls $prefix-vpc1-www --zone $zone

予想される出力:

network-firewall-policy  fwpolicy-example      490         ALLOW      INGRESS    10.0.0.0/16
network-firewall-policy  fwpolicy-example      2147483645  GOTO_NEXT  INGRESS    ::/0
network-firewall-policy  fwpolicy-example      2147483647  GOTO_NEXT  INGRESS    0.0.0.0/0
network-firewall-policy  fwpolicy-example      2147483644  GOTO_NEXT  EGRESS     ::/0
network-firewall-policy  fwpolicy-example      2147483646  GOTO_NEXT  EGRESS     0.0.0.0/0

fwpolicy-vpc1-client の SSH セッション タブに戻り、curl を試します。

user@fwpolicy-vpc1-client$ curl fwpolicy-vpc1-www --connect-timeout 2

接続できましたか?

これを確認するには、Cloud Shell でルールを更新し、送信元の CIDR 条件を削除します。

gcloud compute network-firewall-policies rules update 500 \
    --firewall-policy $prefix-example \
    --src-ip-ranges "" \
    --global-firewall-policy

gcloud compute network-firewall-policies rules describe 500 \
    --firewall-policy $prefix-example \
    --global-firewall-policy

action: allow
description: allow-web
direction: INGRESS
disabled: false
enableLogging: false
kind: compute#firewallPolicyRule
match:
  layer4Configs:
  - ipProtocol: tcp
    ports:
    - '80'
  - ipProtocol: tcp
    ports:
    - '443'
  srcSecureTags:
  - name: tagValues/479619031616
    state: EFFECTIVE
priority: 490
ruleTupleCount: 7
targetSecureTags:
- name: tagValues/230424970229
  state: EFFECTIVE

fwpolicy-vpc1-client の SSH セッション タブに戻り、もう一度お試しください。

user@fwpolicy-vpc1-client$ curl fwpolicy-vpc1-www --connect-timeout 2

今回はタグが fwpolicy-vpc1-client に追加されていないため、接続がタイムアウトするはずです。Cloud Shell から追加して、もう一度お試しください。

gcloud resource-manager tags bindings create \
  --location $zone \
  --tag-value $org_id/tags-vpc1/web-clients \
  --parent \
//compute.googleapis.com/projects/$project_id/zones/$zone/instances/$prefix-vpc1-client

fwpolicy-vpc1-client の SSH セッション タブに戻り、もう一度お試しください。

user@fwpolicy-vpc1-client$ curl fwpolicy-vpc1-www --connect-timeout 2

7. VPC ネットワーク ピアリングを介した IAM によって管理されるタグ

Cloud Shell から、新しい VPC、サブネット、クライアントを作成し、ネットワーク間に VPC ネットワーク ピアリングを設定します。

gcloud compute networks create $prefix-vpc2 --subnet-mode=custom 

gcloud compute networks subnets create $prefix-vpc2-subnet \
   --range=10.0.1.0/24 --network=$prefix-vpc2 --region=$region

gcloud compute instances create $prefix-vpc2-client \
   --subnet=$prefix-vpc2-subnet --no-address --zone $zone

gcloud compute networks peerings create vpc1-to-vpc2 \
   --network=$prefix-vpc1 \
   --peer-project $project_id \
   --peer-network $prefix-vpc2

gcloud compute networks peerings create vpc2-to-vpc1 \
    --network=$prefix-vpc2 \
    --peer-project $project_id \
    --peer-network $prefix-vpc1

IAP 設定の一部としてまだ定義されていない場合に、IAP 範囲からの上り(内向き)SSH トラフィックを許可するファイアウォール ルールを作成します。

gcloud compute firewall-rules create allow-ssh-ingress-from-iap-vpc2 \
  --direction=INGRESS \
  --action=allow \
  --network=$prefix-vpc2 \
  --rules=tcp:22 \
  --source-ranges=35.235.240.0/20

タグは組織全体のオブジェクトですが、タグキーは特定の VPC に関連付けられているため、異なるネットワーク内のインスタンスには適用できません。そのため、vpc2 に適用する新しいタグキーと値を作成する必要があります。

gcloud resource-manager tags keys create tags-vpc2 \
   --parent organizations/$org_id \
   --purpose GCE_FIREWALL \
   --purpose-data network=$project_id/$prefix-vpc2

gcloud resource-manager tags values create web-clients \
   --parent=$org_id/tags-vpc2

新しいタグを fwpolicy-vpc2-client インスタンスに適用します。

gcloud resource-manager tags bindings create \
  --location $zone \
  --tag-value $org_id/tags-vpc2/web-clients \
  --parent \
//compute.googleapis.com/projects/$project_id/zones/$zone/instances/$prefix-vpc2-client

必要に応じて、fwpolicy-vpc2-client のバインディングを一覧表示します。

gcloud resource-manager tags bindings list --location $zone --effective --parent //compute.googleapis.com/projects/$project_id/zones/$zone/instances/$prefix-vpc2-client

予想される出力:

namespacedTagKey: ORGANIZATION_ID/tags-vpc2
namespacedTagValue: ORGANIZATION_ID/tags-vpc2/web-clients
tagKey: tagKeys/916316350251
tagValue: tagValues/633150043992

Cloud Shell で、既存のネットワーク ファイアウォール ポリシールールの説明を取得して、新しいタグが使用されていないことを確認します。

gcloud compute network-firewall-policies rules describe 500 \
    --firewall-policy $prefix-example \
    --global-firewall-policy

予想される出力:

---
action: allow
description: allow-web
direction: INGRESS
disabled: false
enableLogging: true
kind: compute#firewallPolicyRule
match:
  layer4Configs:
  - ipProtocol: tcp
    ports:
    - '80'
  - ipProtocol: tcp
    ports:
    - '443'
  srcSecureTags:
  - name: tagValues/479619031616
    state: EFFECTIVE
priority: 500
ruleTupleCount: 6
targetSecureTags:
- name: tagValues/230424970229
  state: EFFECTIVE

既存のファイアウォール ルールを更新して、ピアリングされた VPC ネットワークのタグを許可します。

gcloud compute network-firewall-policies rules update 500 \
    --firewall-policy $prefix-example \
    --src-secure-tags $org_id/tags-vpc1/web-clients,$org_id/tags-vpc2/web-clients \
    --global-firewall-policy

ファイアウォール ルールの説明を取得して、正常に適用され、Effective としてレポートされていることを確認します。

gcloud compute network-firewall-policies rules describe 500 \
    --firewall-policy $prefix-example \
    --global-firewall-policy

予想される出力:

---
action: allow
description: allow-web
direction: INGRESS
disabled: false
enableLogging: false
kind: compute#firewallPolicyRule
match:
  layer4Configs:
  - ipProtocol: tcp
    ports:
    - '80'
  - ipProtocol: tcp
    ports:
    - '443'
  srcSecureTags:
  - name: tagValues/479619031616
    state: EFFECTIVE
  - name: tagValues/633150043992
    state: EFFECTIVE
priority: 500
ruleTupleCount: 7
targetSecureTags:
- name: tagValues/230424970229
  state: EFFECTIVE

以下の gcloud コマンドを使用して、fwpolicy-vpc1-www の IP を調べます。

gcloud compute instances list --filter=vpc1-www

SSH 経由で fwpolicy-vpc2-client に接続し、fwpolicy-vpc1 の IP に対して curl の実行を試行します。

user@fwpolicy-vpc2-client$ curl [fwpolicy-vpc1-www_IP] --connect-timeout 2

fwpolicy-vpc1-www サーバーに接続できるはずです。次のセクションに進んでクリーンアップ手順に進みます。

8. クリーンアップ手順

Cloud Shell から、インスタンス、Cloud NAT、Cloud Router を削除します。

gcloud -q compute instances delete $prefix-vpc2-client --zone=$zone

gcloud -q compute instances delete $prefix-vpc1-client --zone=$zone

gcloud -q compute instances delete $prefix-vpc1-www --zone=$zone

gcloud -q compute routers nats delete $prefix-vpc1-cloudnat \
--router=$prefix-vpc1-cr --router-region=$region

gcloud -q compute routers delete $prefix-vpc1-cr --region=$region

グローバル ネットワーク ファイアウォール ポリシーとタグを削除します。

gcloud -q resource-manager tags values delete \
   $org_id/tags-vpc2/web-clients

gcloud -q resource-manager tags keys delete $org_id/tags-vpc2

gcloud -q resource-manager tags values delete \
   $org_id/tags-vpc1/web-servers

gcloud -q resource-manager tags values delete \
   $org_id/tags-vpc1/web-clients

gcloud -q resource-manager tags keys delete $org_id/tags-vpc1

gcloud -q compute network-firewall-policies associations delete \
     --firewall-policy $prefix-example \
     --name $prefix-vpc1-association \
     --global-firewall-policy

gcloud -q compute network-firewall-policies delete \
   $prefix-example --global

gcloud -q compute firewall-rules delete allow-ssh-ingress-from-iap-vpc1

gcloud -q compute firewall-rules delete allow-ssh-ingress-from-iap-vpc2

tagAdmin ロールと tagUsers ロールが変更された場合は、次の手順を行います。

gcloud organizations remove-iam-policy-binding $org_id \
  --member user:[email] --role roles/resourcemanager.tagAdmin

gcloud organizations remove-iam-policy-binding $org_id \
  --member user:[email] --role roles/resourcemanager.tagUser

最後に、VPC ネットワーク ピアリング、サブネット、VPC ネットワークを削除します。

gcloud -q compute networks peerings delete vpc1-to-vpc2 \
    --network $prefix-vpc1

gcloud -q compute networks peerings delete vpc2-to-vpc1 \
    --network $prefix-vpc2

gcloud -q compute networks subnets delete $prefix-vpc1-subnet \
    --region $region

gcloud -q compute networks subnets delete $prefix-vpc2-subnet \
    --region $region

gcloud -q compute networks delete $prefix-vpc1

gcloud -q compute networks delete $prefix-vpc2

9. 完了

これで、タグ構成を使用したグローバル ネットワーク ファイアウォール ポリシーの構成と検証が完了しました。