对免认证服务提供apikey验证

一些服务不带认证,凡是可以访问到服务端口,都可以正常使用该服务,方便是方便,但是不够安全。

比如ollama默认安装后就是这样。现在据说网上扫一下端口11434,免apikey的ollama服务一大堆。。。

那我们怎样将本机安装的ollama能提供给其他用户使用,并且可以加apikey的限制呢?其实方案有很多,我说一个轻量级的解决方案,nginx代理转发,并且进行header中的Authorization信息的检查。

固定值的可以直接写在nginx.conf配置文件里,最简单;如果是使用json文件来存放apikey信息的话,nginx需要使用lua模块来读取json文件,进行解码,windows版的nginx默认不带lua模块,可以用openresty,它相当于集成了lua模块的nginx。json内容可以由其他应用来维护,不过内容有变化需要考虑,如果要求实时更新,那么最好在应用修改json文件内容时也同时通知nginx来更新;或者干脆由另外一个web服务来负责header中apikey的检查,nginx里要写lua代码去执行调用,根据返回结果来决定是否放行;还有一个就是我最终选择的方案-redis,apikey维护服务在apikey生效或者失效时更新redis的集合,nginx从redis里检查集合里是否包含请求头中的apikey。nginx.conf里的lua部分相关代码如下:

lua 复制代码
...
http {
    # 引入 Lua 模块
    lua_package_path "lualib/?.lua;;";
    lua_package_cpath "lualib/?.so;;";

    # 定义 Redis 连接参数
    upstream redis_backend {
        server 127.0.0.1:6379;  # Redis 服务器地址
        keepalive 10;           # 保持连接
    }
	...
    server {
		listen  443 ssl;
		...

        location /ollama/ {
        
            #if ($request_method = 'OPTIONS') {
            #	return 204;
            #	}
            
            access_by_lua_block {
                -- 获取请求头中的 Authorization
                local auth_header = ngx.var.http_Authorization
                if not auth_header then
                    ngx.status = ngx.HTTP_UNAUTHORIZED
                    ngx.say("Unauthorized: Missing Authorization header")
                    return ngx.exit(ngx.HTTP_UNAUTHORIZED)
                end

                -- 连接 Redis
                local redis = require "resty.redis"
                local red = redis:new()
                red:set_timeout(1000)  -- 设置超时时间为 1 秒

                local ok, err = red:connect("127.0.0.1", 6379)
                if not ok then
                    ngx.status = ngx.HTTP_INTERNAL_SERVER_ERROR
                    ngx.say("Internal Server Error: Failed to connect to Redis")
                    return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
                end

                -- 查询 Redis 中是否存在该密钥
                local is_member, err = red:sismember("auth_keys", auth_header)
                if not is_member then
                    ngx.status = ngx.HTTP_INTERNAL_SERVER_ERROR
                    ngx.say("Internal Server Error: Failed to query Redis")
                    return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
                end

                -- 关闭 Redis 连接
                local ok, err = red:set_keepalive(10000, 100)
                if not ok then
                    ngx.log(ngx.ERR, "Failed to set keepalive: ", err)
                end

                -- 检查密钥是否有效
                if is_member == 0 then
                    ngx.status = ngx.HTTP_UNAUTHORIZED
                    ngx.say("Unauthorized: Invalid Authorization key")
                    return ngx.exit(ngx.HTTP_UNAUTHORIZED)
                end
            }

            # 如果验证通过,代理到目标服务器
            
    		#add_header 'Access-Control-Allow-Origin' '*';
    		#add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    		#add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type';
			#add_header 'Access-Control-Max-Age' 1728000;

			#proxy_set_header origin http://127.0.0.1:11434;
        	#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;
			#proxy_set_header Authorization $http_authorization;
			#proxy_set_header Host localhost:11434;

            proxy_pass http://127.0.0.1:11434;
        }
        ...
    }
}
...

主要是可以参考下lua里将header里认证信息与redis集合进行匹配,其他nginx转发设置头信息跟后端服务要求而定。

相关推荐
迷途呀10 小时前
CI/CD 自动化部署实践:让代码提交后自动上线
linux·运维·nginx·ci/cd·自动化
一航jason11 小时前
Android平台推理框架及试用场景模型对比
android·人工智能·ai·架构·ai编程·llama
一航jason11 小时前
Android 端侧大模型推理框架对比
android·人工智能·ai·ai编程·llama·ai-native
ControlRookie16 小时前
第23篇_源码加更 05|HTTP Server、连接实例和诊断数据
http·codesys·plc通信·开源源码
零依赖极客17 小时前
Day 8·1 自注意力机制:Q·K^T/softmax/V的在线计算
c语言·arm开发·人工智能·llama
企业数字化笔记21 小时前
AI写的网站一直自动跳转怎么办?301、302和HTTPS重定向排查
网络协议·http·https
IT摆渡者21 小时前
1panel 针对HTTP自动续签SSL网站证书
网络协议·ssl·openresty
那年窗外下的雪.1 天前
AIDC 学习日志|第 24 天|设备输出反推与 MAC Flapping 定位
网络协议·学习·tcp/ip·http·macos·tcpdump
sugar__salt1 天前
大模型流式输出完全指南(上):从 HTTP 长连接到手写 SSE
网络·网络协议·http
运维全栈笔记1 天前
Ansible 自动化 Nginx 集群部署实战:动态 Inventory、滚动发布与 Role 工程化
nginx·自动化·ansible