← 返回资讯

聚合网关的密钥与合规安全:保护你的 AI API 访问

2026-07-29

聚合 API 网关的一个核心作用是密钥集中管理——上游的真实 API Key(OpenAI、Anthropic、百度文心等)只存在网关侧,下游应用只持有网关颁发的虚拟 Key。一旦下游 Key 泄露,吊销一个 Key 即可止损,而不必轮换所有上游的真实密钥。但这也意味着网关本身的安全至关重要。

密钥层级与隔离

好的聚合层密钥设计分三层:

上游真实 Key(OPENAI_API_KEY 等)
    ↓ 存在网关侧,加密存储,对下游不可见
网关 Master Key(内部管理用)
    ↓ 用于创建/吊销虚拟 Key
虚拟 Key(发给应用/团队/用户)
    ↓ 可精细化权限控制
你的应用代码

LiteLLM Proxy 生成虚拟 Key 示例:

# 创建一个只能访问特定模型、有预算上限的虚拟 Key
curl -X POST http://localhost:4000/key/generate \
  -H "Authorization: Bearer sk-master-xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "models": ["gpt-4o-mini", "claude-haiku"],
    "max_budget": 5.0,
    "budget_duration": "1mo",
    "metadata": {"team": "frontend", "project": "chatbot"}
  }'

每个虚拟 Key 独立追踪用量,独立设置权限,一旦泄露只吊销该 Key,不影响其他团队。

这套三层结构听起来简单,但很多团队第一次搭网关的时候图省事,直接把上游 Key 原封不动透传给前端调用——这是最常见的事故根源。我见过的一个真实案例:某团队把 OpenAI Key 写进了小程序的前端代码里做”快速验证”,结果被人扒包工具抓出来,几个小时内跑满了当月预算。事后复盘,问题不在于代码写得烂,而在于架构上就没有”隔离层”这个概念——前端根本不该知道上游 Key 长什么样。

网关 Master Key 和虚拟 Key 的权限边界也要分清楚:Master Key 拥有创建、修改、吊销所有虚拟 Key 的权限,只应该躺在你的 CI/CD 密钥库或运维人员的密码管理器里,绝不进业务代码;虚拟 Key 是”一次性发放、按需限权”的凭证,理论上即使全部泄露,损失也被 max_budgetmodels 字段死死框住。这就是为什么上面那条 curl 命令里同时带了 max_budget 和白名单模型列表——少写一个字段,隔离效果就打折扣。实际操作中我建议给每个虚拟 Key 都设置预算和有效期,哪怕内部测试用的 Key 也不例外,“临时用一下”最后忘记吊销才是账单爆炸的常见原因。

上游密钥安全存储

上游真实 Key 的存储安全是重中之重:

存储方式安全性说明
明文写在配置文件配置文件进代码仓库极易泄露
环境变量中等优于明文,但容器日志可能泄漏
Secrets Manager(AWS/阿里云KMS)推荐生产环境使用
HashiCorp Vault动态密钥,支持自动轮换

LiteLLM 支持通过环境变量引用,配置文件中写 "os.environ/OPENAI_API_KEY" 而不是明文值:

model_list:
  - model_name: gpt-4o
    litellm_params:
      model: openai/gpt-4o
      api_key: "os.environ/OPENAI_API_KEY"   # 从环境变量读取,不写明文

环境变量这一步看着是小事,但坑不少。最常见的一个是容器日志泄漏:不少团队习惯在容器启动脚本里打印全部环境变量做调试(比如 printenv 或者 env | tee startup.log),这些日志再被采集到 ELK、阿里云 SLS 之类的日志平台,Key 就这么明晃晃地躺在了日志检索系统里,而日志系统的访问权限往往比密钥管理系统宽松得多。排查这类问题的方法很直接:在你的日志平台里搜一下 sk- 或者 Bearer 这类前缀,如果搜出结果,说明你的密钥已经在裸奔。

另一个容易被忽视的点是 CI/CD 流水线里的环境变量注入。如果你用 GitHub Actions 或者 GitLab CI,Secrets 在构建日志里默认会被打码(显示为 ***),但如果你在脚本里对 Key 做了字符串拼接、Base64 编码或者传给了某个会回显参数的命令,打码规则可能失效,Key 就原样出现在构建日志里。养成的习惯应该是:涉及密钥的命令一律加 set +x(关闭 shell 命令回显),并且构建完成后抽查一次日志确认没有明文残留。

