企业 AI 查询的权限隔离:为什么不能只靠提示词

“请只查询当前用户有权访问的数据”是一条有用的提示,但它不是权限系统。真正的数据隔离必须落在身份、接口和查询执行层,且对每一次工具调用都生效。

“请只查询当前用户有权访问的数据”是一条有用的提示,但它不是权限系统。真正的数据隔离必须落在身份、接口和查询执行层,且对每一次工具调用都生效。

把模型放在不可信输入链中

自然语言、检索到的文档、工具返回值都有可能带有误导性内容。AI 既可能误解组织范围,也可能受到提示注入。应用可以让模型提出“查询本季度成交机会”的意图,但不能让模型自由决定是否绕过租户或用户限制。

推荐的权限执行顺序

已认证用户(可信 user_id / tenant_id)
  → 意图识别(模型)
  → 工具白名单与参数结构校验(应用)
  → 对象级 / 行级权限判断(服务端)
  → 参数化执行(CRM API 或数据库)
  → 结果裁剪与敏感字段脱敏
  → 返回用户 + 审计记录

服务端的 tenant_id、user_id 和授权范围应由可信会话获取,不能采用模型生成的用户标识。工具调用中的筛选参数只能收窄权限,不能扩大权限。

查询示意:先约束授权范围

-- 示例结构,仅说明过滤原则;不是可直接运行的业务 SQL
SELECT customer_id, customer_name, last_followup_at
FROM visible_customers
WHERE tenant_id = :trusted_tenant_id
  AND owner_id IN (:authorized_owner_ids)
  AND last_followup_at < :cutoff_date
ORDER BY last_followup_at ASC
LIMIT :validated_limit;

实际实施时应通过经过审查的查询视图、业务 API 或有严格参数绑定的查询构造器执行。不同数据库对列表参数的绑定语法不同,不能直接把字符串拼接进 SQL。仅靠数据库视图也无法替代多层授权和安全审计。

RBAC 与数据范围是两件事

  • RBAC(基于角色的访问控制)解决“能否执行这个功能”:例如销售可以查询客户、普通员工不能导出客户全表。
  • 数据范围解决“可以访问哪些记录”:例如仅本人负责、所属团队或经过授权的客户。
  • 字段级保护解决“能看到什么细节”:例如可以查看销售统计,但不暴露客户手机号或合同附件。
  • 操作级保护解决“可以做什么动作”:写入、批量导出、外发报告应获得更严格的授权。

至少准备这五组越权测试

  1. 用 A 用户询问 B 用户的客户信息,预期返回拒绝或只返回 A 的可见部分。
  2. 让模型将 owner_id、tenant_id 改成其他值,检查服务端能否阻断。
  3. 在搜索结果或外部文档中植入“忽略限制”的文字,验证工具权限不变。
  4. 测试聚合报表是否通过小样本分组泄露个体敏感信息,必要时设置阈值。
  5. 测试定时报告的接收人、附件和查询范围是否继承原授权且在执行时重新校验。

上线后的审计应该记录什么

记录请求关联 ID、调用主体、工具名、执行范围、授权决策、耗时和结果数量等必要信息。敏感入参及结果内容应最小化留存,并设置访问控制和保存周期;不要把全部客户资料直接写进普通日志。

参考资料与延伸阅读

本文为公开技术方法整理,不披露客户项目细节;文中的示例仅用于解释架构和工程判断。

返回技术文章讨论技术问题