跳转到内容
云栖回顾 | 2024 云栖大会微服务和网关相关演讲材料点此了解

权限校验

注意

  • Nacos是一个内部微服务组件,需要在可信的内部网络中运行,不可暴露在公网环境,防止带来安全风险。
  • Nacos提供简单的鉴权实现,为防止业务错用的弱鉴权体系,不是防止恶意攻击的强鉴权体系。
  • 如果运行在不可信的网络环境或者有强鉴权诉求,请参考官方简单实现做进行自定义插件开发

1. 相关参数说明

参数名默认值对应docker镜像环境变量说明
nacos.core.auth.enabledfalseNACOS_AUTH_ENABLE是否开启鉴权功能
nacos.core.auth.system.typenacosNACOS_AUTH_SYSTEM_TYPE鉴权类型
nacos.core.auth.plugin.nacos.token.secret.key无默认值NACOS_AUTH_TOKEN默认鉴权插件用于生成用户登陆临时accessToken所使用的密钥,使用老版本默认值有安全风险
nacos.core.auth.plugin.nacos.token.expire.seconds18000NACOS_AUTH_TOKEN_EXPIRE_SECONDS用户登陆临时accessToken的过期时间
nacos.core.auth.server.identity.key无默认值NACOS_AUTH_IDENTITY_KEY用于服务端之间请求的身份识别key,使用老版本默认值有安全风险
nacos.core.auth.server.identity.value无默认值NACOS_AUTH_IDENTITY_VALUE用于服务端之间请求的身份识别value,使用老版本默认值有安全风险
nacos.core.auth.enable.userAgentAuthWhitefalseNACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE是否使用useragent白名单,主要用于适配老版本升级,置为true时有安全风险
nacos.core.auth.plugin.nacos.token.cache.enablefalseNACOS_AUTH_CACHE_ENABLE是否开启Token缓存,默认关闭,开启后accessToken会缓存到内存中,但权限更新时可能存在15s左右的延迟。

2. 默认控制台登录页

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

3. 服务端如何开启鉴权

  • 配置token.secret.key

    开启鉴权之前,你需要配置自定义的用于生成JWT令牌的密钥,在application.properties中的配置信息,自定义密钥时,推荐将配置项设置为Base64编码的字符串,且原始密钥长度不得低于32字符

    注意:

    1. 密钥需要保持节点间一致,长时间不一致可能导致403 invalid token错误。
    2. 修改token.secret.key时,请确保token是有效的,如果修改成无效值,会导致后续无法登录,请求访问异常。
    ### 用于生成JWT令牌的密钥(Base64 String):
    nacos.core.auth.default.token.secret.key=$custom_base64_token_secret_key
  • 配置server.identity

    开启鉴权之前,还需要配置用于服务端之间请求的身份识别信息,在application.properties中的配置信息:

    注意:身份识别信息保持节点间一致,长时间不一致可能导致节点见数据不一致。

    ### 配置自定义身份识别的key(不可为空)和value(不可为空)
    nacos.core.auth.server.identity.key=$custom_server_identity_key
    nacos.core.auth.server.identity.value=$custom_server_identity_value
  • 打开鉴权开关

    开启鉴权开关,需要修改application.properties中的配置信息为:

    ### If turn on auth system:
    nacos.core.auth.system.type=nacos
    nacos.core.auth.enabled=true

    注意:鉴权开关是修改之后立马生效的,不需要重启服务端。

3.1. 设置管理员密码

自2.4.0版本开始,Nacos构建时不再提供管理员用户nacos的默认密码,需要在首次开启鉴权后,通过API或Nacos控制台进行管理员用户nacos的密码初始化步骤,具体操作如下:

通过Admin API,指定或随机生成一个管理员用户nacos的密码,当密码指定或生成后,该API将无法再进行调用。

curl -X POST 'http://$nacos_server_host:$nacos_server_port/nacos/v1/auth/users/admin' -d 'password=$your_password'

注意:若输入的$your_password为空字符串,或未带有password参数,Nacos将会生成随机密码,请保存好生成的随机密码。

此时若指定或生成随机密码成功后,会返回如下:

{"username":"nacos", "password":"$your_password"}

3.2. 密码强度注意事项

重要:在Nacos在初始化管理员用户nacos、创建或用户密码更新操作期间不强制执行特定密码长度。Nacos集群管理员有责任对自行构建的密码强度进行控制。为了避免与密码强度相关的安全风险,强烈建议初始化时使用强度较高的密码。

3.3. 升级集群注意事项

若Nacos集群升级自旧版本的Nacos,Nacos会认为当前已经存在管理员用户nacos,因此并不会要求进行管理员用户nacos的初始化流程,管理员用户nacos的密码仍然会保留旧版本时所使用的密码;因此若是使用旧版本时未修改过管理员用户nacos的默认密码,强烈建议升级后尽快修改管理员用户nacos的密码。

4. 客户端如何进行鉴权

请参考用户手册-配置鉴权

5. 开启Token缓存功能

无论是客户端SDK还是OpenAPI,在调用login接口获取accessToken之后,携带accessToken访问服务端,服务端解析Token进行鉴权。解析的动作比较耗时,如果想要提升接口的性能,可以考虑开启缓存Token的功能,用字符串比较代替Token解析。

默认鉴权插件模块支持token缓存功能,可参见ISSUE #9906

5.1. 开启方式

在application.properties中的配置信息:

nacos.core.auth.plugin.nacos.token.cache.enable=true

5.2. 注意事项

在开启Token缓存功能之前,服务端对每一个携带用户名密码访问login接口的请求都会生成新的token,接口的返回值中的tokenTtl字段跟服务端配置文件中设置的值相等,配置如下:

nacos.core.auth.plugin.nacos.token.expire.seconds=18000
// 对应的Docker镜像变量为NACOS_AUTH_TOKEN_EXPIRE_SECONDS

在开启Token缓存功能之后,服务端对每一个携带用户名密码访问login接口的请求,会先检查缓存中是否存在该用户名对应的token。若不存在,生成新的Token,插入缓存再返回;若存在,返回该token,此时tokenTtl字段的值为配置文件中设置的值减去该Token在缓存中存留的时长。 如果Token在缓存中存留的时长超过配置文件设置的值的90%,当login接口收到请求时,尽管缓存中存在该用户名对应的Token,服务端会重新生成Token返回给请求方,并更新缓存。因此,最差情况下,请求方收到的tokenTtl只有配置文件设置的值的10%。