nacos开启鉴权配置

发布时间 2024-01-11 16:40:47作者: 右手一个柚

参考链接:https://nacos.io/zh-cn/docs/v2/guide/user/auth.html

1、nacos开启鉴权

  • 2.2.2版本之前的Nacos默认控制台,无论服务端是否开启鉴权,都会存在一个登录页,这就导致很多用户被误导认为Nacos默认是存在鉴权的。
  • 在社区安全工程师的建议下,Nacos自2.2.2版本开始,在未开启鉴权时,默认控制台将不需要登录即可访问,同时在控制台中给予提示,提醒用户当前集群未开启鉴权,在用户开启鉴权后,控制台才需要进行登录访问。
  • 开启鉴权功能之后,访问Nacos服务端API和控制台都需要输入用户名和密码(默认的用户名和密码都是nacos),可以提高Nacos的安全性,如果客户端(其它服务或者控制台用户)无法提供正确的用户名和密码,将无法访问Nacos Server,这样可以防止服务端被非授权访问,所以对于生产环境中的Nacos Server推荐设置为true。
  • 如果Nacos禁用鉴权功能,此时访问Nacos服务端API和控制台不需要任何登录即可匿名访问。

1.1、修改nacos配置文件(application.properties)

如果 nacos.core.auth.enabled 设置为true,必须添加以下nacos.core.auth.server.identity.keynacos.core.auth.server.identity.valuenacos.core.auth.plugin.nacos.token.secret.key配置,否则无法启动节点。
推荐开启如下配置

# 开启鉴权功能
nacos.core.auth.enabled=true
# 关闭使用user-agent判断服务端请求并放行鉴权的功能
nacos.core.auth.enable.userAgentAuthWhite=false
# 配置自定义身份识别的key和value,这两个属性是auth的白名单,用于标识来自其它服务器的请求,具体实现见 com.alibaba.nacos.core.auth.AuthFilter。
nacos.core.auth.server.identity.key=authKey
nacos.core.auth.server.identity.value=shigzh
# 自定义用于生成JWT令牌的密钥,注意:原始密钥长度不得低于32字符,且一定要进行Base64编码,否则无法启动节点。
nacos.core.auth.plugin.nacos.token.secret.key=bmFjb3NfMjAyNDAxMTBfc2hpZ3poX25hY29zX3Rva2Vu
# 权限缓存开关,开启后权限缓存的更新默认有15秒的延迟,默认 : false
nacos.core.auth.caching.enabled=true

1.2、自定义生成JWT令牌的密钥

注意:原始密钥长度不得低于32字符,且一定要进行Base64编码,否则无法启动节点。

/**
 * <p>
 * nacos中JWT令牌密钥生成器<br>
 * 生成 nacos.core.auth.plugin.nacos.token.secret.key 的值
 * </p>
 * @author shigzh
 * @since 2024/1/10 13:41
 */
public class NacosSecretUtil {
    public static void main(String[] args) {
        // 自定义生成JWT令牌的密钥
        String nacosSecret = "nacos_20240110_shigzh_nacos_token";
        // 输出密钥长度,要求不得低于32字符,否则无法启动节点。
        System.out.println("密钥长度》》》" + nacosSecret.length());
        // 密钥进行Base64编码
        byte[] data = nacosSecret.getBytes(StandardCharsets.UTF_8);
        System.out.println("密钥Base64编码》》》" + Base64Utils.encodeToString(data));
    }
}

2、nacos鉴权测试

2.1、不开启鉴权测试

如果nacos不开启鉴权,即 nacos.core.auth.enabled = false,在这种情况下通过一些请求就可以绕过nacos的权限认证,然后访问nacos的一些数据。
1、在未登录认证的情况下,通过postman以get方式访问/nacos/v1/cs/configs请求来获取nacos的配置信息,可以正常获取到数据。

http://sgz.wz:8848/nacos/v1/cs/configs?dataId=&group=&appName=&config_tags=&pageNo=1&pageSize=10&tenant=&search=accurate&accessToken=&username=

2、在未登录认证的情况下,通过postman以get方式访问/nacos/v1/auth/users请求来获取nacos的用户信息,可以正常获取到数据。

http://sgz.wz:8848/nacos/v1/auth/users?pageNo=1&pageSize=9&search=blur

3、在未登录认证的情况下,通过postman以post方式访问/nacos/v1/auth/users请求,传入指定参数,可以直接新增用户。

http://sgz.wz:8848/nacos/v1/auth/users?username=test2&password=test2


数据库中也存在新增的用户信息

2.2、开启鉴权测试

如果nacos开启鉴权,即 nacos.core.auth.enabled = true,在这种情况下就可以避免上面的nacos权限认证问题,如果不登录认证就不能访问nacos的一些数据,此时访问就会报403 Forbidden错误。

此时在请求header里添加一对属性参数 authKey=shigzh,即我们配置的自定义身份识别的 nacos.core.auth.server.identity.key=authKeynacos.core.auth.server.identity.value=shigzh(这两个属性是auth的白名单,用于标识来自其他服务器的请求),这样也可以正常操作nacos的一些接口,相当于鉴权了,即可跳过权限认证。

header属性配置authKey=shigzh能够跳过权限认证的原理是 com.alibaba.nacos.core.auth.AuthFilter 过滤器,具体逻辑如下图