知识库文档权限细粒度控制与脱敏检索落地

日期:2026-08-02

一、项目背景

这家客户是企业知识库场景,文档量不算特别夸张,但来源杂——法务、财务、人力、研发各部门的文档混在一个检索系统里,员工搜一句话,系统把匹配结果一股脑返回。问题来了:法务的合同草稿、财务的预算明细、研发的未公开设计,全被不同部门的同事搜到了。我们做合规审计时发现,越权访问的隐患不是偶发,而是"默认全可见"这个设计本身就在持续制造风险。更糟的是,即便权限分了,检索返回的摘要里直接带着敏感字段(比如金额、身份证号片段),脱敏根本没做,等于"挡了门却把钥匙挂在门口"。

客户的安全团队给我们的要求是硬性的:检索结果必须按访问者身份动态过滤,敏感字段在结果层就要脱敏,且每一次越权尝试都要留痕可审计。这三条直接推翻了原来的"先搜再人工判断"流程。

二、落地场景

我们重构了"检索前—检索中—结果后"三段。检索前,给每份文档打上权限标签:部门可见、角色可见、密级(公开/内部/机密)、以及字段级敏感标注(哪些段落含金额、证件、联系方式)。检索中,查询进入后先解析访问者身份与权限范围,检索召回的候选文档先做权限过滤,无权限的直接剔除,不进入重排。结果后,对通过权限的文档做字段级脱敏:敏感字段在摘要与片段里用掩码替代,原文访问需二次鉴权。访问行为全程留审计日志,越权尝试(搜了无权文档)单独标记。

三、关键技术挑战与解决思路

第一个挑战是文档权限粒度建模。权限不能只到"文档级",因为一份合同里可能只有金额条款敏感。我们的做法是双层标签:文档级定部门/角色/密级,段落或字段级定敏感类型。检索过滤先按文档级粗筛,结果展示按字段级细筛,两层解耦,扩展性更好——新增一种敏感类型只需加标注规则,不用动权限引擎。

第二个挑战是检索结果动态过滤。难点在于"过滤要在重排之前还是之后"。我们选择在召回后、重排前过滤:先用向量检索召回 Top-K 候选,再拿访问者权限逐条比对标签,剔除无权限项,剩余进入重排。这样保证排在最前面的一定是"有权限且相关"的,不会出现"相关但看不见、白占一个结果位"的尴尬。

第三个挑战是字段级脱敏。脱敏必须在结果层做,而不是在索引层——因为索引需要原文做召回,不能提前抹掉。我们在返回片段时跑一个脱敏管线:识别金额、证件、手机号、地址等模式,按权限决定"掩码"还是"保留",机密字段即便有权限看摘要,也只给脱敏视图,要看原文走二次鉴权。

第四个挑战是越权访问拦截与审计。我们把"搜了无权文档"本身当成信号:虽然候选被过滤了,但这次查询意图记下来,若某用户高频尝试访问某密级文档,安全团队可收到预警。所有访问(含被拦截的)都写审计日志,合规检查时能还原"谁在什么时间试图看什么"。

案例片段(已脱敏): 文档权限标签:doc_tags = {dept: ["legal"], role: ["legal_staff","manager"], level: "confidential", sensitive_fields: ["amount","id_card"]}。检索过滤伪码:candidates = vector_search(q, top_k=50); allowed = [d for d in candidates if auth.check(user, d.doc_tags)]; ranked = rerank(allowed)。字段脱敏:snippet = mask(snippet, fields=d.sensitive_fields, policy="mask_except_last4")。审计日志:log(access: {user, query, hit_docs, denied_docs, ts});越权预警:if freq(denied_by_user[level]) > N then alert(security)

四、效果数据

上线后做了两轮红蓝对抗测试(脱敏示意):越权访问拦截率从原系统的约 0%(默认全可见)提升到约 99.5%,剩下 0.5% 是标注遗漏,已通过标注规则补丁堵上。敏感字段脱敏命中率约 98.7%,未脱敏漏出的多为非标准格式字段,已补充识别正则。检索准确率(有权限相关结果排名)与原系统持平,说明过滤没牺牲相关性。审计覆盖率 100%,安全团队在一个月内通过越权预警发现并处置了两起内部异常访问尝试。合规审计从"发现问题一大堆"变成"一次通过"。

五、可复用经验总结

第一,检索先绑定权限再返回。把权限过滤前置到重排前,既保安全又保体验,比"搜出来再隐藏"干净得多。第二,脱敏要在结果层做。索引需要原文召回,提前抹掉会伤相关性,正确位置是返回前的片段处理。第三,权限要文档级和字段级双层。只做文档级,敏感字段会裸奔;只做字段级,过滤粒度又太碎。双层解耦最稳。第四,越权尝试本身就是情报。把被拦截的访问记下来做预警,比单纯拦了更有安全价值。

给同行一句提醒:企业知识库的雷,往往不在"搜不到",而在"搜到了不该看的"。权限和脱敏看着是合规负担,实则是知识库能不能放心开放给全员用的前提。我们这套"检索前标签、检索中过滤、结果后脱敏、全程留痕"的四段式,在多个客户处都验证过,复用性很强。

结语

知识库的价值在于"该看的看得顺、不该看的看不见"。技术上没有多高深,难的是把权限、脱敏、审计当成一等公民嵌进检索链路,而不是事后打补丁。当我们把每次检索都变成一次带身份、带边界、带留痕的受控操作,知识库才真正敢向全公司敞开。