使用 Cloud Run 函数部署安全的无服务器架构

Last reviewed 2023-08-06 UTC

使用无服务器架构,您无需预配或维护服务器即可开发软件和服务。您可以使用无服务器架构为各种服务构建应用。

本文档为 DevOps 工程师、安全架构师和应用开发者提供了有关如何帮助保护使用 Cloud Run 函数(第 2 代)的无服务器应用的专业指导。本文档是安全蓝图的一部分,后者包含以下内容:

  • 包含一组 Terraform 配置和脚本的 GitHub 代码库
  • 使用此蓝图实现的架构、设计和安全控制的指南(本文档)。

虽然您可以在不先部署 Google Cloud 企业基础蓝图的情况下部署此蓝图,但本文档假定您已按照 Google Cloud 企业基础蓝图中所述配置了一组基础安全控制措施。本文档中介绍的架构可帮助您在基础上额外增加一层控制机制,以有助于保护无服务器应用。

为帮助定义与无服务器应用相关的关键安全控制措施,云安全联盟 (CSA)发布了无服务器应用的 12 大关键风险。此蓝图中使用的安全控制措施旨在解决与本文档中所述的各种应用场景相关的风险。

无服务器应用场景

此蓝图支持以下应用场景:

Cloud Run 函数与 Cloud Run 之间的区别包括:

  • Cloud Run functions 函数由事件触发,例如数据库中的数据更改或从 Pub/Sub 等消息传递系统接收消息。Cloud Run 由请求(例如 HTTP 请求)触发。
  • Cloud Run functions 仅限于一组受支持的运行时。您可以将 Cloud Run 与任何编程语言搭配使用。
  • Cloud Run functions 函数管理容器和用于控制 Web 服务器或语言运行时的基础设施,以便您可以专注于自己的代码。Cloud Run 可让您灵活地自行运行这些服务,以便控制容器配置。

如需详细了解 Cloud Run 与 Cloud Run functions 函数之间的区别,请参阅选择 Google Cloud 计算选项

架构

此蓝图使用共享 VPC 架构,其中 Cloud Run 函数部署在服务项目中,并且可以访问位于其他 VPC 网络中的资源。

下图展示了一个概要架构,它后面的示例架构中对此进行了进一步说明。

使用 Cloud Run 函数的无服务器蓝图的架构。

