防火墙用于确定允许哪些网络流量通过以及拒绝哪些流量。在 App Engine 中,您可以创建一个具有多达 1000 条独立优先规则的防火墙,从而允许或限制一系列 IP 地址和子网。您的应用将仅响应防火墙允许的请求。
准备工作
在为应用创建 App Engine 防火墙规则之前,您必须具有以下任一 App Engine IAM 角色,这些角色拥有创建或修改防火墙规则所需的权限:
- App Engine Admin
- Editor
- Owner
创建防火墙规则
请使用以下任一方法创建防火墙规则。每添加一条规则,都需要重复这些步骤:
使用 Cloud Console 中的“防火墙规则”页面创建防火墙规则:
-
转到 Cloud Console 中的“创建防火墙规则”页面:
-
指定防火墙规则的详细信息:
- 在优先级中,输入一个整数以指定规则的相对重要性,并定义评估规则的顺序。
有效值的范围介于
1
到2147483646
之间。优先级为1
的规则最先评估。优先级为2147483647
的规则最后评估,此优先级保留给“default”规则使用。 -
在对匹配项执行的操作中,指定是允许还是拒绝与规则匹配的请求进行访问。如果规则设置为
allow
,则将请求转发给应用。如果规则设置为deny
,则返回403 Forbidden
错误来响应请求。 - 在 IP 范围中,定义该规则适用的 IP 地址范围。IP 地址范围必须以 CIDR 表示法定义,可以包含子网掩码并支持 IPv4 和 IPv6。
- 可选:在说明中,添加不超过 100 个字符的规则说明。
- 在优先级中,输入一个整数以指定规则的相对重要性,并定义评估规则的顺序。
- 点击保存以创建规则。
- 测试规则,确保相应优先级和操作的行为符合预期:
- 点击测试 IP 地址。
- 输入要验证的 IP 地址,然后点击测试,确保正确评估对应的规则。
运行以下 gcloud
app firewall-rules
命令以创建防火墙规则:
-
运行以下命令以创建防火墙规则:
gcloud app firewall-rules create PRIORITY --action ALLOW_OR_DENY --source-range IP_RANGE --description DESCRIPTION
其中:-
PRIORITY 是
1
到2147483646
之间的整数,用于定义规则的重要性及其评估顺序。优先级为1
的规则最先评估。优先级为2147483647
的规则最后评估,此优先级保留给“default”规则使用。 -
ALLOW_OR_DENY 指定是允许还是拒绝与该规则匹配的请求进行访问。有效值为
allow
或deny
。如果规则设置为allow
,则将请求转发给应用。如果规则设置为deny
,则返回403 Forbidden
错误来响应请求。 - IP_RANGE 定义适用于该规则的 IP 地址范围。IP 地址范围必须以 CIDR 表示法定义,可以包含子网掩码并支持 IPv4 和 IPv6。
- DESCRIPTION 是可选的规则说明,不能超过 100 个字符。
-
PRIORITY 是
- 运行以下命令,以测试规则并确保相应优先级和操作的行为符合预期:
gcloud app firewall-rules test-ip IP_ADDRESS
其中,IP_ADDRESS 是您要针对防火墙规则测试的 IP 地址。 - 运行以下命令可查看现有规则的列表:
gcloud app firewall-rules list
- 运行以下命令可删除现有规则:
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
-
如需以编程方式为 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.40
和10.0.0.1
- 从
0.1.0.40
或10.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-Control
和 Expires
HTTP 响应标头。如需详细了解这些 HTTP 标头(包括如何控制缓存),请参阅避免缓存。后续步骤
为确保您安全地配置应用并设置适当的访问权限级别,请参阅应用安全和访问权限控制。