https://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247484838&idx=1&sn=6439ed96133dde0cf831a96d733ef955&chksm=fb3f1c5dcc48954bb97dd5c551107b85808ca7ee1243bc21bc3307a8714e1bfb35c8ba5bc9d5&scene=0&key=db7d85a11647f7e7c12438d4528cc05c342063b665e301263cc2e229c21428ed0bf8aa75b75ba3839dd2ca84ea8a6bc54550d72a15ef3288d37e1a469cb3e449fbc2478bc16ad3b09aae4b3b7cec7cde&ascene=1&uin=MjgwMTEwNDQxNg%3D%3D&devicetype=Windows-QQBrowser&version=6103000b&lang=zh_CN&pass_ticket=rxCIkuKX8bC9GUfoiX05Q%2B8W%2FnX7p%2B9TdnJOkqoSw4N06LIjjrXo0dqYU5hVSkAz

stphenZkang SpringForAll社区 9月29日

原文链接:https://www.baeldung.com/spring-cloud-vault

作者: Philippe Sevestre

译者:康仔

1. 概述

在本教程中, 我们将展示如何在Spring Boot应用程序中使用Hashicorp’s Vault来保护敏感的配置数据。

到这里我们假设你已经有一定的Vault知识,我们已经启动并运行一个测试设置。. 如果不是这样,让我们花点时间阅读我们的Vault入门教程 来了解它的基础知识。

2. Spring Cloud Vault

Spring Cloud Vault是Spring Cloud堆栈的一个相对较新的成员,它允许应用程序以透明的方式访问存储在 Vault实例中的加密数据。

一般来说,迁移到 Vault是一个非常简单的过程:只需添加所需的库,并向我们的项目添加一些额外的配置属性,我们就应该做好了。不需要修改任何代码!

这是可能的,因为它是在当前环境中注册的优先级较高的 PropertySource 。

因此,无论Spring何时需要属性,都会使用它。例如DataSource 属性、ConfigurationProperties等。

3. 将Spring Cloud Vault添加到Spring Boot项目

为了在基于maven的Spring Boot项目中引入 spring-cloud-vault库,我们使用辅助的starter 构件器,它将加载所有必需的依赖项。

除了主要的starter之外,我们还将包括spring-vault-config-databases,它增加了对动态数据库凭证的支持:

  1. <dependency>

  2.    <groupId>org.springframework.cloud</groupId>

  3.    <artifactId>spring-cloud-starter-vault-config</artifactId>

  4. </dependency>

  5. <dependency>

  6.    <groupId>org.springframework.cloud</groupId>

  7.    <artifactId>spring-cloud-vault-config-databases</artifactId>

  8. </dependency>

最新版的 Spring Cloud Vault starter 已经能够在Maven中心仓库下载了。

3.1. 基础配置

为了正常地工作,Spring Cloud Vault需要一种方法来确定在哪里与Vault 服务器通信,以及如何对其进行身份验证。

我们通过在 bootstrap.yml 或者 bootstrap.properties文件中配置必要的信息来做到这一点:

  1. # bootstrap.yml

  2. spring:

  3.  cloud:

  4.    vault:

  5.      uri: https://localhost:8200

  6.      ssl:

  7.        trust-store: classpath:/vault.jks

  8.        trust-store-password: changeit

spring.cloud.vault.uri属性指向Vault的API地址。由于我们的测试环境使用带有自签名证书的HTTPS,所以我们还需要提供包含其公钥的密钥存储库。

注意,这个配置没有身份验证数据。对于这种最简单的情况,我们可以使用一个固定的令牌,我们可以通过系统属性spring.cloud.vault.token或环境变量来配置它。这种方法与标准的云配置机制配合得很好,比如Kubernetes的ConfigMaps或Docker secrets。

对于我们想在应用程序中使用的各种类型的加密方式,Spring Vault也需要额外的配置。下面的部分描述了如何添加两个常见的加密类型支持:键/值和数据库凭证。

4. 使用一般的加密后端

我们使用一般的加密后端来访问存储在Vault中的键-值对的未定版本的加密数据。

假设我们已经在classpath中添加了spring-cloud-starter-vault-config的依赖,我们所要做的就是在应用程序的bootstrap.yml 文件中添加一些属性:

  1. spring:

  2.  cloud:

  3.    vault:

  4.      # other vault properties omitted ...

  5.      generic:

  6.        enabled: true

  7.        application-name: fakebank

在这种情况下,application-name属性是可选的。如果不指定,Spring将使用标准spring.application.name的值代替。