上图展示的架构结合使用了以下 Google Cloud 服务和功能:

  • Cloud Run 函数可让您运行函数即服务,并代表您管理基础设施。默认情况下,此架构仅使用内部 IP 地址部署 Cloud Run 函数,但无权访问公共互联网。
  • 触发事件是触发 Cloud Run 函数的事件。如示例架构中所详述,此事件可以是 Cloud Storage 事件、计划的时间间隔或 BigQuery 中的更改。
  • Artifact Registry 可存储 Cloud Run 函数应用的来源容器。
  • 共享 VPC可让您将服务项目中的无服务器 VPC 访问通道连接器连接到宿主项目。您可以为每个环境(生产、非生产和开发)部署单独的共享 VPC 网络。这种网络设计可在不同环境之间实现网络隔离。借助共享 VPC 网络,您可以在一个共用网络中集中管理网络资源,同时委托对服务项目的管理职责。
  • 无服务器 VPC 访问通道连接器可使用无服务器 VPC 访问通道将无服务器应用连接到 VPC 网络。无服务器 VPC 访问通道有助于确保从无服务器应用发送到 VPC 网络的请求不会向互联网公开。借助无服务器 VPC 访问通道,Cloud Run 函数能够与支持 VPC Service Controls 的其他服务、存储系统和资源进行通信。

    您可以在共享 VPC 宿主项目或服务项目中配置无服务器 VPC 访问通道。默认情况下,此蓝图会在共享 VPC 宿主项目中部署无服务器 VPC 访问通道,以与集中网络配置资源的共享 VPC 模型保持一致。如需了解详情,请参阅配置方法比较

  • VPC Service Controls 可通过设置授权、访问权限控制和安全数据交换来创建安全边界,以隔离 Cloud Run 函数服务和资源。此边界旨在通过设置额外的访问权限控制和监控来隔离应用和代管式服务,并将 Google Cloud 的治理与应用分开。治理包括密钥管理和日志记录。

  • 使用方服务是由 Cloud Run 函数操作的应用。使用方服务可以是内部服务器,也可以是其他 Google Cloud 服务(例如 Cloud SQL)。根据您的应用场景,此服务可能位于 Cloud 新一代防火墙后面、其他子网中、Cloud Run 函数所在的服务项目中或其他服务项目中。

  • 安全 Web 代理旨在保护出站 Web 流量(如果需要)。它可以基于云身份和 Web 应用实现灵活、精细的政策。此蓝图使用安全 Web 代理以在 Cloud Run 函数构建阶段实现对出站 Web 流量的精细访问政策。此蓝图会将允许的网址列表添加到网关安全政策规则

  • Cloud NAT 可提供与互联网的出站连接(如果需要)。Cloud NAT 支持对没有公共 IP 地址的计算资源使用来源网络地址转换 (SNAT)。入站响应数据包使用目标网络地址转换 (DNAT)。如果 Cloud Run 函数不需要访问互联网,您可以停用 Cloud NAT。Cloud NAT 会实现附加到安全 Web 代理的出站流量网络政策。

  • Cloud Key Management Service (Cloud KMS) 可存储此蓝图中的服务(包括无服务器应用、Artifact Registry 和 Cloud Run 函数)使用的客户管理的加密密钥 (CMEK)

  • Secret Manager 可存储 Cloud Run 函数 Secret。此蓝图会将 Secret 装载为卷,以提供比作为环境变量传递 Secret 更高级别的安全性。

  • Identity and Access Management (IAM)Resource Manager 有助于限制访问权限和隔离资源。访问权限控制和资源层次结构遵循最小权限原则。

  • Cloud Logging 可从 Google Cloud 服务中收集所有日志,供您的分析和调查工具进行存储和检索。

  • Cloud Monitoring 可收集并存储有关 Google Cloud 服务的性能信息和指标。

使用 Cloud Storage 的示例无服务器应用架构

下图展示了如何运行无服务器应用,以在 Cloud Storage 中发生特定事件时访问内部服务器。

使用 Cloud Storage 的示例无服务器架构。

除了架构中所述的服务之外,此示例架构还结合使用了以下 Google Cloud 服务和功能:

  • 当任何云资源、应用或用户在存储桶中创建 Web 对象时,Cloud Storage 可发出事件。
  • Eventarc 可路由来自不同资源的事件,并对传输中的事件和静态事件进行加密。
  • Pub/Sub 可将用作 Cloud Run 函数输入和触发器的事件加入队列。
  • Virtual Private Cloud (VPC) 防火墙规则可控制流入托管资源的子网的数据流,例如内部服务器。
  • 内部服务器在 Compute Engine 或 Google Kubernetes Engine 上运行,可托管您的内部应用。如果您部署使用内部服务器的安全 Cloud Run 函数示例,则需要使用 Hello World HTML 页面来部署 Apache 服务器。此示例模拟对运行虚拟机或容器的内部应用的访问。

使用 Cloud SQL 的示例架构

下图展示了如何运行无服务器应用,以定期访问在 Cloud Scheduler 中定义的 Cloud SQL 托管的服务。如果您必须收集日志、汇总数据等,则可以使用此架构。

使用 Cloud SQL 的示例无服务器架构。

除了架构中所述的服务之外,此示例架构还结合使用了以下 Google Cloud 服务和功能:

使用 BigQuery 数据仓库的示例架构

下图展示了如何运行在 BigQuery 中发生事件(例如,添加数据或创建表)时触发的无服务器应用。

使用 BigQuery 的示例无服务器架构。

除了架构中所述的服务之外,此示例架构还结合使用了以下 Google Cloud 服务和功能:

组织结构

借助 Resource Manager,您可以按项目、文件夹和组织对资源进行逻辑分组。

