[英]Is it possible to use HashiCorp Vault with redundancy in a Spring Boot application?
[英]Securely storing secrets of a Spring Boot application in HashiCorp Vault?
我已閱讀以下教程: Vault Configuration
好的,我們安裝了 Vault 服務器並放置了 2 對秘密屬性:
$ vault kv put secret/gs-vault-config example.username=demouser example.password=demopassword
$ vault kv put secret/gs-vault-config/cloud example.username=clouduser example.password=cloudpassword
Spring Boot 應用程序具有以下屬性( bootstrap.properties
):
spring.application.name=gs-vault-config
spring.cloud.vault.token=00000000-0000-0000-0000-000000000000
spring.cloud.vault.scheme=http
spring.cloud.vault.kv.enabled=true
因此,基於spring.cloud.vault.token
應用程序能夠讀取安全屬性(名稱和密碼),但spring.cloud.vault.token
存儲在不安全的地方 - bootstrap.properties
存儲在代碼存儲庫中。 你能解釋一下為什么它是安全的嗎?
正如我們發現它是不安全的。 如何使其安全? 我知道可能有幾種解決方案可以使其安全,但單個簡化示例對我來說就足夠了。
你能解釋一下為什么它是安全的嗎?
答案是它不安全……如果你那樣做。 例如, Spring Vault 參考手冊說:
“請仔細考慮您的安全要求。如果您想快速開始使用 Vault,靜態令牌身份驗證是可以的,但靜態令牌不再受保護。向非預期方的任何披露都允許 Vault 與相關的令牌角色一起使用。”
您應該保護您的靜態令牌,或者只授予他們訪問您很高興廣為人知的保險庫中的“秘密”的權限。
或者,讓您的應用程序使用經過身份驗證的方法來生成短期動態令牌。
據我所知,最初的問題是將密碼存儲在 Github 上的 application.properties 文件中是不好的。
在 Github 上的 application.properties 文件中存儲靜態 Vault 令牌同樣糟糕。
有什么不同 ?
幾乎沒有區別1 。 這只是使用 Vault 的錯誤方式。
1 - 有一個小優勢,如果您發現令牌意外泄漏,您可以使令牌無效。 但這並不意味着故意發布它是明智的。
那么你如何安全地做事呢?
首先,您必須保護將要使用機密的機器。 即使您不打算在磁盤上存儲實際的機密,您也需要(安全地)在每台機器上存儲不同的機密,以便它們可以在保存真正機密的地方進行身份驗證。
這是一個使用 Chef 的示例。
設置一個安全的 Chef 服務器來保存您機器的配置; 即所有需要安裝的東西的配方,節點描述說明應用什么配方等。
當您將機器作為節點引導時,會為該機器生成一個密鑰對並注冊到 Chef 服務器。 密鑰對也保存在機器上,必須妥善保管。
然后使用 Chef 客戶端運行安裝和配置服務器的方法。
請注意,這依賴於具有適當安全的系統來運行 Chef 服務器。 它還依賴於每個節點都足夠安全來保護自己的密鑰。
還有其他方法可以做到這一點,但如果您不能充分保護您的主機,則無濟於事。
將spring.cloud.vault.token
存儲在檢入 VCS(例如 Git)的application.properties
中可能會危及存儲在 Vault 中的所有機密。
解決方案不是將 Vault 令牌作為純文本存儲在application.properties
中。 有幾種選擇。
application.properties
刪除 Vault 令牌只需從application.properties
刪除spring.cloud.vault.token
,而是通過系統屬性-Dspring.cloud.vault.token=00000000-0000-0000-0000-000000000000
(啟動應用程序時)或環境變量SPRING_CLOUD_VAULT_TOKEN
提供它。 如果您使用容器(Docker 或 Kubernetes),環境變量尤其方便。
application.properties
如果已加密,您可以將spring.cloud.vault.token
屬性保留在application.properties
。
Spring Cloud Config支持使用以{cipher}
開頭的值解密屬性:
spring.cloud.vault.token={cipher}encrypted_vault_token
要使用屬性加密和解密,您將需要以下依賴項(例如 Gradle):
implementation 'org.springframework.cloud:spring-cloud-context:2.2.2.RELEASE'
implementation 'org.bouncycastle:bcprov-jdk15on:1.64'
加密屬性的最簡單方法是使用對稱加密。
提出一個對稱密鑰(例如s3cr3t
)。
要加密 Vault 令牌,您可以將Spring Boot CLI與Spring Boot Cloud CLI 一起使用:
curl "https://repo.spring.io/release/org/springframework/boot/spring-boot-cli/2.2.2.RELEASE/spring-boot-cli-2.2.2.RELEASE-bin.tar.gz" -o spring-boot-cli-bin.tar.gz
tar -xf spring-boot-cli-bin.tar.gz
cd spring-2.2.2.RELEASE
bin/spring install org.springframework.cloud:spring-cloud-cli:2.2.1.RELEASE
bin/spring encrypt 00000000-0000-0000-0000-000000000000 --key s3cr3t
# 507cd1614682535ab8237b448ca73dc74058d3ae9145d63a7381ee67f3046eb1598da6960abdbf2dbf22c47206db5222e45fc74fd6122bc707b61c62f5051e0f
bin/spring decrypt 507cd1614682535ab8237b448ca73dc74058d3ae9145d63a7381ee67f3046eb1598da6960abdbf2dbf22c47206db5222e45fc74fd6122bc707b61c62f5051e0f --key s3cr3t
# 00000000-0000-0000-0000-000000000000
將對稱密鑰傳遞給ENCRYPT_KEY
環境變量中的應用程序。
絕不能將對稱加密密鑰簽入 VCS。
考慮使用公鑰和私鑰對的非對稱加密作為對稱加密的更安全替代方案。
您需要生成密鑰庫而不是對稱加密密鑰(使用 JDK 或openssl
附帶的keytool
實用程序)。
在bootstrap.properties
指定以下屬性:
encrypt.keyStore.location
encrypt.keyStore.password
encrypt.keyStore.alias
encrypt.keyStore.type
密鑰庫必須安裝在encrypt.keyStore.location
指定的位置,並且永遠不會簽入 VCS。
此外,解鎖密鑰庫的密碼最好傳入ENCRYPT_KEYSTORE_PASSWORD
環境變量。
閱讀 Spring Cloud Config 中的密鑰管理。
回答您的問題
你能解釋一下為什么它是安全的嗎?
不安全! 永遠不要在源代碼管理中放置一個簡單的秘密。
正如我們發現它是不安全的。 如何使其安全?
一些提高安全性的方法:
關於 Spring 的細節
引導屬性應僅包含非關鍵屬性。 對於關鍵屬性,您可以使用環境變量將它們傳遞給應用程序。
spring.cloud.vault.token = ${SPRING_CLOUD_VAULT_TOKEN}
概括
問題仍然是“誰看管鑰匙?” . 但 Vault Token 實際上用於保護真實的敏感數據。 如果保險庫令牌泄露,您可以僅使令牌無效。
改進應用程序可以訪問 vault 服務器的限制並減少真實憑據的范圍是確保只有運行應用程序的服務器才能通過真實憑據交換令牌並且真實憑據具有盡可能低的權限的其他方法.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.