在高性能计算服务器上通过 Docker 部署 Xinference 时,由于其默认配置较为开放,直接将端口映射到公网会带来极大的安全风险。

本文将记录如何通过配置文件开启鉴权,并解决 /status 接口泄露系统信息的“隐患”。

基础部署环境

首先,我们通常使用如下命令启动一个基础的 Xinference 容器,支持多 GPU 调用:

1
2
3
4
5
6
docker run --name xinference -d -p 9997:9997 \
-e XINFERENCE_HOME=/data \
-v /your/path/xinference/:/data \
--gpus '"device=0,1"' \
xprobe/xinference:latest \
xinference-local -H 0.0.0.0

开启核心鉴权:配置

仅设置 XINFERENCE_AUTH_TOKEN 环境变量往往是不够的,Xinference 需要显式的配置文件来激活用户管理系统。

第一步:创建配置文件

在宿主机的挂载目录(如 /data)下创建 auth.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"auth_config": {
"algorithm": "HS256",
"secret_key": "your_random_secret_string",
"token_expire_in_minutes": 1440
},
"user_config": [
{
"username": "admin",
"password": "your_secure_password",
"permissions": ["admin"],
"api_keys": ["sk-yourcustomkey123"]
}
]
}

注意:api_keys 仅支持16位,以 sk- 开头,例如 sk-abc1234567890

第二步:更新启动命令

在启动参数中加入 --auth-config 指向该文件:

1
2
3
4
5
6
docker run --name xinference -d -p 9997:9997 \
-e XINFERENCE_HOME=/data \
-v /your/path/xinference/:/data \
--gpus '"device=0,1"' \
xprobe/xinference:latest \
xinference-local -H 0.0.0.0 --auth-config /data/auth.json

验证鉴权效果

开启配置后,可以通过 curl 测试接口的拦截情况:

  • 无 Key 访问:curl -I http://<IP>:9997/v1/models -> 预期返回 401 Unauthorized
  • 带 Key 访问:curl -H "Authorization: Bearer sk-yourcustomkey123" http://<IP>:9997/v1/models -> 预期返回正常 JSON 数据。

深度加固:解决 /status 接口泄露问题

现象:即使开启了 --auth-config,访问 http://<IP>:9997/status 依然能看到显卡型号、显存占用等敏感信息。

原因: Xinference 将 /status 视为健康检查接口,默认不纳入 API Key 的保护范围。

解决方案:Nginx 反向代理(推荐)

通过 Nginx 拦截特定路径,只允许通过鉴权的请求转发到后端。

1
2
3
4
5
6
location /status {
if ($http_authorization != "Bearer sk-yourcustomkey123") {
return 401;
}
proxy_pass http://127.0.0.1:9997;
}

总结:安全检查清单

项目 状态 作用
--auth-config 必须 开启 API Key 校验及 Web 登录限制
api_keys 必须 保护推理资源不被盗刷
Nginx / Firewall 建议 屏蔽 /status 接口及限制访问来源 IP

在公网暴露高性能算力资源时,请务必保持警惕。建议定期更换 secret_key 并监控容器日志。