下图展示了一个资源层次结构,其中的文件夹代表不同环境,例如引导、通用、生产、非生产(或测试)和开发。此资源层次结构基于企业基础蓝图中所述的层次结构。您可以将此蓝图指定的项目部署到以下文件夹:CommonProductionNon-productionDev

无服务器蓝图的组织结构。

下面几个部分更详细地介绍了此图。

文件夹

您可以使用文件夹将生产环境和治理服务与非生产环境和测试环境隔离开来。下表介绍了企业基础蓝图中此蓝图使用的文件夹。

文件夹 说明
Bootstrap 包含部署企业基础蓝图所需的资源。
Common 包含组织的集中式服务,例如安全项目。
Production 包含其云资源已经过测试并且可供客户使用的项目。在此蓝图中,Production 文件夹包含服务项目和宿主项目。
Non-production 包含其云资源当前正在测试并预演进行发布的项目。在此蓝图中,Non-production 文件夹包含服务项目和宿主项目。
Development 包含其云资源当前正在开发的项目。在此蓝图中,Development 文件夹包含服务项目和宿主项目。

您可以更改这些文件夹的名称,以与组织的文件夹结构一致,但我们建议您保持类似的结构。如需了解详情,请参阅组织结构。对于其他文件夹结构,请参阅确定 Google Cloud 着陆区的资源层次结构

项目

您可以使用项目隔离环境中的资源。下表介绍了组织内所需的项目。您可以更改这些项目的名称,但我们建议您保持类似的项目结构。

项目 说明
共享 VPC 宿主项目

此项目包括防火墙入站规则以及具有内部 IP 地址的任何资源(如连接到 VPC 网络中所述)。使用共享 VPC 时,您需要将某个项目指定为宿主项目,并将一个或多个其他服务项目关联到该项目。

应用 Terraform 代码时,您需要指定此项目的名称,蓝图会部署无服务器 VPC 访问通道连接器、Cloud NAT 和 Cloud 安全 Web 代理。

共享 VPC 服务项目

此项目包括无服务器应用、Cloud Run 函数和无服务器 VPC 访问通道连接器。您需要将服务项目关联到宿主项目,以便服务项目可以参与共享 VPC 网络。

应用 Terraform 代码时,您需要指定此项目的名称。蓝图会部署您的应用场景所需的 Cloud Run 函数和服务,例如 Cloud SQL、Cloud Scheduler、Cloud Storage 或 BigQuery。

应用 Terraform 代码时,您需要指定此项目的名称,蓝图会部署 Cloud KMS。如果您在 Cloud Run 函数的无服务器蓝图中使用安全无服务器自动化测试框架模块,则也会部署 Artifact Registry。

安全项目

此项目包括特定于安全的服务,例如 Cloud KMS 和 Secret Manager。

安全项目的默认名称为 prj-bu1-p-sec。如果您在部署安全基础蓝图后部署此蓝图,则除了企业基础蓝图的 Secret 项目 (prj-bu1-p-env-secrets) 之外,系统还会创建安全项目。如需详细了解企业基础蓝图项目,请参阅项目

如果您在没有企业基础蓝图的情况下部署此蓝图的多个实例,则每个实例都有自己的安全项目。

将角色和群组映射到项目

您必须为组织中的不同用户群组授予对构成无服务器架构的项目的访问权限。下表介绍了您创建的项目中的用户群组和角色分配的蓝图建议。您可以自定义群组以匹配组织的现有结构,但我们建议您保持类似的职责划分和角色分配。

群组 项目 角色
无服务器管理员
grp-gcp-serverless-admin@example.com
服务项目
无服务器安全管理员
grp-gcp-serverless-security-admin@example.com
安全项目
Cloud Run 函数开发者
grp-gcp-secure-cloud-run-developer@example.com
安全项目
Cloud Run 函数用户
grp-gcp-secure-cloud-run-user@example.com
共享 VPC 服务项目

安全控制

