使用 Google Cloud Armor 进行机器人管理 + reCAPTCHA

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 漫游器管理政策,以展示漫游器检测功能如何保护您的应用免受恶意漫游器流量的侵害。

8b46e6728996bc0c.png

学习内容

  • 如何设置具有适当健康检查的 HTTP 负载平衡器。
  • 如何创建 reCAPTCHA WAF 验证页面网站密钥并将其与 Cloud Armor 安全政策相关联。
  • 如何创建 reCAPTCHA 会话令牌网站密钥并将其安装在网页上。
  • 如何创建 Cloud Armor 机器人管理政策。
  • 如何验证机器人管理政策是否根据配置的规则处理流量。

所需条件

  • 网络组建和管理以及 HTTP 基础知识
  • Unix/Linux 命令行基础知识

2. 设置和要求

自定进度的环境设置

  1. 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

启动 Cloud Shell

虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。

在 GCP 控制台中,点击右上角工具栏上的 Cloud Shell 图标:

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 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 流量进入后端

配置防火墙规则,以允许 HTTP 流量从 Google Cloud 健康检查工具和负载平衡器发送到后端。此外,还要配置防火墙规则,以允许通过 SSH 连接到实例。

我们将使用您项目中创建的默认 VPC 网络。创建防火墙规则,以允许 HTTP 流量进入后端。健康检查可确定负载均衡器的哪些实例能接收新连接。在 HTTP 负载均衡的过程中,对负载均衡实例的健康检查探测来自于 130.211.0.0/22 和 35.191.0.0/16 范围内的地址。您的 VPC 防火墙规则必须允许这些连接。此外,负载平衡器还通过同一 IP 范围与后端通信。

  1. 在 Cloud 控制台中,前往导航菜单 ( mainmenu.png) > VPC 网络 > 防火墙

131fb495c9242335.png

  1. 请注意现有的 ICMPinternalRDPSSH 防火墙规则。每个 Google Cloud 云项目都从 default 网络和上述防火墙规则开始。
  2. 点击创建防火墙规则
  3. 设置以下值,将所有其他值保留为默认值:

属性

值(按照说明输入值或选择选项)

名称

default-allow-health-check

网络

default

目标

指定的目标标记

目标标记

allow-health-check

来源过滤条件

IP 范围

来源 IP 地址范围

130.211.0.0/22、35.191.0.0/16

协议和端口

指定的协议和端口;然后勾选“tcp”。输入端口号 80

  1. 点击创建

或者,如果您使用的是 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
  1. 同样,创建防火墙规则以允许通过 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 负载平衡器的后端。

配置实例模板

实例模板是一种用于创建虚拟机实例和托管式实例组的资源。实例模板可定义机器类型、启动磁盘映像、子网、标签和其他实例属性。按如下所示创建实例模板。

  1. 在 Cloud 控制台中,依次前往导航菜单 ( mainmenu.png) > Compute Engine > 实例模板,然后点击创建实例模板
  2. 名称部分,输入 lb-backend-template
  3. 系列选择 N1
  4. 点击网络、磁盘、安全、管理、单租户

1d0b7122f4bb410d.png

  1. 前往管理部分,并将以下脚本插入到启动脚本字段中。
#! /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
  1. 点击网络标签页,添加网络标记:allow-health-check
  2. 设置以下值,将所有其他值保留为默认值:

属性

值(按照说明输入值或选择选项)

网络(位于“网络接口”下)

默认

子网(位于“网络接口”下)

默认 (us-east1)

网络标记

allow-health-check

  1. 点击创建
  2. 等待实例模板创建完毕。

创建托管式实例组

  1. 仍然在 Compute Engine 页面中,点击左侧菜单中的实例组

ed419061ad2b982c.png

  1. 点击创建实例组。 选择新的托管式实例组(无状态)
  2. 设置以下值,将所有其他值保留为默认值:

属性

值(按照说明输入值或选择选项)

名称

lb-backend-example

位置

单个可用区

区域

us-east1

可用区

us-east1-b

实例模板

lb-backend-template

自动扩缩

不自动调节

实例数

1

  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:

开始配置

  1. 在 Cloud 控制台中,依次点击导航菜单 ( mainmenu.png) > 网络服务 > 负载均衡,然后点击创建负载平衡器
  2. HTTP(S) 负载均衡下,点击开始配置

4f8b8cb10347ecec.png

  1. 依次选择从互联网到我的虚拟机传统版 HTTP(S) 负载平衡器,然后点击继续
  2. 名称设置为 http-lb。

配置后端