我们现在可以使用存储在 secret/fakebank中的所有键/值对作为任何其他环境属性。下面的代码片段展示了如何读取存储在此路径下的foo键的值:

  1. @Autowired Environment env;

  2. public String getFoo() {

  3.    return env.getProperty("foo");

  4. }

正如我们所看到的,无需对Vault写任何代码,这是一件好事!我们仍然可以在本地测试中使用固定的属性,并按照我们的要求切换到Vault,只需在bootstrap.yml文件中启动一个属性即可。

4.1. 关于Spring配置文件的注释

如果在当前环境中可用,Spring Cloud Vault 将使用可用的概要文件名作为后缀追加到指定的基路径中,其中键/值对将被搜索。

它还将在一个可配置的默认应用程序路径下寻找属性(带有和没有配置后缀),这样我们就可以在一个位置共享加密数据。小心使用这个特性!

总而言之,如果fakebank应用程序的生产配置文件是灵活的,Spring Vault将寻找存储在以下路径下的属性:

  1. secret/fakebank/production (较高优先级)

  2. secret/fakebank

  3. secret/application/production

  4. secret/application (低优先级)

在前面的列表中,application是Spring为加密数据用作默认附加位置的名称。我们可以使用spring.cloud.vault.generic.default-context 属性修改它。

存储在最特定路径下的属性将优先于其他路径。例如,如果在上面的路径中有相同的属性foo,那么优先顺序将是:

5. 使用数据库加密后端

数据库后端模块允许Spring应用程序使用Vault创建动态生成的数据库凭证。Spring Vault将这些凭证注入标准的spring.datasource.username和spring.datasource.password属性,这样就可以通过常规的数据源进行选择。

请注意,在使用这个后端之前,我们必须像我们之前的教程中描述的那样,在Vault中创建一个数据库配置和角色。

为了在Spring应用程序中使用Vault生成的数据库凭证,spring-cloud-vault-config-databases必须出现在项目的类路径中,以及相应的JDBC驱动程序。

我们还需要在我们的bootstrap.yml文件中添加一些属性,从而使其在我们的应用程序中生效:

  1. spring:

  2.  cloud:

  3.    vault:

  4.      # ... other properties omitted

  5.      database:

  6.        enabled: true

  7.        role: fakebank-accounts-rw

这里最重要的属性是role属性,它持有存储在Vault中的数据库角色名称。在引导期间,Spring将连接Vault,并请求来它创建具有相应特权的新凭证。

默认情况下,vault将在配置好的时间内取消与这些凭证相关的特权。

值得庆幸地是,Spring Vault将自动更新与获得的凭证相关的租约。通过这样做,证书将在我们的应用程序运行时保持长期有效。

现在,让我们看看这个集成。下面的代码片段从spring管理的数据源获得一个新的数据库连接:

  1. Connection c = datasource.getConnection();

再一次,我们可以看到在我们的代码中没有Vault使用的迹象。所有的集成都发生在环境级别,所以我们的代码可以很容易地像往常一样进行单元测试。

6. 结论

在本教程中,我们已经展示了如何使用Spring Vault库将Vault与Spring Boot程序集成在一起。我们已经介绍了两个常见的用例:通用键/值对和动态数据库凭证。

一个包含所有必需依赖项、集成测试和 vault安装脚本的示例项目可以在GitHub上找到。

推荐: 【SFA官方翻译】:Spring中的组件扫描

上一篇: 【SFA官方翻译】Spring Boot中配置Tomcat连接池

