Ollama 鉴权方案实现教程

Ollama 鉴权方案实现教程

一、背景与需求

Ollama 是一款轻量级本地大模型运行工具,默认情况下没有内置鉴权机制,直接暴露端口存在安全风险(如未授权访问、滥用资源等)。为保护服务安全,需通过额外手段实现访问控制。

方案一:反向代理层鉴权(推荐,适合中小规模部署)

通过 Nginx、Traefik 等反向代理工具在请求入口层拦截并验证权限,无需修改 Ollama 源码。

实现步骤:

  1. 安装 Nginx(以 Ubuntu 为例):

    bash 复制代码
    sudo apt update && sudo apt install nginx
  2. 配置 Basic Auth 认证

    • 安装 htpasswd 工具:sudo apt install apache2-utils

    • 创建用户密码文件(如用户名 ollama_user):

      bash 复制代码
      htpasswd -c /etc/nginx/ollama_auth.db ollama_user
      # 输入密码并确认
  3. 配置 Nginx 反向代理 :编辑 /etc/nginx/sites-available/ollama

    nginx 复制代码
    server {
        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;
        }
    }
  4. 启用配置并重启 Nginx

    bash 复制代码
    sudo ln -s /etc/nginx/sites-available/ollama /etc/nginx/sites-enabled/
    sudo nginx -t  # 验证配置
    sudo systemctl restart nginx
  5. 验证 :通过 curl -u ollama_user:密码 http://localhost/api/tags 测试,无密码或错误密码会返回 401。

方案二:API 网关鉴权(适合多服务集成场景)

使用 Kong、APISIX 等 API 网关,支持更灵活的鉴权策略(如 Token、JWT、IP 白名单等)。以 APISIX 为例:

实现步骤:

  1. 部署 APISIX (参考 官方文档)。

  2. 创建路由与上游

    • 上游指向 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  # 令牌有效期(秒)
              }
          }
      }'
  3. 生成 JWT 令牌 :使用工具生成包含密钥的令牌(如 jwt.io),或通过代码生成。

  4. 验证:请求时在 Header 中携带令牌:

    bash 复制代码
    curl -H "Authorization: Bearer <your_jwt_token>" http://APISIX_IP:9080/api/tags

方案三:修改 Ollama 源码添加鉴权(适合深度定制)

通过修改 Ollama 源码,在 API 层添加鉴权逻辑(需 Go 开发基础)。

实现步骤:

  1. 克隆源码

    bash 复制代码
    git clone https://github.com/jmorganca/ollama.git
    cd ollama
  2. 添加 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())))
    }
  3. 编译 Ollama

    bash 复制代码
    go build -o ollama ./cmd/ollama
  4. 启动并验证

    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、动态权限管理。
  • 深度定制 / 源码可控 :选 方案三(修改源码) ,但需维护代码更新。
  • 辅助加固 :任何场景都建议结合 方案四(网络控制) ,降低攻击面。

根据实际安全需求和技术栈选择合适方案,生产环境建议至少采用两种以上鉴权手段(如反向代理 + 网络控制)。

相关推荐
聆风吟º21 小时前
openEuler 开源操作系统测试实战:搭建本地AI问答工具
人工智能·ai·开源·openeuler·ollama
i查拉图斯特拉如是2 天前
搭建本地大模型知识库
人工智能·ai·大模型·知识库·ollama
小股虫2 天前
SillyTavern使用本地大模型写故事实操手册
人工智能·ai写作·ollama·本地大模型·sillytavern
七夜zippoe5 天前
使用Ollama在消费级硬件上运行大模型:从环境配置到企业级实战
性能优化·大模型·模型量化·ollama
互联网老欣6 天前
2025年保姆级教程:阿里云服务器部署Dify+Ollama,打造专属AI应用平台
服务器·阿里云·ai·云计算·dify·ollama·deepseek
wuli_滔滔8 天前
Qwen2.5、Llama 3.1轻量模型本地化部署指南:从环境配置到企业级实战
vllm·ollama·qwen2.5·llama 3.1
重整旗鼓~9 天前
2.LangChain4j+springboot+大模型整合
openai·springboot·ollama·langchain4j
用什么都重名10 天前
设置 Ollama 容器自动重启和模型自动加载的方法
人工智能·ollama·自加载
七夜zippoe14 天前
基于Qwen2.5-7B-Chat的本地化部署实战——从模型原理到企业级应用
vllm·ollama·qwen2.5·gradio web·企业级api
Jack_abu19 天前
RAG系统学习之——RAG技术详解与实战指南
llm·rag·ollama