使用 Cloud Armor 保护边缘缓存

1. 简介

借助 Google Cloud Armor 边缘安全政策,您可以限制对 Google Cloud CDN 和 Google Cloud Storage 上的缓存对象的访问。举例来说,确保您的用户不会从受限地理位置访问存储分区中的对象,或确保您的媒体分发会在您获得许可的地理位置进行过滤。

在本实验中,我们将创建一个 GCS 存储分区,将图片上传到该存储分区,将其绑定到负载平衡器,然后为其启用 Cloud CDN 和边缘安全政策。

学习内容

  • 如何设置具有可缓存内容的 Cloud Storage 存储分区
  • 如何创建边缘安全政策来保护内容
  • 如何验证边缘安全政策是否按预期运行

所需条件

  • 网络基本知识和 HTTP 知识
  • Unix/Linux 命令行基础知识

2. 设置和要求

自定进度的环境设置

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

96a9c957bc475304

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.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 图标:

bce75f34b2c53987.png

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

f6ef2b5f13479f3a.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

3. 创建 Cloud Storage 存储分区

在 Cloud Console 中,转到导航菜单 > Cloud Storage > 浏览器。点击创建存储分区

baf3d3c74282ecba.png

存储桶命名规则:

  • 请勿在存储桶名称中添加敏感信息,因为存储桶命名空间是全局性的,公开可见。
  • 存储桶名称只能包含小写字母、数字、短划线 (-)、下划线 (_) 和句点 (.)。包含句点的名称需要进行验证
  • 存储桶名称必须以数字或字母开头和结尾。
  • 存储桶名称必须包含 3 到 63 个字符。含句点的名称最多可以包含 222 个字符,但是每个以句点分隔的部分不得超过 63 个字符。
  • 存储桶名称不得以点分十进制的 IP 地址表示(例如 192.168.5.4)。
  • 存储桶不得以“goog”前缀开头。
  • 存储桶名称不得包含“google”或“google”的近似错拼变体。
  • 此外,为保证 DNS 合规与未来的兼容性,不应使用下划线 (_),也不应在句点或短划线旁边再添加句点。例如,DNS 名称中不可以使用“..”、“-.”或“.-”。

点击继续

位置类型:地区

位置:选择离您较远的区域

点击继续

默认存储类别:标准

点击继续

取消选中“禁止公开访问”下的 “禁止公开访问此存储分区”复选框。

选择“访问权限控制”下的精细控制

点击继续

配置好存储桶后,请点击创建

大功告成,您成功创建了 Cloud Storage 存储桶!

4. 将对象上传到存储分区

现在,您可以上传对象到存储桶中。

首先,将此映像下载到 Cloud Shell 中的临时实例。在以下示例中,我们将使用 Google 首页中的 Google 图片。

通过 Cloud Shell

wget --output-document google.png https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png

使用 gsutil cp 命令将该图片从保存位置上传到您创建的存储分区中:

通过 Cloud Shell

gsutil cp google.png gs://YOUR-BUCKET-NAME

现在,移除下载的图片:

通过 Cloud Shell

rm google.png

找到您的对象,点击右侧的三点状图标,将权限修改为公开。

821aad82d8633922

30a975d3ad22d33d

5. 创建负载平衡器

接下来,我们将创建 HTTP 负载平衡器。

前往网络 >>网络服务 >>负载均衡 >>创建负载平衡器 >>HTTP 负载平衡器 >>从互联网到我的虚拟机 >>传统 HTTP(S) 负载平衡器

首先,为您将创建的负载平衡器命名。

创建后端存储桶

创建新的后端存储分区(即您刚刚创建的存储分区),然后选择“已启用 CDN 和缓存静态内容”。点击“创建”。

ed392a56538d499e.png

创建主机和路径规则

转到左侧的“主机和路径规则”。我们将使用简单的主机/路径规则,并将任何请求发送到存储分区。

7c1a664e0d1f15b0

创建前端配置

选择前端配置。对于前端配置,我们将使用 HTTP(但如果您拥有证书,也可使用 HTTPS)和临时 IP 地址,并确保您已选择高级层网络。

2597a5e63d618622

点击“创建”

获取负载平衡器 IP

点击项目的负载平衡器列表中的负载平衡器名称,从控制台获取负载平衡器 IP。

9b757362d806e835

查询负载平衡器

几分钟后,尝试向负载平衡器查询您上传的对象。您需要负载平衡器 IP 地址和映像名称。该命令的结构如下所示:

从航站楼起飞

curl -svo /dev/null http://LOAD_BALANCER_IP/google.png

输出

