1. 简介
Google Cloud HTTP(S) 负载均衡部署在全球各地的 Google 入网点 (POP),位于 Google 网络边缘。定向到 HTTP(S) 负载均衡器的用户流量会进入距离用户最近的 POP,然后通过 Google 的全球网络进行负载均衡,转发到具有足够可用容量的最近后端。
Cloud Armor 是 Google 推出的分布式拒绝服务攻击和 Web 应用防火墙 (WAF) 检测系统。Cloud Armor 与 Google Cloud HTTP 负载均衡器紧密耦合,可保护 Google Cloud 客户的应用免受来自互联网的攻击。reCAPTCHA Enterprise 服务基于现有的 reCAPTCHA API 构建,利用先进的风险分析技术区分人类与漫游器,从而保护您的网站免受垃圾内容和滥用行为的侵扰。Cloud Armor 漫游器管理提供了一套端到端解决方案,它将 reCAPTCHA Enterprise 的漫游器检测和评分功能与 Cloud Armor 在网络边缘的强制执行能力相结合,从而保护下游应用。
在本实验中,您将配置一个带有后端的 HTTP 负载均衡器,如下图所示。然后,您将学习如何设置 reCAPTCHA 会话令牌网站密钥并将其嵌入到您的网站中。您还将学习如何设置到 reCAPTCHA Enterprise 手动验证任务的重定向。然后,我们将配置 Cloud Armor 漫游器管理政策,以展示漫游器检测功能如何保护您的应用免受恶意漫游器流量的侵害。

学习内容
- 如何配置 HTTP 负载均衡器并设置相应的健康检查。
- 如何创建 reCAPTCHA WAF 验证任务页面网站密钥,并将其与 Cloud Armor 安全政策相关联。
- 如何创建 reCAPTCHA 会话令牌网站密钥并将其安装到您的网页上。
- 如何创建 Cloud Armor 漫游器管理政策。
- 如何验证漫游器管理政策是否根据所配置的规则处理流量。
所需条件
- 网络组建和管理以及 HTTP 基础知识
- Unix/Linux 命令行基础知识
2. 设置和要求
自定进度的环境设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。



- 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串,您可以随时对其进行更新。
- 项目 ID 在所有 Google Cloud 项目中必须是唯一的,并且不可变(一经设置便无法更改)。Cloud Console 会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(它通常标识为
PROJECT_ID),因此如果您不喜欢某个 ID,请再生成一个随机 ID,还可以尝试自己创建一个,并确认是否可用。然后,项目创建后,ID 会处于“冻结”状态。 - 第三个值是一些 API 使用的项目编号。如需详细了解所有这三个值,请参阅文档。
- 接下来,您需要在 Cloud Console 中启用结算功能,才能使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。要关闭资源以避免产生超出本教程范围的费用,请按照此 Codelab 末尾提供的任何“清理”说明操作。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。
启动 Cloud Shell
虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。
在 GCP 控制台中,点击右上角工具栏上的 Cloud Shell 图标:

预配和连接到环境应该只需要片刻时间。完成后,您应该会看到如下内容:

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。只需一个浏览器,即可完成本实验中的所有工作。
准备工作
在 Cloud Shell 中,确保项目 ID 已设置
gcloud config list project gcloud config set project [YOUR-PROJECT-NAME] PROJECT_ID=[YOUR-PROJECT-NAME] echo $PROJECT_ID
启用 API
启用所有必要的服务
gcloud services enable compute.googleapis.com gcloud services enable logging.googleapis.com gcloud services enable monitoring.googleapis.com gcloud services enable recaptchaenterprise.googleapis.com
3. 配置防火墙规则,以允许 HTTP 和 SSH 流量进入后端
配置防火墙规则,以允许来自 Google Cloud 健康检查和负载均衡器的 HTTP 流量进入后端。此外,还要配置一条防火墙规则,以允许通过 SSH 连接到实例。
我们将使用在您的项目中创建的 default VPC 网络。创建防火墙规则,以允许 HTTP 流量进入后端。健康检查可确定负载均衡器的哪些实例能接收新连接。对于 HTTP 负载均衡,针对负载均衡实例的健康检查探测请求来自 130.211.0.0/22 和 35.191.0.0/16 范围内的地址。您的 VPC 防火墙规则必须允许这些连接。此外,负载均衡器也会在相同的 IP 地址范围内与后端进行通信。
- 在 Cloud 控制台中,依次前往导航菜单 (
) > VPC 网络 > 防火墙。

