Python 2 不再受社区支持。我们建议您将 Python 2 应用迁移到 Python 3

使用防火墙控制访问权限

防火墙用于确定允许哪些网络流量通过以及拒绝哪些流量。在 App Engine 中,您可以创建一个具有多达 1000 条独立优先规则的防火墙,从而允许或限制一系列 IP 地址和子网。您的应用将仅响应防火墙允许的请求。

准备工作

在为应用创建 App Engine 防火墙规则之前,您必须具有以下任一 App Engine IAM 角色,这些角色拥有创建或修改防火墙规则所需的权限:

  • App Engine Admin
  • Editor
  • Owner

创建防火墙规则

请使用以下任一方法创建防火墙规则。每添加一条规则,都需要重复这些步骤:

控制台

使用 Cloud Console 中的“防火墙规则”页面创建防火墙规则:

  1. 转到 Cloud Console 中的“创建防火墙规则”页面:

    转到“创建防火墙规则”页面

  2. 指定防火墙规则的详细信息:

    1. 优先级中,输入一个整数以指定规则的相对重要性,并定义评估规则的顺序。

      有效值的范围介于 12147483646 之间。优先级为 1 的规则最先评估。优先级为 2147483647 的规则最后评估,此优先级保留给“default”规则使用。

    2. 对匹配项执行的操作中,指定是允许还是拒绝与规则匹配的请求进行访问。如果规则设置为 allow,则将请求转发给应用。如果规则设置为 deny,则返回 403 Forbidden 错误来响应请求。
    3. IP 范围中,定义该规则适用的 IP 地址范围。IP 地址范围必须以 CIDR 表示法定义,可以包含子网掩码并支持 IPv4 和 IPv6。
    4. 可选:在说明中,添加不超过 100 个字符的规则说明。
  3. 点击保存以创建规则。
  4. 测试规则,确保相应优先级和操作的行为符合预期:
    1. 点击测试 IP 地址
    2. 输入要验证的 IP 地址,然后点击测试,确保正确评估对应的规则。
gcloud

运行以下 gcloud app firewall-rules 命令以创建防火墙规则:

  1. 运行以下命令以创建防火墙规则:

    gcloud app firewall-rules create PRIORITY --action ALLOW_OR_DENY --source-range IP_RANGE --description DESCRIPTION
    其中:
    • PRIORITY12147483646 之间的整数,用于定义规则的重要性及其评估顺序。优先级为 1 的规则最先评估。优先级为 2147483647 的规则最后评估,此优先级保留给“default”规则使用。
    • ALLOW_OR_DENY 指定是允许还是拒绝与该规则匹配的请求进行访问。有效值为 allowdeny。如果规则设置为 allow,则将请求转发给应用。如果规则设置为 deny,则返回 403 Forbidden 错误来响应请求。
    • IP_RANGE 定义适用于该规则的 IP 地址范围。IP 地址范围必须以 CIDR 表示法定义,可以包含子网掩码并支持 IPv4 和 IPv6。
    • DESCRIPTION 是可选的规则说明,不能超过 100 个字符。
  2. 运行以下命令,以测试规则并确保相应优先级和操作的行为符合预期:
    gcloud app firewall-rules test-ip IP_ADDRESS
    其中,IP_ADDRESS 是您要针对防火墙规则测试的 IP 地址。
  3. 运行以下命令可查看现有规则的列表:
    gcloud app firewall-rules list
  4. 运行以下命令可删除现有规则:
    gcloud app firewall-rules delete PRIORITY
    其中,PRIORITY 是您要删除的规则的优先级值。
示例:
您可以参考以下示例创建防火墙:
  • 添加允许 IPv6 地址和子网掩码的规则,然后对其进行测试,以确保先于其他规则评估该规则:

    gcloud app firewall-rules create 123 --source-range fe80::3636:3bff:fecc:8778/128 --action allow
    gcloud app firewall-rules test-ip fe80::3636:3bff:fecc:8778
  • 添加拒绝 IPv4 地址和子网掩码的规则,然后对其进行测试,以确保适当评估该规则:

    gcloud app firewall-rules create 123456 --source-range "74.125.0.0/16" --action deny
    gcloud app firewall-rules test-ip 74.125.0.8
  • 更新默认规则,然后对其进行测试,以确保该规则限制与任何其他规则不匹配的所有 IP 地址:

    gcloud app firewall-rules update default --action deny
    gcloud app firewall-rules test-ip 123.456.7.89
