前言
nacos 致力于帮助您发现、配置和管理微服务。nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
使用 nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。随着nacos被广泛使用,也逐渐暴露一些的漏洞,官方给出了一些建议,具体需要用户自行维护。
本篇简单介绍实际运用过程遇到的问题,以及处理过程,以备后续参考
一、nacos漏洞复现
在2.2.1之后的版本,默认不需要登录,直接就到的管理界面,所有信息一目了然,如果暴露在外网,使用默认端口,严重威胁到数据安全。
虽然2.2.1的版本之前的版本有登录界面限制,一旦nacos没有开启权限认证,即nacos.core.auth.enabled = false,在这种情况下,通过一些请求就可以绕过nacos的权限认证。
这里列举常见的三种方式。
1.1.查看配置
在未登录的情况下,在浏览器中直接发起请求
http://127.0.0.1:18848/nacos/v1/cs/configs?dataid=&group=&appname=&config_tags=&pageno=1&pagesize=10&tenant=&search=accurate&accesstoken=&username=
这样直接可以看到返回了配置列表,如图:

1.2.查看用户列表
在未登录的情况下,在浏览器中直接发起请求,能拿到所有的用户信息。
http://127.0.0.1:18848/nacos/v1/auth/users?pageno=1&pagesize=10

同样的方式,也可以查询出所有的角色,如下图:
提示:在2.2.1版本之后,已经直接报参数错误了

1.3.注册新用户
在未登录的情况下,通过第三方工具(postman或apifox)以post方式访问该请求,并传入指定参数,可以直接新增用户。
http://127.0.0.1:18848/nacos/v1/auth/users?username=test&password=123456
执行结果如下图:

二、nacos开启鉴权
关于鉴权,官方文档:authorization,相关参数说明如下:

接下来,介绍本如何按照文档来实现鉴权,这里以2.3.2版本为例,步骤如下:
修改nacos\conf文件夹下的application.properties文件中的部分属性
- 开启鉴权
nacos.core.auth.enabled=true
- 默认鉴权插件用于生成用户登陆临时accesstoken所使用的密钥,这是采用base64生成,可以使用在线工具
nacos.core.auth.plugin.nacos.token.secret.key=zmf1bhrub2tlblnly30mjayndewmtyxmtazjldetlebmfjb3ndb3jlqxv0aerlunyzwf0zuf
- 用于替换useragent白名单的身份识别key和value
nacos.core.auth.server.identity.key=npsserveridentitynacos.core.auth.server.identity.value=customsecurity
添加或修改后的配置如图:

全部配置好,无需重启nacos,刷新页面,很可能会出现下面的情况

此时,只需要关闭提示,点击用户名,登出,然后重新登录即可。
若后期还是会出现,那可能是因为在nacos的sql脚本中没有针对用户权限的数据录入 ,所以需要执行sql:
insert into roles (username, role) values ('nacos', 'role_admin');按照上面的步骤设置好后,通过网页直接访问或postman的get方式访问,都会被拒绝

三、变更配置与信息加密
1.变更配置
当nacos开启鉴权后,其它微服务会报错,而直接启动其他服务,其他服务也无法正常连接nacos,出现403错误,此时,需要再其他服务的配置文件中加上如下配置。
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos

2.信息加密
从上图的配置可以看出,naocs以明文的形式出现,这样存在被泄露的风险,针对这种情况,可以采用jasypt加密,加密后效果,如图:

关于如何使用 jasypt加密
四、增强安全性
- 不采用默认端口,变更为端口

- 设置只监听本地

- 采用nginx代理,设置白名单
http {
# ...
upstream nacos_server {
server nacos-server-ip:2838;
}
server {
listen 1789;
server_name nacos.example.com;
location / {
proxy_pass http://nacos_server;
proxy_set_header host $host;
proxy_set_header x-real-ip $remote_addr;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
# 设置白名单
allow 123.123.123.123; # 允许访问的 ip
allow 234.234.234.234; # 可以添加更多允许的 ip
deny all; # 拒绝其他所有 ip
}
}
# ...
}- 开启防火墙,设置入站规则
- 关闭登录界面

五、常见问题
5.1.提示nacos启动异常
若提示:
“com.alibaba.nacos.api.exception.nacosexception: <html><body><h1>whitelabel error page</h1><p>this application has no explicit mapping for /error, so you are seeing this as a fallback.</p><div id='created'>thu nov 14 17:04:16 cst 2024</div><div>there was an unexpected error (type=forbidden, status=403).</div><div>unknown user!</div></body></html>”
导致无法启动的,需要检查账号密码是否正确
5.2 模块无法启动
若启动模块时,提示:
“consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true”
如图:
解决步骤:
检查bootstrap.yml是否配置了相关信息,即同名的bean覆盖,如下:
spring:
main:
allow-bean-definition-overriding: true如果配置了,还是启动报错,可以采用在启动类加上配置来解决,示例代码:
@enablediscoveryclient
@springbootapplication(exclude = {datasourceautoconfiguration.class })
public class demoapplication{
public static void main(string[] args) {
springapplication application = new springapplication(demoapplication.class);
application.setallowbeandefinitionoverriding(true);
application.run(args);
}
}5.3 提示缺少字段
如果下载使用最新nacos,延用旧的数据库,在启动nacos可能会出现缺少字段提示
unknown column 'encrypted_data_key' in 'field list'
此时,需要分别在3张表添加该字段
alter table config_info add column `encrypted_data_key` text not null comment '秘钥' ;
alter table config_info_beta add column `encrypted_data_key` text not null comment '秘钥' ;
alter table his_config_info add column `encrypted_data_key` text not null comment '秘钥' ;
总结
低版本的nacos很有必要升级,或者开启鉴权,以保证数据安全,特别是1.x版本升级到2.0至关重要。nacos作为开源的项目,在实际运用中尽量少采用默认的配置,以提高nacos的安全性。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论