本部分介绍了 Google Cloud 中可用于帮助保护无服务器架构的安全控制措施。您需要考虑以下关键安全原则:

  • 根据最小权限原则保护访问权限,为主账号仅授予执行任务所需的权限。
  • 通过信任边界设计(包括网络分段、组织政策和防火墙政策)保护网络连接。
  • 保护每项服务的配置。
  • 确定托管无服务器工作负载的基础架构的任何合规性或监管要求,并分配风险级别。
  • 配置充分的监控和日志记录机制,以支持安全运营和事件管理的审核跟踪记录。

构建系统控制措施

部署无服务器应用时,您需要使用 Artifact Registry 存储容器映像和二进制文件。Artifact Registry 支持 CMEK,因此您可以使用自己的加密密钥来加密制品库。

网络和防火墙规则

Virtual Private Cloud (VPC) 防火墙规则可控制流入边界的数据流。您可以创建拒绝所有出站流量的防火墙规则,但来自 restricted.googleapis.com 特殊域名的特定 TCP 端口 443 连接除外。使用 restricted.googleapis.com 网域具有以下优势:

  • 在工作负载与 Google API 和服务通信时,该网域可使用专用 Google 访问通道缩小网络受攻击面。
  • 该网域可确保您仅使用支持 VPC Service Controls 的服务。

此外,您需要创建 DNS 记录,以将 *.googleapis.com 解析为 restricted.googleapis.com

如需了解详情,请参阅配置专用 Google 访问通道

边界控制措施

架构部分中所示,将无服务器应用的资源放在单独的 VPC Service Controls 安全边界内。此边界有助于减少系统或服务入侵造成的广泛影响。但是,当 Cloud Build 自动将代码构建到容器映像中并该将映像推送到 Artifact Registry 时,此安全边界不适用于 Cloud Run 函数构建流程。在此情况下,请在服务边界内为 Cloud Build 服务账号创建入站流量规则

访问政策

为帮助确保只有特定主账号(用户或服务)可以访问资源和数据,您需要启用 IAM 群组和角色。

为帮助确保只有特定来源可以访问您的项目,您需要为 Google 组织启用访问权限政策。如需了解详情,请参阅访问权限级别属性

服务账号和访问权限控制

服务账号是针对应用或计算工作负载(而非单个最终用户)的账号。如需实现最小权限原则和职责分离原则,请创建具有精细权限且对资源具有有限访问权限的服务账号。服务账号如下所示:

密钥管理

为了验证完整性并帮助保护静态数据,您可以将 CMEK 与 Artifact Registry、Cloud Run 函数、Cloud Storage 和 Eventarc 搭配使用。借助 CMEK,您可以更好地控制加密密钥。系统会使用以下 CMEK:

  • 用于证明无服务器应用的代码的 Artifact Registry 软件密钥。
  • 用于加密 Cloud Run 函数部署的容器映像的加密密钥
  • 用于加密静态消息传递渠道的 Eventarc 事件加密密钥
  • 可帮助保护 Cloud Storage 中的数据的加密密钥

应用 Terraform 配置时,您需要指定 CMEK 位置,以确定存储密钥的地理位置。您必须确保 CMEK 与资源位于同一区域。默认情况下,CMEK 每 30 天轮替一次。

密钥管理

Cloud Run 函数支持使用 Secret Manager 存储无服务器应用可能需要的 Secret。这些 Secret 可以包括 API 密钥、数据库用户名和密码。如需将 Secret 公开为已装载的卷,请使用主模块中的 service_configs 对象变量。

在具有企业基础蓝图的情况下部署此蓝图时,您必须先将 Secret 添加到 Secret 项目,然后再应用 Terraform 代码。此蓝图会向 Cloud Run 函数服务账号授予 Secret Manager Secret Assessor (roles/secretmanager.secretAccessor) 角色。如需了解详情,请参阅使用 Secret

组织政策

此蓝图添加了企业基础蓝图使用的组织政策限制条件。如需详细了解企业基础蓝图使用的限制条件,请参阅组织政策限制条件

下表介绍了此蓝图的安全 Cloud Run 函数安全性模块中定义的其他组织政策限制条件。

政策限制条件 说明 推荐值
允许使用的入站流量设置(Cloud Run 函数)constraints/cloudfunctions.allowedIngressSettings

