1. はじめに
Cloud Next Generation Firewall(NGFW)
Cloud Next Generation Firewall は、高度な保護機能、マイクロセグメンテーション、内部および外部の攻撃から Google Cloud ワークロードを広範囲に保護する機能を備えた、完全分散型のファイアウォール サービスです。
Cloud NGFW には次の利点があります。
- 分散ファイアウォール サービス: Cloud NGFW では、各ワークロードに完全に分散されたステートフルなホストベースの適用が可能で、ゼロトラスト セキュリティ アーキテクチャを実現できます。
- 構成とデプロイの簡素化: Cloud NGFW は、リソース階層ノードに接続できるネットワークと階層型ファイアウォール ポリシーを実装します。これらのポリシーにより、Google Cloud リソース階層全体で一貫性のあるファイアウォール エクスペリエンスが提供されます。
- きめ細かい制御とマイクロセグメンテーション: ファイアウォール ポリシーと Identity and Access Management(IAM)によって管理されるタグを組み合わせて、Virtual Private Cloud(VPC)ネットワーク全体で、North-South トラフィックと East-West トラフィックの両方を 1 つの VM に至るまできめ細かく制御できます。
ネットワーク ファイアウォール ポリシー
ネットワーク ファイアウォール ポリシーは、ファイアウォール ルールのコンテナとして機能します。ネットワーク ファイアウォール ポリシーで定義されたルールは、ポリシーが VPC ネットワークに関連付けられるまでどこでも適用されません。各 VPC ネットワークには、1 つのネットワーク ファイアウォール ポリシーを関連付けることができます。ネットワーク ファイアウォール ポリシーは、ファイアウォール ルールで IAM で管理されるタグ(または単にタグ)をサポートしています。これはワークロードに ID を提供するために使用できます。
ネットワーク ファイアウォール ポリシーを複数のネットワークで共有し、IAM によって管理されるタグと統合することで、ファイアウォールの構成と管理が大幅に簡素化されます。
ネットワーク ファイアウォール ポリシーの導入により、Google Cloud のファイアウォール ポリシーは次のコンポーネントで構成されるようになりました。
階層型ファイアウォール ポリシーはリソース階層内の組織ノードとフォルダノードでサポートされますが、VPC ファイアウォール ルールとネットワーク ファイアウォール ポリシーは VPC レベルで適用されます。VPC ファイアウォール ルールとネットワーク ファイアウォール ポリシーの大きな違いは、VPC ファイアウォール ルールは単一の VPC ネットワークにしか適用できないのに対し、ネットワーク ファイアウォール ポリシーは単一の VPC または VPC のグループにアタッチできることです。その他にも、バッチ更新などのメリットがあります。
このラボでは、階層型ファイアウォール ポリシーとグローバル ネットワーク ファイアウォール ポリシーをテストします。
最後に、すべての VPC ネットワークに付属する暗黙のファイアウォール ルールもあります。
- アクションが allow、宛先が 0.0.0.0/0 の下り(外向き)ルール
- アクションが deny、送信元が 0.0.0.0/0 の上り(内向き)ルール
デフォルトでは、適用シーケンスは次の図のようになります。