后端服务会将传入的流量定向到一个或多个关联的后端。每个后端由一个实例组和附加的服务容量元数据组成。

  1. 点击后端配置
  2. 对于后端服务和后端存储桶,点击创建后端服务
  3. 设置以下值,将所有其他值保留为默认值:

属性

值(按照说明选择选项)

名称

http-backend

协议

HTTP

命名端口

htp

实例组

lb-backend-example

端口号

80

  1. 点击完成
  2. 点击添加后端
  3. 对于健康检查,请选择创建健康检查

168a9ba1062b1f45.png

  1. 设置以下值,将所有其他值保留为默认值:

属性

值(按照说明选择选项)

名称

http-health-check

协议

TCP

端口

80

dc45bc726bb4dfad.png

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

c8f884fa4a8cd50.png

  1. 点击创建以创建后端服务。

1fd2ad21b1d32a95.png

配置前端

主机和路径规则决定将如何定向您的流量。例如,您可以将视频流量定向到一个后端,将静态流量定向到另一个后端。不过,主机和路径规则的配置并不在本实验的涵盖范围内。

  1. 点击前端配置
  2. 指定以下内容,并将所有其他值保留为默认值:

属性

值(按照说明输入值或选择选项)

协议

HTTP

IP 版本

IPv4

IP 地址

临时

端口

80

  1. 点击完成

检查并创建 HTTP 负载平衡器

  1. 点击检查并最终确定

478e5e51057af3a3.png

  1. 检查后端服务前端
  2. 点击创建
  3. 等待负载均衡器创建完毕。
  4. 点击负载均衡器的名称 (http-lb)。
  5. 请记下负载平衡器的 IPv4 地址,以备在下一个任务中使用。我们将其称为 [LB_IP_v4]。

6. 测试 HTTP 负载平衡器

现在您已经为自己的后端创建了 HTTP 负载平衡器,接下来验证流量会转发到该后端服务。若要测试对 HTTP 负载均衡器的 IPv4 访问,在浏览器中打开一个新标签页,并转到 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 验证页面网站密钥

在创建会话令牌网站密钥和挑战页面网站密钥之前,请仔细检查您是否已启用 reCAPTCHA Enterprise API,如开头的“启用 API”部分中所述。

在评估后,reCAPTCHA JavaScript 会在最终用户的浏览器上将 reCAPTCHA 会话令牌设置为 Cookie。只要 reCAPTCHA JavaScript 保持活跃状态,最终用户的浏览器就会附加该 Cookie 并刷新该 Cookie。

  1. 创建 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
  1. 上述命令的输出会显示您创建的密钥。请记下此代码,因为我们将在下一步中将其添加到您的网站。
  2. 创建 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
  1. 依次前往导航菜单 ( mainmenu.png) > 安全性 > reCAPTCHA Enterprise。您应该会在“Enterprise Keys”(企业密钥)下看到您创建的密钥 -

4e2567aae0eb92d7.png

实现 reCAPTCHA 会话令牌网站密钥

  1. 前往导航菜单 ( mainmenu.png) > Compute Engine > 虚拟机实例。找到实例组中的虚拟机,然后通过 SSH 连接到该虚拟机。

6d7b0fd12a667b5f.png

  1. 前往 Web 服务器根目录,并将用户更改为 root -
@lb-backend-example-4wmn:~$ cd /var/www/html/
@lb-backend-example-4wmn:/var/www/html$ sudo su
  1. 更新着陆页 index.html 并嵌入 reCAPTCHA 会话令牌网站密钥。会话令牌网站密钥在着陆页的标头部分中设置,如下所示:

<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
  1. 创建另外三个示例网页,以测试机器人管理政策 -
  • 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
  1. 通过在浏览器中打开所有网页,验证您是否能够访问这些网页。请务必将 [LB_IP_v4] 替换为负载平衡器的 IPv4 地址。
  • 打开 http://[LB_IP_v4]/index.html。当您在页面右下角看到“受 reCAPTCHA 保护”时,便可验证 reCAPTCHA 实现是否正常运行 -

d695ad23d91ae4e9.png

  • 点击每个链接。

4a2ad1b2f10b4c86.png

  • 验证您是否能够访问所有网页。

481f63bf5e6f244.png

8. 为机器人管理创建 Cloud Armor 安全政策规则

在本部分中,您将使用 Cloud Armor 漫游器管理规则,根据 reCAPTCHA 得分允许、拒绝和重定向请求。请注意,您在创建会话令牌网站密钥时,将测试得分设置为 0.5。

  1. 在 Cloud Shell 中(如需了解如何使用 Cloud Shell,请参阅“设置和要求”下的“启动 Cloud Shell”),通过 gcloud 创建安全政策:
