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.yml
或bootstrap.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將在以下路徑下查找存儲的屬性:
-
secret/
fakebank/production
(更高優先級) -
secret/
fakebank -
secret/application/production
-
secret/application
(低優先級)
在前面的列表中, application
是Spring用作秘密的默認其他位置的名稱。我們可以使用spring.cloud.vault.generic.default-context
屬性對其進行修改。
存儲在最特定路徑下的屬性將優先於其他屬性。例如,如果在上述路徑下可以使用相同的屬性foo
,則優先級順序為:
5.使用數據庫加密後端
數據庫後端模塊允許Spring應用程序使用由Vault創建的動態生成的數據庫憑據。 Spring Vault在標準spring.datasource.username
和spring.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上獲得。