Spring Cloud Vault介紹


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連接池


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM