「資料放在公司內網」不是私有語料搜尋的安全設計。文件一旦進入管線,內容還會出現在 connector 暫存區、解析結果、全文索引、向量、查詢紀錄、追蹤資料與模型請求裡。真正的邊界不是一條網路線,而是每一份資料在每個元件之間能不能流動。
這個系列處理資料生命週期:資料如何進來、被更新、被授權查詢,最後確實消失。BM25、向量搜尋和 reranker 只標出位置;檢索技法請回到〈RAG 技法大全〉。
先寫四張清單,再選元件
第一張是資料分級。公開資料、內部資料、機密資料、個資與受法規約束資料,能進的環境不一定相同。不要只替原始檔案分級;切塊、embedding、摘要和 query log 都可能保留可辨識內容,也要繼承來源的敏感等級。
第二張是資料落點。逐一列出原始檔、暫存檔、索引、備份、dead-letter queue、應用程式 log、模型供應商與觀測平台的地區、加密方式、保存期限和管理者。任何一格答不出來,都還不能聲稱資料沒有外流。
第三張是身分與權限來源。使用者是誰、屬於哪個租戶與群組、文件 ACL 從哪個系統同步、撤權多久生效,都要有唯一答案。NIST SP 800-207 的核心不是「全部放內網」,而是不因網路位置或資產所有權給予隱含信任。保護的對象是資源,存取前仍要驗證身分並授權。
第四張是 freshness SLA。政策文件也許要求來源更新後十分鐘內可查,離職撤權可能要求一分鐘內生效,法務刪除則要求在期限內從索引、快取與備份處理完成。沒有具體期限,「最終一致」只是把未知延遲換個名字。
架構的主脊是 policy enforcement
一條可稽核的管線可以畫成:
Source systems
│ content + source ACL + revision
▼
Connector → quarantine/parser → canonical document store
│
policy-aware indexer
┌────────┴────────┐
▼ ▼
Meilisearch Qdrant
(lexical) (vector)
└────────┬────────┘
▼
User → identity → policy decision → filtered retrieval → reranker → LLM
│ │ │
└──── audit metadata, not unrestricted content ────┘
這張圖有三個刻意的決定。
首先,connector 同步的不只是文字,還有穩定的 source ID、revision、ACL 與刪除訊號。少了其中一項,後面就無法判斷是更新、重複文件、撤權還是刪除。
其次,權限條件要在 trusted server 依登入身分產生,再送進檢索查詢。Qdrant 的多租戶做法可以用 tenant payload 過濾共享 collection;Meilisearch tenant token則把 search rules 放進短效、限縮的憑證。這些是執行機制,不是權限真相來源。若 client 能自己傳 tenant_id,再好的 filter 都只是可選參數。
最後,reranker 與 LLM 只能看到已授權候選。先跨全公司取 top 100,再在應用層刪掉無權文件,不只可能讓敏感內容進入 log 或外部模型,也會因過濾後候選不足而傷害召回率。
威脅模型要涵蓋資料與指令
至少檢查五條路徑:
- connector token 被竊後,攻擊者能讀多少來源、寫入什麼內容;
- 惡意文件進入索引後,能不能以 hidden instruction 影響模型;
- 使用者能不能修改 tenant、ACL filter、index 名稱或查詢上限;
- log、trace、錯誤訊息與 DLQ 是否留下完整私密內容;
- 撤權或刪除後,舊 chunk、快取、snapshot 與重建資料集是否仍可被找回。
OWASP 的 RAG Security Cheat Sheet把 ingestion 到 output 都視為攻擊面;其 prompt injection 指引也明確指出,RAG 不會消除 prompt injection。這表示檢索出的文件仍是不可信輸入:解析階段要隔離、掃描隱藏內容,生成階段限制工具與輸出,不能期待 system prompt 自己守住資料。
自架、託管與混合式怎麼切
全自架適合資料不得離開自管環境,且團隊真的能維運金鑰、TLS、備份、修補與災難復原。它減少第三方資料處理者,沒有消除內部誤設、log 外洩與過度權限。
全託管適合合約、資料所在地、保存與刪除承諾都符合要求,而且團隊要把維運責任交出去。評估單位不能只到搜尋服務:embedding、reranking、LLM 與 observability 每一家都要算。
混合式常是比較務實的答案。原始文件與敏感 metadata 留在自管環境,只把允許的切塊送到特定服務;或全文搜尋留內部,僅對低敏感資料使用外部模型。代價是跨邊界的 lineage、刪除與事故調查更複雜。
今晚能做的動作是畫出「元件 × 資料類型」矩陣。每格填入允許/禁止、保存期限、加密、管理身分與刪除方式;填不出的格子先視為禁止。這張矩陣比先決定 Qdrant 或 Meilisearch 更接近真正的架構決策。
上線閘門
- 用兩個租戶加一份跨群組文件做負向權限測試,確認未授權內容不會離開搜尋引擎。
- 停用一名使用者與刪除一份文件,量到各索引、快取、查詢服務與備份政策的實際傳播時間。
- 逐一檢查 log、trace、DLQ 與模型請求,只保留除錯真正需要的欄位。
- 演練 connector token 洩漏、惡意文件與索引服務故障,確認能停同步、撤銷憑證並從 source of truth 重建。
這篇只建立邊界。下一篇才把 canonical ID、checksum、idempotent upsert 與 tombstone 接成可持續同步的管線。第三篇深入查詢權限與刪除傳播,最後用固定繁中 corpus 做 Retrieval Eval。
參考資料
Loading...