nacos连接数据库密码加密

it2024-12-16  23

nacos数据库密码加密

简介修改源码打包发布


简介

nacos作为一款优秀的注册发现中心和配置管理工具,能够实现微服务配置的热更新,同时从代码中解耦出去,更加自由的控制服务的上线和下线,使所有的操作全部可视化,独立化. 关于nacos的入门和配置官网都有非常详细的介绍nacos官网但是在nacos原生版本中,nacos持久化连接mysql数据库是通过配置文件读取数据库的ip、port、user及password的. 这其实是一种不安全的操作,如果数据库权限约束做的不好,那么数据库密码泄露将是一件很严重的事情.

修改源码

完成个性化定制,自定义数据库密码的加密方式,其实并不难,只需要修改nacos源码中数据库连接部分即可nacos数据库连接初始化所在的类是com.alibaba.nacos.config.service.DataSource包下的ExternalDataSourceServiceImpl类.完成数据库信息装配的方法是reload()方法.我们需要做的只是在nacos读取到配置文件中的密码之后,并且将属性值赋值到实体类之前将密码解析出来即可,以下是源码以及修改的部分 @Override public synchronized void reload() throws IOException { List<HikariDataSource> dblist = new ArrayList<>(); try { String val = null; val = ApplicationUtils.getProperty("db.num"); if (null == val) { throw new IllegalArgumentException("db.num is null"); } int dbNum = Integer.parseInt(val.trim()); for (int i = 0; i < dbNum; i++) { HikariDataSource ds = new HikariDataSource(); ds.setDriverClassName(JDBC_DRIVER_NAME); val = ApplicationUtils.getProperty("db.url." + i); if (null == val) { fatalLog.error("db.url." + i + " is null"); throw new IllegalArgumentException("db.url." + i + " is null"); } ds.setJdbcUrl(val.trim()); val = ApplicationUtils.getProperty("db.user." + i, ApplicationUtils.getProperty("db.user")); if (null == val) { fatalLog.error("db.user." + i + " is null"); throw new IllegalArgumentException("db.user." + i + " is null"); } ds.setUsername(val.trim()); // nacos在这里读取数据库密码 //--------------------------------------------------------------------------------------- val = ApplicationUtils.getProperty("db.password." + i, ApplicationUtils.getProperty("db.password")); if (null == val) { fatalLog.error("db.password." + i + " is null"); throw new IllegalArgumentException("db.password." + i + " is null"); } String trim = val.trim(); // 在这里可以自定义密码的解密规则,以最简单的base64为例,可以替换成自己的解密类 val=new String(Base64.getDecoder().decode(trim)); ds.setPassword(val); //------------------------------------------------------------------------------------------- val = ApplicationUtils.getProperty("db.maxPoolSize." + i, ApplicationUtils.getProperty("db.maxPoolSize")); ds.setMaximumPoolSize(Integer.parseInt(defaultIfNull(val, "20"))); val = ApplicationUtils.getProperty("db.minIdle." + i, ApplicationUtils.getProperty("db.minIdle")); ds.setMinimumIdle(Integer.parseInt(defaultIfNull(val, "50"))); ds.setConnectionTimeout(3000L); // 每10分钟检查一遍连接池 ds.setValidationTimeout(TimeUnit.MINUTES.toMillis(10L)); ds.setConnectionTestQuery("SELECT 1 FROM dual"); dblist.add(ds); JdbcTemplate jdbcTemplate = new JdbcTemplate(); jdbcTemplate.setQueryTimeout(queryTimeout); jdbcTemplate.setDataSource(ds); testJTList.add(jdbcTemplate); isHealthList.add(Boolean.TRUE); } if (dblist == null || dblist.size() == 0) { throw new RuntimeException("no datasource available"); } dataSourceList = dblist; new SelectMasterTask().run(); new CheckDBHealthTask().run(); } catch (RuntimeException e) { fatalLog.error(DB_LOAD_ERROR_MSG, e); throw new IOException(e); } finally { } }

同时这个类中其他所有的属性都可以根据自己的需要去进行修改,也可以自己实现这个实现类的父接口,不过只是修改密码规则的话还是建议直接在这里修改

打包发布

修改完源码需要将源码包打包成可以使用的jar包 在nacos顶级包路径下打开控制台(IDEA的terminal也可以),输入以下命令 mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U

然后等待打包成功. 打包好的包位置:nacos-xxx\distribution\target\nacos-server-xxx.zip修改配置文件中的密码,用自己定义的加密方式加密一遍启动nacos,登录到控制台,日志没有报错那么修改nacos密码连接方式就完成了

以上就是修改nacos数据库连接的全部教程,其实很简单,希望能帮到你.

最新回复(0)