应用安全概览

区域 ID

REGION_ID 是 Google 根据您在创建应用时选择的区域分配的缩写代码。此代码不对应于国家/地区或省,尽管某些区域 ID 可能类似于常用国家/地区代码和省代码。对于 2020 年 2 月以后创建的应用,REGION_ID.r 包含在 App Engine 网址中。对于在此日期之前创建的现有应用,网址中的区域 ID 是可选的。

详细了解区域 ID

安全性是 Google Cloud 的核心功能,但您仍需采取一些措施来保护 App Engine 应用并识别漏洞。

您可以借助以下功能来确保 App Engine 应用的安全。如需详细了解 Google 安全模型以及可以采取哪些措施来保护 Google Cloud 项目,请参阅 Google Cloud Platform 安全性

HTTPS 请求

使用 HTTPS 请求安全访问 App Engine 应用。您可以使用以下选项,具体取决于应用的配置方式:

appspot.com 网域
  • 使用 https 网址前缀向 Google Cloud 项目的 default 服务发送 HTTPS 请求,例如:
    https://PROJECT_ID.REGION_ID.r.appspot.com
  • 如需定位 App Engine 应用中的特定资源,请使用 -dot- 语法分隔您要定位的各资源,例如:
    https://VERSION-dot-SERVICE-dot-PROJECT_ID.REGION_ID.r.appspot.com

  • 如需将 HTTP 网址转换为 HTTPS 网址,请将各资源之间的英文句点替换为 -dot-,例如:
    http://SERVICE_ID.PROJECT_ID.REGION_ID.r.appspot.com
    https://SERVICE_ID-dot-PROJECT_ID.REGION_ID.r.appspot.com

如需详细了解 HTTPS 网址以及如何针对资源,请参阅请求的路由方式

自定义网域

如需使用自定义网域发送 HTTPS 请求,可使用由 App Engine 预配的托管式 SSL 证书。如需了解详情,请参阅使用 SSL 保护自定义网域

应用处理程序

如需为应用的处理程序强制使用 HTTPS,您可以为 app.yaml 中的每个处理程序指定 secure: always 元素,例如:

handlers:
- url: /.*
  script: auto
  secure: always
  redirect_http_response_code: 301

如果使用 secure: always,则所有 HTTP 流量都将重定向到路径相同的 HTTPS 网址,请参阅 app.yaml 配置参考文档以了解详情。

访问权限控制

在每个 Google Cloud 项目中,设置访问权限控制以确定哪些人员可以访问项目中的服务(包括 App Engine)。您可以为不同的账号分配不同的角色,以确保每个账号仅具有支持您的应用所需的权限。如需了解详情,请参阅设置访问权限控制

App Engine 防火墙

借助 App Engine 防火墙,您可以通过一组规则来允许或拒绝来自指定 IP 地址范围的请求,从而控制对 App Engine 应用的访问。您不需要为防火墙所屏蔽的流量或带宽付费。您可以按以下方式创建防火墙:

仅允许来自特定网络的流量
确保只有特定网络中的特定 IP 地址范围才能访问您的应用。例如,通过创建规则,您可在应用的测试阶段仅允许公司专用网络中的 IP 地址范围访问您的应用。然后,您可以创建和修改防火墙规则,以此控制整个发布流程的访问范围,使您的应用在公开发布之前仅可供公司内部或外部的特定组织进行访问。
仅允许来自特定服务的流量
确保发送到 App Engine 应用的所有流量都先通过特定服务进行代理。例如,如果您使用第三方 Web 应用防火墙 (WAF) 来代理定向到您的应用的请求,则可以创建防火墙规则,拒绝 WAF 转发的请求之外的所有请求。
屏蔽存在滥用行为的 IP 地址
虽然 Google Cloud 实施了许多机制来防止攻击,您仍然可以使用 App Engine 防火墙来阻止从存在恶意企图的 IP 地址发送到您的应用的流量,或者保护您的应用免遭拒绝服务攻击和类似形式的滥用。您可以将某些 IP 地址或子网列入拒绝名单,这样,从这些地址和子网路由的请求会被拒绝,无法到达您的 App Engine 应用。

如需详细了解如何创建规则和配置防火墙,请参阅使用防火墙控制应用访问权限

入站流量控制

本部分介绍如何使用入站流量设置来限制对 App Engine 应用的网络访问。在网络级层,默认情况下,互联网上的任何资源都能够访问 App Engine 应用的 appspot 网址或者在 App Engine 中设置的自定义网域。例如,appspot.com 网址可以采用以下格式:SERVICE_ID.PROJECT_ID.REGION_ID.r.appspot.com

您可以通过为入站流量指定不同的设置来更改此默认设置。所有入站流量路径(包括默认 appspot.com 网址)都受入站流量设置的约束。入站流量是在服务级层设置的。

可用的入站流量设置

您可以使用以下设置:

设置 说明
内部 限制性最高。允许来自附加到项目的 VPC 网络的资源的请求,例如:
来自这些来源的请求会一直在 Google 网络中,即使它们通过 appspot.com 网址访问您的服务也是如此。来自其他来源(包括互联网)的请求无法通过 appspot.com 网址或自定义网域访问您的服务。不支持多租户,即同一项目中的多个信任网域。
内部和 Cloud Load Balancing 允许来自以下资源的请求:
  • 限制性较高的内部设置允许的资源
  • 外部应用负载均衡器
