Media CDN 使用 Google Cloud Armor 安全政策来防止不受欢迎的流量访问其服务。您可以根据以下条件允许或拒绝请求:
- IPv4 和 IPv6 地址和范围 (CIDR)
- 国家/地区代码(地理位置)
- 第 7 层过滤
借助这些功能,您可以将内容下载限制为您有内容许可限制的特定地理位置的用户,仅允许公司 IP 地址访问测试或预演端点,以及拒绝一组已知的不良客户端 IP 地址。
您可以通过插入具有可配置名称和值的自定义标头,修饰 Google Cloud Armor 允许的请求。
Google Cloud Armor 安全政策适用于通过媒体 CDN 提供的所有内容,包括缓存内容和缓存未命中内容。
Google Cloud Armor 安全政策按 Media CDN 服务进行配置,所有发往该服务 IP 地址(或主机名)的请求都会一致地强制执行安全政策。您可以对不同的服务应用不同的安全政策,还可以根据需要为不同地理位置创建多个服务。
如需在每位用户一级更精细地保护内容,我们建议将经过签名的网址和经过签名的 Cookie与 Google Cloud Armor 政策搭配使用。
如果 referer
标头设置为以下任一值,Media CDN 在对第 7 层标头过滤边缘安全政策的规则进行评估时不会将其纳入考量范围:
- 多个网址
- 相对网址
- 包含用户信息或 fragment 组件的有效绝对网址
配置安全政策
请按照以下说明配置安全政策。
准备工作
如需将 Google Cloud Armor 安全政策附加到 Media CDN 服务,请确保:
- 熟悉 Google Cloud Armor。
- 拥有要将政策应用到的现有媒体 CDN 服务。
- 可选,但建议:在 Media CDN 服务上启用日志记录,以便您识别被屏蔽的请求。
您还需要拥有以下 Identity and Access Management (IAM) 权限,才能授权、创建和将安全政策附加到 Media CDN 服务:
compute.securityPolicies.addAssociation
compute.securityPolicies.create
compute.securityPolicies.delete
compute.securityPolicies.get
compute.securityPolicies.list
compute.securityPolicies.update
compute.securityPolicies.use
需要将现有证书附加到 Media CDN 服务的用户只需具备以下 IAM 权限:
compute.securityPolicies.get
compute.securityPolicies.list
compute.securityPolicies.use
roles/networkservices.edgeCacheUser
角色包含所有这些权限。
创建安全政策
Google Cloud Armor 安全政策由多个规则组成,每个规则都定义了一组请求匹配条件(表达式)和一项操作。例如,表达式可以包含针对位于印度的客户的匹配逻辑,关联的操作为 allow
。如果请求与规则不匹配,Google Cloud Armor 会继续评估下一条规则,直到尝试所有规则为止。
安全政策具有一条带有 allow
操作的默认规则。默认规则允许与上述规则不匹配的请求。如果您想仅 allow
与前面规则匹配的请求并拒绝所有其他请求,则可以将其更改为 deny
规则。
以下示例展示了如何创建一条规则,以 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
如果您检查该政策,会看到以下两条规则:第一条规则会屏蔽来自澳大利亚的请求 (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.headers
、request.method
、request.path
、request.scheme
和 request.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 政策附加到 Media 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
如需查看附加到 Media CDN 服务的 Google Cloud Armor 政策,请使用 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=""
gcloud edge-cache services describe MY_SERVICE
命令的输出中现在省略了 edgeSecurityPolicy
字段。
示例
请参考以下详细示例用例。
示例:确定被阻止的请求
您必须为给定的 Edge Cache 服务启用日志记录,才能记录被阻止的请求。
过滤政策允许或拒绝的请求会记录到日志。如需过滤已拒绝的请求,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 地址之外的某个国家/地区以外的客户端
在媒体投放中,一个常见的情况是,拒绝来自您拥有内容许可或付款机制的区域之外的客户端的连接。
例如,您可能希望仅允许位于印度的客户以及位于 192.0.2.0/24
范围内的许可名单中的所有 IP 地址(包括内容合作伙伴和您自己的员工的 IP 地址)访问您的资源,并拒绝所有其他 IP 地址。
使用 Google Cloud Armor 自定义规则语言,可通过以下表达式实现此目的:
origin.region_code == "IN" || inIpRange(origin.ip, '192.0.2.0/24')
此表达式配置为 allow
规则,默认的 deny
规则配置为与所有其他客户端匹配。安全政策始终有一条默认规则。通常,您会将此值配置为您未明确允许的 default deny
流量。在其他情况下,您可以选择屏蔽部分流量并default allow
屏蔽所有其他流量。
在安全政策输出中,请注意以下事项:
- 优先级最高的规则 (
priority: 0
) 允许来自印度或定义的 IP 地址列表的流量。 - 优先级最低的规则表示
default deny
。如果优先级较高的规则的计算结果不为 true,规则引擎会拒绝所有客户端。 - 您可以使用布尔运算符组合多个规则。
该政策允许来自印度的客户的流量,允许来自指定 IP 地址范围的客户,并拒绝所有其他流量。
查看政策的详细信息后,您会看到类似于以下内容的输出:
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')
您可以屏蔽 IPv4 中最多 /8
掩码的 IP 地址范围,以及 IPv6 中最多 /32
掩码的 IP 地址范围。在在线播放平台中,常见的做法是屏蔽代理或 VPN 提供方的出站 IP 地址范围,以最大限度地减少内容许可规避行为:
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.ip
或 inIpRange(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
示例:拒绝包含特定标头的缓存内容请求
边缘安全政策适用于定位到该政策所附加的任何 Media CDN 服务的所有请求。此政策强制执行会在任何缓存查找之前进行。边缘安全政策不允许的请求会被拒绝,并返回配置的状态代码。
以下表达式与来自 IP 地址 1.2.3.4
且在 user-agent
标头中包含字符串 user1
的请求匹配:
inIpRange(origin.ip, '1.2.3.4/32') && request.headers['user-agent'].contains('user1')
以下命令会将过滤规则 105
添加到已附加到 Media CDN 服务的边缘安全政策 my-edge-policy
:
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.enable
设置为 true
。未启用日志的服务不会记录安全政策事件。
如果客户端位于美国境外,并且有一个名为 deny-non-us-clients
的安全政策生效,该政策会拒绝来自美国境外的请求,那么被拒绝的请求的日志条目如下所示:
enforcedSecurityPolicy: name: deny-non-us-clients outcome: DENY
未附加 Google Cloud Armor 政策的服务的 enforcedSecurityPolicy.name
值为 no_policy
,outcome
为 ALLOW
。例如,未附加政策的服务的请求日志条目具有以下值:
enforcedSecurityPolicy: name: no_policy outcome: ALLOW
了解地理 IP 分类
Media CDN 依赖 Google 的内部 IP 分类数据源,从 IP 地址派生出位置(区域、州/省/直辖市/自治区或城市)。如果您要从多个提供商迁移或在多个提供商之间分配流量,少数 IP 地址有时可能会与不同的位置相关联。
- Google Cloud Armor 使用 ISO 3166-1 alpha 2 区域代码将客户端与地理位置相关联。
- 例如,
US
表示美国,AU
表示澳大利亚。 - 在某些情况下,一个区域对应一个国家/地区,但并非总是如此。例如,
US
代码包括美国各州、一个特区和六个美国本土外地区。 - 如需了解详情,请参阅 Unicode 技术标准中的 unicode_region_subtag。
- 对于无法派生位置信息的客户端,
origin.region_code
会设置为ZZ
。
您可以向 Media CDN 端点(使用 routing.routeRules[].headerActions[].responseHeadersToAdd[]
)向响应标头添加地理位置数据,或反映提供给 Cloud Functions 的地理位置数据,以验证初始集成和测试期间地理 IP 数据源之间的任何差异。
此外,媒体 CDN 请求日志还包含 clientRegion
和其他特定于客户端的数据,您可以根据现有数据源对这些数据进行验证。
后续步骤
- 了解如何使用已签名请求按用户授权内容。
- 请参阅 Google Cloud Armor 规则参考文档,了解如何表达和组合 IP 地址和地理位置匹配规则。
- 请参阅日志记录文档,了解如何查询请求日志以及检查哪些请求已被屏蔽。