配置安全政策

媒体 CDN 使用 Google Cloud Armor 安全政策防止不受欢迎的用户 流量访问其服务您可以根据 以下:

  • IPv4 和 IPv6 地址和范围 (CIDR)
  • 国家/地区代码(地理位置)
  • 第 7 层过滤

借助这些功能,您可以仅限特定 但只允许有内容许可限制的公司 访问测试端点或预演端点,以及拒绝一系列已知 不良客户端 IP 地址。

您可以通过将自定义 包含可配置名称和值的标头。

Google Cloud Armor 安全政策适用于 媒体 CDN,包括缓存的内容和缓存未命中。

Google Cloud Armor 安全政策是在 媒体 CDN 服务 - 发往该服务网站的所有请求 始终为 IP 地址强制执行安全政策。 不同的服务可能会应用不同的安全政策,您可以 根据需要针对不同的地理位置创建多项服务。

如需在用户级别对内容进行更精细的保护,我们建议 签名网址和签名 Cookie 与 Google Cloud Armor 政策搭配使用

媒体 CDN 在下列期间不会考虑 referer 标头 第 7 层标头过滤边缘安全政策(当其达到 设置为以下任意值:

  • 多个网址
  • 相对网址
  • 包含用户信息或片段组件的有效绝对网址

配置安全政策

请按照以下说明配置安全政策。

准备工作

将 Google Cloud Armor 安全政策附加到媒体 CDN 的方法 确保符合以下要求:

您还需要以下 Identity and Access Management 权限才能授权、创建和 将安全政策附加到媒体 CDN 服务:

  • compute.securityPolicies.addAssociation
  • compute.securityPolicies.create
  • compute.securityPolicies.delete
  • compute.securityPolicies.get
  • compute.securityPolicies.list
  • compute.securityPolicies.update
  • compute.securityPolicies.use

需要将现有证书附加到媒体 CDN 的用户 服务只需要以下 IAM 权限:

  • compute.securityPolicies.get
  • compute.securityPolicies.list
  • compute.securityPolicies.use

roles/networkservices.edgeCacheUser 角色包含所有这些 权限。

创建安全政策

Google Cloud Armor 安全政策由多条规则组成, 每条规则为请求定义一组匹配条件(表达式), 以及一项操作。例如,一个表达式可以包含 位于印度的客户,相关操作为 allow。如果 请求与规则不匹配时,Google Cloud Armor 会继续评估 直到尝试完所有规则为止。

安全政策具有一项具有 allow 操作的默认规则。默认 规则允许与前一个规则不匹配的请求。这可以更改为 deny 规则(如果您想仅 allow 与前面的规则匹配的请求) 然后拒绝其他所有请求

以下示例展示了如何创建屏蔽所有客户端的规则 通过 HTTP 403 地理定位到澳大利亚,并允许所有其他请求。

gcloud

如需创建类型为 CLOUD_ARMOR_EDGE 的新政策,请使用 gcloud compute security-policies create 命令

gcloud compute security-policies create block-australia \
    --type="CLOUD_ARMOR_EDGE" --project="PROJECT_ID"

这会创建一项政策,并将默认允许规则设为最低 优先级 (priority: 2147483647):

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/securityPolicies/block-australia].

然后,您可以添加优先级更高的规则:

gcloud compute security-policies rules create 1000 \
    --security-policy=block-australia --description "block AU" \
    --expression="origin.region_code == 'AU'" --action="deny-403"

输出如下所示:

Updated [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/securityPolicies/block-australia].

Terraform

resource "google_compute_security_policy" "default" {
  name        = "block-australia"
  type        = "CLOUD_ARMOR_EDGE"
  description = "block AU"

  rule {
    action      = "deny(403)"
    description = "block AU"
    priority    = "1000"
    match {
      expr {
        expression = "origin.region_code == 'AU'"
      }
    }
  }
  rule {
    action   = "allow"
    priority = "2147483647"
    match {
      versioned_expr = "SRC_IPS_V1"
      config {
        src_ip_ranges = ["*"]
      }
    }
    description = "default rule"
  }
}

