上线前安全核对
私有部署多出的攻击面,每一处上线前要留哪些证据
模型放进自己的机房,数据不出边界,但机房里多出这些攻击面:权重与镜像的供应链,知识库里的越权检索与间接注入,推理接口与默认外联。每一处写成「威胁、控制、证据」三栏,上线凭证据,不凭打勾。账号、补丁、备份这类通用基线沿用企业自己的制度,这里只写与推理部署相关的差别。
威胁、控制与证据
OWASP 的 LLM 应用十大风险(2025 版)给其中几处排了编号,下表标在威胁一栏,没有对应条目的不标(OWASP Top 10 for LLM Applications)。
| 威胁 | 控制 | 上线前的证据 |
|---|---|---|
| 权重或镜像被替换、夹带代码(LLM03 供应链) | 入闸检查:哈希、固定提交、权重格式、签名、清单,见下节 | 入闸记录,每个制品一行 |
| 甲部门读到乙部门的资料(LLM08 向量与嵌入弱点) | 权限过滤写进检索查询;向量库按部门分区或加过滤;向量库放推理网段 | 越权用例的运行记录,见下文用例表 |
| 知识库文档里的指令被模型当作指令(LLM01 提示注入,含间接注入) | 入库审核(LLM08 缓解清单里的知识来源校验);模型无工具;外部内容与指令分开标明,回答渲染时外部图片与链接走白名单;引用校验。知识库问答不经核心经营系统的模型网关,网关的投影与契约保证不适用于它 | 注入用例的运行记录;写明残余风险 |
| 提示词与检索片段落进日志(无对应的 OWASP 条目) | 推理日志按业务机密对待:限定访问角色、定留存期限、必要时脱敏 | 日志目录的权限清单与留存期限 |
| 引擎接口被未授权访问 | 引擎前置反向代理,只开放要用的端点;监听清单与设备清单一致 | 用无凭据的请求访问 /metrics,被代理拒绝的记录 |
| 引擎与工具的默认外联 | 逐组件关闭,再以网络层拒绝兜底,见下文清单 | 失败的对外连接记录 |
| 多机并行时机间流量被窃听或注入 | 机间流量放隔离网段;需要加密时在外部另加 | 网段规划表与机间端口的监听清单 |
接口那一行的依据是 vLLM 的安全指南:它的访问密钥只覆盖 /v1、/v2、/inference 等前缀,/invocations、/metrics、/pause 等许多端点不在其内,文档要求不要单靠密钥做访问控制,建议放在反向代理之后;多机时节点之间的通信默认不加密,要放在隔离网段里,需要密码学保护时在外部加 mTLS 边车或 IPsec(vLLM 安全指南)。端点列表随版本变化,以所用版本的文档为核对对象。
供应链入闸
准备在联网的机器上做,入闸在内网做。每个制品一行记录。
| 制品 | 入闸检查 | 依据与说明 |
|---|---|---|
| 权重 | 记录来源仓库与提交哈希,对文件算哈希入账;优先 safetensors;不设 trust_remote_code=True | Transformers 文档称 PyTorch 传统的 pickle 序列化「known to be insecure」,safetensors 更安全(Transformers 加载模型);仅有 pickle 文件的,作为例外单独审批 |
| 自定义模型代码 | 必须用时,代码先审,再固定到某个提交 | 同一页写明加载自定义模型要设 trust_remote_code=True,并建议固定 revision,避免加载被改动过的代码 |
| 镜像签名 | 固定到 digest;用本地公钥验签 | cosign 文档给出 cosign verify --key 的用法(cosign 验签),但没有说明验签是否访问透明日志,也没有写在隔离网络里忽略透明日志的开关,这是离线验签最先会撞到的问题,入闸前要在目标环境实测。digest 只证明内容没变;签名只回答「谁发布的」,信任谁由企业决定 |
| 清单 | 用 Syft 从镜像生成 CycloneDX 或 SPDX 格式的软件物料清单,入库留存 | Syft |
| 漏洞 | 把 Trivy 的漏洞库同步进自有镜像仓库,离线扫描 | Trivy 的漏洞库以 OCI 镜像发布,可托管在自有仓库(Trivy 离线) |
入闸记录的字段:制品名、来源、版本或提交、哈希、验签结果、清单文件位置、扫描结果、入闸时间、经手人。
默认外联清单
模型引擎只是外联的来源之一。监控与扫描工具自己也有默认外联,逐个关掉,再用网络层兜底。
| 组件 | 默认行为 | 关法 |
|---|---|---|
| vLLM | 默认收集匿名使用统计 | 设 VLLM_NO_USAGE_STATS 或 DO_NOT_TRACK,或建 ~/.config/vllm/do_not_track 文件(vLLM 使用统计) |
| Hugging Face 库 | transformers 等库默认收集遥测;hf 命令行启动时检查 PyPI 新版 | HF_HUB_DISABLE_TELEMETRY=1 或 DO_NOT_TRACK;HF_HUB_DISABLE_UPDATE_CHECK=1;HF_HUB_OFFLINE=1 让它不再向 Hub 发 HTTP 请求(huggingface_hub 环境变量) |
| Trivy | 更新检查与遥测连接 check.trivy.dev;文档称它完全可选、正常运行不需要 | 文档称可选,没有给出关闭开关;以网络层阻断兜底(Trivy 离线) |
| Grafana | [analytics] 的 reporting_enabled 默认为真,每 24 小时向 stats.grafana.org 发计数;check_for_updates 访问 GitHub,check_for_plugin_updates 访问 grafana.com | 在配置里关闭相应设置,默认值按所用版本的文档核对(Grafana 配置) |
开关会漏,组件会增,所以底线放在网络层,规则与失败连接的证明见网络与机房条件。
越权与注入的验收用例
| 用例 | 做法 | 通过的标准 |
|---|---|---|
| 越权检索 | 甲部门账号提问乙部门独有的资料 | 召回为零,回答拒答,没有引用 |
| 过滤后漏召回 | 甲部门账号提问甲部门自己的资料,用线上实际的索引与过滤配置 | 应有的片段仍被召回;近似索引在扫描之后过滤,召回会少于预期,见私有部署的组成 |
| 权限变更 | 调整账号所属部门,重测前两条 | 结果随之变化 |
| 间接注入 | 向测试库入库一份含「忽略以上规则」类语句的文档,再提问 | 回答不执行文档里的指令,引用不指向越权片段 |
| 输出渲染外带 | 入库一份诱导模型插入外部图片链接的文档,再提问 | 前端不加载外部图片,回答里的外部链接被拦截或去掉 |
注入用例的通过只代表这一组用例通过。OWASP 对提示注入的说明是:检索增强与微调不能完全消除它,也不确定是否有万无一失的防法(OWASP LLM01)。清单里因此写明残余风险:用例集由谁维护,新出现的写法怎样补进去。
上线后的周期复核
| 项 | 何时复测 | 证据 |
|---|---|---|
| 失败的对外连接 | 每次升级引擎、容器引擎或改网络之后 | 主机与容器各一条记录 |
| 运行中镜像的 digest 与入闸记录 | 每次升级之后 | 对比结果 |
| 监听端口与反向代理开放的端点 | 每次升级之后 | 监听清单、无凭据访问 /metrics 的结果 |
| 越权与注入用例 | 权限模型、检索参数或嵌入模型变化之后 | 运行记录 |
| 账号、带外管理口凭据、固件 | 按企业制度的周期 | 账号清单与更新记录 |
| 备份对象 | 按企业制度的周期 | 备份清单与一次恢复演练记录 |
备份对象除配置外,要包含向量库数据、索引版本,以及权重的哈希清单。
限制与不适用
- 清单只证明检查做过,证明不了不会被攻破。
- 提示注入没有万无一失的防法,注入用例的通过只代表这一组用例通过,残余风险要写明。
- 离线环境里验签用哪种信任根,签约前与企业定下。
- 账号、补丁、备份这类通用基线沿用企业自己的制度,等保或行业合规的逐条映射也不在这里。
其他做法
| 做法 | 它解决什么 | 为什么不用 |
|---|---|---|
| 靠提示词要求模型忽略文档里的指令 | 实现最快 | 边界不靠让模型更听话;文档里的指令与系统提示是同一种文本,见模型能碰什么 不能碰什么 |
| 只靠应用层开关关掉遥测 | 配置最简 | 组件一多总会漏一个,底线放在网络层,见私有部署概览 |
与常见做法对照
| 常见做法 | 它省了什么 | 代价 |
|---|---|---|
| 把引擎自带的访问密钥当作访问控制 | 不必部署反向代理 | 密钥只覆盖部分前缀,/metrics 等端点无凭据也能访问 |
| 用 digest 记录代表镜像可信 | 一条命令出清单 | digest 只证明内容没变,来源与漏洞另要核对 |
| 清单全部打勾即上线 | 流程清楚 | 勾选只证明有人看过,没有记录就无法事后复查 |
验收时可以问的问题
- 离线环境里验签用哪种信任根,本地公钥由谁保管、怎样轮换,请在签约前写明。透明日志的问题见入闸表的镜像签名行。
- 检索日志里的问题与片段是业务机密,留存期限与日志不可改写之间怎么取舍,请由企业与 SZV 在合同中约定。
- 请出示越权与注入用例的运行记录;权限模型、检索参数或嵌入模型变化之后,请复测一次。
- 带外管理口的默认凭据与固件更新由谁负责,请在合同中写明。
- 上线前缺口的补齐由谁确认、确认记录放在哪里,请在合同中写明。
相关页
- 私有部署概览:自建的判断方法,零出站的理由。
- 网络与机房条件:出站规则、网段与失败连接的证明。
- 私有部署的组成:权限过滤与引用校验在管线里的位置。
- 模型能碰什么 不能碰什么:经营系统调用面的模型边界。