Bootstrap

【第3章】Spring Cloud之Nacos服务端权限认证


前言

上一章我们访问了控制台,这里为了安全我们开启Nacos的权限认证。


一、默认控制台登录页

2.2.2版本之前的Nacos默认控制台,无论服务端是否开启鉴权,都会存在一个登录页;这导致很多用户被误导认为Nacos默认是存在鉴权的。在社区安全工程师的建议下,Nacos自2.2.2版本开始,在未开启鉴权时,默认控制台将不需要登录即可访问,同时在控制台中给予提示,提醒用户当前集群未开启鉴权。

在用户开启鉴权后,控制台才需要进行登录访问。 同时针对不同的鉴权插件,提供新的接口方法,用于提示控制台是否开启登录页;同时在2.2.3版本后,Nacos可支持关闭开源控制台,并引导到用户自定义的Nacos控制台,详情可查看Nacos鉴权插件-服务端插件控制台手册-关闭登录功能

二、鉴权

1.相关参数

这里我们先学习鉴权相关参数,完成对应参数配置即可生效。

参数名默认值启止版本说明
nacos.core.auth.enabledfalse1.2.0 ~ latest是否开启鉴权功能
nacos.core.auth.system.typenacos1.2.0 ~ latest鉴权类型
nacos.core.auth.plugin.nacos.token.secret.keySecretKey012345678901234567890123456789012345678901234567890123456789(2.2.0.1后无默认值)2.1.0 ~ latest默认鉴权插件用于生成用户登陆临时accessToken所使用的密钥,使用默认值有安全风险
nacos.core.auth.plugin.nacos.token.expire.seconds180002.1.0 ~ latest用户登陆临时accessToken的过期时间
nacos.core.auth.enable.userAgentAuthWhitefalse1.4.1 ~ latest是否使用useragent白名单,主要用于适配老版本升级,置为true时有安全风险
nacos.core.auth.server.identity.keyserverIdentity(2.2.1后无默认值)1.4.1 ~ latest用于替换useragent白名单的身份识别key,使用默认值有安全风险
nacos.core.auth.server.identity.valuesecurity(2.2.1后无默认值)1.4.1 ~ latest用于替换useragent白名单的身份识别value,使用默认值有安全风险
nacos.core.auth.default.token.secret.keySecretKey0123456789012345678901234567890123456789012345678901234567891.2.0 ~ 2.0.4同nacos.core.auth.plugin.nacos.token.secret.key
nacos.core.auth.default.token.expire.seconds180001.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
在这里插入图片描述
在这里插入图片描述

四、用户列表

在这里插入图片描述

我们可以通过用户列表修改默认密码,或新增用户进一步规范控制台访问权限,保证应用的安全。


总结

回到顶部

更多内容请查看官网服务鉴权

;