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数据库连接的全部教程,其实很简单,希望能帮到你.

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