如果检查该政策,您会看到两条规则:第一条规则屏蔽 来自澳大利亚 (origin.region_code == 'AU') 的请求和 第二条优先级最低的规则,允许与最高优先级不匹配的所有流量 优先级规则。

kind: compute#securityPolicy
name: block-australia
rules:
- action: deny(403)
  description: block AU
  kind: compute#securityPolicyRule
  match:
    expr:
      expression: origin.region_code == 'AU'
  preview: false
  priority: 1000
- action: allow
  description: default rule
  kind: compute#securityPolicyRule
  match:
    config:
      srcIpRanges:
      - '*'
    versionedExpr: SRC_IPS_V1
  preview: false
  priority: 2147483647
  ruleNumber: '1'
type: CLOUD_ARMOR_EDGE

将规则添加到安全政策

Google Cloud Armor 安全政策是与 第 7 层属性,用于保护面向外部的应用 服务。每条规则都针对传入流量进行评估。

以下特性可用于安全政策中的 HTTP 请求: request.headersrequest.methodrequest.pathrequest.schemerequest.query。详细了解如何编写表达式以提高安全性 政策规则,请参阅 Google Cloud Armor 自定义规则语言参考文档

Google Cloud Armor 安全政策规则由匹配条件和 在满足该条件时要执行的操作。

gcloud

如需为安全政策创建规则,请使用 gcloud compute security-policies rules create PRIORITY 命令。 将 PRIORITY 替换为规则在 政策:

gcloud compute security-policies rules create PRIORITY \
    --security-policy POLICY_NAME \
    --description DESCRIPTION \
    --src-ip-ranges IP_RANGES | --expression EXPRESSION \
    --action=[ allow | deny-403 | deny-404 | deny-502 ] \
    --preview

将政策附加到服务

gcloud

要将现有的 Google Cloud Armor 政策附加到 媒体 CDN 服务,请使用 gcloud edge-cache services update 命令

gcloud edge-cache services update MY_SERVICE \
    --edge-security-policy=SECURITY_POLICY

更新安全政策中的规则

使用以下说明更新 Google Cloud Armor 安全政策中的单条规则。或者,您可以在一个文件中以原子方式更新多个规则 安全政策

gcloud

使用 gcloud compute security-policies rules update 命令

gcloud compute security-policies rules update PRIORITY [ \
    --security-policy POLICY_NAME  \
    --description DESCRIPTION  \
    --src-ip-ranges IP_RANGES  | --expression EXPRESSION \
    --action=[ allow | deny-403 | deny-404 | deny-502 ]  \
    --preview
  ]
  

例如,以下命令将更新优先级为 1111 的规则,以允许来自 IP 地址范围 192.0.2.0/24 的流量:

gcloud compute security-policies rules update 1111 \
    --security-policy my-policy \
    --description "allow traffic from 192.0.2.0/24" \
    --src-ip-ranges "192.0.2.0/24" \
    --action "allow"

如需更新规则的优先级,必须使用 REST API。有关 请参阅 securityPolicies.patchRule 方法

查看政策附件

如需查看附加到现有服务的政策,请检查(描述) 服务。

gcloud

如需查看附加到集群的 Google Cloud Armor 政策,请执行以下操作: 媒体 CDN 服务,请使用 gcloud edge-cache services describe 命令

gcloud edge-cache services describe MY_SERVICE

该服务的 edgeSecurityPolicy 字段用于描述 附加的政策:

name: "MY_SERVICE"
edgeSecurityPolicy: "SECURITY_POLICY

移除政策

要移除现有政策,请更新关联的服务,并将空的 字符串作为政策。

gcloud

使用 gcloud edge-cache services update 命令

gcloud edge-cache services update MY_SERVICE 
--edge-security-policy=""

现在,edgeSecurityPolicy 字段已从 gcloud edge-cache services describe MY_SERVICE 命令。

示例

请考虑以下详细示例用例。

示例:找出被屏蔽的请求

您必须为给定的 Edge 启用日志记录 用于记录被屏蔽请求的缓存服务。

将过滤政策允许或拒绝的请求记录到 Logging。如需过滤被拒请求,可使用以下 日志记录查询 如下所示:prod-video-service

resource.type="edge_cache_service"
jsonPayload.statusDetails="denied_by_security_policy"

示例:自定义响应代码

