背景
官方软件更新的背景
2.2.2版本之前的Nacos默认控制台,无论服务端是否开启鉴权,都会存在一个登录页,需要登录成功才能操作;这导致很多用户被误导认为Nacos默认是存在鉴权的。在社区安全工程师的建议下,Nacos自2.2.2版本开始,在未开启鉴权时,默认控制台将不需要登录即可访问,同时在控制台中给予提示,提醒用户当前集群未开启鉴权。
官方参考链接:https://nacos.io/zh-cn/docs/v2/guide/user/auth.html
我的使用背景
之前用的旧版本nacos,许多服务的nacos client端都没有开启鉴权。但是为了保证运维开发人员不能随意改配置,管理页面上是有认证的。(nacos2.2.2版本前刚好都满足)
冲突
冲突1:nacos升级到2.2.2之后,如果没开启鉴权,管理页面没有登录功能了,访问进去可以直接修改配置。
冲突2:我们有很多服务,部分陈旧服务甚至没有源码,把鉴权加上不太可行。
冲突3:尝试用nginx代理访问nacos,在nginx上用auth_basic设置账号密码。发现即便是账号密码输入正确也不行,频繁报401的错。排查后发现,auth_basic和nacos都需要用Header中Authorization参数,发生了冲突。
解决方案
在nginx使用lua解析账号密码,使用cookie记录是否认证成功
步骤1:nginx中添加html登录页面login.html (输入账号密码,跳转的lua解析页面) —>
步骤2:lua解析页面,如果解析成功账号密码,就写一个cookie,并跳转到nacos页面 -->
步骤3:nacos页面判断是否有cookie,如果有cookie就访问nacos页面,如果没有对应的cookie就跳转到登录页面
nginx配置参考
events { worker_connections 1024; } http { server { listen 80; # 登录页面 location = /login.html { default_type text/html; content_by_lua_block { ngx.say([[]]) } } # 处理登录请求 location = /login { content_by_lua_block { ngx.req.read_body() local args = ngx.req.get_post_args() local username = args.username local password = args.password -- 设定你的用户名和密码 local valid_username = "sit" local valid_password = "sit" if username == valid_username and password == valid_password then ngx.header["Set-Cookie"] = "auth=1; Path=/; HttpOnly" ngx.redirect("/nacos") else ngx.say("Wrong user or password! Click the browser's 'Back' button to log in again") ngx.exit(ngx.HTTP_UNAUTHORIZED) end } } # nacos路径 location /nacos/ { # 如果认证不通过,就跳转到认证页面 if ($cookie_auth != "1") { return 302 /login.html; } # 如果认证通过,代理请求到后端nacos服务器 proxy_pass http://10.1.0.5:8848/nacos/; } } }Nacos Login Nacos Login
还没有评论,来说两句吧...