API

如需以编程方式为 App Engine 应用创建防火墙规则,您可以使用 Admin API 中的 apps.firewall.ingressRules 方法。

如需测试防火墙规则并确保优先级和操作的行为符合预期,您可以使用 apps.firewall.ingressRules.list 方法,并在 matchingAddress 参数中指定要测试的 IP 地址。

了解 App Engine 防火墙规则

App Engine 防火墙包含一个有序的规则列表,可以允许或拒绝从指定的 IP 地址或范围访问您的应用。该规则适用于 App Engine 应用的所有资源。

防火墙规则按重要性进行排序,您通过为每条规则的优先级赋值来定义其重要性。必须为每条规则指定唯一的优先级值,因为该值定义了某条规则相对于防火墙中其他规则的重要性。规则的优先级值范围介于 1(最重要)到 2147483647(最不重要)之间。

每道防火墙都包含一条自动创建的 default 规则,该规则的优先级为 2147483647,并且适用于应用的整个 IP 范围。default 规则始终在防火墙中的所有其他规则之后进行评估,并且会应用于所有 IP 地址的所有请求。

防火墙会首先评估优先级最高的规则,然后按顺序评估防火墙中的其余规则,直到某条规则与相关请求的 IP 范围相匹配。系统在找到匹配的规则后,将允许或拒绝连接,然后跳过防火墙中的所有剩余规则。如果防火墙中手动定义的规则与请求均不匹配,则防火墙将评估 default 规则。

例如,如果您创建了一条优先级为 1 的规则,则防火墙将始终首先评估该规则。如果传入的请求与优先级为 1 的规则相匹配,则防火墙将仅评估该规则,并跳过防火墙中的所有其他规则,包括 default 规则。

下面的防火墙示例演示了规则的优先级会如何改变防火墙的行为。

App Engine 防火墙和 Cloud Load Balancing

如果您使用 Cloud Load Balancing 和无服务器 NEGS,请注意以下事项:

  • 负载平衡器不会干扰 App Engine 防火墙规则或与之交互。在无服务器 NEG 将流量定向到 App Engine 之前,不会评估 App Engine 规则。
  • 我们建议您使用入站流量控制,以使应用仅接收从负载平衡器和 VPC(如果使用 VPC)发送的请求。否则,用户可以使用应用的 App Engine 网址来绕过负载平衡器、Google Cloud Armor 安全政策、SSL 证书和通过负载平衡器传递的私钥。

防火墙示例

在此示例中,公司设置了防火墙,以授权工程团队和企业内部网络访问其正在开发的应用。防火墙规则已创建完毕,各个优先级之间具有较大的差距,以便今后能够灵活地增添其他规则。

优先级 操作 IP 范围 说明
1000 拒绝 192.0.2.1 拒绝向 DoS 攻击者授予访问权限。
2000 允许 198.51.100.2 允许向分支机构的工程师授予访问权限。
3000 拒绝 198.51.100.0/24 拒绝向所有非工程建筑授予访问权限。
5000 允许 203.0.113.0/24 允许向主建筑网络授予访问权限。
2147483647 拒绝 * 默认操作

创建防火墙后,假设向示例应用发出以下请求,请注意应用的响应:

  • 来自 198.51.100.2 的请求与优先级为 2000 的规则匹配,因此获得准许。
  • 来自 198.51.100.100 的请求与优先级为 3000 的规则匹配,因此遭到拒绝。
  • 来自 203.0.113.54 的请求与优先级为 5000 的规则匹配,因此获得准许。
  • 来自 45.123.35.242 的请求与默认规则匹配,因此遭到拒绝。

解决存在冲突的规则

例如,假设公司防火墙中的两个优先级发生了调换。如果调换优先级为 2000 和 3000 的规则,请注意会出现什么意外行为。