仅允许来自内部服务或外部 HTTP(S) 负载均衡器的入站流量。

默认值为 ALLOW_ALL

ALLOW_INTERNAL_ONLY
要求使用 VPC 连接器(Cloud Run 函数)constraints/cloudfunctions.requireVPCConnector

要求在部署函数时指定无服务器 VPC 访问通道连接器。如果强制执行此限制条件,函数必须指定无服务器 VPC 访问通道连接器。

默认值为 false

true
允许使用的 VPC 连接器出站流量设置(Cloud Run 函数)cloudfunctions.allowedVpcConnectorEgressSettings

要求 Cloud Run 函数的所有出站流量都使用无服务器 VPC 访问通道连接器。

默认值为 PRIVATE_RANGES_ONLY

ALL_TRAFFIC

运营控制

您可以启用日志记录和 Security Command Center 高级方案层级功能,例如安全性分析和威胁检测。这些控制措施可帮助您执行以下操作:

  • 监控数据访问情况。
  • 确保已设置适当的审核流程。
  • 支持您的组织的安全运维和事件管理功能。

日志记录

为了帮助您满足审核要求并深入了解您的项目,请使用您要跟踪的服务的数据日志配置 Google Cloud Observability。在应用 Terraform 代码之前在项目中部署 Cloud Logging,以确保此蓝图为防火墙、负载均衡器和 VPC 网络配置日志记录。

部署此蓝图后,我们建议您配置以下各项:

对于项目中的所有服务,请确保日志包含有关数据写入和管理员权限的信息。如需详细了解日志记录最佳实践,请参阅检测控制措施

监控和提醒

部署蓝图后,您可以设置提醒,以便在安全性事件发生时通知安全运营中心 (SOC)。例如,您可以使用提醒,让安全分析师知道 IAM 角色的权限何时发生更改。如需详细了解如何配置 Security Command Center 提醒,请参阅设置发现结果通知

Cloud Run 函数 Monitoring 信息中心可帮助您监控 Cloud Run 函数的性能和健康状况。它提供了各种指标和日志,可用于发现和排查问题。信息中心还包含一些可帮助您提高函数性能的功能,例如设置提醒和配额。

如需了解详情,请参阅监控 Cloud Run 函数

如需导出提醒,请参阅以下文档:

调试和问题排查

您可以运行 Connectivity Tests,以帮助您调试 Cloud Run 函数与子网内资源之间的网络配置问题。Connectivity Tests 会模拟数据包的预期路径,并提供有关连接的详细信息,包括资源到资源的连接分析。

Terraform 代码不会启用 Connectivity Tests;您必须单独进行设置。如需了解详情,请参阅创建和运行 Connectivity Tests

Terraform 部署模式

下表介绍了部署此蓝图的方式,以及适用于每种部署模式的 Terraform 模块。

部署模式 Terraform 模块

在部署企业基础蓝图后部署此蓝图(推荐)。

此选项会在企业基础蓝图使用的同一 VPC Service Controls 边界内部署此蓝图的资源。如需了解详情,请参阅如何自定义 Foundation v3.0.0 以确保安全 Cloud Run 函数部署

此选项还会使用您在部署企业基础蓝图时创建的 Secret 项目。

使用以下 Terraform 模块:

在不安装安全基础蓝图的情况下安装此蓝图。

此选项要求您创建 VPC Service Controls 边界。

使用以下 Terraform 模块:

综合应用

如需实现本文档中所述的架构,请执行以下操作:

  1. 查看有关蓝图的自述文件,以确保满足所有前提条件。
  2. 在测试环境中,如需查看蓝图的实际应用,请部署一个示例。这些示例与架构中介绍的架构示例相符。在测试过程中,请考虑执行以下操作:
    1. 使用 Security Command Center 根据通用合规性要求扫描项目。
    2. 将示例应用替换为实际应用(例如 1),并在典型部署场景中运行。
    3. 与企业中的应用工程和运营团队合作,测试他们对项目的访问权限,并验证他们能否以预期的方式与解决方案进行交互。
  3. 将蓝图部署到您的环境中。

后续步骤