gcloud compute security-policies create recaptcha-policy \
    --description "policy for bot management"
  1. 如需使用 reCAPTCHA Enterprise 手动验证来区分真人和自动化客户端,请将我们为手动验证创建的 reCAPTCHA WAF 验证网站密钥与安全政策相关联。将“CHALLENGE-PAGE-KEY”替换为我们创建的密钥 -
gcloud compute security-policies update recaptcha-policy \
   --recaptcha-redirect-site-key "CHALLENGE-PAGE-KEY"
  1. 添加机器人管理规则,以允许网址路径与 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
  1. 添加一条机器人管理规则,以在网址路径与 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"
  1. 添加漫游器管理规则,以在网址路径与 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
  1. 将安全政策附加到后端服务 http-backend:
gcloud compute backend-services update http-backend \
    --security-policy recaptcha-policy –-global
  1. 在控制台中,前往导航菜单 > 网络安全 > Cloud Armor
  2. 点击 recaptcha-policy。您的政策应如下所示:

74852618aaa96786.png

9. 使用 Cloud Armor 验证机器人管理

  1. 打开浏览器,然后输入网址 http://[LB_IP_v4]/index.html。前往“访问允许链接”。您应该可以顺利通过 -

edf3e6ca238d2ee7.png

  1. 在无痕模式下打开新窗口,确保我们拥有新的会话。输入网址 http://[LB_IP_v4]/index.html,然后前往“访问被屏蔽的链接”。您应该会收到 HTTP 403 错误 -

ecef5655b291dbb0.png

  1. 在无痕模式下打开新窗口,确保我们拥有新的会话。输入网址 http://[LB_IP_v4]/index.html,然后前往“访问重定向链接”。您应该会看到重定向到 Google reCAPTCHA 和手动验证页面,如下所示 -

53ed2b4067b55436.png

验证 Cloud Armor 日志

浏览安全政策日志,验证机器人管理功能是否按预期运行。

  1. 在控制台中,前往导航菜单 > 网络安全 > Cloud Armor
  2. 点击 recaptcha-policy
  3. 点击日志

46fd825d8506d355.png

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

b7b1712642cf092b.png

  1. 对 http://[LB_IP_v4]/bad-score.html 和 http://[LB_IP_v4]/median-score.html 重复相同的步骤

c28f96d83056725a.png

8c4803d75a77142c.png

请注意,configuredAction 已设置为 ALLOW、DENY 或 GOOGLE_RECAPTCHA,名称为 recaptcha-policy

恭喜!您已完成本实验:使用 Cloud Armor 进行机器人管理

©2020 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。

10. 实验清理

  1. 前往网络安全 >> Cloud Armor >> %POLICY NAME%,然后选择“删除”-

2646f9c1df093f90.png

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

8ad4f55dc06513f7.png

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

f6f02bb56add6420.png

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

2116b286954fd6.png

在文本框中输入“delete”以确认删除。

等待托管式实例组删除完成。此操作还会删除组中的实例。只有在删除实例组后,您才能删除模板。

  1. 从左侧窗格中前往实例模板。选择实例模板,然后点击“删除”。
  2. 前往导航菜单 ( mainmenu.png) > VPC 网络 > 防火墙。选择“default-allow-health-check”和“allow-ssh”规则,然后点击“删除”。
  3. 依次前往导航菜单 ( mainmenu.png) > 安全性 > reCAPTCHA Enterprise。选择我们创建的密钥,然后将其删除。在文本框中输入“DELETE”以确认删除。

e71ecd11baf262ca.png

11. 恭喜!

您已成功使用 Cloud Armor 实现了机器人管理。您配置了 HTTP 负载平衡器。然后,您在网页上创建并实现了 reCAPTCHA 会话令牌网站密钥。您还学习了如何创建挑战网页网站密钥。您设置了 Cloud Armor 机器人管理政策,并验证了这些政策如何根据规则处理请求。您能够浏览安全政策日志,以确定系统允许、阻止或重定向流量的原因。

所学内容

  • 如何设置实例模板并创建托管式实例组。
  • 如何设置 HTTP 负载平衡器。
  • 如何创建 Cloud Armor 机器人管理政策。
  • 如何创建和实现 reCAPTCHA 会话令牌网站密钥。
  • 如何创建和实现 reCAPTCHA 验证任务网站密钥。
  • 如何验证 Bot 管理政策是否按预期运行。

后续步骤

  • 尝试设置 reCAPTCHA 操作令牌。