优先级 操作 IP 范围 说明
1000 拒绝 192.0.2.1 拒绝向 DoS 攻击者授予访问权限。
2000 拒绝 198.51.100.0/24 拒绝向所有非工程建筑授予访问权限。
3000 允许 198.51.100.2 允许向分支机构的工程师授予访问权限。
5000 允许 203.0.113.0/24 允许向主建筑网络授予访问权限。
2147483647 拒绝 * 默认操作

分支机构的工程师将无法访问该公司的应用,因为按照规则的新优先级,该规则永远得不到评估。工程师的 IP 地址 198.51.100.2 与拒绝 198.51.100.0/24 IP 地址范围内所有非工程师的规则相匹配,而允许工程师的 IP 地址访问的规则优先级低于此规则。

如需解决此问题,您必须对允许 198.51.100.2 访问的规则的优先级进行设置,使其高于拒绝 IP 地址范围 198.51.100.0/24 访问的规则。

允许来自服务的请求

在创建规则时,应考虑以下几点:

  • 默认情况下,任何与规则不匹配的请求都可以访问您的应用。若要阻止所有与特定规则不匹配的请求,您必须将 default 规则设置为 deny
  • 即使 default 规则设置为 deny,防火墙也会允许任务队列流量。
  • 标准环境将允许 Cron 流量。如需验证传入的 Cron 请求是否来自 App Engine 应用,请参阅验证 Cron 请求

    在柔性环境中,您必须明确允许 Cron 流量。如需详细了解如何在 App Engine 柔性环境中创建防火墙规则,请参阅创建防火墙

  • 如需控制来自其他 App Engine 应用或服务的请求的访问权限,您可能需要创建相应的规则以纳入那些用于服务间通信的 IP 地址。如果您的应用与 App Engine 中的其他应用或服务进行通信,您必须考虑如何处理来自以下 IP 地址的请求:

    • 来自网址提取服务的请求:0.1.0.40
      • 在标准环境中收到的请求:0.1.0.40
      • 在柔性环境中收到的请求:0.1.0.4010.0.0.1
      • 0.1.0.4010.0.0.1 发送的请求可以来自任何 App Engine 应用。
      • 您可以使用 X-Appengine-Inbound-AppId 标头来确定源应用 ID。
    • 来自 Blobstore 或 Cloud Storage 的请求:0.1.0.30
    • 仅在标准环境中收到的请求:
      • 应用部署请求:10.1.0.41
    • 来自启用了专用 Google 访问通道的 Compute Engine 实例的请求:0.0.0.0
      • 0.0.0.0 发送的请求将来自启用了专用 Google 访问通道的任何 Compute Engine 实例。

    示例

    您的应用具有一项在标准环境中运行的后端服务 (backend_std)。该服务使用 URL Fetch 服务与 backend_flex 进行通信。

    您需要创建两条防火墙规则以允许请求,并且必须在 backend_flex 中读取 X-Appengine-Inbound-AppId 标头,以确保它与 backend_std 的应用 ID 对应:

    • 0.1.0.40 - 此规则允许 backend_flex 接收来自 backend_std 的 URL Fetch 请求。
    • 10.0.0.1 - 此规则允许在 backend_flex 中进行针对 URL Fetch 请求的服务间通信。
    • backend_flex 中,仅允许 X-Appengine-Inbound-AppId 标头为 backend_std 的 ID 的请求。

阻止访问缓存的内容

App Engine 防火墙位于缓存内容的机制(例如 Web 代理和浏览器)之后。内容缓存之后,系统会通过该特定网址公开提供该内容,直到其过期为止。即使在创建新的防火墙规则之后,这些内容也仍然可以访问。

如需了解关于更改静态内容的默认到期时间或防止静态内容被缓存的信息,请参阅缓存过期时间

如需防止应用代码输出的动态内容被缓存,请使用 Cache-ControlExpires HTTP 响应标头。如需详细了解这些 HTTP 标头(包括如何控制缓存),请参阅避免缓存

后续步骤

为确保您安全地配置应用并设置适当的访问权限级别,请参阅应用安全保障访问权限控制