OPA 鉴权策略
概述
OPA 鉴权策略是云开发提供的 环境级请求鉴权能力,基于开源策略引擎 Open Policy Agent (OPA) 和策略语言 Rego 构建。通过在云开发控制台编写一段策略代码,可以为整个环境的 HTTP API 和 HTTP 访问服务 请求定义统一的访问控制规则。
云开发会在每次收到请求时执行策略,根据 用户身份、HTTP 请求、环境上下文 三类信息做出"放行 / 拦截"决策,再将请求转发到实际调用的资源。
用户请求
↓
云开发
↓
构造 input(subject + request + cloudbase)
↓
执行 OPA 策略评估
├─ allow = true 且 deny = false → 放行 → 访问实际资源
└─ deny = true → 拒绝,返回 403 + 原因
默认情况下,云开发为 HTTP API 和 HTTP 访问服务内置一套平台默认策略,覆盖各类资源在不同身份下的默认放通与拒绝规则,具体策略规则见 附录 A:平台默认策略。
用户策略可在平台默认策略之上进行追加调整:
- 用户策略中定义的
allow(放通)可放开被平台默认拒绝的请求 - 用户策略中定义的
deny(拒绝)可拒绝被平台默认放通的请求(deny优先级高于allow)
通过用户策略的调整,可灵活、细粒度地定义基于 HTTP 请求、用户身份、访问资源或多种条件组合的鉴权规则,实现高度可定制的权限管控。通过编写 OPA 策略,可实现下列需求:
- IP 白名单访问控制
- 按用户身份控制读写权限
- 保护管理后台接口
- 按访问入口执行不同规则
- ...
关于完整实现示例,请参考 实战案例。
核心能力
| 能力 | 说明 |
|---|---|
| 多条件组合鉴权 | 可基于用户身份、请求特征、环境信息等多维度条件灵活组合鉴权规则,实现细粒度访问控制 |
| 统一策略入口 | 同一份策略同时覆盖 HTTP API 和 HTTP 访问服务(云函数/云托管/静态托管等)入口,统一管控公网流量 |
| 拒绝原因可溯源 | 拒绝请求时可向调用方返回可读的拒绝原因,便于快速排查权限问题 |
| 在平台默认策略基础上定制 | 平台已内置各资源类型的默认放通/拒绝规则,你只需编写策略调整需要覆盖的规则,无需从零开始 |
| 支持标准 Rego 语法 | 基于 OPA 开源策略引擎,使用通用的 Rego 策略语言,学习成本低,社区资源丰富 |
与其他安全能力的关系
云开发提供了多层安全能力,OPA 鉴权策略位于请求入口的 访问控制 层,与其他能力协作形成防护体系:
| 能力 | 作用域 | 控制维度 | 何时选用 |
|---|---|---|---|
| OPA 鉴权策略 | 环境内所有 HTTP API 和 HTTP 访问服务 请求 | 用户 + 请求 + 环境上下文 | 需要复杂条件组合、基于请求级别、可编程的访问控制 |
| 限频设置 | 云函数、云托管 | QPS(资源维度 / 客户端维度) | 防刷、防过载 |
| 静态托管安全配置 | 静态托管资源 | Referer / IP / QPS | 静态资源防盗链 |
| 安全来源 | 客户端 SDK 调用 | 域名白名单 | 限制 SDK 调用来源 |
快速开始
以下为一段最小可用策略:
package authz.user
# 默认拒绝
default allow := false
# 管理员访问 /v1/ 路径放行
allow if {
input.subject.auth_type == "administrator"
startswith(input.request.path, "/v1/")
}
# 未认证用户禁止 DELETE
deny contains "DELETE requires authentication" if {
input.request.method == "DELETE"
input.subject.auth_type == "unauthenticated"
}
示例中的 startswith 是 Rego 内建函数。完整语法与内建函数清单见 Rego 语言参考 与 Rego 内建函数列表;出于安全考虑,CloudBase 仅启用其中的一个白名单子集,常见禁用函数见附录 B。
策略输入 input 由云开发在每次请求时构造,完整结构如下,字段详细定义请参考 策略上下文:
{
"subject": {
"user_id": "c-user-123",
"auth_type": "administrator",
"groups": ["developer"]
},
"request": {
"method": "GET",
"raw_host": "env-xxx.api.tcloudbasegateway.com",
"host": "env-xxx.api.tcloudbasegateway.com",
"path": "/v1/functions/foo",
"query": {"page": "1"},
"client_ip": "10.1.2.3",
"header": {"X-Env-Id": ["env-xxx"]},
"header_map": {"X-Env-Id": "env-xxx"}
},
"cloudbase": {
"env_id": "env-xxx",
"region": "ap-shanghai",
"entrypoint_type": "tcbopenapi",
"resource_type": "functions"
}
}
决策矩阵速查:
deny | allow | 最终结果 |
|---|---|---|
true | 任意 | 拒绝 |
false | true | 允许 |
false | false | 拒绝 |
策略上下文(input)
input 是策略可读取的唯一外部数据,固定包含三个顶层字段:
input.subject # 请求主体(用户)
input.request # 当前 HTTP 请求
input.cloudbase # CloudBase 环境上下文