可将 Google Cloud Armor 规则配置为返回特定状态代码 作为与指定规则相关的操作。在大多数情况下 返回 HTTP 403 (deny-403) 代码以明确表示 被该规则屏蔽

支持的状态代码包括:

  • HTTP 403(禁止)
  • HTTP 404(未找到)
  • HTTP 502(网关无效)

以下示例演示了如何配置返回的状态代码:

将某个 [allow | deny-403 | deny-404 | deny-502] 指定为操作 请运行以下命令。本示例将 返回 HTTP 502 代码

gcloud compute security-policies rules create 1000 \
    --security-policy=block-australia --description "block AU" \
    --expression="origin.region_code == 'AU'" --action="deny-502"

安全政策中的每条规则都可以定义不同的状态代码响应。

示例:拒绝某个国家/地区以外的客户端(允许的 IP 地址除外)

媒体传送的一个常见情况是,拒绝来自 在您拥有内容许可或付款机制的区域之外。

例如,您可能只想允许印度境内客户以及 许可名单中的任何 IP 地址,包括内容合作伙伴的 IP 地址 和您自己的员工(在 192.0.2.0/24 范围内),并拒绝所有其他内容。

使用 Google Cloud Armor 自定义规则 语言、 以下表达式可以实现这一点:

origin.region_code == "IN" || inIpRange(origin.ip, '192.0.2.0/24')

此表达式配置为 allow 规则,默认值为 deny 规则配置为与所有其他客户端匹配。安全政策 都有默认规则。 您通常需要将此设置配置为 default deny 不需要的流量 明确允许。在其他情况下,您可能会选择屏蔽一些流量并 default allow:所有其他流量。

在安全政策输出中,请注意以下事项:

  • 优先级最高的 (priority: 0) 规则允许来自印度的流量 OR 从定义的 IP 地址列表中返回。
  • 优先级最低的规则表示 default deny。规则引擎 拒绝所有客户端,因为优先级较高的规则未评估为 true。
  • 您可以使用 布尔值运算符

此政策允许来自印度境内客户端的流量, 并拒绝所有其他流量

当您查看政策详情时, 输出类似于以下内容:

kind: compute#securityPolicy
name: allow-india-only
type: "CLOUD_ARMOR_EDGE"
rules:
- action: allow
  description: ''
  kind: compute#securityPolicyRule
  match:
    expr:
      expression: origin.region_code == "IN" || inIpRange(origin.ip, '192.0.2.0/24')
  preview: false
  priority: 0
- action: deny(403)
  description: Default rule, higher priority overrides it
  kind: compute#securityPolicyRule
  match:
    config:
      srcIpRanges:
      - '*'
    versionedExpr: SRC_IPS_V1
  preview: false
  priority: 2147483647

您还可以设置自定义响应标头 {region_code} 标头变量。您可以使用 JavaScript 并反映到客户端。

示例:按 IP 地址和 IP 范围屏蔽恶意客户端

使用 Google Cloud Armor 自定义规则 语言、 以下表达式可以实现这一点:

inIpRange(origin.ip, '192.0.2.2/32') || inIpRange(origin.ip, '192.0.2.170/32')

您最多可以屏蔽 /8 掩码(对于 IPv4)和 /32(对于 IPv6)。答 流式传输平台的常见情况是阻止代理的出站 IP 范围 或 VPN 提供商,以尽量减少规避内容许可的行为:

inIpRange(origin.ip, '192.0.2.0/24') || inIpRange(origin.ip, '198.51.100.0/24') || inIpRange(origin.ip, '203.0.113.0/24') || inIpRange(origin.ip, '2001:DB8::B33F:2002/64')

IPv4 和 IPv6 地址范围均受支持。

示例:仅允许使用固定的地理位置列表

如果您有国家/地区代码列表,可以使用布尔值 OR 运算符 || 组合匹配条件。

使用 Google Cloud Armor 自定义规则 语言、 以下表达式允许被识别为来自澳大利亚的用户 或新西兰:

origin.region_code == "AU" || origin.region_code == "NZ"

此外,这可与 origin.ipinIpRange(origin.ip, '...') 表达式结合使用,以允许测试人员、合作伙伴和贵公司的 IP 地址范围。 即使他们并非来自指定的地理位置也无济于事。

