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

Last reviewed 2023-03-10 UTC

本页内容的上次更新时间为 2023 年 3 月,代表截至本文撰写之时的状况。Google 始终持续加强对客户的保护力度,因此安全政策和系统可能会随着时间的推移而发生变化。

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

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

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

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

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

无服务器应用场景

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

Cloud Functions 与 Cloud Run 之间的区别包括:

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

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

架构

此蓝图让您可以使用共享 VPC 在 Cloud Run 上运行无服务器应用。我们建议您使用共享 VPC,因为它会对所有网络资源集中实施网络政策和控制措施。此外,共享 VPC 部署在企业基础蓝图中。

下图展示了如何在共享 VPC 网络中运行无服务器应用。

无服务器蓝图的架构。

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

  • 外部应用负载均衡器可接收无服务器应用需要从互联网获得的数据,并将其转发到 Cloud Run。外部应用负载均衡器是第 7 层负载均衡器。
  • Google Cloud Armor 充当 Web 应用防火墙,可帮助保护无服务器应用免遭拒绝服务 (DOS) 和 Web 攻击。
  • Cloud Run 可让您在容器中运行应用代码并代表您管理基础架构。在此蓝图中,内部和 Cloud Load Balancing 入站流量设置限制对 Cloud Run 的访问,以便 Cloud Run 仅接受来自外部应用负载均衡器的请求。
  • 无服务器 VPC 访问通道连接器可使用无服务器 VPC 访问通道将无服务器应用连接到 VPC 网络。无服务器 VPC 访问通道有助于确保从无服务器应用发送到 VPC 网络的请求不会向互联网公开。借助无服务器 VPC 访问通道,Cloud Run 能够与支持 VPC Service Controls 的其他服务、存储系统和资源进行通信。

    默认情况下,您在服务项目中创建无服务器 VPC 访问通道连接器。运行安全 Cloud Run 网络时,您可以通过为 connector_on_host_project 输入变量指定 true,在宿主项目中创建无服务器 VPC 访问通道连接器。如需了解详情,请参阅配置方法比较

  • Virtual Private Cloud (VPC) 防火墙规则可控制流入托管资源的子网的数据流,例如 Compute Engine 上托管的公司服务器或 Cloud Storage 中存储的公司数据。

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

  • 共享 VPC可让您将服务项目中的无服务器 VPC 访问通道连接器连接到宿主项目。

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

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

替代架构:不使用共享 VPC 网络的 Cloud Run

如果您不使用共享 VPC 网络,则可以在没有共享 VPC 网络的情况下在 VPC Service Control 边界中部署 Cloud Run 和无服务器应用。如果您使用的是中心辐射型拓扑,则可以实现此替代架构。

下图展示了如何在不使用共享 VPC 的情况下运行无服务器应用。

无服务器蓝图的替代架构。

上图中显示的架构结合使用了类似于上一部分推荐架构:使用共享 VPC 的 Cloud Run 所述的 Google Cloud 服务和功能。

组织结构

您可以对资源进行分组,以便进行管理,并将开发和测试环境与生产环境分开。借助 Resource Manager,您可以按项目、文件夹和组织对资源进行逻辑分组。

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

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

以下各部分更详细地介绍了此图。

文件夹

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

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

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

项目

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

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

应用 Terraform 代码时,请指定此项目的名称,蓝图会部署这些服务。
服务项目 此项目包括无服务器应用、Cloud Run 和无服务器 VPC 访问通道连接器。将服务项目关联到宿主项目,以便服务项目可以参与共享 VPC 网络。

当您应用 Terraform 代码时,请指定此项目的名称。蓝图会部署 Cloud Run、Google Cloud Armor、无服务器 VPC 访问通道连接器和负载均衡器。
安全项目 此项目包括特定于安全的服务,例如 Cloud KMS 和 Secret Manager。

应用 Terraform 代码时,请指定此项目的名称,蓝图会部署 Cloud KMS。如果您使用安全 Cloud Run 自动化测试框架模块,则还会部署 Artifact Registry。

如果您在部署安全基础蓝图后部署此蓝图,则此项目是由企业基础蓝图创建的 Secret 项目。如需详细了解企业基础蓝图项目,请参阅项目

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

将角色和群组映射到项目

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

群组 项目 角色
无服务器管理员

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
服务项目

安全控制

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

  • 根据最小权限原则保护访问权限,为实体仅提供执行其任务所需的权限。
  • 通过分段设计、组织政策和防火墙政策保护网络连接。
  • 保护每项服务的配置。
  • 了解托管无服务器工作负载的环境的风险级别和安全要求。
  • 配置充分的监控和日志记录机制,以支持检测、调查和响应。

无服务器应用的安全控制措施

您可以借助用于保护网络流量、控制访问权限和加密数据的控制措施来保护无服务器应用。

构建系统控制措施

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

SSL 流量