Secrets Manager 和 Vault 比环境变量强在哪儿?核心区别是访问审计自动轮换。环境变量一旦注入到进程里,谁都拿不到”谁在什么时候读取过这个值”的记录;而 KMS/Vault 类工具每次读取都会留痕,你可以在审计日志里看到具体是哪台机器、哪个服务账号在什么时间拉取了密钥。如果你的团队规模还小、预算有限,环境变量+定期人工轮换是可以接受的过渡方案;但一旦涉及多个服务共享密钥、或者有合规审计要求,就该尽早切到 Secrets Manager,越往后迁移成本越高。

访问控制最佳实践

最小权限原则

  • 前端/移动端应用:只允许访问必要的模型,设置严格的 token 预算
  • 内部后台服务:按服务分配独立 Key,便于审计和吊销
  • 开发测试:使用独立的测试 Key,与生产环境隔离

IP 白名单: 对于服务端调用,在网关前置 IP 白名单,拒绝来自未知 IP 的请求。对于面向用户的场景,结合 Rate Limiting 防止滥用。

Rate Limiting

# LiteLLM 全局限速配置
router_settings:
  rpm_limit: 100     # 每分钟最多 100 个请求
  tpm_limit: 100000  # 每分钟最多 10 万 token

也可以对单个虚拟 Key 设置独立的限速策略。

限速这块最容易踩的坑是只设了全局限速,没设单 Key 限速。假设你的网关全局 rpm_limit 设成 100,某个测试脚本因为写了个死循环重试,一分钟内把这 100 个请求配额全占满,其他所有正常业务的调用都会被顶掉,返回 429。这种”一个 Key 拖垮全站”的故障排查起来很头疼,因为表面现象是所有调用都在报错,容易误判成网关整体故障或者上游服务商限流,实际根因只是某一个 Key 失控。解决办法就是给每个虚拟 Key 都配独立的 rpm_limit/tpm_limit,全局限速只作为兜底防线,而不是唯一防线。

关于限速阈值怎么定:先看你上游服务商本身的限速档位(按账号等级有不同的 RPM/TPM 上限,以官方文档为准),网关侧的限速应该略低于上游限速,给自己留出缓冲,否则网关本身没触发限速,请求打到上游却先被拒了,日志里看到的错误还是走了一圈才暴露,排查链路变长。遇到 429 时先看响应头里的 Retry-After 或者错误信息里带的重置时间,不要靠盲猜的间隔去重试,这是最容易被忽略但最省事的一个细节。

数据合规与隐私

聚合层处于数据流的中间位置,需要明确几个合规问题:

请求内容是否被持久化?

  • 自建方案(LiteLLM、OneAPI):你完全控制,默认行为取决于配置,建议明确关闭请求内容的持久化
  • 托管方案:务必阅读服务商的数据处理协议(DPA),确认是否持久化请求内容、保留多久

数据出境合规: 如果你的应用处理中国大陆用户的个人数据,通过境外服务商(OpenAI、Anthropic)处理时需要满足《数据安全法》和《个人信息保护法》的出境要求。选择有国内服务器的聚合服务,或使用境内模型(通义、文心)处理敏感数据。

日志脱敏: 日志中不应记录完整的用户输入,尤其是包含个人信息的场景。在网关侧做日志脱敏(截断、hash 或字段屏蔽),而不是在下游各应用分别处理。

安全加固检查清单

  • 上游 API Key 使用 Secrets Manager 存储,不写入配置文件或代码
  • 下游使用虚拟 Key,真实 Key 不暴露给应用层
  • 所有通信走 HTTPS,禁用明文 HTTP
  • 生产网关不暴露公网管理端口(LiteLLM /key/generate 等接口)
  • 设置合理的 Rate Limiting,防止滥用
  • 定期轮换所有 Key(建议 90 天以内)
  • 开启操作日志审计,记录 Key 的创建/修改/吊销
  • 明确数据保留和处理策略,符合相关法规

常见问题

虚拟 Key 泄露了怎么办? 立即在网关控制台吊销该 Key(LiteLLM:DELETE /key/delete),上游的真实 Key 不受影响。吊销后检查该 Key 的用量日志,评估是否有异常调用,必要时通知相关用户。

自建网关的管理端口如何保护? 生产环境中,LiteLLM 等自建网关的管理 API(/key/*/model/* 等端点)应只通过内网访问,在反向代理层(Nginx/Caddy)中屏蔽这些路径的公网访问。

托管聚合服务的安全性如何评估? 重点查阅:是否有 SOC 2 认证、数据处理协议(DPA)的内容、是否提供数据加密存储声明,以及历史安全事件记录。不要只看宣传材料,看具体的合规文件。


延伸阅读:

密钥管理让你头疼?申请力达云聚合 API 内测,一个网关 Key 管理所有上游,密钥安全由平台保障。