- 请注意现有的 ICMP、internal、RDP 和 SSH 防火墙规则。每个 Google Cloud 项目在创建之初都包含 default 网络以及上述防火墙规则。
- 点击创建防火墙规则。
- 设置以下值,将其余各项保留为默认值:
属性 | 值(按照说明输入值或选择选项) |
名称 | default-allow-health-check |
网络 | default |
目标 | 指定的目标标记 |
目标标记 | allow-health-check |
来源过滤条件 | IP 范围 |
来源 IP 地址范围 | 130.211.0.0/22、35.191.0.0/16 |
协议和端口 | 指定的协议和端口;然后勾选“tcp”。输入端口号 80 |
- 点击创建。
或者,如果您使用的是 gcloud 命令行。以下是相应命令 -
gcloud compute firewall-rules create default-allow-health-check --direction=INGRESS --priority=1000 --network=default --action=ALLOW --rules=tcp:80 --source-ranges=130.211.0.0/22,35.191.0.0/16 --target-tags=allow-health-check
- 同样,创建一条防火墙规则,允许通过 SSH 连接到实例 -
gcloud compute firewall-rules create allow-ssh --direction=INGRESS --priority=1000 --network=default --action=ALLOW --rules=tcp:22 --source-ranges=0.0.0.0/0 --target-tags=allow-health-check
4. 配置实例模板并创建托管式实例组
托管式实例组可使用实例模板来创建一组相同的实例。您可以使用这些实例来创建 HTTP 负载均衡器的后端。
配置实例模板
实例模板是一种可用于创建虚拟机实例和托管式实例组的资源。实例模板可定义机器类型、启动磁盘映像、子网、标签和其他实例属性。按如下所示创建实例模板。
- 在 Cloud 控制台中,前往导航菜单 (
) > Compute Engine > 实例模板,随后点击创建实例模板。 - 对于名称,输入 lb-backend-template。
- 为系列选择 N1。
- 点击网络、磁盘、安全、管理、单租户。

- 前往管理部分,并将以下脚本插入到启动脚本字段中。
#! /bin/bash sudo apt-get update sudo apt-get install apache2 -y sudo a2ensite default-ssl sudo a2enmod ssl sudo vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" sudo echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html
- 点击网络标签页,添加网络标记:allow-health-check
- 设置以下值,将其余各项保留为默认值:
属性 | 值(按照说明输入值或选择选项) |
网络(位于“网络接口”下) | 默认 |
子网(位于“网络接口”下) | 默认 (us-east1) |
网络标记 | allow-health-check |
- 点击创建。
- 等待实例模板创建完毕。
创建托管式实例组
- 仍然在 Compute Engine 页面中,点击左侧菜单中的实例组。

- 点击创建实例组。 选择新的托管式实例组(无状态)。
- 设置以下值,将所有其他值保留为默认值:
属性 | 值(按照说明输入值或选择选项) |
名称 | lb-backend-example |
位置 | 单个可用区 |
区域 | us-east1 |
可用区 | us-east1-b |
实例模板 | lb-backend-template |
自动扩缩 | 不自动调节 |
实例数 | 1 |
- 点击创建。
向实例组添加已命名端口
对于您的实例组,定义一个 HTTP 服务并将端口名称映射到相关端口上。负载均衡服务会将流量转发到命名端口。
gcloud compute instance-groups set-named-ports lb-backend-example \
--named-ports http:80 \
--zone us-east1-b
5. 配置 HTTP 负载均衡器
配置 HTTP 负载均衡器,以将流量发送到后端 lb-backend-example::
开始配置
- 在 Cloud 控制台中,依次点击导航菜单 (
) > 网络服务 > 负载均衡,然后点击创建负载均衡器。 - 在 HTTP(S) 负载均衡下,点击开始配置。

