Spring Cloud Vault簡介

1.概述

在本教程中,我們將展示如何在Spring Boot應用程序中使用Hashicorp的Vault保護敏感的配置數據。

我們在這裡假設一些保險櫃知識,並且我們已經建立並運行了測試設置。如果不是這種情況,讓我們花一點時間閱讀我們的Vault Intro教程,以便我們熟悉其基礎知識。

2.Spring Cloud Vault

Spring Cloud Vault是Spring Cloud堆棧中相對較新的功能,它允許應用程序以透明方式訪問Vault實例中存儲的機密

通常,遷移到Vault是一個非常簡單的過程:只需向我們的項目中添加所需的庫並添加一些額外的配置屬性,我們就應該做好了。無需更改代碼!

這是可能的,因為它充當在當前Environment註冊的高優先級PropertySource

因此,Spring將在需要屬性時使用它。示例包括DataSource屬性, ConfigurationProperties,等。

3.將Spring Cloud Vault添加到Spring Boot項目

為了在基於Maven的Spring Boot項目中包含spring-cloud-vault庫,我們使用了相關的starter工件,它將提取所有必需的依賴項。

除了主starter,我們還將包括spring-vault-config-databases ,它增加了對動態數據庫憑據的支持:

<dependency>

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

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

 </dependency>

 <dependency>

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

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

 </dependency>

可以從Maven Central下載最新版本的Spring Cloud Vault入門程序。

3.1。基本配置

為了正常工作,Spring Cloud Vault需要一種方法來確定在何處聯繫Vault服務器以及如何針對它進行身份驗證。

為此,我們在bootstrap.ymlbootstrap.properties提供了必要的信息:

# bootstrap.yml

 spring:

 cloud:

 vault:

 uri: https://localhost:8200

 ssl:

 trust-store: classpath:/vault.jks

 trust-store-password: changeit

spring.cloud.vault.uri屬性指向保險櫃的API地址。由於我們的測試環境使用帶有自簽名證書的HTTPS,因此我們還需要提供包含其公鑰的密鑰庫。

請注意,此配置沒有身份驗證數據。對於最簡單的情況,我們使用固定令牌,可以將其傳遞給系統屬性spring.cloud.vault.token或環境變量。這種方法與標準的雲配置機制(例如Kubernetes的ConfigMaps或Docker機密)結合使用時效果很好。

Spring Vault還需要針對我們要在應用程序中使用的每種秘密類型進行額外配置。以下各節描述瞭如何為兩種常見的機密類型添加支持:鍵/值和數據庫憑據。

4.使用通用機密後端

我們使用通用機密後端訪問存儲為Vault中的鍵值對的unversioned機密

假設我們已經在classpath具有spring-cloud-starter-vault-config依賴項,我們要做的就是向應用程序的bootstrap.yml配置文件中添加一些屬性:

spring:

 cloud:

 vault:

 # other vault properties omitted ...

 generic:

 enabled: true

 application-name: fakebank

在這種情況下,屬性application-name是可選的。如果未指定,Spring將採用標準spring.application.name的值。

現在,我們可以將存儲在secret/fakebank所有鍵/值對用作任何其他Environment屬性.以下代碼段顯示瞭如何讀取此路徑下存儲的foo鍵的值:

@Autowired Environment env;

 public String getFoo() {

 return env.getProperty("foo");

 }

如我們所見,代碼本身對Vault一無所知,這是一件好事!我們仍然可以在本地測試中使用固定屬性,並通過在bootstrap.yml啟用單個屬性來切換到Vault。

4.1。關於Spring Profiles

如果在當前Environment,可用Environment, Spring Cloud Vault將使用可用的配置文件名稱作為後綴附加到將在其中搜索鍵/值對的指定基本路徑

它還將在可配置的默認應用程序路徑(帶有和不帶有配置文件後綴)下查找屬性,以便我們可以在單個位置擁有共享機密。請謹慎使用此功能!

總而言之,如果外發fakebank應用程序的production配置文件處於活動狀態,則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.usernamespring.datasource.password屬性下注入這些憑證,以便常規DataSource可以選擇它們。

請注意,在使用此後端之前,我們必須按照上一教程中的說明在Vault中創建數據庫配置和角色。

為了在我們的Spring應用程序中使用Vault生成的數據庫憑據, spring-cloud-vault-config-databases必須與相應的JDBC驅動程序一起存在於項目的類路徑中。

我們還需要通過在bootstrap.yml:添加一些屬性來在應用程序中啟用它bootstrap.yml:

spring:

 cloud:

 vault:

 # ... other properties omitted

 database:

 enabled: true

 role: fakebank-accounts-rw

這裡最重要的屬性是role屬性,該屬性保存存儲在Vault中的數據庫角色名稱。在引導過程中,Spring將與Vault聯繫並請求其創建具有相應特權的新憑據。

默認情況下,保管庫將在配置的生存時間後撤消與這些憑據關聯的特權。

幸運的是, Spring Vault將自動續訂與所獲取憑證關聯的租約。這樣,只要我們的應用程序正在運行,憑據就將保持有效。

現在,讓我們來看一下這種集成的作用。以下代碼段從Spring託管的DataSource獲取新的數據庫連接:

Connection c = datasource.getConnection();

再一次,我們可以看到在我們的代碼中沒有使用保險櫃的跡象。所有集成都發生在Environment級別,因此我們的代碼可以像往常一樣輕鬆地進行單元測試。

六,結論

在本教程中,我們展示瞭如何使用Spring Vault庫將Vault與Spring Boot集成。我們討論了兩個常見的用例:通用鍵/值對和動態數據庫憑據。

包含所有必需的依賴項,集成測試和Vault設置腳本的示例項目可從GitHub上獲得