保护 Cloud Run 入站流量

1. 概览

本实验将向您展示如何限制对 Cloud Run 服务的访问,并仅允许来自在本地或项目 VPC 中运行的工作负载的请求。您可以使用两层访问权限控制:入站流量设置和 Identity and Access Management (IAM) 政策。

5aed47d10595c878.png

入站流量设置

借助入站设置,您可以根据请求的网络来源(内部或外部)进行过滤。默认情况下,系统允许所有请求(包括来自公共互联网的请求)通过。

IAM 政策

借助 IAM 政策,您可以根据发件人的身份过滤请求,这些政策通常用于对服务到服务的请求进行身份验证。

在本实验中,您将了解如何以及何时使用入站设置。

本地主机通过 VPC 连接

在本实验中,我们将模拟一个本地工作负载。如需将本地主机连接到 Cloud Run,您需要配置 适用于本地主机的专用 Google 访问通道。这包括在 VPC 网络中设置 Cloud VPN 网关,如下所示。

31611f6a2f12fd0c.png

使用 VPC 中的跳转服务器模拟本地工作负载

在本实验中,您将通过从 VPC 中的 Compute Engine 虚拟机发送请求来模拟从本地主机发送请求,如下所示。

aebf22740c7a84f0.png

您将用作跳转服务器的 Compute Engine 虚拟机与 Cloud VPN 网关具有相同的网络来源,因此您可以使用它来模拟从本地工作负载发送请求。

2. 设置和要求

自定进度的环境设置

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时更新。
  • 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(通常用 PROJECT_ID 标识)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且此 ID 在项目期间会一直保留。
  • 此外,还有第三个值,即部分 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档
  1. 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。若要关闭资源以避免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除整个项目。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。

环境设置

  1. 将环境变量设置为项目 ID,以便在后续命令中使用:
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ZONE=us-central1-a
  1. 启用执行此实验所需的 API。
gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  compute.googleapis.com \
  artifactregistry.googleapis.com
  1. 克隆示例应用代码库并导航到目录
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git

cd cymbal-eats/partner-registration-service
  1. 为 Compute Engine 和 Cloud Run 设置默认区域和可用区
gcloud config set compute/region ${REGION}
gcloud config set run/region ${REGION}
gcloud config set compute/zone ${ZONE}

3. 部署服务

您将先部署该服务,并将其设为公开访问。在您验证可以从浏览器发送请求后,我们会锁定该服务,仅允许来自内部网络来源的请求。

运行以下命令时,请按照以下说明操作:

  • 源代码位置 (...):确认您位于 partner-registration-service 目录中,然后按 Enter 键接受默认值
  • 服务名称 (partner-registration-service):按 Enter 键接受默认值
  • 是否允许对 [partner-registration-service] 进行未经身份验证的调用 (y/N)?
gcloud run deploy 

此命令完成后,会列出 Cloud Run 服务的网址。输出将类似于以下列表:

Service [partner-registration-service] revision [partner-registration-service-00001-haz] has been deployed and is serving 100 percent of traffic.
Service URL: https://partner-registration-service-ssssssssss-uc.a.run.app

在浏览器中打开服务网址。您应该会看到以下输出:

Partner registration service: RUNNING

将服务设置为仅允许内部请求

现在,您将使用 Cloud Run 服务的入站流量设置,仅允许来自内部来源的请求。内部来源包括与 Cloud Run 服务位于同一项目(或 VPC Service Controls 边界)内的 VPC 网络中的资源,非常适合我们的用例。

此外,来自其他 Google Cloud 产品的请求也被视为内部请求,即使它们不属于 VPC 也是如此。例如 Pub/Sub 和 Workflows。

来自这些来源的请求会保留在 Google 网络中,即使它们通过 run.app 网址访问您的服务且禁止公开访问也是如此。

更新服务以仅允许内部请求:

gcloud run services update partner-registration-service --ingress=internal

如果您再次打开服务网址,系统会显示“Error: Forbidden - Access is forbidden”(错误:禁止访问)

由于您的浏览器是从外部网络来源(而不是从 Google Cloud 项目的内部来源)发送请求的,因此这正是您预期会发生的情况。您的服务现在更安全了。

4. 创建一个 Compute Engine 虚拟机作为跳转服务器

下一步是通过在 VPC 中创建一个用作跳转服务器的 Compute Engine 实例,模拟从本地服务器通过 Cloud VPN 网关发送的请求:

gcloud compute instances create jump-server --scopes=https://www.googleapis.com/auth/cloud-platform

此命令的输出应类似于以下内容:

NAME         ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
jump-server  us-central1-a  n1-standard-1               10.128.0.10  34.170.108.8  RUNNING

从 Compute Engine 实例向服务发送请求

现在,您将在虚拟机上打开一个终端,并直接从 VPC 网络中的机器发送请求。

如果以下命令提示您在 Cloud Shell 中设置 SSH,请按照说明操作:

gcloud compute ssh jump-server

使用以下命令获取 Cloud Run 服务的网址:

gcloud run services describe partner-registration-service --region us-central1

输出的前几行应如下所示:

✔ Service partner-registration-service in region us-central1

URL:     https://partner-registration-service-ssssssssss-uc.a.run.app
Ingress: internal

现在,复制该网址,然后使用 curl 从 Compute Engine 实例发送请求。此请求应该会成功,因为虚拟机实例在项目的 VPC 网络中运行,是一个内部来源。

export SERVICE_URL=https://

curl ${SERVICE_URL}

输出应如下所示:

Partner registration service: RUNNING

5. 基于 IAM 的访问权限控制又如何?

本实验介绍了如何以及何时使用入站设置。如果您要将本地工作负载连接到 Cloud Run,则入站设置是一个不错的起点。

基于 IAM 的访问权限控制需要付出更多努力才能实现,尤其是在您从本地主机进行调用时:

  • IAM 要求您在宿主上管理长期有效的服务账号凭据
  • IAM 要求您进行代码更改,以便使用服务账号凭据签署请求。

Google 建议采用多层访问权限控制方法。使用入站流量设置将访问权限限制为仅限内部主机,这是一个很好的第一步,但不要就此止步!

6. 恭喜!

恭喜,您已完成此 Codelab!

后续步骤:

探索其他 Cymbal Eats Codelab:

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

若要避免产生费用,最简单的方法是删除您为本教程创建的项目。

实用参考

以下是可帮助您详细了解 Cloud Run 的两层访问权限控制的其他资源。