Ollama 鉴权方案实现教程
一、背景与需求
Ollama 是一款轻量级本地大模型运行工具,默认情况下没有内置鉴权机制,直接暴露端口存在安全风险(如未授权访问、滥用资源等)。为保护服务安全,需通过额外手段实现访问控制。
方案一:反向代理层鉴权(推荐,适合中小规模部署)
通过 Nginx、Traefik 等反向代理工具在请求入口层拦截并验证权限,无需修改 Ollama 源码。
实现步骤:
-
安装 Nginx(以 Ubuntu 为例):
bashsudo apt update && sudo apt install nginx -
配置 Basic Auth 认证:
-
安装 htpasswd 工具:
sudo apt install apache2-utils -
创建用户密码文件(如用户名
ollama_user):bashhtpasswd -c /etc/nginx/ollama_auth.db ollama_user # 输入密码并确认
-
-
配置 Nginx 反向代理 :编辑
/etc/nginx/sites-available/ollama:nginxserver { listen 80; # 对外暴露的端口(避免直接使用 Ollama 默认的 11434) server_name localhost; # 开启 Basic Auth auth_basic "Ollama Access"; auth_basic_user_file /etc/nginx/ollama_auth.db; # 反向代理到本地 Ollama location / { proxy_pass http://127.0.0.1:11434; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } -
启用配置并重启 Nginx:
bashsudo ln -s /etc/nginx/sites-available/ollama /etc/nginx/sites-enabled/ sudo nginx -t # 验证配置 sudo systemctl restart nginx -
验证 :通过
curl -u ollama_user:密码 http://localhost/api/tags测试,无密码或错误密码会返回 401。
方案二:API 网关鉴权(适合多服务集成场景)
使用 Kong、APISIX 等 API 网关,支持更灵活的鉴权策略(如 Token、JWT、IP 白名单等)。以 APISIX 为例:
实现步骤:
-
部署 APISIX (参考 官方文档)。
-
创建路由与上游:
-
上游指向 Ollama 服务(
127.0.0.1:11434)。 -
路由配置路径为
/api/*,并启用 JWT 插件:bash# 通过 APISIX Admin API 配置 curl "http://127.0.0.1:9180/apisix/admin/routes/1" -X PUT -d ' { "uri": "/api/*", "upstream": { "type": "roundrobin", "nodes": {"127.0.0.1:11434": 1} }, "plugins": { "jwt-auth": { "key": "your_secret_key", # JWT 密钥 "exp": 86400 # 令牌有效期(秒) } } }'
-
-
生成 JWT 令牌 :使用工具生成包含密钥的令牌(如 jwt.io),或通过代码生成。
-
验证:请求时在 Header 中携带令牌:
bashcurl -H "Authorization: Bearer <your_jwt_token>" http://APISIX_IP:9080/api/tags
方案三:修改 Ollama 源码添加鉴权(适合深度定制)
通过修改 Ollama 源码,在 API 层添加鉴权逻辑(需 Go 开发基础)。
实现步骤:
-
克隆源码:
bashgit clone https://github.com/jmorganca/ollama.git cd ollama -
添加 Token 验证中间件 :在
api/server.go中,为路由注册添加鉴权中间件:运行
go// 定义鉴权中间件 func authMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // 从 Header 获取 Token token := r.Header.Get("X-Ollama-Token") if token != "your_secure_token" { // 替换为实际密钥 http.Error(w, "Unauthorized", http.StatusUnauthorized) return } next.ServeHTTP(w, r) }) } // 在路由注册时应用中间件 func setupRoutes(mux *http.ServeMux) { // 为所有 API 路径添加鉴权 mux.Handle("/api/", authMiddleware(http.StripPrefix("/api", apiRouter()))) } -
编译 Ollama:
bashgo build -o ollama ./cmd/ollama -
启动并验证:
bash./ollama serve # 启动服务 # 带 Token 请求 curl -H "X-Ollama-Token: your_secure_token" http://localhost:11434/api/tags
方案四:网络层访问控制(辅助方案,建议与其他方案结合)
通过防火墙或网络策略限制访问来源,减少暴露面。
示例(UFW 防火墙):
bash
# 只允许特定 IP 访问 11434 端口
sudo ufw allow from 192.168.1.100 to any port 11434
# 拒绝其他所有 IP
sudo ufw deny 11434
总结与选择建议
- 中小规模 / 快速部署 :优先选 方案一(Nginx Basic Auth) ,配置简单且兼容性好。
- 多服务集成 / 复杂策略 :选 方案二(API 网关) ,支持 JWT、动态权限管理。
- 深度定制 / 源码可控 :选 方案三(修改源码) ,但需维护代码更新。
- 辅助加固 :任何场景都建议结合 方案四(网络控制) ,降低攻击面。
根据实际安全需求和技术栈选择合适方案,生产环境建议至少采用两种以上鉴权手段(如反向代理 + 网络控制)。