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
原文鏈接: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,它增加了對動態數據庫憑證的支持:
-
<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>
最新版的 Spring Cloud Vault starter 已經能夠在Maven中心倉庫下載了。
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屬性指向Vault的API地址。由於我們的測試環境使用帶有自簽名證書的HTTPS,所以我們還需要提供包含其公鑰的密鑰存儲庫。
注意,這個配置沒有身份驗證數據。對於這種最簡單的情況,我們可以使用一個固定的令牌,我們可以通過系統屬性spring.cloud.vault.token或環境變量來配置它。這種方法與標准的雲配置機制配合得很好,比如Kubernetes的ConfigMaps或Docker secrets。
對於我們想在應用程序中使用的各種類型的加密方式,Spring Vault也需要額外的配置。下面的部分描述了如何添加兩個常見的加密類型支持:鍵/值和數據庫憑證。
4. 使用一般的加密后端
我們使用一般的加密后端來訪問存儲在Vault中的鍵-值對的未定版本的加密數據。
假設我們已經在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中的所有鍵/值對作為任何其他環境屬性。下面的代碼片段展示了如何讀取存儲在此路徑下的foo鍵的值:
-
@Autowired Environment env;
-
public String getFoo() {
-
return env.getProperty("foo");
-
}
正如我們所看到的,無需對Vault寫任何代碼,這是一件好事!我們仍然可以在本地測試中使用固定的屬性,並按照我們的要求切換到Vault,只需在bootstrap.yml文件中啟動一個屬性即可。
4.1. 關於Spring配置文件的注釋
如果在當前環境中可用,Spring Cloud Vault 將使用可用的概要文件名作為后綴追加到指定的基路徑中,其中鍵/值對將被搜索。
它還將在一個可配置的默認應用程序路徑下尋找屬性(帶有和沒有配置后綴),這樣我們就可以在一個位置共享加密數據。小心使用這個特性!
總而言之,如果fakebank應用程序的生產配置文件是靈活的,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屬性,這樣就可以通過常規的數據源進行選擇。
請注意,在使用這個后端之前,我們必須像我們之前的教程中描述的那樣,在Vault中創建一個數據庫配置和角色。
為了在Spring應用程序中使用Vault生成的數據庫憑證,spring-cloud-vault-config-databases必須出現在項目的類路徑中,以及相應的JDBC驅動程序。
我們還需要在我們的bootstrap.yml文件中添加一些屬性,從而使其在我們的應用程序中生效:
-
spring:
-
cloud:
-
vault:
-
# ... other properties omitted
-
database:
-
enabled: true
-
role: fakebank-accounts-rw
這里最重要的屬性是role屬性,它持有存儲在Vault中的數據庫角色名稱。在引導期間,Spring將連接Vault,並請求來它創建具有相應特權的新憑證。
默認情況下,vault將在配置好的時間內取消與這些憑證相關的特權。
值得慶幸地是,Spring Vault將自動更新與獲得的憑證相關的租約。通過這樣做,證書將在我們的應用程序運行時保持長期有效。
現在,讓我們看看這個集成。下面的代碼片段從spring管理的數據源獲得一個新的數據庫連接:
-
Connection c = datasource.getConnection();
再一次,我們可以看到在我們的代碼中沒有Vault使用的跡象。所有的集成都發生在環境級別,所以我們的代碼可以很容易地像往常一樣進行單元測試。
6. 結論
在本教程中,我們已經展示了如何使用Spring Vault庫將Vault與Spring Boot程序集成在一起。我們已經介紹了兩個常見的用例:通用鍵/值對和動態數據庫憑證。
一個包含所有必需依賴項、集成測試和 vault安裝腳本的示例項目可以在GitHub上找到。