請啟用 JavaScript 來查看內容

透過 Nginx 為 Ollama 加上 API Key 身分驗證,提升安全性

    前言

    之前看到一篇報導,Cisco 發現全球一千多台 Ollama 伺服器外曝,近 2 成免認證即可執行模型推論,可能帶來重大安全風險。

    延伸閱讀: Cisco揭露逾千臺Ollama伺服器外曝,近2成免認證可執行模型推論


    所以我打算簡單來為 Ollama API 加上 API Key 身分驗證,但小麻煩的是目前 Ollama 本身不支援身分驗證。
    核心團隊解釋到 Ollama 是一個 LLM 推理引擎,應該將不同功能分離,建議使用 HTTP Web 伺服器 (例如 Nginx 或 Caddy) 反向代理去做身分驗證。
    (或有人推薦 ollama_proxy_server 工具)

    延伸閱讀: Support for API_KEY based authentication #8536 | GitHub


    我就以比較熟悉的 Nginx 來實做~



    設定 API Key (Nginx)

    打開 Nginx 的設定檔 nginx.conf
    (不知道這檔案放在哪裡的,自行 Google 就會知道了)


    先設定 map 來指定哪些 API Key 可以 call Ollama API,$http_authorization 為 Nginx 內建變數,會自動抓取 headers 內 Authorization 的值。當 Authorization 的值完全等於其中一個 API Key 則 變數為 1,否則為 0。

    1
    2
    3
    4
    5
    
    map $http_authorization $is_ollama_key_valid {
        default 0;
        "Bearer sk-123456" 1;
        "Bearer abcdefg" 1;
    }
    

    並透過 if 來驗證 Authorization header 是否帶有正確的 Bearer Token。

    如果 header 沒有帶 Authorization 就回 401 "Unauthorized: Authorization header required";
    如果驗證錯誤就回 401 "Unauthorized: Invalid API key"

    1
    2
    3
    4
    5
    6
    7
    8
    
    # 檢查 Authorization header 格式與是否在允許列表中
    if ($http_authorization = "") {
        return 401 "Unauthorized: Authorization header required";
    }
    
    if ($is_ollama_key_valid = 0) {
        return 401 "Unauthorized: Invalid API key";
    }
    


    完整包含 Ollama 的設定大概如下:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
    map $http_authorization $is_ollama_key_valid {
        default 0;
        "Bearer sk-123456" 1;
        "Bearer abcdefg" 1;
    }
    
    #......
    
    server {
        listen 80;
    
        location / {
            # 檢查 Authorization header 格式與是否在允許列表中
            if ($http_authorization = "") {
                return 401 "Unauthorized: Authorization header required";
            }
    
            if ($is_ollama_key_valid = 0) {
                return 401 "Unauthorized: Invalid API key";
            }
    
            proxy_pass http://localhost:11434;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    


    結語

    透過以上簡單的設定,當我們使用 Ollama API 時,就需要在 headers 內代上 Authorization: Bearer sk-123456 做驗證,否則會在 Nginx 被阻擋下來。

    從而保護我們 Ollama API 的安全~


    對生成式 AI 感興趣的讀者,記得追蹤 FB 粉專『 IT空間 』,以免錯過最新的發文通知呦~🔔




    參考:
    Support for API_KEY based authentication · Issue #8536 · ollama/ollama | GitHub
    How can I add api key authentication in nginx proxy? | Stack Overflow


    世界越快,心則慢


    🔻 如果覺得喜歡,歡迎在下方獎勵我 5 個讚~
    分享

    Jia
    作者
    Jia
    軟體工程師 - Software Engineer