4. AI服务接口授权与访问控制

认证解决“你是谁”,授权解决“你能做什么”。在AI服务接口中,授权比传统业务系统更复杂:调用方不仅要访问某个HTTP端点,还要在端点内部指定模型、提示模板、工具函数、知识库分区、推理参数上限等资源。如果只做“登录即可调用”的粗粒度控制,越权风险会以多种形态出现——低权限用户调用高价值模型、跨租户读取他人知识库、通过参数注入绕过工具白名单、用超长上下文拖垮共享推理资源。本节围绕RBAC、ABAC、模型能力授权与策略引擎,说明如何把授权决策落到每一次推理请求上。

一、从RBAC到ABAC:授权模型的演进

RBAC(基于角色的访问控制)以“用户—角色—权限”三层映射为核心。例如在AI平台中定义viewer、app_developer、model_operator、tenant_admin四类角色,app_developer可调用/v1/chat/completions但只能使用gpt-4o-mini级别模型,model_operator可发布模型版本但不能读取用户对话内容。RBAC的优点是易管理、审计清晰,缺点是难以表达“同一角色在不同租户、不同时段、不同数据敏感级别下权限不同”的细粒度需求。

ABAC(基于属性的访问控制)用主体属性、资源属性、操作属性和环境属性共同计算决策。典型策略可表达为:当subject.tenant_id == resource.tenant_id且subject.clearance >= resource.data_class且environment.time在工作时段内时允许访问。ABAC灵活但策略数量增长快,需要策略引擎统一管理。实践中常采用RBAC+ABAC混合:角色决定基础能力边界,属性策略做租户隔离、数据分级和动态约束。

AI服务接口授权决策链:从请求到策略判定 调用请求 API Key / OAuth Token tenant_id · model · tools 身份认证 签名校验 / JWT解析 提取主体属性 细粒度策略引擎 RBAC角色基线 + ABAC属性规则 模型能力授权表 · 工具白名单 租户隔离 · 数据分级 · 时段约束 决策结果 Allow → 注入能力令牌,转发推理 Deny → 403 + 审计事件 Step-up → 要求二次审批 四类典型越权风险与防控点 ① 横向越权 租户A读取租户B会话 防控:tenant_id强绑定 资源查询强制带租户过滤 策略:subject.tenant == res.tenant ② 纵向越权 普通用户调用管理员接口 防控:角色-端点映射表 管理端点独立鉴权中间件 策略:role in allowed_roles ③ 模型能力越权 低权限调用高价值模型 防控:模型能力授权表 按模型分级+配额限制 策略:model_tier ≤ clearance ④ 参数注入越权 提示注入绕过工具白名单 防控:工具调用二次校验 参数schema强校验+沙箱 策略:tool ∈ allowed_tools 审计与持续收敛 每次决策记录:主体 · 资源 · 操作 · 环境 · 结果 · 策略ID → 异常检测 → 策略调优

二、模型能力授权:把“能调用”细化为“能用什么模型、用多少”

模型能力授权是AI接口特有的授权维度。同一个/v1/chat/completions端点,背后可能挂载多个模型,成本、延迟、合规等级差异巨大。建议建立“模型能力授权表”,把模型按能力等级分层,例如:

能力等级示例模型允许角色单次最大Token日调用配额
L1 基础轻量对话模型viewer, app_developer4,0962,000
L2 增强通用大模型app_developer, model_operator16,384500
L3 高价值旗舰推理模型model_operator(需审批)32,76850
L4 敏感含敏感数据微调模型tenant_admin + 数据分级达标8,19220

授权判定时,策略引擎先检查角色是否在allowed_roles中,再校验请求的max_tokens是否超过该等级上限,最后检查当日配额余量。任一不满足即拒绝,并返回明确的错误码,例如MODEL_TIER_FORBIDDEN或QUOTA_EXCEEDED,便于调用方定位问题。

三、细粒度策略引擎的实现要点

策略引擎应独立于业务代码,以“策略即配置”的方式管理。推荐使用类似OPA/Rego或Cedar的策略语言,输入为JSON格式的请求上下文,输出为Allow/Deny/Step-up。一个简化的策略判定输入示例:

{
  "subject": {
    "user_id": "u_1024",
    "tenant_id": "t_acme",
    "roles": ["app_developer"],
    "clearance": 2
  },
  "resource": {
    "endpoint": "/v1/chat/completions",
    "model": "general-large",
    "model_tier": 2,
    "data_class": 2,
    "tenant_id": "t_acme"
  },
  "action": "invoke",
  "environment": {
    "time": "2025-06-10T10:30:00+08:00",
    "ip_zone": "corp",
    "risk_score": 12
  }
}

策略引擎按顺序执行:租户一致性检查 → 角色-端点匹配 → 模型等级与clearance比较 → 数据分级校验 → 环境风险评分判断。若risk_score超过阈值(例如80),即使其他条件满足也返回Step-up,要求二次认证或人工审批。这种“默认拒绝、显式允许”的设计能有效收敛越权面。

策略引擎的输入上下文应尽量完整,但不要包含原始提示词或用户隐私数据。审计日志中记录策略ID和判定结果即可,敏感内容单独脱敏存储。

四、越权风险防控的落地检查

越权风险往往不在单点,而在“认证通过后”的信任惯性。建议在接口层做三项强制检查:第一,所有资源查询必须携带tenant_id过滤条件,禁止仅凭资源ID查询;第二,工具调用(Function Calling)必须经过独立白名单校验,不能因为模型“决定调用”就放行;第三,管理类端点与推理端点使用不同的鉴权中间件,避免角色继承导致纵向越权。

以一个实际排障场景为例:某租户反馈“A用户能看到B用户的会话列表”。排查发现会话查询接口只校验了登录态,未校验session.tenant_id == subject.tenant_id。修复方式是在数据访问层强制注入租户过滤,并在策略引擎中增加一条ABAC规则:resource.tenant_id == subject.tenant_id,否则Deny。修复后通过构造跨租户请求验证返回403,并确认审计日志中记录了policy_id: tenant_isolation_v2。

不要依赖前端隐藏按钮或模型自身的“安全对齐”来防越权。授权决策必须在服务端、在每次请求上、以策略引擎的判定结果为准。

综上,AI服务接口的授权体系应以RBAC划定能力基线,以ABAC处理租户、数据分级和环境动态约束,以模型能力授权表控制模型与配额,以独立策略引擎统一判定,并通过审计闭环持续发现和收敛越权风险。只有把授权从“端点级”下沉到“模型级、工具级、数据级”,才能在开放AI能力的同时守住安全边界。