- 依次选择从互联网到我的虚拟机、传统版 HTTP(S) 负载均衡器,然后点击继续。
- 将名称设置为 http-lb。
配置后端
后端服务会将传入的流量定向到一个或多个关联的后端。每个后端由一个实例组和附加的服务容量元数据组成。
- 点击后端配置。
- 对于后端服务和后端存储桶,点击创建后端服务。
- 设置以下值,将其余各项保留为默认值:
属性 | 值(按照说明选择选项) |
名称 | http-backend |
协议 | HTTP |
命名端口 | htp |
实例组 | lb-backend-example |
端口号 | 80 |
- 点击完成。
- 点击添加后端。
- 对于健康检查,请选择创建健康检查。

- 设置以下值,将所有其他值保留为默认值:
属性 | 值(按照说明选择选项) |
名称 | http-health-check |
协议 | TCP |
端口 | 80 |

- 点击保存。
- 选中启用日志记录框。
- 将采样率设置为 1:

- 点击创建以创建后端服务。

配置前端
主机和路径规则决定将如何定向您的流量。例如,您可以将视频流量定向到一个后端,将静态流量定向到另一个后端。不过,主机和路径规则的配置并不在本实验的涵盖范围内。
- 点击前端配置。
- 指定以下内容,并将所有其他值保留为默认值:
属性 | 值(按照说明输入值或选择选项) |
协议 | HTTP |
IP 版本 | IPv4 |
IP 地址 | 临时 |
端口 | 80 |
- 点击完成。
检查并创建 HTTP 负载均衡器
- 点击检查并最终确定。

- 检查后端服务和前端。
- 点击创建。
- 等待负载均衡器创建完毕。
- 点击负载均衡器的名称 (http-lb)。
- 记下负载均衡器的 IPv4 地址,以便在下一个任务中使用。我们将其称为 [LB_IP_v4]。
6. 测试 HTTP 负载均衡器
现在您已经为后端创建了 HTTP 负载均衡器,接下来验证流量是否会转发到该后端服务。若要测试通过 IPv4 访问 HTTP 负载均衡器的情况,请在浏览器中打开一个新标签页,并访问 http://[LB_IP_v4]。请务必将 [LB_IP_v4] 替换为负载均衡器的 IPv4 地址。
7. 创建并部署 reCAPTCHA 会话令牌和验证任务页面网站密钥
reCAPTCHA Enterprise for WAF 与 Google Cloud Armor 的集成提供以下功能:reCAPTCHA 验证任务页面、reCAPTCHA 操作令牌和 reCAPTCHA 会话令牌。在此代码库中,我们将实现 reCAPTCHA 会话令牌网站密钥和 reCAPTCHA WAF 验证任务页面网站密钥。
创建 reCAPTCHA 会话令牌和 WAF 验证任务页面网站密钥
在创建会话令牌网站密钥和验证任务页面网站密钥之前,请仔细核查您是否已按照开头的“启用 API”部分中的说明启用了 reCAPTCHA Enterprise API。
评估完成后,reCAPTCHA JavaScript 会在最终用户的浏览器中将 reCAPTCHA 会话令牌设置为 Cookie。只要 reCAPTCHA JavaScript 保持运行,最终用户的浏览器就会携带并刷新该 Cookie。
- 创建 reCAPTCHA 会话令牌网站密钥,并为该密钥启用 WAF 功能。我们还将 WAF 服务设置为 Cloud Armor,以启用 Cloud Armor 集成。
gcloud recaptcha keys create --display-name=test-key-name \ --web --allow-all-domains --integration-type=score --testing-score=0.5 \ --waf-feature=session-token --waf-service=ca
- 上述命令的输出会显示创建的密钥。请记下此代码,因为我们将在下一步中将其添加到您的网站。
- 创建 reCAPTCHA WAF 验证任务页面网站密钥,并为该密钥启用 WAF 功能。您可以使用 reCAPTCHA 验证任务页面功能,将传入的请求重定向到 reCAPTCHA Enterprise,从而确定每项请求是潜在的欺诈行为还是合法请求。稍后,我们将此密钥与 Cloud Armor 安全政策相关联,以启用手动验证。在后续步骤中,我们将此密钥称为 CHALLENGE-PAGE-KEY。
gcloud recaptcha keys create --display-name=challenge-page-key \ --web --allow-all-domains --integration-type=INVISIBLE \ --waf-feature=challenge-page --waf-service=ca
- 依次前往导航菜单 (
) > 安全 > reCAPTCHA Enterprise。您应该会在“Enterprise 密钥”下看到您创建的密钥 -

