使用 Cloud Armor 保护边缘缓存

1. 简介

借助 Google Cloud Armor 边缘安全政策,您可以限制对 Google Cloud CDN 和 Google Cloud Storage 中缓存的对象的访问权限。这样做的原因包括确保用户不会访问受限地理位置的存储分区中的对象,或确保媒体分发会根据您获得许可的地理位置进行过滤。

在本实验中,我们将创建一个 GCS 存储分区,向其中上传映像,将其绑定到负载平衡器,然后对其启用 Cloud CDN 和 Edge 安全政策。

学习内容

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

所需条件

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

2. 设置和要求

自定进度的环境设置

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

96a9c957bc475304.png

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

30a975d3ad22d33d.png

5. 创建负载平衡器

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

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

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

创建后端存储桶

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

ed392a56538d499e.png

创建主机和路径规则

前往左侧的“主机和路径规则”。我们将使用简单的主机/路径规则,并将所有请求发送到相应存储分区。

7c1a664e0d1f15b0.png

创建前端配置

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

2597a5e63d618622.png

点击“创建”

获取负载平衡器 IP

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

9b757362d806e835.png

查询负载平衡器

几分钟后,尝试查询负载平衡器以获取您上传的对象。您将需要负载平衡器 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 >> %存储分区名称% >> 对象

选择相应图片并将其删除。

a1cc1bb9a0ff41df.png

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

前往网络安全 >> Cloud Armor,然后点击“创建政策”

选择以下选项

政策类型:边缘安全政策

默认操作:拒绝

7a12374be33026fd.png

b7c4efc091272358.png

77ddbcddd07b65d2.png

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

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
<

调查日志

接下来,您可以查看日志,了解强制执行的边缘安全政策。依次前往操作 >> 日志记录 >> Logs Explorer

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

14972af5ae6c182a.png

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

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

cddc48ca93ad79ca.png

移除安全政策

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

依次前往网络安全 >> Cloud Armor >> %POLICY NAME% >> 目标,然后移除目标存储分区。

350655729a89eb33.png

确认政策已移除

几分钟后,再次向存储分区中的资源发送 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 边缘安全政策。

©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 Load Balancer
  • 如何创建 Cloud Armor 边缘安全政策
  • 如何验证边缘安全政策是否按预期运行。

后续步骤

  • 尝试设置边缘安全政策,并从 Compute Engine 资源中进行缓存命中。