如需支持流向无服务器应用的 HTTPS 流量,请为外部应用负载均衡器配置 SSL 证书。默认情况下,使用自签名证书,您可以在应用 Terraform 代码后将其更改为代管式证书。如需详细了解如何安装和使用代管式证书,请参阅使用 Google 管理的 SSL 证书

网络和防火墙规则

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

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

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

边界控制措施

推荐的架构图中所示,将无服务器应用的资源放在单独的边界中。此边界有助于保护无服务器应用免遭意外访问和数据渗漏。

访问政策

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

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

Identity and Access Proxy

如果您的环境已包含 Identity and Access Proxy (IAP),您可以配置外部应用负载均衡器,以使用 IAP 为无服务器应用授权流量。借助 IAP,您可以为无服务器应用建立一个中央授权层,从而可以使用应用级访问权限控制,而不是依赖于网络级防火墙。

如需为您的应用启用 IAP,请在 loadbalancer.tf 文件中将 iap_config.enable 设置为 true

如需详细了解 IAP,请参阅 Identity-Aware Proxy 概览

服务账号和访问权限控制

服务账号是 Google Cloud 可用于代表您运行 API 请求的身份。如需实现职责分离,请针对特定目的创建具有不同角色的服务账号。服务账号如下所示:

  • 具有以下角色的 Cloud Run 服务账号 (cloud_run_sa):

    • roles/run.invoker
    • roles/secretmanager.secretAccessor

    如需了解详情,请参阅允许 Cloud Run 访问 Secret

  • 具有 roles/compute.networkUser 角色的无服务器 VPC 访问通道连接器账号 (gcp_sa_vpcaccess)。

  • 第二个具有 roles/compute.networkUser 角色的无服务器 VPC 访问通道连接器账号 (cloud_services)。

    这些无服务器 VPC 访问通道连接器服务账号是必需的,以便连接器可以在宿主项目中创建防火墙入站和出站规则。如需了解详情,请参阅向服务项目中的服务账号授予权限

  • 具有 roles/vpcaccess.user 角色用于运行 Cloud Run 的服务身份 (run_identity_services)。

  • 具有 roles/editor 角色的 Google API 服务代理 (cloud_services_sa)。此服务账号允许 Cloud Run 与无服务器 VPC 访问通道连接器进行通信。

  • 具有 roles/artifactregistry.reader 角色的 Cloud Run 服务身份 (serverless_sa)。此服务账号提供对 Artifact Registry 和 CMEK 加密和解密密钥的访问权限。

密钥管理

使用 CMEK 密钥可帮助保护 Artifact Registry 和 Cloud Run 中的数据。您使用以下加密密钥:

  • 用于证明无服务器应用的代码的 Artifact Registry 软件密钥。
  • 用于加密 Cloud Run 部署的容器映像的加密密钥

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

密钥管理

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

使用企业基础蓝图部署此蓝图时,您必须先将 Secret 添加到 Secret 项目,然后再应用 Terraform 代码。此蓝图会向 Cloud Run 服务账号授予 Secret Manager Secret Accessor 角色。如需了解详情,请参阅使用 Secret

组织政策

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

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

政策限制条件 说明 推荐的值
constraints/run.allowedIngress 仅允许来自内部服务或外部应用负载均衡器的入站流量。 internal-and-cloud-load-balancing
constraints/run.allowedVPCEgress 要求 Cloud Run 服务的修订版本使用无服务器 VPC 访问通道连接器,并确保修订版本的 VPC 出站流量设置仅允许专用范围。 private-ranges-only

运营控制

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

  • 监控谁在访问您的数据。
  • 确保已设置适当的审核流程。
  • 支持事件管理和运维团队能够应对可能发生的问题。

日志记录

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

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

  • 跨所有项目创建聚合日志接收器
  • 选择适当的区域来存储日志。
  • 将 CMEK 密钥添加到日志记录接收器。

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

监控和提醒

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

Cloud Run Monitoring 信息中心是示例信息中心库的一部分,为您提供了以下信息:

  • 请求数
  • 请求延迟时间
  • 计费实例时间
  • 容器 CPU 分配
  • 容器内存分配
  • 容器 CPU 利用率
  • 容器内存利用率

如需了解如何导入信息中心,请参阅安装示例信息中心。如需导出提醒,请参阅以下文档:

调试和问题排查

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

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

检测控制措施

本部分介绍了蓝图中包含的检测控制措施。

Google Cloud Armor 和 WAF

您使用外部应用负载均衡器和 Google Cloud Armor 为无服务器应用提供分布式拒绝服务攻击 (DDoS) 防护。Google Cloud Armor 是 Google Cloud 提供的 Web 应用防火墙 (WAF)。

您可以配置下表中所述的 Google Cloud Armor 规则,以帮助保护无服务器应用。这些规则旨在帮助缓解 OWASP 十大风险

