日期:2026-08-15
我们网关后面挂着好几种模型,有通用的、有垂直小模型,还有几个内部敏感模型。早期图省事,所有应用都能调所有模型,结果一个测试应用把生产用的高价模型刷爆了额度,账单月底吓人一跳,更麻烦的是它顺手调到了一个不该碰的内部模型。我们复盘时发现,网关的鉴权只管"能不能进来",不管"进来后能调什么",这在多模型多租户的场景里等于没设防。随着接入的应用从几个涨到几十个,这种宽授权迟早出大事,我们当时判断,最小授权不是合规要求,是运维自己的保命绳,必须先收紧再谈别的。
权限是建在 AI 网关的接入层和管控台之上的。我们按"应用加部门"两维做模型调用授权,每个应用只能调被显式授权的模型,敏感模型额外加二级审批,授权变更走审批流并留痕。越权调用在网关入口实时拦截,不进模型就直接拒,同时记一条审计。管控台能看到每个应用调了哪些模型、额度用了多少,超授权的尝试一眼能看见。整个最小授权是默认拒绝,需要什么开什么,新应用接入默认只有通用模型,要敏感模型得单独申请。
第一个难点是授权粒度与运维成本的平衡。接口级授权最严但最烦,我们先用应用加模型两维,把大面卡住,再对少数敏感模型细化到接口,不一步到位,否则工单会淹死运维。第二个难点是敏感模型的界定,哪些算敏感不能拍脑袋,我们列了三类的清单:高价模型、内部数据模型、合规受限模型,清单由安全团队和维护团队共同维护,每季度复盘一次。第三个难点是越权实时拦截,拦截要在路由分发前完成,不能等模型返回才发现调错了,我们把它放在接入层最前面。第四个难点是授权变更的回溯,每次开权限都要能查到谁、为什么、什么时间,我们落地了变更流水,出事能秒级定位。我后来觉得,授权收敛别一把梭,先拿测试应用和高价模型开刀,见效快、阻力小,剩下的慢慢收,比上来就全员整改容易推行得多。
还有一块是新应用接入的默认姿态,我们定了默认最小集加按需申请的规矩,新应用进来只有通用模型,要敏感模型走审批,避免为了省事又开成宽授权。这个默认姿态让收敛工作从救火变成日常,新接入的天然就是干净的,不用事后去收,运维轻松一大截。
另外,授权和额度要绑定看,光管能调什么不够,还得管调多少,我们让授权和计量配额联动,超授权的尝试拦截、超额度的请求降级,两套一起才兜得住。这点早期只做了授权没做额度联动,结果有人拿到了授权但把额度刷爆,账单还是炸,补了联动才闭环。权限和成本是一体两面,分开管永远是漏洞,这个教训我们记牢了。
上线后,越权调用拦截数每月稳定在约两百次,敏感模型误用率从约百分之三降到接近零。授权收敛比例(被收回的多余授权占原授权)约四成,主要砍在测试环境和跨部门的宽授权上。审计覆盖率达到百分之百,每次授权变更都可回溯到人和时间。高价模型的异常额度消耗下降约七成,那张让财务跳脚的月底账单再没出现过。新应用接入的平均授权开通时长从约一天压到约两小时,因为默认最小集很清晰,不用反复拉群确认。
权限收敛之后,安全团队终于不用每周救火,把精力转到敏感模型清单的季度复盘上,治理从被动堵漏进入正循环,这也是我们最乐意看到的变化。
网关授权别一上来就细到接口级,先按应用和模型两维把最小授权卡住,再逐步收紧,否则运维会被工单淹死,项目也容易因为阻力大而流产。敏感模型清单要两方共维护,安全团队定边界、维护团队定细节,单方面列容易漏也容易过严,过严了业务会绕过去,反而更危险。越权拦截必须放在路由前,等模型返回再发现就晚了,那条内部模型被测试应用摸到的事就是教训。说到底,最小授权不是一次性工程,是持续收敛的过程,每月看一眼越权日志,比年底搞一次大排查有用,系统越用越干净。
我们也踩过坑,早期授权变更没留痕,一次误开高价模型查了半天才定位到谁,之后落地了变更流水才踏实。最小授权要想长久,可追溯和持续收敛比一次性收紧更关键,这点我们是用一次事故记住的,现在每月必看越权日志,从不间断。
权限治理最难的不是技术,是让人接受先收再放的节奏,我们靠先打痛点再推全局,才没激起太大反弹,系统也慢慢干净起来。
案例片段(已脱敏): 应用级模型授权与越权拦截规则:
yaml authz: default: deny grants: - app: app_test_01 models: [m_general] # 仅通用模型 deny: [m_internal, m_expensive] - app: app_finance_02 models: [m_general, m_finance] sensitive_models: m_finance: second_approval # 二级审批 intercept_at: gateway_in # 路由前拦截越权拦截日志节选:[2026-08-04 10:31] app=app_test_01 denied target=m_expensive(高价) reason=not_granted 拦截于 gateway_in, 未进入模型 审计留痕: operator=auto, policy=authz_v2