近期Ollama未授權(quán)訪問漏洞Nginx反向代理解決方案
一、摘要
近期,國家信息安全漏洞共享平臺(CNVD)收錄了Ollama未授權(quán)訪問漏洞(CNVD - 2025 - 04094)。在此漏洞下,未經(jīng)授權(quán)的攻擊者能夠遠(yuǎn)程訪問Ollama服務(wù)接口,進(jìn)而執(zhí)行諸如敏感資產(chǎn)獲取、虛假信息投喂、拒絕服務(wù)等惡意操作。CNVD已建議受影響的單位和用戶盡快采取措施防范該漏洞攻擊風(fēng)險(xiǎn)。
近期互聯(lián)網(wǎng)上都是漏洞相關(guān)信息,常見的解決方案如封端口、限制遠(yuǎn)程、限制IP訪問等,這些方式缺乏針對性且可操作性不強(qiáng)??紤]到將Ollama服務(wù)默認(rèn)監(jiān)聽地址從127.0.0.1:11434改為0.0.0.0:11434是有業(yè)務(wù)需求的,采取“一刀切”的防范方式并不適宜。為了保障Ollama服務(wù)的安全性,本文提出使用Nginx作為反向代理,并通過設(shè)置認(rèn)證頭信息的方式防止未授權(quán)訪問。
二、解決思路
為有效解決Ollama未授權(quán)訪問問題,確保其遠(yuǎn)程調(diào)用的安全性,本文利用Nginx反向代理并結(jié)合認(rèn)證頭信息進(jìn)行驗(yàn)證。在Nginx配置中,代理轉(zhuǎn)發(fā)請求至目標(biāo)服務(wù)的同時(shí),添加專門的認(rèn)證邏輯。通過驗(yàn)證請求頭中的認(rèn)證信息(如Authorization: Bearer YOUR_SECRET_TOKEN),若認(rèn)證失敗,返回401狀態(tài)碼;若認(rèn)證成功,則將請求正常轉(zhuǎn)發(fā)給目標(biāo)服務(wù)。以下為一個示例請求:
POST /api/generate HTTP/1.1
Host: your_domain_or_ip
Content-Type: application/json
Authorization: Bearer YOUR_SECRET_TOKEN
User-Agent: python-requests/2.26.0
Accept: */*
Connection: keep-alive
三、解決步驟
因作者使用LocalAPI.ai進(jìn)行遠(yuǎn)程調(diào)用,為方便調(diào)試將相關(guān)設(shè)置代理到根目錄,若無需此功能,可刪除location / {}代碼塊。具體操作步驟如下:
- 安裝Nginx并編輯配置文件
首先安裝Nginx服務(wù),隨后編輯Nginx配置文件nginx.conf,配置反向代理。以下是配置文件內(nèi)容:
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 禁用緩沖以支持流式響應(yīng)
proxy_buffering off;
# 增大緩沖區(qū)設(shè)置,避免 502 Bad Gateway
proxy_buffer_size 256k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 512k;
server {
listen 80; # 綁定80端口
server_name your_domain_or_ip; # 替換為你的域名或IP地址
# 由于這里使用LocalAPI.ai進(jìn)行遠(yuǎn)程調(diào)用,避免出現(xiàn)跨域問題,同時(shí)代理 LocalAPI.ai 到80端口根目錄
location / {
if ($request_method = 'OPTIONS') {
return 204; # 處理OPTIONS預(yù)檢請求
}
proxy_pass http://localapi.ai; # 代理到目標(biāo)網(wǎng)站
}
# 代理 Ollama 服務(wù)到 /api/,并進(jìn)行請求頭認(rèn)證
location /api/ {
proxy_pass http://127.0.0.1:11434/api/; # 代理目標(biāo)地址
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;
# 驗(yàn)證請求頭中的認(rèn)證信息
set $auth_header $http_authorization;
if ($auth_header != "Bearer YOUR_SECRET_TOKEN") { # 替換為你的認(rèn)證令牌
add_header 'WWW-Authenticate' 'Bearer realm="Access to the API"'; # 提示客戶端需要認(rèn)證
return 401; # 如果認(rèn)證失敗,返回 401 Unauthorized
}
# 處理 OPTIONS 請求
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}
}
}
}
- 測試配置文件
在完成配置文件的編輯后,通過命令nginx -t對配置文件進(jìn)行測試,確保配置正確無誤。 - 驗(yàn)證認(rèn)證效果
?未添加請求頭訪問:在未添加請求頭的情況下直接訪問Ollama服務(wù),將會出現(xiàn)401錯誤頁,表明認(rèn)證失敗。
?添加認(rèn)證請求頭訪問:添加正確的認(rèn)證請求頭后,則可以正常調(diào)用Ollama服務(wù)。
4. 實(shí)現(xiàn)遠(yuǎn)程調(diào)用聊天功能
配置認(rèn)證請求頭
成功配置后,即可實(shí)現(xiàn)通過遠(yuǎn)程調(diào)用與Ollama進(jìn)行聊天。
四、總結(jié)
Nginx支持多種認(rèn)證方式,如基本認(rèn)證(Basic Authentication)、OAuth2等。本文以認(rèn)證頭為例,給出了解決Ollama未授權(quán)訪問問題的思路以及詳細(xì)的實(shí)際配置文件。通過Nginx反向代理為Ollama WEB API服務(wù)設(shè)置認(rèn)證頭信息,能夠有效防止未授權(quán)訪問。
在進(jìn)行Nginx配置過程中,需要特別注意將配置文件中的YOUR_SECRET_TOKEN替換為一個安全程度較高的字符串,以確保系統(tǒng)的安全性,避免認(rèn)證令牌泄露帶來的風(fēng)險(xiǎn) 。