Spring Cloud Vault介绍的更多相关文章

  1. Java之Spring Cloud概念介绍(非原创)

    文章大纲 一.理解微服务二.Spring Cloud知识介绍三.Spring Cloud全家桶四.参考资料下载五.参考文章 一.理解微服务   我们通过软件架构演进过程来理解什么是微服务,软件架构的发 ...

  2. (2)java Spring Cloud+Spring boot+mybatis企业快速开发架构之SpringCloud-Spring Cloud是什么?Spring Cloud版本介绍

    ​ Spring Cloud 是一系列框架的有序集合.它利用 Spring Boot 的开发便利性,巧妙地简化了分布式系统基础设施的开发,如服务注册.服务发现.配置中心.消息总线.负载均衡.断路器.数 ...

  3. Spring Cloud Alibaba 介绍及工程准备

    简介 SpringCloud Alibaba是阿里巴巴集团开源的一套微服务架构解决方案. 微服务架构是为了更好的分布式系统开发,将一个应用拆分成多个子应用,每一个服务都是可以独立运行的子工程.其中涵盖 ...

  4. Spring Cloud Stream介绍-Spring Cloud学习第八天(非原创)

    文章大纲 一.什么是Spring Cloud Stream二.Spring Cloud Stream使用介绍三.Spring Cloud Stream使用细节四.参考文章 一.什么是Spring Cl ...

  5. Spring Cloud Bus介绍--Spring Cloud学习第七天(非原创)

    一.什么是Spring Cloud Bus二.Spring Cloud Bus之RabbitMQ介绍三.Spring Cloud Bus整合RabbitMQ四.Spring Cloud Bus整合Ka ...

  6. Spring Cloud 子项目介绍

    Spring Cloud由以下子项目组成. Spring Cloud Config 配置中心——利用git来集中管理程序的配置. 项目地址:https://spring.io/projects/spr ...

  7. Spring Cloud体系介绍

    上图只是Spring Cloud体系的一部分,Spring Cloud共集成了19个子项目,里面都包含一个或者多个第三方的组件或者框架! Spring Cloud 工具框架 1.Spring Clou ...

  8. Spring Cloud学习介绍

    最近在学spring cloud, 整理了下 简单知识要求: 1.要了解springboot 2.了解分布式架构 3.了解微服务 4.了解springcloud是做什么的 带着这些,初学者 就至少有个 ...

  9. Spring Cloud认知学习(一):Spring Cloud介绍与Eureka使用

    目录 Spring Cloud的介绍 微服务的介绍 Spring Cloud出现的原因: 常见场景: 微服务的优劣势: Spring Cloud版本问题 版本介绍 与Spring Boot版本对应关系 ...

随机推荐

  1. [转帖]Linux:cut命令详解

    Linux:cut命令详解 https://www.cnblogs.com/Spiro-K/p/6361646.html cut -f cut -f -d cut -c1- 这三个命令好像最常见, 记 ...

  2. 重构客户注册-基于ActiveMQ实现短信验证码生产者

    重构目标:将bos_fore项目中的CustomerAction作为短信消息生产者,将消息发给ActiveMQ,创建一个单独的SMS项目,作为短信息的消费者,从ActiveMQ获取短信消息,调用第三方 ...

  3. MyBatis映射文件2(不支持自增的数据库解决方案/参数处理[单参、多参、命名参数])

    针对Oracle不支持自增的解决方案 Oracle不支持自增,但是它使用序列来模拟自增,每次插入数据的主键是从序列中拿到的值,那么如何获取这个值呢? <insert id="addEm ...

  4. 剑指offer(7)

    今天的几道题目都是关于斐波那契数列的. 题目1: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 传统的方法采用递归函数,这种 ...

  5. python(Django之组合搜索、JSONP、XSS过滤 )

    一.组合搜索 二.jsonp 三.xss过滤 一.组合搜索 首先,我们在做一个门户网站的时候,前端肯定是要进行搜索的,但是如果搜索的类型比较多的话,怎么做才能一目了然的,这样就引出了组合搜索的这个案例 ...

  6. Protocol buffers--python 实践(二) protocol buffers vs json

    为什么专门开一个坑,来使用pb.放弃本在各平台上都支持得很好的json而使用pb的一个归根到底的理由,就是希望在保证强类型和跨平台的情况下,能够更轻,更快,更简单.既然是奔着这个目标去的,到底多快我需 ...

  7. HashMap、HashTable、ConcurrentHashMap、HashSet区别 线程安全类

    HashMap专题:HashMap的实现原理--链表散列 HashTable专题:Hashtable数据存储结构-遍历规则,Hash类型的复杂度为啥都是O(1)-源码分析 Hash,Tree数据结构时 ...

  8. java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=fun2], {ExactMatcher:fDisplayName=fun2(cn.itcast.demo2.fun1)], {LeadingIdentifierMatcher:fClassName=cn.itcast.demo2.fun1,fLeadi

    Junit报的错误, 在测试方法前面没有添加注解@Test

  9. Lodop打印连续的纸张

    连续的纸张,有时有会被误解为没有高度,高度自适应,其实不是,这属于纸张连续打印,纸张高度和实际单个纸张高度相同.纸张高度自适应适用于没有高度的那种小票打印(卷纸没有纸张分界线),不是这种连续纸张.关于 ...

  10. vue axios 封装(二)

    封装二: http.js import axios from 'axios' import storeHelper from './localstorageHelper' // 全局设置 const ...