共享服务账户不是每个租户授权的
应用程序通常为了方便而使用单个长生命周期的服务账户,并赋予其广泛的权限。然而,这种方法并非针对代码执行操作的安全租户级授权模型。当针对某个租户的请求触发某项操作时,拥有特权的该服务账户往往能够访问属于其他租户的数据。仅依赖在数据库中检查租户 ID 是不够的,因为后续添加的缓存或搜索索引等组件可能会绕过这种有限的检查。为确保安全性,服务账户应定义进程的最大能力,而非作为每项操作的授权凭证。在执行任何副作用操作之前,必须强制执行授权,其范围应与在线 API 保持一致,即使对于后台任务也是如此。对于出站调用,使用短生命周期、作用域狭窄的令牌优于使用单个全权密钥。准确记录租户 ID、资源 ID 以及所使用的服务身份对于事件调查至关重要。如果同一段代码路径能够通过共享服务账户成功访问其他租户的资源,这表明缺乏授权,而非真正的安全。虽然共享凭证用于管理进程执行,但最终决定可访问和修改哪些对象的仍是授权机制。