文章目录
前言
上一章我们访问了控制台,这里为了安全我们开启Nacos的权限认证。
一、默认控制台登录页
2.2.2版本之前的Nacos默认控制台,无论服务端是否开启鉴权,都会存在一个登录页;这导致很多用户被误导认为Nacos默认是存在鉴权的。在社区安全工程师的建议下,Nacos自2.2.2版本开始,在未开启鉴权时,默认控制台将不需要登录即可访问,同时在控制台中给予提示,提醒用户当前集群未开启鉴权。
在用户开启鉴权后,控制台才需要进行登录访问。 同时针对不同的鉴权插件,提供新的接口方法,用于提示控制台是否开启登录页;同时在2.2.3版本后,Nacos可支持关闭开源控制台,并引导到用户自定义的Nacos控制台,详情可查看Nacos鉴权插件-服务端插件及控制台手册-关闭登录功能
二、鉴权
1.相关参数
这里我们先学习鉴权相关参数,完成对应参数配置即可生效。
参数名 | 默认值 | 启止版本 | 说明 |
---|---|---|---|
nacos.core.auth.enabled | false | 1.2.0 ~ latest | 是否开启鉴权功能 |
nacos.core.auth.system.type | nacos | 1.2.0 ~ latest | 鉴权类型 |
nacos.core.auth.plugin.nacos.token.secret.key | SecretKey012345678901234567890123456789012345678901234567890123456789(2.2.0.1后无默认值) | 2.1.0 ~ latest | 默认鉴权插件用于生成用户登陆临时accessToken所使用的密钥,使用默认值有安全风险 |
nacos.core.auth.plugin.nacos.token.expire.seconds | 18000 | 2.1.0 ~ latest | 用户登陆临时accessToken的过期时间 |
nacos.core.auth.enable.userAgentAuthWhite | false | 1.4.1 ~ latest | 是否使用useragent白名单,主要用于适配老版本升级,置为true时有安全风险 |
nacos.core.auth.server.identity.key | serverIdentity(2.2.1后无默认值) | 1.4.1 ~ latest | 用于替换useragent白名单的身份识别key,使用默认值有安全风险 |
nacos.core.auth.server.identity.value | security(2.2.1后无默认值) | 1.4.1 ~ latest | 用于替换useragent白名单的身份识别value,使用默认值有安全风险 |
SecretKey012345678901234567890123456789012345678901234567890123456789 | 1.2.0 ~ 2.0.4 | 同nacos.core.auth.plugin.nacos.token.secret.key | |
18000 | 1.2.0 ~ 2.0.4 | 同nacos.core.auth.plugin.nacos.token.expire.seconds |
2.服务端开启鉴权
2.1 开启鉴权
开启鉴权之后,application.properties中的配置信息为:
### If turn on auth system:
nacos.core.auth.system.type=nacos
nacos.core.auth.enabled=true
第一项配置和默认相同,则无需改动
2.2 自定义密钥
自定义密钥
自定义密钥时,推荐将配置项设置为Base64编码的字符串,且原始密钥长度不得低于32字符。例如下面的的例子:
### The default token(Base64 String):
nacos.core.auth.default.token.secret.key=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=
### 2.1.0 版本后
nacos.core.auth.plugin.nacos.token.secret.key=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=
注意:鉴权开关是修改之后立马生效的,不需要重启服务端。动态修改token.secret.key时,请确保token是有效的,如果修改成无效值,会导致后续无法登录,请求访问异常。
生成密钥
public static void customSecret(){
String uuid = UUID.randomUUID().toString().replace("-","");
System.out.println(uuid);
String secret = Base64.getEncoder().encodeToString(uuid.getBytes(StandardCharsets.UTF_8));
System.out.println(secret);
}
//输出
6da8b41d3cca4abebb49e72a3555e30b
NmRhOGI0MWQzY2NhNGFiZWJiNDllNzJhMzU1NWUzMGI=
3. 开启服务身份识别功能
开启鉴权功能后,服务端之间的请求也会通过鉴权系统的影响。考虑到服务端之间的通信应该是可信的,因此在1.2~1.4.0版本期间,通过User-Agent中是否包含Nacos-Server来进行判断请求是否来自其他服务端。
但这种实现由于过于简单且固定,导致可能存在安全问题。因此从1.4.1版本开始,Nacos添加服务身份识别功能,用户可以自行配置服务端的Identity,不再使用User-Agent作为服务端请求的判断标准。
开启方式:
### 开启鉴权
nacos.core.auth.enabled=true
### 关闭使用user-agent判断服务端请求并放行鉴权的功能
nacos.core.auth.enable.userAgentAuthWhite=false
### 配置自定义身份识别的key(不可为空)和value(不可为空)
nacos.core.auth.server.identity.key=example
nacos.core.auth.server.identity.value=example
** 注意 ** 所有集群均需要配置相同的server.identity信息,否则可能导致服务端之间数据不一致或无法删除实例等问题。
4. 开启Token缓存功能
服务端自2.2.1版本后,默认鉴权插件模块支持token缓存功能,可参见ISSUE #9906
https://github.com/alibaba/nacos/issues/9906
背景
无论是客户端SDK还是OpenAPI,在调用login接口获取accessToken之后,携带accessToken访问服务端,服务端解析Token进行鉴权。解析的动作比较耗时,如果想要提升接口的性能,可以考虑开启缓存Token的功能,用字符串比较代替Token解析。
开启方式
nacos.core.auth.plugin.nacos.token.cache.enable=true
注意事项
在开启Token缓存功能之前,服务端对每一个携带用户名密码访问login接口的请求都会生成新的token,接口的返回值中的tokenTtl字段跟服务端配置文件中设置的值相等,配置如下:
nacos.core.auth.plugin.nacos.token.expire.seconds=18000
在开启Token缓存功能之后,服务端对每一个携带用户名密码访问login接口的请求,会先检查缓存中是否存在该用户名对应的token。若不存在,生成新的Token,插入缓存再返回;若存在,返回该token,此时tokenTtl字段的值为配置文件中设置的值减去该Token在缓存中存留的时长。 如果Token在缓存中存留的时长超过配置文件设置的值的90%,当login接口收到请求时,尽管缓存中存在该用户名对应的Token,服务端会重新生成Token返回给请求方,并更新缓存。因此,最差情况下,请求方收到的tokenTtl只有配置文件设置的值的10%。
三、效果
http://192.168.137.192:8848/nacos/
nacos/nacos
四、用户列表
我们可以通过用户列表修改默认密码,或新增用户进一步规范控制台访问权限,保证应用的安全。
总结
标签:core,Spring,Nacos,auth,nacos,token,鉴权,服务端 From: https://blog.csdn.net/qq_44824164/article/details/140416248更多内容请查看官网服务鉴权