使用内部和 Cloud Load Balancing 设置可以接受来自外部应用负载均衡器的请求,但不接受直接来自互联网的请求。对 appspot.com 网址的请求会绕过外部应用负载均衡器,因此此设置会阻止外部请求到达 appspot.com 网址。
全部 限制性最低允许所有请求,包括直接从互联网发送到 appspot.com 网址的请求。

访问内部服务

需要注意以下几点:

  • 对于来自共享 VPC 的请求,仅当 App Engine 应用部署在共享 VPC 宿主项目中时,流量才会被视为内部流量。如果 App Engine 应用部署在共享 VPC 服务项目中,则只有来自应用自身项目拥有的网络的流量才是内部流量。所有其他流量(包括来自其他共享 VPC 的流量)均为外部流量。

  • 访问内部服务时,请像平常一样使用它们的公开网址(即默认 appspot.com 网址或 App Engine 中设置的自定义网域)来调用它们。

  • 对于来自 Compute Engine 虚拟机实例或在同一项目内的 VPC 网络中运行的其他资源的请求,无需进一步设置。

  • 对于来自其他 App Engine 服务或来自同一项目中的 Cloud Run 或 Cloud Run functions 的请求,请将服务或函数连接到 VPC 网络,并通过连接器路由所有出站流量,具体请参阅连接到共享 VPC 网络

  • 来自同一项目中 VPC 网络内资源的请求将归类为内部请求,即使这些资源具有公共 IP 地址也是如此。

  • 来自通过 Cloud VPN 连接到 VPC 网络的本地资源的请求会被视为 internal

查看入站流量设置

控制台

  1. 前往“App Engine 服务”页面。

    转到“服务”页面

  2. 找到入站流量列。对于每项服务,此列中的值会将入站流量设置显示为以下项之一:全部(默认)、内部 + 负载均衡内部

gcloud

如需使用 gcloud CLI 查看服务的入站流量设置,请运行以下命令:

gcloud app services describe SERVICE

SERVICE 替换为服务的名称。

例如,如需查看默认服务运行的入站流量设置和其他信息,请运行以下命令:

gcloud app services describe default

修改入站流量设置

控制台

  1. 前往“App Engine 服务”页面。

    转到“服务”页面

  2. 选择您要修改的服务。

  3. 点击修改入站流量设置

  4. 从菜单中选择所需的入站流量设置,然后点击保存

gcloud

如需使用 gcloud CLI 更新服务的入站流量设置,请运行以下命令:

gcloud app services update SERVICE --ingress=INGRESS

您需要进行如下替换:

  • SERVICE:您的服务的名称。
  • INGRESS:要应用的入站流量控制。allinternal-onlyinternal-and-cloud-load-balancing 之一。

例如:

  • 如需更新 App Engine 应用的默认服务,以仅接受来自 Cloud Load Balancing 和来自同一项目的 VPC 网络的流量:

    gcloud app services update default --ingress=internal-and-cloud-load-balancing
  • 如需更新名为“internal-requests”的服务以仅接受来自同一项目中的 VPC 网络的流量:

    gcloud app services update internal-requests --ingress=internal-only

出站流量设置

如果您使用无服务器 VPC 访问通道,则可以为 App Engine 服务指定出站流量设置。

默认情况下,只有对内部 IP 地址和内部 DNS 名称的请求会通过无服务器 VPC 访问通道连接器进行路由。您可以在 app.yaml 文件中为您的服务指定出站流量设置。

出站流量设置与 URL Fetch 服务不兼容。如果您还没有这样做,请通过使用套接字来停用 URL Fetch 默认值并停止对 urlfetch 软件包的任何显式使用。如果使用 urlfetch 库,则系统会忽略出站流量设置,并且请求不会通过无服务器 VPC 访问通道连接器进行路由。

如需配置 App Engine 服务的出站流量行为,请执行以下操作:

  1. egress_setting 特性添加到服务的 app.yaml 文件的 vpc_access_connector 字段中:

    vpc_access_connector:
      name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR_NAME
      egress_setting: EGRESS_SETTING

    您需要进行如下替换:

    • PROJECT_ID 替换为您的 Google Cloud 项目 ID
    • REGION 替换为连接器所在的区域
    • CONNECTOR_NAME 替换为连接器的名称
    • EGRESS_SETTING 替换为以下项之一:
      • private-ranges-only 默认值。只有发送到 RFC 1918RFC 6598 IP 地址范围或内部 DNS 名称的请求才会路由到您的 VPC 网络。其他的所有请求都会直接路由到互联网。
      • all-traffic 来自您的服务的所有出站请求都路由到您的 VPC 网络。然后,请求受到 VPC 网络的防火墙、DNS 和路由规则的约束。 请注意,将所有出站请求路由到您的 VPC 网络会增加无服务器 VPC 访问通道连接器处理的出站流量,并可能产生费用
  2. 部署该服务:

    gcloud app deploy
    

Security Scanner

为了发现漏洞,Google Cloud Web Security Scanner 会抓取您的 App Engine 应用,追踪从起始网址可达的所有链接,并尝试执行尽可能多的用户输入和事件处理程序。

您必须是 Google Cloud 项目的所有者,才能使用 Security Scanner。如需详细了解如何分配角色,请参阅设置访问权限控制

您可以从 Google Cloud 控制台运行安全扫描,以识别 App Engine 应用中的安全漏洞。如需详细了解如何运行 Security Scanner,请参阅使用 Web Security Scanner