Google Cloud Armor 规则名称 ModSecurity 规则名称
远程代码执行 rce-v33-stable
本地文件包含 lfi-v33-stable
协议攻击 protocolattack-v33-stable
远程文件包含 rfi-v33-stable
扫描程序检测 scannerdetection-v33-stable
会话固定攻击 sessionfixation-v33-stable
SQL 注入 sqli-v33-stable
跨站点脚本攻击 xss-v33-stable

启用这些规则后,Google Cloud Armor 会自动拒绝与规则匹配的任何流量。

如需详细了解这些规则,请参阅调整 Google Cloud Armor 预配置 WAF 规则

Cloud Run 中的安全问题检测

您可以使用 Recommender 检测 Cloud Run 中的潜在安全问题。Recommender 可以检测如下安全问题:

  • 存储在环境变量(而不是 Secret Manager)中的 API 密钥或密码。
  • 包含硬编码凭据(而不是使用服务身份)的容器。

部署 Cloud Run 大约一天后,Recommender 会开始提供其发现结果和建议。Recommender 会在 Cloud Run 服务列表Recommendation Hub 中显示其发现结果和建议的纠正措施。

Terraform 部署模式

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

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

此选项会在企业基础蓝图使用的同一 VPC Service Controls 边界内部署此蓝图的资源。如需了解详情,请参阅如何自定义 Foundation v2.3.1 以进行安全无服务器部署

此选项还会使用您在部署企业基础蓝图时创建的 Secret 项目。
使用以下 Terraform 模块:
在不安装企业基础蓝图的情况下安装此蓝图。

此选项要求您创建 VPC Service Controls 边界。
使用以下 Terraform 模块:

综合应用

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

  1. 查看有关蓝图的自述文件,并确保满足所有前提条件。
  2. 创建 SSL 证书,以用于外部应用负载均衡器
    如果您未完成此步骤,此蓝图会使用自签名证书来部署负载均衡器,并且当您尝试访问无服务器应用时,浏览器会显示有关不安全连接的警告。
  3. 在测试环境中,部署安全 Cloud Run 示例以查看此蓝图的实际应用。在测试过程中,请考虑执行以下操作:
    1. 使用 Security Command Center 根据通用合规性要求扫描项目。
    2. 将示例应用替换为实际应用,并在典型部署场景中运行。
    3. 与企业中的应用工程和运营团队合作,测试他们对项目的访问权限,并验证他们能否以预期的方式与解决方案进行交互。
  4. 将蓝图部署到您的环境中。

合规性对应关系

为帮助定义与无服务器应用相关的关键安全控制措施,云安全联盟 (CSA)发布了无服务器应用的 12 大关键风险。此蓝图中使用的安全控制措施可帮助您解决其中的大多数风险,如下表所示。

风险 蓝图缓解措施 您的责任
1. 函数事件数据注入 Google Cloud Armor 和外部应用负载均衡器有助于防范 OWASP 十大安全风险,如 2021 年 Google Cloud 上的 OWASP 十大缓解选项中所述。 安全编码做法(例如异常处理),如 OWASP 安全编码做法软件工件的供应链级别 (SLSA) 中所述
2.身份验证中断 用于向服务验证用户身份的 IAP 和 Identity Platform
3. 无服务器部署配置不安全 将 CMEK 与 Cloud KMS 结合使用
管理您自己的加密密钥
4.函数权限和角色的特权过高
  • 用于服务身份验证的自定义服务账号(不是默认的 Compute Engine 服务账号)
  • 对 Cloud Run 服务账号严格设置了范围的 IAM 角色
  • 用于限制 Google Cloud API 访问权限范围的 VPC Service Controls(使用 Google Cloud 企业基础蓝图提供)
5. 函数监控和日志记录不充分 Cloud Logging Cloud Monitoring 信息中心和提醒结构
6. 第三方依赖项不安全 使用代码扫描和部署前分析来保护 CI/CD 流水线
7. 应用 Secret 存储不安全 Secret Manager 应用代码中的 Secret 管理
8. 拒绝服务攻击和财务资源耗尽
  • Google Cloud Armor
  • Cloud Run 服务超时(默认为 120 秒)
9. 无服务器业务逻辑操纵 用于限制 Google Cloud API 访问权限范围的 VPC Service Controls(使用企业基础蓝图提供)
10. 异常处理和详细错误消息不正确 安全编程最佳实践
11. 函数、云资源和事件触发器过时 使用修订版本来最大限度地缩小攻击面。修订版本有助于降低意外启用之前过时的服务迭代的可能性。修订版本还可以帮助您使用 A/B 测试以及监控和日志记录工具测试新修订版本的安全状况。
  • 用于管理云资源的基础架构即代码 (IaC)
  • 使用 Security Command Center 监控云资源
  • Cloud Billing 监控
  • 清理未使用的云资源,以最大限度地缩小攻击面
12. 交叉执行数据持久化

后续步骤