保护 Cloud Run 入站流量

1. 概览

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

5aed47d10595c878

入站流量设置

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

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

如果您再次打开该服务网址,系统会显示“错误:禁止访问 - 访问被禁止”

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

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

下一步是通过 Cloud VPN 网关模拟来自本地服务器的请求,方法是在 VPC 中创建 Compute Engine 实例以用作跳转服务器:

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 上的两层访问权限控制。