1. 概述
Vault是一款管理密钥和保护敏感数据的组件,用于保护、存储和严格控制对令牌、密码、证书和加密密钥的访问,可以使用UI客户端、CLI和HTTP API访问密钥和其他敏感数据。更多详细介绍,可以参阅vault官网
2. Vault下载与安装
本文以windows安装为例
2.1. Vault下载
浏览器输入官网地址https://www.vaultproject.io/,进入首页,点击Download进入下载页面
目前最新版本是1.12.2
选择适合的操作系统,386对应32位系统,AMD64对应64位系统,根据需要下载对应版本,下载完成的文件是一个压缩包,直接解压即可,解压后是一个名为vault.exe的文件
2.2. 安装
将vault.exe移动到指定目录,在vault.exe目录下打开cmd命令窗口,或者将vault.exe目录配置在环境变量中,在cmd命令窗口输入vault可以查看vault相关命令
3. 服务启动和参数配置
vault有多个启动模式,使用命令vault server -help可以查看详细的介绍
开发环境可以使用dev模式启动,dev模式启动下数据存储在内存中
命令如下:vault server -dev
在最下面有几个重要的参数需要设置
新打开一个cmd窗口,设置vault访问地址,输入命令set VAULT_ADDR=http://127.0.0.1:8200
保存unseal key,输入命令 echo “Unseak Key” > unseal.key
设置vault初始token,输入命令set VAULT_TOKEN=hvs.RGvfQb2UhGDd8WqB2350Yp2Y
如果需要设置namesapce,输入命令set VAULT_NAMESPACE=boot-vault-nprd
输入命令vault status,可以查看vault服务运行情况
4. 操作密钥
可以在vault管理页面添加密钥,也可以在CLI客户端或者使用HTTP API添加密钥,在dev模式下,默认使用kv安全引擎,使用命令vault kv -help可以查看更多操作
4.1. CLI操作密钥
Write secret
使用命令vault kv put可以写入secret,例如:
同时设置多个kv值时,可以使用如下命令
Read secret
使用vault kv get命令可以读取密钥
如果需要读取指定密钥,可以使用下面命令
Delete secret
使用vault kv delete命令可以删除密钥
再次读取密钥,会提示密钥已被删除
恢复已删除的secret,可以使用如下命令
再次查询恢复的secret
5. 管理端配置密钥
在浏览器地址栏输入http://127.0.0.1:8200,输入启动时的token
登录后进入首页
5.1. Secrets配置
vault在dev模式启动下默认的kv Secrets Engines是secret,为了区分项目,可以自己新建Secret,点击Enable new engine
选择KV模式,点击Next
输入Path名称,此参数为项目集成中kv.backend的值,第二处配置是最多显示多少个版本的数据,由于每次修改都是新建一个版本,配置此参数后,默认只显示最近的版本数
点击Create secret
输入Path for secret,此参数为项目集成中kv.application-name的值,Secret data就是具体的密钥配置信息
5.2. Policy配置
policy用于管理vault中控制用户可以访问的内容,比如读写权限,选择Policies,点击Create ACL policy创建新的policy,这里可以创建管理员policy和开发policy
输入name和Policy后,点击Create policy
同样的方式创建developer策略
5.3. Access配置
Access中可以配置权限方式
点击Enable new method创建新的认证方式,由于token认证方式中token会过期,可以创建appRole方式
Path默认approle,其他选项可以默认,直接点击Enable Method即可
配置approle参数
选择Entities,创建entity实体
name可以使用默认名称,选择Policies
在Entities页面选择Aliases添加alias
输入用户名称,选择认证方式
6. 获取approle参数
在使用approle认证时需要roleId和secretId,使用命令vault list auth/approle/role/可以查看存在哪些role
使用命令vault read auth/approle/role/my-role/role-id获取approle的roleId
使用命令vault write -f auth/approle/role/my-role/secret-id获取approle的secretId
7. 微服务集成vault
新建一个springboot项目,版本如下:
JDK:11
SpringBoot:2.7.8
SpringCloud:2021.0.5
7.1. 引入核心依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-vault-config</artifactId>
</dependency>
由于springcloud vault3.0和springboot2.4之后默认不再先读取bootstrap.yml配置,所以需要配置spring.cloud.bootstrap.enabled=true或者引入spring-cloud-starter-bootstrap依赖
7.2. yml配置文件
示例中使用token方式验证,由于token会过期,实际开发中会使用approle方式验证,新建bootstrap.yml文件,配置如下:
spring:
application:
name: cloud-vault
cloud:
vault:
host: localhost
port: 8200
scheme: http
fail-fast: true
authentication: token
token: xxx.xxxxxxxxxxxxx
#authentication: APPROLE
#app-role:
#role-id: xxxxxxxxxxxxxxx
#secret-id: xxxxxxxxxxxxx
read-timeout: 15000
connection-timeout: 5000
config:
spring.config.import: vault://
kv:
enabled: true
backend: cloud-vault
profile-separator: /
application-name: cloud-vault-qa
application.yml配置如下:
server:
port: 8099
spring:
datasource:
password: ${vault.mysql.password}
7.3. 验证
新建一个类获取application配置中的spring.datasource.password参数配置,再新建一个单元测试类引入,代码如下:
@SpringBootTest(classes = CloudVaultApplication.class)
class CloudVaultApplicationTests {
@Autowired
private VaultService vaultService;
@Test
void contextLoads() {
final String mysqlPassword = vaultService.getMysqlPassword();
System.out.println("mysql password is : " + mysqlPassword);
}
}
运行单元测试