IAM によって管理されるタグ
新しいファイアウォール ポリシールールに統合されたタグは、Google Cloud リソース階層の組織レベルまたはプロジェクト レベルで定義された Key-Value ペアのリソースです。このようなタグには、名前が示すように、そのタグに対して誰が何を行えるかを指定する IAM アクセス制御が含まれています。たとえば、IAM 権限では、どのプリンシパルが値をタグに割り当てることができるかと、どのプリンシパルがタグをリソースにアタッチできるかを指定できます。タグがリソースに適用されると、ファイアウォール ポリシー ルールはそれを使用してトラフィックを許可または拒否できます。
タグは Google Cloud の継承リソースモデルに従います。つまり、タグとその値は親から階層全体に伝わっていきます。その結果、タグは 1 か所で作成され、リソース階層全体で他のフォルダやプロジェクトで使用される可能性があります。タグとアクセス制限の詳細については、こちらのページをご覧ください。
タグをネットワーク タグと混同しないでください。ネットワーク タグは Compute Engine インスタンスに追加できる文字列で、インスタンスに関連付けられ、インスタンスが廃止されると消滅します。VPC ファイアウォール ルールにはネットワーク タグを含めることができますが、クラウド リソースとはみなされないため、IAM アクセス制御の対象ではありません。違いについて詳しくは、こちらのページをご覧ください。
2. 学習内容
- Cloud NGFW で使用するグローバル スコープの IAM 管理タグを作成する方法。
- VM にタグを関連付ける方法。
- 階層型ファイアウォール ポリシーを作成してフォルダに関連付ける方法。
- 階層型ファイアウォール ポリシーでファイアウォール ルールを作成し、IAM によって管理されるタグを使用して送信元と宛先を指定する方法。
3. ラボの全体的なアーキテクチャ