armanrye-macbookpro% curl -svo /dev/null http://34.98.81.123/google.png
*   Trying 34.98.81.123...
* TCP_NODELAY set
* Connected to 34.98.81.123 (34.98.81.123) port 80 (#0)
> GET /google.png HTTP/1.1
> Host: YOUR_IP
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< X-GUploader-UploadID: ADPycdtoILI76KVsvBvdVGvSfzaxys1m3zYqCepBrmJxAI48ni24cWCRIdNu-53PX3DS6iycxp6xwFbMpwtcHHZQUQmEBxAgng
< Expires: Mon, 13 Dec 2021 22:58:26 GMT
< Date: Mon, 13 Dec 2021 21:58:26 GMT
< Cache-Control: public, max-age=3600
< Last-Modified: Mon, 13 Dec 2021 21:45:57 GMT
< ETag: "8f9327db2597fa57d2f42b4a6c5a9855"
< x-goog-generation: 1639431957957903
< x-goog-metageneration: 2
< x-goog-stored-content-encoding: identity
< x-goog-stored-content-length: 5969
< Content-Type: image/png
< x-goog-hash: crc32c=TeiHTA==
< x-goog-hash: md5=j5Mn2yWX+lfS9CtKbFqYVQ==
< x-goog-storage-class: STANDARD
< Accept-Ranges: bytes
< Content-Length: 5969
< Server: UploadServer

验证您的内容是否正在通过 CDN 或负载均衡监控从 CDN 提供。您的命中率应该可以接近 100%。如果您需要运行多个查询,可以执行以下操作

从航站楼起飞

#for i in `seq 1 50`; do curl http://%loadbalncer-IP%/google.png; done

确认 Cloud CDN 提供的内容

导航至网络服务 >>,验证您是否在处理来自 CDN 的流量CDN

a52d0ba4c084aa05.png

6. 从 GCS 中删除对象

现在我们填充了缓存,让我们从存储分区中删除对象,以强调我们是将政策应用于缓存而不是后端。

导航到 Cloud Storage >>%bucket name% >>对象

选择图片并将其删除。

a1cc1bb9a0ff41df.png

7. 为 CDN 缓存创建边缘安全政策

导航至网络安全 >>Cloud Armor,然后点击“创建政策”

选择以下选项

Policy Type(政策类型):Edge Security Policy(边缘安全政策)

默认操作:拒绝

7a12374be33026fd.png

b7c4efc091272358.png

77ddbcddd07b65d2

将政策应用于后端存储分区。

8. 验证边缘安全政策

现在,我们已经在后端存储分区前面创建了边缘安全政策,接下来验证该政策是否按预期工作。

检查安全政策

几分钟后,您将能够检查 Cloud Armor 政策是否正在运行。在命令行中,运行以下命令将会返回 403

从航站楼起飞

curl -svo /dev/null http://LOAD_BALANCER_IP/google.png

输出

curl -svo /dev/null http://34.98.81.123/google.png
*   Trying 34.98.81.123...
* TCP_NODELAY set
* Connected to 34.98.81.123 (34.98.81.123) port 80 (#0)
> GET /google.png HTTP/1.1
> Host: YOUR_IP
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 403 Forbidden
< X-GUploader-UploadID: ADPycdtS6FtJOGIsiWYDrAAE8VFeQuNutcvbGoQe2t8EZxsuspVtmCjyiTv_P3CNktroHMOGFXkTCfG-Jj-rUO60ZGPpEbpqcw
< Content-Type: application/xml; charset=UTF-8
< Content-Length: 111
< Date: Mon, 13 Dec 2021 23:09:35 GMT
< Expires: Mon, 13 Dec 2021 23:09:35 GMT
< Cache-Control: private, max-age=0
< Server: UploadServer
<

调查日志

接下来,您可以检查日志以查看强制执行的边缘安全政策。依次点击操作 >>日志记录 >>日志浏览器

在查询中输入以下代码段,然后点击“运行”

14972af5ae6c182a

resource.type:(http_load_balancer) AND jsonPayload.enforcedEdgeSecurityPolicy.name:(%SECURITY_POLICY_NAME%)

注意 403 响应和强制执行的安全政策

cddc48ca93ad79ca.png

移除安全政策

移除安全政策并从缓存中查询对象。

导航至网络安全 >>Cloud Armor >>%POLICY NAME% >>目标,然后移除目标存储分区。

350655729a89eb33

确认政策已移除

几分钟后,向存储分区中的资源发送另一个 curl。这次您会收到 200 响应。

从航站楼起飞

curl -svo /dev/null http://LOAD_BALANCER_IP/google.png

输出

armanrye-macbookpro% curl -svo /dev/null http://34.98.81.123/google.png

*   Trying 34.98.81.123...
* TCP_NODELAY set
* Connected to 34.98.81.123 (34.98.81.123) port 80 (#0)
> GET /google.png HTTP/1.1
> Host: YOUR_IP
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< X-GUploader-UploadID: ADPycdtI7f49P3MSuZSZ8vl6RwfwmnIDJ59EeSKp7UPvLPawdaiRHXiNWLtseQTxUxceWOvSLvpYmT3pWVkV4qeIP7M
< Date: Mon, 13 Dec 2021 23:06:46 GMT
< Last-Modified: Mon, 13 Dec 2021 21:45:57 GMT
< ETag: "8f9327db2597fa57d2f42b4a6c5a9855"
< x-goog-generation: 1639431957957903
< x-goog-metageneration: 2
< x-goog-stored-content-encoding: identity
< x-goog-stored-content-length: 5969
< Content-Type: image/png
< x-goog-hash: crc32c=TeiHTA==
< x-goog-hash: md5=j5Mn2yWX+lfS9CtKbFqYVQ==
< x-goog-storage-class: STANDARD
< Accept-Ranges: bytes
< Content-Length: 5969
< Server: UploadServer
< Age: 1621
< Cache-Control: public,max-age=3600
<
{ [775 bytes data]
* Connection #0 to host 34.98.81.123 left intact
* Closing connection 0

恭喜!您已完成有关 Cloud Armor Edge 安全政策的实验。

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

9. 实验清理

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

21eefb5f375e8fee.png

前往 Cloud Storage,选择您创建的存储分区,然后点击“删除”

ef2fa8d45c1d3452.png

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

ee2e78c10f4104eb.png

10. 恭喜!

您已完成“使用 Cloud Armor 保护边缘缓存”Codelab!

所学内容

  • 如何设置 Cloud Storage 存储分区和关联的 Cloud 负载平衡器
  • 如何创建 Cloud Armor 边缘安全政策
  • 如何验证边缘安全政策是否按预期运行。

后续步骤

  • 请尝试设置 Compute Engine 资源缓存命中的边缘安全政策。