接上三篇
Vault---机密信息管理工具安装及常用示例
Vault机密管理工具集群配置示例
vault签发根证书、中间证书、ca证书流程记录
项目里打算把所有密码都放到vault里管理,vault提供了springcloud vault用来在springboot里连接vault,启动加载vault里的值放到spring中,极端点,vault的kv引擎甚至可以做分布式配置中心来用,来替代nacos的配置中心功能,当然这样用的人还比较少。
maven引入:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-vault-config</artifactId>
<version>3.0.3</version>
</dependency>
bootstrap.yml里加入:
spring:
cloud:
vault:
application-name: venucia_fota_kv
host: 127.0.0.1
port: 8200
scheme: http
authentication: TOKEN
token: xxxtoken
connection-timeout: 5000
read-timeout: 15000
config:
order: -10
kv:
enabled: true
backend: kvTest
profile-separator: /
application-name: /ota/pwd
注意springcloud vault源码里对启动顺序定义的很靠前,所以最好不要放到nacos里,它会在nacos加载配置文件前就生效,如果放到nacos里会报缺少token的错误。springcloud vault代码侵入性很小,只要引入jar包,配到springboot里就可以生效。
假设我们在vault里新建一个kvTest的kv引擎,在
kvTest/ota/pwd
路径存储了一系列json数据比如:
{"mysql-pwd":"xxxpsd"}
上面的配置文件中backend代表的是引擎名称,application-name如果不指定,默认拿spring.application.name,指定了路径就是自定义的路径
如此,在springboot启动后,如果vault正常连接,且配置在这里的token有该引擎的访问权限的话,就可以把vault里面存储的json值(key,value)放入spring里,我们在项目里或nacos里用$就可以输出或者用java输出。
如:
nacos里或者配置文件里
${mysql-pwd}
java代码里:
@Value("${mysql-pwd}")
或import org.springframework.core.env.Environment里拿:
Environment config = SpringContextUtil.getApplicationContext().getEnvironment();
String value = config.getProperty("mysql-pwd");
System.out.println("===" + value);
补充SpringContextUtil:
package ly.mp.project.common.util;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component("springContextUtil")
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext; // Spring应用上下文环境
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) throws BeansException {
return (T) applicationContext.getBean(name);
}
@SuppressWarnings("unchecked")
public static <T> T getBean(Class<?> clz) throws BeansException {
return (T) applicationContext.getBean(clz);
}
}
别忘了给这个token最基本的policy权限:
path "kvTest/*" {
capabilities = ["read", "list"]
}
path "secret/*"{
capabilities = ["read", "list"]
}
springcloud vault会自动续期token
vault创建的token默认最长只有768h的有效期,也就是32天左右,但是springcloud vault jar包里做了自动续期的操作,实测在token将要过期前的5秒到3秒内会自动向vault发送renew-self请求实现自动续期,所以理论上只要项目在过期前的那个时间点还在运行,就可以自动续期。
如此,就可以把项目里的所有密码都放到vault里管理了,比如mysql密码,elasticsearch密码等等,要比直接放在nacos里更安全。
网友评论