本文将介绍如何对 Media CDN 分发的内容进行保护,其中包括对访问源进行过滤控制,以及通过鉴权方式来防盗链。为了更好进行演示,本文仍将使用视频点播 VOD 场景为例子,具体部署场景可以参见 Media CDN 上手指南。
网络访问控制
Media CDN 通过和 Google Cloud Armor 产品的集成,可以实现对访问 Media CDN 的用户进行源地址控制,并支持基于 IP 地理信息的过滤。Google Cloud Armor 使用 ISO 3166 alpha 2 国家区域代码对客户端的源 IP 地址进行映射,例如澳大利亚是 AU,美国是 US,印度是 IN 等等,对于无法确认 IP 地址归属的,使用 ZZ 进行标识。
通过 Cloud Armor 规则语言,我们可以针对源 IP 地址,IP 归属地等进行过滤。例如:
源地址为 192.0.2.0/24 对应为 inIpRange(origin.ip, '192.0.2.0/24')
IP 地址所在国家为澳大利亚对应为 origin.region_code == "AU"
还可以通过逻辑操作”与&” ”或|” 把多个表达式进行逻辑组合,但要注意是一个 IP 地址不会属于两个归属地,也不会属于两个 IP 地址段。
创建 Cloud Armor Edge 策略
gcloud compute security-policies create block-au --type=CLOUD_ARMOR_EDGE |
创建安全策略,模拟阻止澳大利亚和美国用户访问
gcloud compute security-policies rules create 1000 \\ --security-policy=block-au --description "block AU+US" \\ --expression="origin.region_code == 'AU' || origin.region_code == 'US'" \\ --action="deny-403" |
创建完成后,验证策略创建 gcloud compute security-policies describe block-au 优先级为 1000 的策略阻止来自澳大利亚和美国用户访问,并返回 403,其他客户采用默认规则,允许访问。
kind: compute#securityPolicy name: block-au rules: - action: deny(403) description: block AU+US kind: compute#securityPolicyRule match: expr: expression: origin.region_code == 'AU' || origin.region_code == 'US' preview: false priority: 1000 - action: allow description: default rule kind: compute#securityPolicyRule match: config: srcIpRanges: - '*' versionedExpr: SRC_IPS_V1 preview: false priority: 2147483647 type: CLOUD_ARMOR_EDGE |
创建完成后,更新到 Media CDN 的服务中
gcloud edge-cache services update infoq-demo --edge-security-policy=block-au |
通过模拟访问 https://infoq.yinghli.cn/index.html 澳大利亚终端模拟访问,显示 403 错误。查看 Media CDN 日志显示,该终端访问命中 bolck-au 策略,并返回 403 错误。
对比另一个非限制国家终端访问日志,结果显示 200
内容访问控制
Media CDN 支持针对访问 URL 进行鉴权,从而对 CDN 分发内容进行保护。Media CDN 使用 Ed25519 算法生成密钥对,对 URL 进行鉴权。具体支持格式参见。本文通过几个示例演示
生成密钥对
目前可以通过 Python3 或者 OpenSSL 1.1.1 生成 Ed25519 密钥对。具体参见文档。
密钥对生成后,需要将公钥上传到 Media CDN 的 keyset 中,以便验证。
gcloud edge-cache keysets create signurlkey \\ --public-key='id=publickey,value=xxxxxx' |
更新 Media CDN 配置,将 keyset 应用到 URL 鉴权中。页面配置中,找到 CDN policy 配置
点击编辑,Signed request 配置中,选择 Require_Signatures 并指定 signurl 作为 keyset
对全部 URL 进行鉴权
本章节演示如何在客户端使用 Python 代码对单一 URL 进行鉴权。Python 代码请参见
根据 Media CDN URL 鉴权方式,代码中定义了四个输入参数,分别是:
完整的 URL,本示例中采用 https://infoq.yinghli.cn/transcoder-output/TOS/manifest.m3u8
鉴权使用的 keyset 名称,该名称需要和上一步 Media CDN keyset 配置的名称匹配,本示例中为 signurlkey
鉴权使用的私钥,即上文中生成的 Ed25519 密钥对中的私钥
过期时间,即该签名的有效时间,例如 2023 年 3 月 6 日 10 点 datetime.datetime(2023,3,16,10,0,0,0,None)
通过以上四个参数输入,示例代码会生成客户端 URL 鉴权。格式为
https://infoq.yinghli.cn/transcoder-output/TOS/manifest.m3u8? Expires=EXPIRATION &KeyName=KEY_NAME &Signature=SIGNATURE |
通过 curl 进行验证 curl -svo /dev/null "https://infoq.yinghli.cn/transcoder-output/TOS/manifest.m3u8?Expires=1679133600&KeyName=signurlkey&Signature=xxxxx"
使用正确鉴权 URL 的访问结果为 200,使用错误授权 URL 的结果为 403,日志提示 error=http_request_denied;
details="signed_request_ed25519_signature_invalid""
使用 URL Prefix 进行鉴权
当希望对有结构化的 URL 进行鉴权时,可以使用针对 URL 前缀方式进行授权。例如针对上例中的 URL https://infoq.yinghli.cn/transcoder-output/TOS/manifest.m3u8,可以对 https://infoq.yinghli.cn/transcoder-output/TOS 进行授权,减少针对每个文件生成不同的授权 URL。Python 代码请参见。
根据 Media CDN URL 鉴权方式,URL Prefix 代码中定义了五个输入参数,分别是:
完整的 URL,本示例中采用 https://infoq.yinghli.cn/transcoder-output/TOS/manifest.m3u8
URL Prefix,本示例中 https://infoq.yinghli.cn/transcoder-output/TOS
鉴权使用的 keyset 名称,该名称需要和上一步 Media CDN keyset 配置的名称匹配,本示例中为 signurlkey
鉴权使用的私钥,即上文中生成的 Ed25519 密钥对中的私钥
过期时间,即该签名的有效时间,例如 2023 年 3 月 6 日 10 点 datetime.datetime(2023,3,16,10,0,0,0,None)
通过以上五个参数,示例代码会生成客户端 URL 鉴权,格式
https://infoq.yinghli.cn/transcoder-output/TOS/manifest.m3u8? URLPrefix=PREFIX &Expires=EXPIRATION &KeyName=KEY_NAME &Signature=SIGNATURE |
本示例生成的 URL 可以使用同样的 curl 方式进行验证 https://infoq.yinghli.cn/transcoder-output/TOS/manifest.m3u8?URLPrefix=aHR0cHM6Ly9pbmZvcS55aW5naGxpLmNuL3RyYW5zY29kZXItb3V0cHV0L1RPUw==&Expires=1679133600&KeyName=signurlkey&Signature=xxxx
使用 Cookie 进行授权
区别于 URL 鉴权方式,Media CDN 还支持采用 Cookie 方式鉴权。通过 HTTP Header 方式将鉴权信息传递给 Media CDN。针对 URL https://infoq.yinghli.cn/transcoder-output/TOS/manifest.m3u8,我们采用 Cookies 方式进行鉴权。Python 代码参见。
根据 Media CDN Cookie 鉴权方式,代码中定义了四个输入参数,分别是
完整的 URL,本示例中采用 https://infoq.yinghli.cn/transcoder-output/TOS/manifest.m3u8
鉴权使用的 keyset 名称,该名称需要和上一步 Media CDN keyset 配置的名称匹配,本示例中为 signurlkey
鉴权使用的私钥,即上文中生成的 Ed25519 密钥对中的私钥
过期时间,即该签名的有效时间,例如 2023 年 3 月 6 日 10 点 datetime.datetime(2023,3,16,10,0,0,0,None)
通过以上参数,示例代码会生成客户端的 Cookie 鉴权,
Edge-Cache-Cookie: URLPrefix=PREFIX: Expires=EXPIRATION: KeyName=KEY_NAME: Signature=SIGNATURE |
在使用 curl 测试过成中,通过 -H 方式输入 Cookie 方式进行鉴权
curl -H "Cookie:Edge-Cache-Cookie=URLPrefix=aHR0cHM6Ly9pbmZvcS55aW5naGxpLmNuL3RyYW5zY29kZXItb3V0cHV0L1RPUy9tYW5pZmVzdC5tM3U4:Expires=1679133600:KeyName=signurlkey:Signature=xxxx" -svo /dev/null 'https://infoq.yinghli.cn/transcoder-output/TOS/manifest.m3u8' |
除此之外,Media CDN 还支持使用 Token 方式进行鉴权,我们会在以后的技术博客中详细介绍
文章信息
相关推荐
