API Key 泄露是 VPS 部署 AI 工具时最容易被忽视的安全漏洞。很多用户在折腾 AI Agent、Claude Code 或 n8n 自动化工作流时,习惯把密钥直接写进代码或配置文件里,结果一不留神就跟着 Git 提交到了公网,或者被日志文件暴露。主机选整理了一套针对 VPS 环境的密钥管理和权限隔离方案,覆盖从环境变量到容器化部署的实战操作,帮你堵住这个坑。

API Key 泄露的常见渠道和排查方法
泄露不一定发生在黑客攻击,更多是操作失误。先检查自己的 VPS 上有没有这些隐患:
•硬编码在脚本里:`api_key = "sk-xxx"` 这种写法,只要代码被复制、分享或上传到 GitHub,密钥就裸奔了。
•Git 历史记录:哪怕后来删掉了,Git 历史里依然能翻出旧版本中的密钥。用 `git log -p | grep "sk-"` 快速扫描一下。
•日志文件:很多 AI 工具(比如 Open WebUI、n8n)默认会把请求参数写入日志,如果请求里带了 API Key,日志就成了泄露源。
•环境变量未隔离:在 Docker 容器里直接用 `-e API_KEY=xxx` 启动,别人通过 `docker inspect` 就能看到明文。
排查命令参考:
grep -r "sk-" –include="*.py" –include="*.js" –include="*.yaml" .
git log –all –oneline –grep="sk-"
docker inspect <容器名> | grep -i "api_key"
密钥管理的实战操作
用环境变量替代硬编码
这是最基本也最有效的做法。所有 AI 工具都支持从环境变量读取 API Key,例如 Claude Code 读取 `ANTHROPIC_API_KEY`,OpenAI 读取 `OPENAI_API_KEY`,DeepSeek 读取 `DEEPSEEK_API_KEY`。
在 Linux VPS 上设置环境变量:
nano ~/.bashrc
export ANTHROPIC_API_KEY="sk-ant-xxxx"
export OPENAI_API_KEY="sk-xxxx"
source ~/.bashrc
注意:不要在 `/etc/environment` 或 `/etc/profile` 里写密钥,这些文件可能被其他用户读取。建议放在用户家目录下的 `.bashrc` 或 `.zshrc` 里,并设置权限:
chmod 600 ~/.bashrc
使用 .env 文件并严格保护
如果工具支持读取 `.env` 文件(n8n、Ollama、Open WebUI 等都支持),把密钥写进 `.env`,然后:
• 把 `.env` 加入 `.gitignore`
• 设置文件权限为 600(仅属主可读写)
• 绝对不要把 `.env` 提交到任何代码仓库
echo "ANTHROPIC_API_KEY=sk-ant-xxxx" > .env
echo "OPENAI_API_KEY=sk-xxxx" >> .env
chmod 600 .env
Docker 部署中的密钥隔离
用 Docker 部署 AI 工具(比如 Open WebUI、n8n、Claude Code 容器化版本)时,不要用 `-e` 传明文。推荐两种安全方式:
方式一:Docker Secrets(Swarm 模式)
echo "sk-ant-xxxx" | docker secret create anthropic_key –
services:
claude-code:
image: …
secrets:
– anthropic_key
environment:
– ANTHROPIC_API_KEY_FILE=/run/secrets/anthropic_key
方式二:挂载 .env 文件(单机常用)
docker run -d \
–env-file /path/to/.env \
–restart unless-stopped \
your-ai-tool-image
`–env-file` 方式不会把密钥暴露在 `docker inspect` 中,相比 `-e` 更安全。
权限隔离:最小化密钥的暴露面
不要用 root 运行 AI 服务
很多教程直接让用 root 跑 n8n 或 Ollama,这是大忌。一旦服务被攻破,攻击者直接拿到 root 权限,所有密钥和数据库全暴露。
创建专用用户:
sudo useradd -r -s /usr/sbin/nologin ai-service
sudo chown -R ai-service:ai-service /opt/ai-tools
容器内的权限限制
在 Docker Compose 中设置 `read_only: true` 和 `cap_drop: ALL`,让容器只能读文件,无法写入或修改密钥文件。
yaml
services:
n8n:
image: n8nio/n8n
read_only: true
cap_drop:
– ALL
environment:
– N8N_ENCRYPTION_KEY_FILE=/run/secrets/encryption_key
API Key 的访问控制
如果多个 AI 工具共用一个 API Key(比如 Claude Code 和 Hermes Agent 共用 Anthropic 密钥),建议为每个工具创建独立的 API Key,并在 API 提供商后台限制 IP 白名单和权限范围。例如:
• OpenAI:创建多个 Key,每个只允许特定模型或特定 IP
• Anthropic:每个 Key 绑定一个项目,限制使用量
• DeepSeek:在控制台设置 Key 的可访问 IP
这样即使某个 Key 泄露,影响范围也有限。
老鸟叮嘱
1.别把 API Key 写进 Dockerfile:Docker 镜像会被分发,密钥会留在镜像层里。用构建参数(`–build-arg`)也不行,因为 `docker history` 能看见。
2.日志里过滤密钥:n8n 和 Open WebUI 都有日志级别设置,生产环境建议设为 `error` 或 `warn`,避免请求体写入日志。如果必须记录,用正则替换密钥。
3.定期轮换密钥:每 90 天换一次 API Key,旧 Key 及时在后台删除。可以用 cron 脚本自动更新 `.env` 文件并重启服务。
4.监控异常调用:在 API 提供商后台开启用量告警,如果某 Key 突然出现大量调用,很可能已泄露。
5.使用密钥管理工具:如果服务多、密钥多,考虑部署 HashiCorp Vault 或 1Password CLI 来动态获取密钥,避免密钥以文件形式长期存在磁盘上。
FAQ
Q1:API Key 泄露后应该怎么办?
立即在 API 提供商后台吊销该 Key,生成新 Key,并更新所有使用该 Key 的配置文件。同时检查是否有未授权的调用,必要时轮换所有相关服务的密钥。
Q2:.env 文件放在 VPS 上安全吗?
相对安全,前提是文件权限设为 600,并且 VPS 没有被攻破。如果 VPS 被 root 权限入侵,.env 文件一样能被读取。所以还要配合系统加固和最小权限原则。
Q3:用 Docker Secrets 和 .env 文件哪个更安全?
Docker Secrets 更安全,因为密钥以内存方式挂载,不会写入容器层,且只有指定容器可访问。单机部署时,挂载 .env 文件且限制权限也够用。
Q4:n8n 的加密密钥(N8N_ENCRYPTION_KEY)也需要保护吗?
必须保护。这个密钥用于加密数据库中的凭证,泄露后攻击者可以直接解密所有存储的 API Key。同样用环境变量或 Docker Secrets 管理。
Q5:Claude Code 和 Codex 这类 CLI 工具怎么管理密钥?
它们都支持环境变量,也支持在项目根目录放 `.claude` 或 `.codex` 配置文件。建议用环境变量,并确保配置文件不提交到 Git。如果必须用配置文件,在 `.gitignore` 里添加对应文件名。
Q6:Open WebUI 部署时,OLLAMA_API_KEY 怎么设置才安全?
在 `docker run` 命令中用 `–env-file` 加载,不要直接在命令里写 `-e OLLAMA_API_KEY=xxx`。另外 Open WebUI 的数据库里也可能存储密钥,注意数据库文件的权限。
密钥管理没有一劳永逸的方案,但做好环境变量隔离、权限最小化和定期轮换,就能堵住 90% 的泄露风险。下次部署 AI 工具时,多花五分钟配置密钥保护,远比出事后再补救省心。
转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/9934.html 商家投稿邮箱:zhujixuanblog@qq.com
