使用 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 流量进入后端

配置防火墙规则,以允许来自 Google Cloud 健康检查和负载平衡器的 HTTP 流量传输到后端。此外,配置防火墙规则以允许通过 SSH 访问实例。

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

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

131fb495c9242335

  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

  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

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

配置后端

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

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

属性

值(按照说明选择选项)

名称

http-backend

协议

HTTP

已命名端口

htp

实例组

lb-backend-example

端口号

80

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

168a9ba1062b1f45

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

属性

值(按照说明选择选项)

名称

http-health-check

协议

TCP

端口

80

dc45bc726bb4dfad.png

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

c8f884fa4a8cd50.png

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

1fd2ad21b1d32a95

配置前端

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

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

属性

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

协议

HTTP

IP 版本

IPv4

IP 地址

临时

端口

80

  1. 点击完成

查看并创建 HTTP 负载平衡器

  1. 点击检查并最终确定

478e5e51057af3a3

  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 会话令牌。在此 Codelab 中,我们将实现 reCATCHA 会话令牌网站密钥和 reCAPTCHA WAF 质询页网站。

创建 reCAPTCHA 会话令牌和 WAF 验证页面网站密钥

在创建会话令牌网站密钥和验证页面网站密钥之前,请仔细检查您是否已按照“启用 API”中的说明启用了 reCAPTCHA Enterprise 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. 上述命令的输出为您提供了创建的密钥。请记下该 ID,我们将在下一步中将其添加到您的网站中。
  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。您应该会在“企业密钥”下看到自己创建的密钥:

4e2567aae0eb92d7

实现 reCAPTCHA 会话令牌网站密钥

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

6d7b0fd12a667b5f

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

<script src="https://www.google.com/recaptcha/enterprise.js?render=&lt;REPLACE_TOKEN_HERE&gt;&waf=session"async defer&gt;&lt;/script&gt;

请务必在更新 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

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

481f63bf5e6f244

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 政策。您的政策应与以下内容类似:

74852618aaa96786

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

验证 Cloud Armor 日志

查看安全政策日志,验证聊天机器人管理是否按预期运行。

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

46fd825d8506d355

  1. 点击查看政策日志
  2. 以下是 MQL(监控查询语言)查询,您可以将该查询复制并粘贴到查询修改器中:
resource.type:(http_load_balancer) AND jsonPayload.enforcedSecurityPolicy.name:(recaptcha-policy)
  1. 现在,点击运行查询
  2. 在查询结果中查找请求针对 http://[LB_IP_v4]/good-score.html 的日志条目。展开 jsonPayload.Expand 违规处置安全政策。

b7b1712642cf092b.png

  1. 对 http://[LB_IP_v4]/bad-score.html 和 http://[LB_IP_v4]/median-score.html 重复上述操作

c28f96d83056725a.png

8c4803d75a77142c

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

恭喜!您已完成“使用 Cloud Armor 管理机器人”这项实验

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

10. 实验清理

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

2646f9c1df093f90

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

“8ad4f55dc06513f7”

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

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 验证页面网站密钥。
  • 如何验证聊天机器人管理政策是否按预期运行。

后续步骤

  • 请尝试设置 reCAPTCHA 操作令牌。