使用Vault保护SpringBoot配置文件中的敏感数据,你学会了吗?

开发 前端
Spring Vault 为访问、存储和撤销秘密提供客户端支持。有了 HashiCorp 的 Vault,你就有了一个集中的地方来管理所有环境中应用程序的外部秘密数据。

环境:SpringBoot2.7.16 + Vault1.15.5(Vault服务版本)

1. 简介

SpringBoot作为流行的Java微服务框架,其配置文件可能包含数据库密码、API密钥等敏感数据。为了保障这些信息的安全,Vault作为一个开源的秘密管理工具,成为了众多开发者的选择。本文将深入探讨如何整合SpringBoot与Vault,实现对配置文件中敏感信息的有效保护,从而确保微服务应用的安全性。

Spring Vault 为访问、存储和撤销秘密提供客户端支持。有了 HashiCorp 的 Vault,你就有了一个集中的地方来管理所有环境中应用程序的外部秘密数据。Vault 可以管理应用程序数据、远程应用程序/资源的用户名/密码等静态和动态秘密,并为 MySQL、PostgreSQL、Apache Cassandra、Consul、AWS 等外部服务提供凭证。

2. Vault服务安装及配置

本文将通过Docker安装Vault服务。执行如下命令即可

docker run -d --name vault --cap-add=IPC_LOCK \
  -e 'VAULT_LOCAL_CONFIG={"storage": {"file": {"path": "/vault/file"}}, "listener": [{"tcp": { "address": "0.0.0.0:8200", "tls_disable": true}}], "default_lease_ttl": "168h", "max_lease_ttl": "720h", "ui": true}' \
  -p 8200:8200 hashicorp/vault server

上面以服务的模式运行vault。

--cap-add=IPC_LOCK:这是 Vault 锁定内存所必需的,这会阻止内存被交换到磁盘。强烈推荐这个。在非开发环境中,如果不想使用该功能,则必须添加"disable_mlock: true"配置信息。

这将运行一个禁用 TLS 的 Vault 服务器,file存储后端位于路径/vault/file,默认秘密租约期限为一周,最长为 30 天。file不建议在生产使用中禁用 TLS 和使用存储后端。

3. Vault基本操作

通过http://localhost:8200/ui/ 访问Vault管理页面

图片图片

这里输入你初次进入页面时会给你生成一份token文件,文件中包含了token信息。如下:

图片图片

进入管理页面后点击Secrets Engines菜单,在该菜单中进行信息的配置

图片图片

创建新的密钥管理

图片图片

选择KV

图片图片

输入路径Path,这个路径就是以后你要访问的路径,然后点击Enable Engine。

最后添加你需要的配置信息

图片图片

以上就是基本的配置。

在上面的加密引擎选择中有个,Transit这个类型可以同来对数据进行加解密也是非常的实用。

4. Vault加解密数据

接下来我们通过Transit进行数据的加解密。

private VaultEndpoint vaultEndpoint ;
private VaultTemplate vaultTemplate  ;


@BeforeEach
public void init() {
  vaultEndpoint = new VaultEndpoint() ;
  vaultEndpoint.setHost("localhost") ;
  vaultEndpoint.setPort(8200) ;
  vaultEndpoint.setScheme("http") ;
  
  vaultTemplate = new VaultTemplate(vaultEndpoint, new TokenAuthentication("hvs.xxxxxxxxxxooooooooo"));
}

加密数据

@Test
public void testEncrypt() {
  String ret = vaultTemplate.opsForTransit().encrypt("db.password", "123123") ;
  System.out.println(ret) ;
}
// 输出
vault:v1:1WxwJjUJnN78FnqsTzxo+9wnGyHln3yCdG+lf5ZC/SDmeQ==

解密数据

@Test
public void testDecrypt() {
  String ret = vaultTemplate.opsForTransit().decrypt("db.password", "vault:v1:wBLlqFGICCnONZgwm+9JRRiOF/0xoxuO+OIy4omZoS1FBg==") ;
  System.out.println(ret) ;
}
// 输出
123123

5. 编程方式存储KV值

首先在Vault上建立一个mydata秘钥引擎。

@Test
public void testCreate() {
  Secrets ss = new Secrets();
  ss.username = "admin";
  ss.password = "123123";
  Map<String, Object> data = new HashMap<>() ;
  data.put("data", ss) ;
  vaultTemplate.write("/mydata/data/db", data) ;
}

图片图片

查询获取数据

@Test
public void testRead() {
  System.out.println( vaultTemplate.read("/mydata/data/db").getData()) ;
}

6. SpringBoot整合Vault

添加配置文件vault.properties,内容如下:

vault.uri=http://localhost:8200
vault.token=hvs.xxxxxxxxoooooooo

配置类

@Configuration
@VaultPropertySource(value = {"demo/db"})
@PropertySource("vault.properties")
@Import(EnvironmentVaultConfiguration.class)
public class AppVaultConfig {}

@VaultPropertySource注解配置你需要查询的密钥key信息@Import(EnvironmentVaultConfiguration.class) 该配置会自动在容器中配置VaultTemplate类型的Bean,并且读取的配置信息就是上面vault.properties中的。

以上就是SpringBoot与Vault整合所需要的全部内容。接下来在Vault服务上配置数据库的信息

图片图片

以上准备工作做完后,接下来就可以在SpringBoot配置文件中去引用这些配置了。

spring:
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/batch?serverTimeznotallow=GMT%2B8&nullCatalogMeansCurrent=true&useSSL=false
    username: ${db.username}
    password: ${db.password}
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      minimumIdle: 10
      maximumPoolSize: 13

到此,就完成了所有的配置工作,接下来只需要启动服务,查看是否有异常即可。

图片图片

数据库正确的连接。

以上是本篇文章的全部内容,希望对你有所帮助。

完毕!!!

责任编辑:武晓燕 来源: Spring全家桶实战案例源码
相关推荐

2020-04-16 08:00:00

Ansible Vau敏感数据加密

2023-10-13 09:04:09

2024-05-29 07:47:30

SpringJava@Resource

2024-02-02 11:03:11

React数据Ref

2023-11-29 07:23:04

参数springboto

2023-06-27 08:00:35

2022-10-24 09:55:32

ESLintJavaScript

2022-11-08 08:45:30

Prettier代码格式化工具

2024-10-09 07:40:43

2023-11-27 07:26:42

Springboot容器

2023-08-08 08:23:08

Spring日志​线程池

2024-08-19 10:24:14

2023-10-23 10:39:05

2023-10-30 07:05:31

2023-12-27 07:31:45

json产品场景

2023-09-06 11:31:24

MERGE用法SQL

2023-10-30 15:35:05

数据安全数据驱动

2022-07-08 09:27:48

CSSIFC模型

2024-01-11 08:21:33

Jetpack数据技术

2024-01-02 12:05:26

Java并发编程
点赞
收藏

51CTO技术栈公众号