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