每个规则都有记录数量的子表达式 使用自定义表达式。如果您需要将 多个子表达式,可以在一项政策中定义多条规则。

示例:屏蔽来自一组特定国家/地区的客户

比较不常见的例子是 屏蔽来自一组国家/地区的客户 而是允许来自所有其他国家/地区的请求

为此,您创建了一项政策来屏蔽国家/地区及任意 而无法确定其所区域的客户, 默认允许规则。

以下示例介绍的政策禁止客户来自加拿大以及 与位置未知但允许所有其他流量的任何客户端一样:

  kind: compute#securityPolicy
  name: block-canada
  type: "CLOUD_ARMOR_EDGE"
  rules:
  - action: deny(403)
    description: ''
    kind: compute#securityPolicyRule
    match:
      expr:
        expression: origin.region_code == "CA" || origin.region_code == "ZZ"
    preview: false
    priority: 0
  - action: allow
    description: Default rule, higher priority overrides it
    kind: compute#securityPolicyRule
    match:
      config:
        srcIpRanges:
        - '*'
      versionedExpr: SRC_IPS_V1
    preview: false
    priority: 2147483647

示例:拒绝对具有特定标头的缓存内容的请求

边缘安全政策 适用于定位至已启动结算协议、 政策。此政策会在任何缓存之前强制执行 查询。边缘安全政策不允许的请求会被拒绝 替换为已配置的状态代码。

以下表达式与来自 IP 地址 1.2.3.4 的请求匹配 user-agent 标头中包含字符串 user1

inIpRange(origin.ip, '1.2.3.4/32') && request.headers['user-agent'].contains('user1')

以下命令会将过滤规则 105 添加到边缘安全政策 my-edge-policy 附加到媒体 CDN 服务:

gcloud compute security-policies rules create 105 \
    --security-policy my-edge-policy \
    --expression = "inIpRange(origin.ip, '1.2.3.4/32') && request.headers['user-agent'].contains('charlie')" \
    --action= deny-403 \
    --description="block requests from IP addresses in which the user-agent header contains the string charlie"
    

记录强制执行操作

每个请求日志都会提供有关哪些安全政策的详细信息 是否已应用,以及该请求是被允许 (ALLOW) 还是被拒绝 (DENY)。

如需启用日志记录,请确保在您的logConfig.enabletrue 服务。未启用日志的服务不会记录安全政策事件。

当客户端位于美国境外,并且存在名为 deny-non-us-clients 会拒绝来自以下来源的请求: 美国,以下是被拒请求的日志条目:

enforcedSecurityPolicy:
  name: deny-non-us-clients
  outcome: DENY

未附加 Google Cloud Armor 政策的服务包含 no_policy enforcedSecurityPolicy.name 的值和 ALLOWoutcome。对于 例如,某项服务的请求日志条目 附加的政策具有以下值:

enforcedSecurityPolicy:
  name: no_policy
  outcome: ALLOW

了解 GeoIP 分类

媒体 CDN 依赖于 Google 的内部 IP 分类 用于从 IP 获取位置(区域、州、省或城市)的数据源 地址。如果您要从多个 有时,少量 IP 地址可能会与 不同位置。

  • Google Cloud Armor 使用 ISO 3166-1 alpha 2 将客户端和地理位置关联起来。
  • 例如,US 表示美国,AU 表示美国 澳大利亚。
  • 在某些情况下,一个区域对应一个国家/地区,但并不总是 这种情况。例如,US 代码包含美国的所有州 一个州、一个区和六个本土外地区。
  • 如需了解详情,请参阅 unicode_region_subtag
  • 对于无法获得位置信息的客户, origin.region_code 设置为 ZZ

您可以添加 响应标头中的地理位置数据 连接到媒体 CDN 端点(使用 routing.routeRules[].headerActions[].responseHeadersToAdd[]),也可以反映 地理数据提供给Cloud 函数来验证任何差异 在初始集成和测试期间,在 GeoIP 数据源之间分配数据。

此外,媒体 CDN 请求日志包含 clientRegion 以及可针对现有数据验证的其他特定于客户端的数据 来源。

后续步骤