实现 reCAPTCHA 会话令牌网站密钥
- 依次前往导航菜单 (
) > Compute Engine > 虚拟机实例。在实例组中找到相应虚拟机,然后通过 SSH 连接到该虚拟机。

- 前往 Web 服务器根目录,并将用户切换为 root -
@lb-backend-example-4wmn:~$ cd /var/www/html/ @lb-backend-example-4wmn:/var/www/html$ sudo su
- 更新着陆页 index.html 并嵌入 reCAPTCHA 会话令牌网站密钥。会话令牌网站密钥需按如下方式在着陆页的 head 部分中设置:
<script src="https://www.google.com/recaptcha/enterprise.js?render=<REPLACE_TOKEN_HERE>&waf=session" async defer></script>
请务必替换令牌,然后再更新 index.html 文件,如下所示 -
root@lb-backend-example-4wmn:/var/www/html# echo '<!doctype html><html><head><title>ReCAPTCHA Session Token</title><script src="https://www.google.com/recaptcha/enterprise.js?render=<REPLACE_TOKEN_HERE>&waf=session" async defer></script></head><body><h1>Main Page</h1><p><a href="/good-score.html">Visit allowed link</a></p><p><a href="/bad-score.html">Visit blocked link</a></p><p><a href="/median-score.html">Visit redirect link</a></p></body></html>' > index.html
- 再创建三个示例页面,用于测试漫游器管理政策 -
- good-score.html
root@lb-backend-example-4wmn:/var/www/html# echo '<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1252"></head><body><h1>Congrats! You have a good score!!</h1></body></html>' > good-score.html
- bad-score.html
root@lb-backend-example-4wmn:/var/www/html# echo '<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1252"></head><body><h1>Sorry, You have a bad score!</h1></body></html>' > bad-score.html
- median-score.html
root@lb-backend-example-4wmn:/var/www/html# echo '<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1252"></head><body><h1>You have a median score that we need a second verification.</h1></body></html>' > median-score.html
- 在浏览器中打开所有网页,确认您可以正常访问。请务必将 [LB_IP_v4] 替换为负载均衡器的 IPv4 地址。
- 打开 http://[LB_IP_v4]/index.html。当页面右下角显示“受 reCAPTCHA 保护”时,即表示 reCAPTCHA 已成功部署并正常运行 -

- 依次点击每个链接。

- 验证您是否可以访问所有页面。

8. 为漫游器管理创建 Cloud Armor 安全政策规则
在本部分中,您将使用 Cloud Armor 漫游器管理规则,根据 reCAPTCHA 得分来允许、拒绝或重定向请求。请注意,您在创建会话令牌网站密钥时设置的测试分数为 0.5。
- 在 Cloud Shell 中(如需了解如何使用 Cloud Shell,请参阅“设置和要求”下的“启动 Cloud Shell”),通过 gcloud 创建安全政策:
gcloud compute security-policies create recaptcha-policy \
--description "policy for bot management"
- 若要使用 reCAPTCHA Enterprise 手动验证来区分真人和自动化客户端,请将我们为手动验证创建的 reCAPTCHA WAF 验证任务页面网站密钥与安全政策关联。将“CHALLENGE-PAGE-KEY”替换为我们创建的密钥 -
gcloud compute security-policies update recaptcha-policy \ --recaptcha-redirect-site-key "CHALLENGE-PAGE-KEY"
- 添加一条漫游器管理规则:如果网址路径与 good-score.html 匹配且得分大于 0.4,则允许流量通过。
gcloud compute security-policies rules create 2000 \
--security-policy recaptcha-policy\
--expression "request.path.matches('good-score.html') && token.recaptcha_session.score > 0.4"\
--action allow
- 添加一条漫游器管理规则:如果网址路径与 bad-score.html 匹配且得分低于 0.6,则拒绝流量通过。
gcloud compute security-policies rules create 3000 \
--security-policy recaptcha-policy\
--expression "request.path.matches('bad-score.html') && token.recaptcha_session.score < 0.6"\
--action "deny-403"
- 添加一条漫游器管理规则:如果网址路径与 median-score.html 匹配且得分为 0.5,则将流量重定向到 Google reCAPTCHA
gcloud compute security-policies rules create 1000 \
--security-policy recaptcha-policy\
--expression "request.path.matches('median-score.html') && token.recaptcha_session.score == 0.5"\
--action redirect \
--redirect-type google-recaptcha
- 将安全政策附加到后端服务 http-backend:
gcloud compute backend-services update http-backend \
--security-policy recaptcha-policy –-global
- 在控制台中,前往导航菜单 > 网络安全 > Cloud Armor。
- 点击 recaptcha-policy。您的政策应如下所示:

