工具调用租户不敏感的 internal 端点后必须校验响应的 tenant_id,不匹配当 “not found”。
这是什么意思?
文章目录
- 多租户安全隔离原则
- 关键概念
- 1. 什么是"租户不敏感的 internal 端点"?
- 2. "必须校验响应的 tenant_id"
- 3. "不匹配当 not found"
- 为什么要这样做?
- 一句话总结
多租户安全隔离原则
这是一条多租户系统中的数据安全隔离规则,常见于 SaaS 平台或 AI Agent 工具调用的安全规范中。下面逐句拆解:
关键概念
1. 什么是"租户不敏感的 internal 端点"?
指的是那些本身不会按租户过滤数据的内部 API。比如:
GET /internal/orders/12345这个端点可能只根据order_id查数据,不管你是哪个租户,只要 ID 存在就返回结果。与之相对的是"租户敏感"端点,会在 SQL 层面自动加上WHERE tenant_id = ?的过滤。
2. “必须校验响应的 tenant_id”
既然端点本身不做租户隔离,那调用方(工具/Agent)就必须自己来做这层校验:
response=call_internal_endpoint(resource_id)# ⚠️ 关键步骤:校验返回数据中的 tenant_idifresponse.tenant_id!=current_user.tenant_id:# 不匹配 → 当作不存在raiseNotFoundError()3. “不匹配当 not found”
如果tenant_id不匹配,不能返回"权限不足"(403 Forbidden),而应该返回“未找到”(404 Not Found)。
为什么要这样做?
| 做法 | 风险 |
|---|---|
| 返回 403 Forbidden | 攻击者能推断出"这个资源存在,只是不属于我" →信息泄露 |
| 返回 404 Not Found | 攻击者无法区分"资源不存在"和"资源存在但不属于我" →安全 |
这是一种经典的安全模糊化(Security through Ambiguity)策略,防止跨租户的资源枚举攻击(Resource Enumeration Attack)。
一句话总结
当你调用的内部接口不区分租户时,你必须在拿到结果后自己检查数据属于哪个租户;如果数据不是当前租户的,就假装这个数据根本不存在,从而防止跨租户的数据泄露和探测攻击。