ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

SpringBoot中使用Vault保护配置文件中的敏感数据

SpringBoot中使用Vault保护配置文件中的敏感数据

什么是 Vault

Vault 是一个基于身份的秘密和加密管理系统。秘密是您想要严格控制访问的任何内容,例如 API 加密密钥、密码和证书。 Vault 提供由身份验证和授权方法控制的加密服务。使用 Vault 的 UI、CLI 或 HTTP API,可以安全地存储和管理、严格控制(限制)和审核对机密和其他敏感数据的访问。

为什么需要 Vault

  • 执行密码轮换策略很痛苦
  • 掌握机密的员工离职后可能泄密或是恶意报复
  • 开发者不小心把机密信息随着代码上传到公网的源码仓库造成泄密
  • 管理多个系统的机密非常麻烦
  • 需要将机密信息安全地加密后存储,但又不想将密钥暴露给应用程序,以防止应用程序被入侵后连带密钥一起泄漏

vault 是一款 HCP 推出的密钥管理引擎,用来集中存储集群运行过程中所需要的秘密信息,例如数据库的访问凭证、密码、密钥等。它保证了存储与通信过程的保密性,这对于我们无处不在的敏感信息的数据安全显然是十分必要的。

与此同时,vault 拥有一系列可插拔功能扩展,可以支持将 vault 的实际数据存储到内存、文件系统、google cloud、AWS、etcd 等多种存储介质中,满足不同的集群部署需求,可谓是非常灵活。

本文我们就来初步介绍一下 vault 这款存储的搭建和使用。

简介

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

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

Vault服务安装及配置

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

方式 1:开发模式(Dev Mode,仅用于测试)

开发模式下 Vault 无需配置持久化、无需手动初始化 / 解封,自动生成根令牌,绝对不要用于生产环境。

1. 启动 Vault 容器

执行以下命令启动开发模式的 Vault:

docker run -d \ --name vault-dev \ -p 8200:8200 \ -e 'VAULT_DEV_ROOT_TOKEN_ID=my-root-token' \ -e 'VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200' \ hashicorp/vault:latest

参数说明:

  • --name vault-dev:容器命名为 vault-dev,方便管理
  • -p 8200:8200:映射本地 8200 端口到容器 8200 端口(Vault 默认端口)
  • VAULT_DEV_ROOT_TOKEN_ID:指定根令牌(自定义,后续访问用)
  • VAULT_DEV_LISTEN_ADDRESS:让 Vault 监听容器所有网卡,允许外部访问
2. 验证启动状态
# 查看容器日志,确认启动成功 docker logs vault-dev

日志中出现以下内容表示启动成功:

Vault server started! Log data will stream in below: ... Unseal Key: (开发模式无需关注) Root Token: my-root-token (你指定的根令牌) ... Vault address: http://0.0.0.0:8200

3. 访问 Vault UI

打开浏览器访问:http://localhost:8200

  • 选择「Token」方式登录
  • 输入根令牌my-root-token,即可进入 Vault 管理界面。

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

3. Vault基本操作

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

登陆成功后的页面:

可以查看secrect

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

创建新的密钥管理

选择KV, 创建路径db

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

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

创建一个sb.password秘钥:

以上就是基本的配置。

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

Vault加解密数据

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

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

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

数据库正确的连接。

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

完毕!!!

返回列表