9. 使用 Cloud Armor 验证漫游器管理效果
- 打开浏览器,输入网址 http://[LB_IP_v4]/index.html。点击“Visit allow link”(访问允许的链接)。您应该可以顺利通过 -

- 在无痕模式下打开新窗口,以确保开启新会话。输入网址 http://[LB_IP_v4]/index.html,然后点击“Visit blocked link”(访问被屏蔽的链接)。您应该会收到 HTTP 403 错误 -

- 在无痕模式下打开新窗口,以确保开启新会话。输入网址 http://[LB_IP_v4]/index.html,然后点击“Visit redirect link”(访问重定向链接)。您应该会看到系统已重定向至 Google reCAPTCHA,并显示如下所示的手动验证任务页面:

查看 Cloud Armor 日志
查看安全政策日志,验证漫游器管理是否按预期运行。
- 在控制台中,前往导航菜单 > 网络安全 > Cloud Armor。
- 点击 recaptcha-policy。
- 点击日志。

- 点击查看政策日志。
- 以下是 MQL(监控查询语言)查询,您可以将其复制并粘贴到查询编辑器中 -
resource.type:(http_load_balancer) AND jsonPayload.enforcedSecurityPolicy.name:(recaptcha-policy)
- 现在,点击运行查询。
- 在查询结果中,查找请求为 http://[LB_IP_v4]/good-score.html 的日志条目。依次展开 jsonPayload 和 enforcedSecurityPolicy。

- 对 http://[LB_IP_v4]/bad-score.html 和 http://[LB_IP_v4]/median-score.html 执行同样的操作


请注意,configuredAction 设置为 ALLOW、DENY 或 GOOGLE_RECAPTCHA,名称为 recaptcha-policy。
恭喜!您已完成本实验,即使用 Cloud Armor 进行漫游器管理
©2020 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。
10. 实验清理
- 依次前往网络安全 >> Cloud Armor >> %POLICY NAME%,然后选择“删除”-

- 依次前往网络 >> 网络服务 >> 负载均衡。选择您创建的负载均衡器,然后点击“删除”。

选择后端服务和健康检查作为要删除的其他资源 -

- 依次前往导航菜单 (
) > Compute Engine > 实例组。选择托管式实例组,然后点击“删除”图标 -

在文本框中输入“delete”以确认删除。
等待托管式实例组删除完成。此操作还会删除组中的实例。只有在删除实例组后,您才能删除模板。
- 从左侧窗格中前往实例模板。选择实例模板,然后点击“删除”。
- 前往导航菜单 (
) > VPC 网络 > 防火墙。选择 default-allow-health-check 和 allow-ssh 规则,然后点击“删除”。 - 依次前往导航菜单 (
) > 安全 > reCAPTCHA Enterprise。选择我们创建的密钥,然后将其删除。在文本框中输入“DELETE”以确认删除。

11. 恭喜!
您使用 Cloud Armor 成功实现了漫游器管理,并配置了一个 HTTP 负载均衡器,然后在网页上创建并实现了 reCAPTCHA 会话令牌网站密钥。您还学习了如何创建验证任务页面网站密钥。配置了 Cloud Armor 漫游器管理政策,并验证了这些政策如何根据规则处理请求;您成功查看了安全政策日志,并确定了流量被允许、阻止或重定向的原因。
所学内容
- 如何设置实例模板并创建托管式实例组。
- 如何设置 HTTP 负载均衡器。
- 如何创建 Cloud Armor 漫游器管理政策。
- 如何创建和实现 reCAPTCHA 会话令牌网站密钥。
- 如何创建和实现 reCAPTCHA 验证任务页面网站密钥。
- 如何验证漫游器管理政策是否按预期运行。
后续步骤
- 尝试设置 reCAPTCHA 操作令牌。