組織とフォルダ:
- 組織の直下に
folder1とfolder2の 2 つのフォルダを作成します。
プロジェクト:
folder1内にホスト プロジェクトを作成します。このプロジェクトには共有 VPC ネットワークが含まれます。folder2内にサービス プロジェクトを作成します。このプロジェクトには、共有 VPC を使用する VM が含まれます。
ネットワーキング:
mynetという名前の VPC ネットワークがホスト プロジェクトに作成され、共有 VPC として構成されます。これにより、サービス プロジェクトのリソースがネットワークを使用できるようになります。- サービス プロジェクトに 2 つの VM が作成され、
mynet共有 VPC に接続されます。
IAM によって管理されるタグ:
- 組織レベルで、2 つの値(
http_serverとhttp_client)を持つhttp_tagsという名前の IAM 管理タグを作成します。これらのタグと値は、VM の識別とファイアウォール ルールの適用に使用されます。
ファイアウォール ポリシー:
- 階層型ファイアウォール ポリシーが作成され、
folder1に関連付けられます。このポリシー内のルールは、IAM で管理されるタグを使用して、ポート 80 でhttp-clientからhttp-serverへのトラフィックを許可します。 - ホスト プロジェクトにネットワーク ファイアウォール ポリシーが作成され、
mynetVPC に関連付けられます。このポリシーには、テスト目的で VM への IAP SSH アクセスを許可するルールが含まれます。
4. 準備手順
まず、Google Cloud 組織で必要な IAM ロール、ネットワーク インフラストラクチャ、インスタンスを設定します。
ラボで作業するために必要な IAM ロール
まず、組織レベルで必要な IAM ロールを GCP アカウントに割り当てます。
- 組織管理者(
roles/resourcemanager.organizationAdmin): このロールを使用すると、IAM ポリシーを管理し、組織、フォルダ、プロジェクトの組織のポリシーを表示できます。 - タグ管理者(
roles/resourcemanager.tagAdmin): このロールを使用すると、セキュアタグの作成、更新、削除を行うことができます。 - タグユーザーのロール(
roles/resourcemanager.tagUser): このロールを使用すると、セキュアタグのリストにアクセスして、リソースとの関連付けを管理できます。 - Compute 組織ファイアウォール ポリシー管理者のロール(
roles/compute.orgFirewallPolicyAdmin): このロールでは、Compute Engine 組織のファイアウォール ポリシーを完全に制御できます。 - コンピューティング組織リソース管理者ロール(
roles/compute.orgSecurityResourceAdmin): このロールでは、組織またはフォルダへの Compute Engine ファイアウォール ポリシーの関連付けを完全に制御できます。 - Compute ネットワーク管理者(
roles/compute.networkAdmin): このロールでは、Compute Engine ネットワーク リソースを完全に制御できます。 - Compute インスタンス管理者(ベータ版)(
roles/compute.instanceAdmin): このロールでは、Compute Engine インスタンス リソースを完全に制御できます。 - Logging 管理者(
roles/logging.admin): このロールは、ロギングに関するすべての権限と依存する権限に対するアクセス権を付与します。 - サービス アカウント管理者(
roles/iam.serviceAccountAdmin): このロールを使用すると、サービス アカウントを作成して管理できます。 - Service Usage 管理者(
roles/serviceusage.serviceUsageAdmin): このロールでは、サービス状態の有効化、無効化、検査、オペレーションの検査、ユーザー プロジェクトの割り当てと請求の利用が可能です。 - Compute Shared VPC 管理者(
roles/compute.xpnAdmin): このロールを使用すると、共有 VPC ネットワーク(XPN)を管理できます。
フォルダとプロジェクトの作成
Cloud Shell で、次の操作を行って folder1 と folder2 を作成します。
gcloud auth login
export org_id=$(gcloud organizations list --format='value(ID)')
export BILLING_ACCOUNT_ID=$(gcloud billing accounts list --format='value(ACCOUNT_ID)')
export folder1=[FOLDER1 NAME]
export folder2=[FOLDER2 NAME]
export hostproject=[HOST PROJECT NAME]
export serviceproject=[SERVICE PROJECT NAME]
export regionname=[REGION NAME]
export zonename=[COMPUTE ZONE NAME]
gcloud resource-manager folders create --display-name=$folder1 --organization=$org_id
export folder1_id=$(gcloud resource-manager folders list --organization=$org_id --filter="displayName=$folder1" --format="value(ID)")
gcloud resource-manager folders create --display-name=$folder2 --organization=$org_id
export folder2_id=$(gcloud resource-manager folders list --organization=$org_id --filter="displayName=$folder2" --format="value(ID)")
Cloud Shell で、次の操作を行って folder1 にホスト プロジェクトを作成します。
gcloud projects create --name=$hostproject --folder=$folder1_id
次の画面が表示されます。新しいプロジェクト ID でプロジェクトを作成するには、Y を押します。
No project ID provided.
Use [NEW-PROJECT-ID] as project ID (Y/n)?
プロジェクト ID をメモします。Cloud Shell で、次の操作を行って hostproject_id にエクスポートします。
export hostproject_id=[HOSTPROJECT ID]
Cloud Shell で、次の操作を行ってホスト プロジェクトを請求先アカウントにリンクします。
gcloud billing projects link $hostproject_id \
--billing-account=$BILLING_ACCOUNT_ID
Cloud Shell で、次の操作を行って folder2 にサービス プロジェクトを作成します。
gcloud projects create --name=$serviceproject --folder=$folder2_id
次の画面が表示されます。新しいプロジェクト ID でプロジェクトを作成するには、Y を押します。
No project ID provided.
Use [NEW-PROJECT-ID] as project ID (Y/n)?
プロジェクト ID をメモします。Cloud Shell で、次の操作を行って serviceproject_id にエクスポートします。
export serviceproject_id=[SERVICEPROJECT ID]
Cloud Shell で、次の操作を行ってサービス プロジェクトを請求先アカウントにリンクします。
gcloud billing projects link $serviceproject_id \
--billing-account=$BILLING_ACCOUNT_ID
IAM によって管理されるタグを作成する
タグは、組織、フォルダ、プロジェクトに付加できる Key-Value ペアです。詳細については、タグの作成と管理と必要な権限をご覧ください。
組織レベルで 1 つのタグ http-tags を作成します。タグの目的は、Cloud NGFW で使用することです。スコープを 1 つのネットワークに制限することはありません。タグはグローバルにスコープ設定されます。このタグは、後で folder2 のサービス プロジェクトで作成された VM に適用します。
Cloud Shell で、次の操作を行います。
gcloud resource-manager tags keys create http_tags \
--parent=organizations/$org_id \
--purpose GCE_FIREWALL \
--purpose-data organization=auto
タグキー ID を使用して、作成時に VM にアノテーションを付けます。Cloud Shell で、次の操作を行ってタグキー ID を取得します。
export http_tags_id=$(gcloud resource-manager tags keys describe $org_id/http_tags --format="value(name)")
echo $http_tags_id
Cloud Shell で、次の操作を行って、2 つの新しいタグ値 http_server と http_client を作成します。
gcloud resource-manager tags values create http_server \
--parent $org_id/http_tags
gcloud resource-manager tags values create http_client \
--parent $org_id/http_tags
タグ ID とタグ値 ID を使用して、作成時に VM にアノテーションを付けます。Cloud Shell で、次の操作を行って http_server と http_client のタグ値 ID を取得します。
export http_tags_http_server_id=$(gcloud resource-manager tags values describe $org_id/http_tags/http_server --format="value(name)")
echo $http_tags_http_server_id
export http_tags_http_client_id=$(gcloud resource-manager tags values describe $org_id/http_tags/http_client --format="value(name)")
echo $http_tags_http_client_id
ホスト プロジェクトとサービス プロジェクトで API を有効にする
Cloud Shell で、次の操作を行います。
gcloud services enable compute.googleapis.com --project=$serviceproject_id
gcloud services enable compute.googleapis.com --project=$hostproject_id
ホスト プロジェクトに VPC を作成する
ホスト プロジェクトで、カスタム サブネット モードの VPC ネットワークを作成します。Cloud Shell で次の操作を行います。
gcloud compute networks create mynet \
--subnet-mode=custom \
--project=$hostproject_id
ホスト プロジェクトにサブネットを作成する
Cloud Shell で、次の操作を行って IPV4 サブネットを作成します。
gcloud compute networks subnets create mysubnet \
--network=mynet \
--range=10.0.0.0/28 \
--region=$regionname \
--project=$hostproject_id
ホスト プロジェクトで共有 VPC を有効にする
Cloud Shell で、次の操作を行ってホスト プロジェクトで共有 VPC を有効にします。
gcloud compute shared-vpc enable $hostproject_id
ホスト プロジェクトで共有 VPC のサービス プロジェクトを接続する
Cloud Shell で、次の操作を行って、ホスト プロジェクトの共有 VPC にサービス プロジェクトを接続します。
gcloud compute shared-vpc associated-projects add $serviceproject_id --host-project=$hostproject_id
ホスト プロジェクトに Cloud Router と Cloud NAT を作成する
Cloud NAT は、VM がアプリケーションをダウンロードしてインストールできるように、インターネットの下り(外向き)トラフィックを許可するために使用されます。
gcloud compute routers create $regionname-cr \
--network=mynet \
--region=$regionname \
--project=$hostproject_id
gcloud compute routers nats create $regionname-nat \
--router=$regionname-cr \
--region=$regionname \
--nat-all-subnet-ip-ranges \
--auto-allocate-nat-external-ips \
--project=$hostproject_id
サービス プロジェクトにインスタンスを作成する
サービス プロジェクトで、ホスト プロジェクトの共有 VPC で作成したサブネットに 2 つのインスタンスを作成します。1 つのインスタンスに http-server という名前を付け、http_tags のタグに http_server の値をアノテーションします。もう 1 つのインスタンスは http-client という名前で、http_tags のタグに http_client の値をアノテーションします。Cloud Shell で次のコマンドを実行します。
gcloud compute instances create http-client \
--project=$serviceproject_id \
--subnet=projects/$hostproject_id/regions/$regionname/subnetworks/mysubnet \
--zone=$zonename \
--no-address \
--resource-manager-tags=$http_tags_id=$http_tags_http_client_id
gcloud compute instances create http-server \
--project=$serviceproject_id \
--subnet=projects/$hostproject_id/regions/$regionname/subnetworks/mysubnet \
--zone=$zonename \
--no-address \
--resource-manager-tags=$http_tags_id=$http_tags_http_server_id \
--metadata startup-script='#! /bin/bash
sudo apt-get update
sudo apt-get install apache2 -y
a2enmod ssl
sudo a2ensite default-ssl
echo "I am a Http Server." | \
tee /var/www/html/index.html
systemctl restart apache2'
http-server の内部 IP をメモします。これは、後のファイアウォール ルールのテストステップで使用します。
export http_server_ip=$(gcloud compute instances describe http-server --zone $zonename --format='value(networkInterfaces[0].networkIP)' --project $serviceproject_id)
echo $http_server_ip
5. ホスト プロジェクトにグローバル ネットワーク ファイアウォール ポリシーを作成する
ホスト プロジェクトにグローバル ネットワーク ファイアウォール ポリシーを作成し、ホスト プロジェクトの共有 VPC に関連付けます。
gcloud config set project $hostproject_id
gcloud compute network-firewall-policies create mynet-fw-policy \
--global \
--project=$hostproject_id
gcloud compute network-firewall-policies associations create \
--firewall-policy=mynet-fw-policy \
--network=mynet \
--name=mynet-fw-policy \
--global-firewall-policy \
--project=$hostproject_id
IAP が VM インスタンスに接続できるようにするには、ネットワーク ファイアウォール ポリシーにファイアウォール ルールを作成します。
- IAP を使用してアクセス可能にするすべての VM インスタンスに適用されます。
- IP 範囲 35.235.240.0/20 からの上り(内向き)トラフィックを許可します。この範囲には、IAP が TCP 転送に使用するすべての IP アドレスが含まれています。
gcloud compute network-firewall-policies rules create 1000 \
--action=ALLOW \
--firewall-policy=mynet-fw-policy \
--description="mynet-allow-iap" \
--direction=INGRESS \
--src-ip-ranges=35.235.240.0/20 \
--layer4-configs=tcp:22 \
--global-firewall-policy \
--project=$hostproject_id
コンソールで、ホスト プロジェクトに移動し、[ファイアウォール ポリシー] で新しく作成されたグローバル ネットワーク ファイアウォール ポリシーを確認できます。新しく作成したファイアウォール ルールは、ネットワーク ファイアウォール ポリシーで確認できます。コンソールへのリンクはこちらです。コンソールでプロジェクト選択ツールをホスト プロジェクトに変更してください。
6. http-client VM から http-server VM へのアクセスをテストする
http-client という名前の VM に SSH 接続し、http 80 ポートで http-server にアクセスできるかどうかをテストします。
Cloud Shell で、次の操作を行います。
gcloud compute ssh \
--zone=$zonename "http-client" \
--tunnel-through-iap \
--project=$serviceproject_id
curl を使用してウェブサーバーにアクセスします。
curl -m 10 [http_server_ip]
curl コマンドの結果が表示されます。http-server のポート 80 を許可する上り(内向き)ファイアウォール ルールがない。
接続が 10,000 ミリ秒後にタイムアウトしました。
SSH セッションを終了して、Cloud Shell に戻ります。
exit
7. 階層型ファイアウォール ポリシーとファイアウォール ルールを作成する
folder1 に階層型ファイアウォール ポリシーを作成し、そのポリシーを folder1 に関連付けます。ポリシーのファイアウォール ルールは、folder1 のホスト プロジェクトに適用されます。
階層型ファイアウォール ポリシーを作成する
gcloud compute firewall-policies create \
--folder=$folder1_id \
--short-name=my-folder1-fw-policy
階層型ファイアウォール ポリシーにファイアウォール ルールを作成する
このルールでは、タグ値が http_tags/http_client の VM が、TCP ポート 80 でタグ値が http_tags/http_server の VM にアクセスできます。
gcloud compute firewall-policies rules create 100 \
--organization=$org_id \
--firewall-policy my-folder1-fw-policy \
--direction=INGRESS \
--layer4-configs=tcp:80 \
--action=allow \
--src-secure-tags=$org_id/http_tags/http_client \
--target-secure-tags=$org_id/http_tags/http_server \
--description=folder1-allow-http
階層型ファイアウォール ポリシーを folder1 に関連付ける
gcloud compute firewall-policies associations create \
--firewall-policy=my-folder1-fw-policy \
--folder=$folder1_id \
--name=my-folder1-fw-policy\
--organization=$org_id
コンソールで folder1 に移動し、[ファイアウォール ポリシー] で新しく作成した階層型ファイアウォール ポリシーを確認できます。ファイアウォール ポリシーは [このフォルダ内にあるファイアウォール ポリシー] に表示されます。新しく作成したファイアウォール ルールは、階層型ファイアウォール ポリシーで確認できます。コンソールへのリンクはこちらです。コンソールでプロジェクト選択ツールを folder1 に変更してください。
8. http-client VM から http-server VM へのアクセスをテストする
ホスト プロジェクトの共有 VPC に適用されている有効なファイアウォール ポリシーを確認します。
Cloud Shell で、次の操作を行います。
gcloud compute networks get-effective-firewalls mynet --project=$hostproject_id
継承された階層型ファイアウォール ポリシーは次のように表示されます。
TYPE: org-firewall
FIREWALL_POLICY_NAME: <NUMBER_FOR_YOUR_FW_POLICY>
FIREWALL_POLICY_PRIORITY:
PRIORITY: 100
ACTION: ALLOW
DIRECTION: INGRESS
DISABLED: False
IP_RANGES:
You will see the network firewall policy to the VPC like this:
TYPE: network-firewall-policy
FIREWALL_POLICY_NAME: mynet-fw-policy
FIREWALL_POLICY_PRIORITY: 1000
PRIORITY: 1000
ACTION: ALLOW
DIRECTION: INGRESS
DISABLED: False
IP_RANGES: 35.235.240.0/20
http-client という名前の VM に SSH 接続し、http 80 ポートで http-server にアクセスできるかどうかをテストします。
Cloud Shell で、次の操作を行います。
gcloud compute ssh \
--zone=$zonename "http-client" \
--tunnel-through-iap \
--project=$serviceproject_id
curl を使用してウェブサーバーにアクセスします。
curl [http_server_ip]
curl コマンドが http-server からレスポンスを正常に返すことを確認します。
I am a Http Server.
階層型ファイアウォール ポリシーの内向きファイアウォール ルールにより、ポート 80 で http-client から http-server へのアクセスが許可されます。
SSH セッションを終了して、Cloud Shell に戻ります。
exit
9. クリーンアップ
サービス プロジェクトの VM をクリーンアップする
Cloud Shell で、次の操作を行います。
gcloud compute instances delete http-server --zone $zonename --project=$serviceproject_id
gcloud compute instances delete http-client --zone $zonename --project=$serviceproject_id
階層型ファイアウォール ポリシーをクリーンアップする
Cloud Shell で、次の操作を行います。
gcloud compute firewall-policies associations delete my-folder1-fw-policy \
--firewall-policy=my-folder1-fw-policy \
--organization=$org_id
gcloud compute firewall-policies rules delete 100 \
--organization=$org_id \
--firewall-policy=my-folder1-fw-policy
gcloud compute firewall-policies delete my-folder1-fw-policy \
--organization=$org_id
組織レベルでタグをクリーンアップする
Cloud Shell で、次の操作を行います。
gcloud resource-manager tags values delete $http_tags_http_server_id
gcloud resource-manager tags values delete $http_tags_http_client_id
gcloud resource-manager tags keys delete $http_tags_id
ホスト プロジェクトをクリーンアップする
Cloud Shell で、次の操作を行います。
gcloud compute shared-vpc associated-projects remove $serviceproject_id --host-project=$hostproject_id
gcloud compute shared-vpc disable $hostproject_id
gcloud projects delete $hostproject_id
サービス プロジェクトをクリーンアップする
Cloud Shell で、次の操作を行います。
gcloud projects delete $serviceproject_id
フォルダをクリーンアップする
Cloud Shell で、次の操作を行います。
gcloud resource-manager folders delete $folder1_id
gcloud resource-manager folders delete $folder2_id
10. 完了
IAM によって管理されるタグを使用して階層型ファイアウォール ポリシーを正常にテストしました。