本页介绍了如何使用 Google Cloud Armor 安全政策来保护您的 Google Cloud 部署。
Google Cloud Armor 安全政策通过提供第 7 层过滤并清除常见 Web 攻击或其他第 7 层属性的传入请求来防止流量到达负载均衡后端服务或后端,从而保护您的应用存储桶。每项安全政策都由一组 可针对第 3 层到第 7 层的属性配置的规则。这些规则可以根据传入请求的 IP 地址、IP 地址范围、区域代码或请求标头等条件过滤流量。
Google Cloud Armor 安全政策适用于以下负载均衡器和端点类型:
- 全局外部应用负载均衡器 (HTTP/HTTPS)
- 传统应用负载均衡器 (HTTP/HTTPS)
- 区域级外部应用负载均衡器 (HTTP/HTTPS)
- 区域级内部应用负载均衡器 (HTTP/HTTPS)
- 全球外部代理网络负载均衡器 (TCP/SSL)
- 传统代理网络负载均衡器 (TCP/SSL)
- 外部直通网络负载均衡器 (TCP/UDP)
- 协议转发
- 具有公共 IP 地址的虚拟机
负载均衡器可以位于优质层级或标准层级中。
后端服务的后端可以是以下任何一种:
- 实例组
- 区域网络端点组 (NEG)
- 无服务器 NEG:一个或 更多 App Engine、Cloud Run、 或 Cloud Run Functions 服务
- 外部后端的互联网 NEG
- Cloud Storage 中的存储桶
当您使用 Google Cloud Armor 保护混合部署或多云端架构时,后端必须是互联网 NEG。当流量通过负载均衡器路由时,Google Cloud Armor 还可保护无服务器 NEG。为确保只有通过负载均衡器路由的流量到达您的无服务器 NEG,请参阅 Ingress 控制。
Google Cloud Armor 还为外部直通式网络负载均衡器、协议转发和具有公共 IP 地址的虚拟机提供高级网络 DDoS 防护。如需详细了解高级 DDoS 防护,请参阅配置高级网络 DDoS 防护。
使用 Google Cloud Armor 安全政策保护您的 Google Cloud 部署
外部负载均衡是在全球 Google 接入点 (PoP) 的 Google 网络边缘处实施的。在优质层级中,定向到外部负载均衡器的用户流量会进入距离用户最近的 PoP,然后通过 Google 全球网络负载均衡到具有足够可用容量的最近后端。在标准层级中,用户流量通过您部署了 Google Cloud 资源的地区中的对等网络、ISP 或传输网络进入 Google 网络。
利用 Google Cloud Armor 安全政策,您可以允许或拒绝请求、限制请求的速率,或者将请求重定向到 Google Cloud 边缘的后端服务,尽可能靠近传入流量来源。这样可以防止不受欢迎的流量占用资源或进入您的虚拟私有云 (VPC) 网络。
下图说明了全球外部应用负载均衡器、传统版应用负载均衡器、Google 网络和 Google 数据中心的位置。
使用要求
以下是 Google Cloud Armor 安全政策的要求:
- 后端服务的负载均衡方案必须是
EXTERNAL
。EXTERNAL_MANAGED
或INTERNAL_MANAGED
。 - 后端服务的协议必须是
HTTP
、HTTPS
、HTTP/2
、UDP
、TCP
、SSL
或UNSPECIFIED
中的一个。
关于 Google Cloud Armor 安全政策
Google Cloud Armor 安全政策是一组规则,与第 3 层至第 7 层的特性相匹配,以保护面向外部的应用或服务。每条规则都针对传入流量进行评估。
Google Cloud Armor 安全政策规则包含一个匹配条件和一项满足该条件时要执行的操作。条件可以很简单,例如传入流量的源 IP 地址是否匹配特定 IP 地址或 CIDR 范围(也称为 IP 地址许可名单和拒绝名单规则)。或者,您也可以通过利用 Google Cloud Armor 自定义规则语言参考文档,创建与传入流量的各个属性(如网址路径、请求方法或请求标头值)匹配的自定义条件。
当传入请求与安全政策规则中的条件匹配时,Google Cloud Armor 会根据该规则是允许规则、拒绝规则还是重定向规则来允许、拒绝或重定向请求。也可以应用其他操作参数,如插入请求标头。此功能是 Google Cloud Armor 机器人管理的一部分。如需详细了解机器人管理,请参阅机器人管理概览。
您可以将 Google Cloud Armor 安全政策与一项或多项后端服务相关联。后端服务只能与一项安全政策关联,但您的后端服务无需与同一安全政策关联。
如果一项 Google Cloud Armor 安全政策与任何后端服务相关联,则无法将其删除。无论后端服务是否具有关联的安全政策,都可以将其删除。
如果多条转发规则指向具有关联安全政策的后端服务,则将针对进入这些转发规则 IP 地址中的每个 IP 地址的所有流量执行政策规则。
在下图中,Google Cloud Armor 安全政策 internal-users-policy
与后端服务 test-network
相关联。
Google Cloud Armor 安全政策具有以下功能:
您可以选择对使用 Google Cloud Armor 的负载均衡器使用
QUIC
协议。您可以将 Google Cloud Armor 与属于以下任一网络服务层级的负载均衡器搭配使用:
- 优质层级
- 标准层级
您可以将后端安全政策与 GKE 和默认入站流量控制器搭配使用。
您可以在配置以下负载均衡器之一时使用默认安全政策,用于防止流量超过用户指定的阈值:
- 全球外部应用负载均衡器
- 传统应用负载均衡器
- 区域级外部应用负载均衡器
- 区域级内部应用负载均衡器
- 全局外部代理网络负载均衡器
- 传统代理网络负载均衡器
- 外部直通式网络负载均衡器
此外,您还可以配置 Google Cloud Armor 预配置的 WAF 规则,这些规则是具有数十个签名的复杂 Web 应用防火墙 (WAF) 规则,根据开源业界标准编译而成的。每个签名都对应于规则集中的攻击检测规则。Google 按原样提供这些规则。通过这些规则,Google Cloud Armor 可以通过引用方便命名的规则评估数十种不同的流量签名,而无需您手动定义每个签名。如需详细了解预配置的 WAF 规则,请参阅预配置的 WAF 规则概览。
安全政策的类型
下表显示了安全政策的类型以及它们支持的功能。对勾标记 () 表示该类型的安全政策支持相关功能。
后端安全政策
后端安全政策用于由以下负载均衡器类型公开的后端服务:
- 全球外部应用负载均衡器
- 传统应用负载均衡器
- 区域级外部应用负载均衡器
- 区域级内部应用负载均衡器
- 全局外部代理网络负载均衡器
- 传统代理网络负载均衡器
它们可用于过滤请求并保护引用实例组或网络端点组 (NEG) 的后端服务,包括互联网 NEG、可用区级 NEG、混合 NEG 和无服务器 NEG。并非所有负载均衡器都支持所有类型的 NEG。如需详细了解负载均衡器支持的 NEG,请参阅网络端点组概览。
使用全球外部代理网络负载均衡器或传统代理网络负载均衡器时,Google Cloud Armor 仅对新连接请求强制执行安全政策规则 deny
操作。deny
操作会终止 TCP 连接。此外,如果您在 deny
操作中提供状态代码,则会忽略状态代码。
后端安全政策具有可选的 type
标志值 CLOUD_ARMOR
。
如果您未设置 type
标志,则默认值为 CLOUD_ARMOR
。
边缘安全政策
借助边缘安全政策,用户可以为存储在缓存中的内容配置过滤和访问权限控制政策;这包括启用 Cloud CDN 的后端服务和 Cloud Storage 存储分区的端点。与后端安全政策相比,边缘安全政策支持根据部分参数进行过滤。您无法将边缘安全政策设置为后端政策。以下端点支持边缘安全政策:
- 全球外部应用负载均衡器
- 传统应用负载均衡器
您可以配置边缘安全政策,以便在从 Google 的缓存处理请求之前过滤请求。在靠近 Google 网络的最外层(Cloud CDN 缓存所在的上游)部署和强制执行边缘安全政策。边缘安全政策可与后端安全政策共存,从而提供两层保护。无论后端服务指向何种资源(例如实例组或网络端点组),它们都可以同时应用于后端服务。您只能将后端安全政策应用于后端存储分区。
将边缘安全政策和后端安全政策附加到同一后端服务时,仅针对已通过边缘安全政策的缓存未命中请求强制执行后端安全政策。
边缘安全政策在 Identity-Aware Proxy (IAP) 之前评估和强制执行。在 IAP 评估请求者的身份之前,被边缘安全政策阻止的请求会被拒绝。使用边缘安全政策中的规则阻止请求可防止 IAP 提供登录页面或以其他方式尝试对用户进行身份验证。
边缘安全政策具有 type
标志值 CLOUD_ARMOR_EDGE
。
网络边缘安全政策
通过网络边缘安全政策,您可以配置规则以屏蔽 Google 网络边缘的流量。强制执行网络边缘安全政策不会消耗虚拟机或主机资源,这有助于避免庞大的流量耗尽目标工作负载上的资源,或者导致拒绝服务攻击。您可以为以下资源配置网络边缘安全政策:
- 外部直通网络负载均衡器
- 协议转发
- 具有公共 IP 地址的虚拟机
网络边缘安全政策支持根据与后端安全政策相同的一些参数进行过滤,并且是唯一支持字节偏移过滤的安全政策类型。如需查看可用参数的完整列表,请参阅安全政策类型表格。
网络边缘安全政策具有 type
标志值 CLOUD_ARMOR_NETWORK
。
如需配置网络边缘安全政策,您必须
请先在您要保护其安全机制的区域中配置高级网络 DDoS 攻击防护
打算创建政策如需详细了解高级 DDoS 防护,请参阅配置高级网络 DDoS 防护。
规则评估顺序
规则评估顺序取决于规则优先级,从最低数字到最高数字。分配了最低数值的规则具有最高逻辑优先级,并且在具有较低逻辑优先级的规则之前进行评估。最小数字优先级为 0。规则的优先级随其数字的增加而降低(1、2、3、N+1)。您不能配置两个或更多具有相同优先级的规则。每个规则的优先级均必须设置为 0 到 2147483646(含)之间的数字。优先级值 2147483647(也称为 INT-MAX
)是默认规则的保留值。
优先级数字可能会有间隙,这使您将来可以添加或移除规则而不会影响其余规则。例如,1、2、3、4、5、9、12、16 是有效的优先级数字序列,您可以在将来添加编号为从 6 到 8、10 到 11 和 13 到 15 的规则。您不必对现有规则进行任何更改,但可以更改执行顺序。
通常,将应用与请求匹配的最高优先级规则。但是,根据使用 evaluatePreconfiguredExpr()
的预配置规则评估 HTTP POST
请求时例外。例外情况如下。
对于 HTTP POST
请求,Google Cloud Armor 会在正文(载荷)之前接收到请求标头。由于 Google Cloud Armor 先接收标头信息,因此它会评估与标头匹配的规则,但不会匹配正文上的任何预配置规则。如果存在多个基于标头的规则,Google Cloud Armor 将根据其优先级对它们进行评估。请注意,redirect
操作和插入自定义标头操作仅在标头处理阶段有效。如果 redirect
操作在以下正文处理阶段匹配,则该操作将转换为 deny
操作。如果自定义请求标头操作在正文处理阶段匹配,将不会生效。
Google Cloud Armor 收到 HTTP POST
正文后,将评估适用于请求标头和正文的规则。因此,可能会在阻止请求正文的较高优先级规则之前匹配允许请求标头的较低优先级规则。在这种情况下,系统可能会将请求的 HTTP 标头部分发送到目标后端服务,而包含潜在的恶意内容的 POST
正文则可能会被阻止。 Google Cloud Armor 会检查 POST
正文的前 8KB 内容。如需详细了解此限制,请参阅 POST 正文检查限制。
预配置规则的 evaluatePreconfiguredExpr()
表达式是根据请求正文评估的唯一表达式。所有其他表达式仅针对请求标头评估。在带有请求正文的 HTTP
请求类型中,Google Cloud Armor 仅处理 POST
请求。检查仅限于 POST
正文的前 8 KB,并且像网址查询参数一样对其进行解码。Google Cloud Armor 可对 JSON 格式的 POST
正文 (Content-Type = "application/json"
) 解析并应用预配置 WAF 规则。但是,Google Cloud Armor 不支持其他基于 HTTP Content-Type/Content-Encoding 的解码器,例如 XML、Gzip 或 UTF-16。
示例
在以下示例中,将针对 IP
和 HTTP
标头字段按该顺序评估规则 1、2 和 3。但是,如果 IP 9.9.9.1
在 HTTP POST
正文中启动 XSS 攻击,则只有正文被阻止(根据规则 2);HTTP
标头将直通到后端(根据规则 3)。
Rule1 expr: inIPRange(origin.ip, '10.10.10.0/24') action: deny(403) priority: 1 Rule2 expr: evaluatePreconfiguredExpr('xss-stable') action: deny(403) priority: 2 Rule3 expr: inIPRange(origin.ip, '9.9.9.0/24') action: allow priority: 3 Rule-default action: deny(403) priority: INT-MAX
在以下示例中,该政策允许 IP 9.9.9.1
,而无需对 XSS 攻击进行扫描:
Rule1 expr: inIPRange(origin.ip, '10.10.10.0/24') action: deny(403) priority: 1 Rule2 expr: inIPRange(origin.ip, '9.9.9.0/24') action: allow priority: 2 Rule3 expr: evaluatePreconfiguredExpr('xss-stable') action: deny(403) priority: 3 Rule-default action: allow priority: INT-MAX
默认规则
每项 Google Cloud Armor 安全政策均包含一条默认规则;如果没有匹配更高优先级的规则,或者该政策中没有其他规则,则将匹配默认规则。系统会自动为默认规则分配优先级 2147483647 (INT-MAX
),并且该规则始终存在于安全政策中。
您不能删除默认规则,但是可以对其进行修改。默认规则的默认操作为 deny
,但您可以将默认操作更改为 allow
。
指纹
每个 Google Cloud Armor 安全政策都有一个字段 fingerprint
。指纹是存储在政策中的内容的哈希。创建新政策时,请勿提供此字段的值。提供的值会被忽略。但是,在您更新安全政策时,必须指定当前指纹,该指纹是在导出或描述政策时获得的(分别使用 EXPORT
或 DESCRIBE
)。
指纹可以防止您覆盖其他用户的更新。如果您提供的指纹已过期,这意味着自您上次检索指纹以来,已更新安全政策。如需检查是否存在任何差异并检索最新指纹,请运行 DESCRIBE
命令。
规则语言和执行引擎
规则语言和执行引擎提供以下内容:
能够编写可与传入请求的各种第 3 层到第 7 层属性匹配的自定义规则表达式。Google Cloud Armor 提供灵活语言来编写自定义匹配条件。
在一条规则中最多可以组合 5 个子表达式。
能够根据传入请求的地区代码拒绝或允许请求。区域代码基于 ISO 3166-1 alpha 2 代码。地区代码有时会对应于特定的国家/地区,但有些代码包含国家/地区及其关联的地区。例如,
US
代码包括美国各州、一个特区和六个美国本土外地区。
规则类型
Google Cloud Armor 具有以下类型的规则。
IP 地址许可名单和拒绝名单规则
您可以在安全政策中创建 IP 地址许可名单和拒绝名单规则:下面是一些示例:
利用 IP 地址/CIDR 的拒绝名单,可以阻止源 IP 地址或 CIDR 范围访问受支持的负载均衡器。
通过将 IP 地址/CIDR 列入许可名单,您可以允许某个来源 用于访问受支持的负载平衡器的 IP 地址或 CIDR 范围。
许可名单和拒绝名单规则支持 IPv4 和 IPv6 地址。
拒绝规则可能会返回 HTTP
403
(Unauthorized)、404
(Access Denied)、502
(Bad Gateway) 响应。超出操作规则可能会返回 HTTP
429
(请求过多)。
来源地理位置规则
您可以允许或拒绝来自由 Unicode 国家/地区代码定义的选定地理区域的请求。
Google Cloud Armor 使用我们自己的 IP 地理定位数据库来识别 请求地理位置。该数据库会定期更新。虽然我们无法保证特定的更新节奏,但在正常运行期间,Google Cloud Armor 使用的映射大约每周更新一次。
更新后的映射必须在全球范围内传播到 Google 的基础架构。发布过程逐步部署到 Google Cloud Armor 所在的多个可用区和区域,通常需要几天时间。由于这种逐步推出流程,在推出期间,如果来源 IP 地址的地理位置映射发生变化,来自同一来源 IP 地址的请求可能会得到不一致的处理。
预配置的 WAF 规则
Google Cloud Armor 提供基于 OWASP ModSecurity 核心规则集 (CRS) 的预配置 WAF 规则的全面列表,可帮助您检测以下攻击:
- SQL 注入攻击
- 跨站脚本攻击
- 本地文件包含攻击
- 远程文件包含攻击
- 远程代码执行攻击
- 方法强制执行攻击
- 扫描程序检测攻击
- 协议攻击
- PHP 注入攻击
- 会话固定攻击
- Java 攻击
- NodeJS 攻击
如需了解详情,请参阅 Google Cloud Armor 预配置的 WAF 规则概览。
机器人管理规则
您可以使用机器人管理规则执行以下操作:
- 重定向 reCAPTCHA 评估的请求(可选) 人工挑战。
- 评估随请求关联的 reCAPTCHA 令牌并加以应用 根据令牌属性配置的操作。
- 将请求重定向到您配置的备用网址,并返回 302 响应。
- 在将请求代理到后端之前,先将自定义标头插入到请求中。
如需详细了解机器人管理,请参阅机器人管理概览。
已命名 IP 地址列表的预配置规则
已命名 IP 地址列表的预配置规则具有以下功能:
将第三方提供商的已命名 IP 地址列表与 Google Cloud Armor 集成
简化对允许或拒绝的 IP 地址范围的维护
每日同步第三方提供商的列表。
增加在安全政策中配置 IP 地址和范围的容量,因为已命名 IP 地址列表不受限于每个规则的 IP 地址数量。
速率限制规则
您可以使用速率限制规则执行以下操作:
- 根据您配置的阈值限制每个客户端的请求数量。
- 暂时屏蔽超出您在配置的时长内设置的请求阈值的客户端。
当您对全局外部代理网络负载平衡器或 传统代理网络负载平衡器,存在以下限制:
- Google Cloud Armor 只会强制执行速率限制操作,例如节流或限制来自客户端的新连接请求。
- 仅支持
ALL
和IP
密钥类型。 - 如果您尝试将密钥类型
HTTP-HEADER
或HTTP-COOKIE
与 TCP/SSL 负载均衡器搭配使用,则密钥类型会被解释为ALL
,同样,XFF-IP
也会被解释为IP
。
如需详细了解速率限制及其工作原理,请参阅速率限制概览。
预览模式
您可以预览规则的效果,而无需执行规则。在预览模式下,操作记录在 Cloud Monitoring 中。您可以选择预览安全政策中的单个规则,也可以预览政策中的每个规则。您需要为处于预览状态的规则支付正常的每次请求费用 模式。
您可以使用 Google Cloud CLI 和 gcloud compute security-policies rules update
的 --preview
标志为规则启用预览模式。
如需停用预览模式,请使用 --no-preview
标志。您还可以使用 Google Cloud 控制台。
如果请求触发预览,Google Cloud Armor 将继续评估其他规则,直到找到匹配项。匹配的规则和预览规则都将在日志中提供。
自定义错误响应
使用全局外部应用负载平衡器时,您可以配置自定义错误响应 ,以了解负载平衡器或后端实例出错的 HTTP 状态代码 生成。此外,您还可以为 Google Cloud Armor 通过为同一资源配置自定义响应页面来拒绝 现有安全政策规则的 4xx 系列或 5xx 系列错误代码 。
如需详细了解自定义错误响应,请参阅自定义错误响应概览。如需了解配置步骤,请参阅配置自定义错误响应。
日志记录
Google Cloud Armor 具有全面的日志记录功能,可让您定义日志记录的详尽程度。Google Cloud Armor 日志是根据与传入请求匹配的第一个(最高优先级)规则生成的,无论安全政策是否处于预览模式。也就是说,系统不会为 不匹配的规则以及优先级较低的匹配规则。
如需全面了解日志记录,请参阅使用请求日志记录。如需详细了解详细日志记录,请参阅详细日志记录。查看 Google Cloud Armor 日志,请参阅 查看日志。
外部应用负载均衡器请求日志记录
根据 Google Cloud Armor 安全政策评估的每个 HTTP(S) 请求都会通过 Cloud Logging 记录。日志提供详细信息,例如所应用安全政策的名称、匹配的规则以及是否执行了规则。新的后端服务资源的请求日志记录默认处于停用状态。为确保记录 Google Cloud Armor 请求,您必须为受安全政策保护的每个后端服务启用 HTTP(S) 日志记录。
如需了解详情,请参阅外部应用负载均衡器日志记录和监控。
外部代理网络负载均衡器请求日志记录
您可以使用 Google Cloud CLI 命令为外部代理网络负载均衡器配置日志记录功能,如 TCP/SSL 代理负载均衡日志记录和监控中所述。您无法使用 Google Cloud 控制台为外部代理网络负载均衡器启用日志记录功能。
限制
以下部分详细介绍了安全政策的限制。
POST 正文检查限制
预配置规则的 evaluatePreconfiguredWaf()
表达式是 Google Cloud Armor 针对请求正文求值的唯一表达式。在带有请求正文的 HTTP 请求类型中,Google Cloud Armor 仅处理 POST
请求。
检查仅限于 POST
正文的前 8 KB 内容,并且会像网址查询参数一样对其进行解码。但是,POST
正文的剩余部分也可能包含可能会被您的应用接受的恶意代码。如需降低大小超过 8 KB 的 POST
正文的风险,请参阅问题排查指南。
Google Cloud Armor 可对采用默认网址编码及 JSON 格式的 POST
正文 (Content-Type = "application/json"
) 解析并应用预配置 WAF 规则,在这种情况下,规则会独立应用于数据中的解码名称和值。对于其他类型的内容和编码类型,Google Cloud Armor 不会解码数据,而是对原始数据应用预配置的规则。
WebSocket 连接的处理方式
全球外部应用负载均衡器具有对 WebSocket 协议的内置支持。WebSocket 通道由 HTTP(S) 请求启动。Google Cloud Armor 可以阻止 WebSocket 通道的建立,例如,在 IP 地址拒绝名单阻止发起 IP 地址时。不过,后续 通道中的事务不符合 HTTP 协议,并且 Google Cloud Armor 不会在第一个请求之后评估任何消息。