光盘 机密_使用保险柜管理机密
光盤 機密
您如何存儲秘密?
密碼,API密鑰,安全令牌和機密數據屬于秘密類別。 那是不應該存在的數據。 在容易猜測的位置,不得以純文本格式提供。 實際上,不得在任何位置以明文形式存儲它。
可以使用Spring Cloud Config Server或TomEE對敏感數據進行加密。 加密數據比未加密數據好了一步。 加密在另一側強加了對用戶側解密的需求,這需要分發解密密鑰。 現在,您將鑰匙放在哪里? 密鑰受密碼保護嗎? 您將密碼短語放在哪里? 您在多少系統上分發密鑰和密碼?
如您所見,加密引入了雞蛋問題。 存儲解密密鑰使應用程序可以解密數據。 它還允許攻擊媒介。 未經授權的人可以通過訪問機器來訪問解密密鑰。 該人可以解密可通過此密鑰解密的數據。 該密鑰是靜態的,因此泄漏的密鑰需要更改密鑰。 數據需要重新加密,憑據需要更改。 在線測量不可能發現這種泄漏,因為一旦獲得數據就可以離線解密。
一種方法是在應用程序啟動之前將密鑰放在難以猜測的位置,并在將密鑰讀取到內存后擦除密鑰。 按鍵可用的時間縮短了。 縮短了攻擊時間范圍,但關鍵仍然在那里。 擦除密鑰僅對一個應用程序啟動有效。 眾所周知,云中的容器和微服務一旦崩潰,便會重新啟動。 由于密鑰已丟失,因此不再可能重新啟動應用程序。
等等,有希望!
正確地進行加密非常困難,而如果自己進行加密,則管理秘密就更加困難。 保險柜正好解決了這些問題。 它有助于解決雞蛋問題,并且帶有加密功能。 保管箱是管理機密的服務。 它提供了一個API,可基于策略訪問機密。 API的任何用戶都需要進行身份驗證,并且只能看到其被授權的機密。 保管箱使用帶有GCM的 256位AES加密數據。 它可以將數據存儲在各種后端(文件,Amazon DynamoDB,Consul等)中。 另一個關鍵方面是,保管箱從不將密鑰存儲在持久位置中。 啟動/重新啟動保管庫始終需要一個或多個操作員才能解封保管庫。 但是,讓我們先從基礎開始。
保險柜并不是所有安全問題的答案。 值得檢查Vault安全模型文檔以了解威脅模型。
要引導Vault,您需要從https://www.vaultproject.io/downloads.html下載二進制文件。 Vault用Go編寫,二進制文件可用于各種平臺。 解壓縮下載的文件,即可開始使用Vault。
接下來啟動Vault服務器。 您需要一個配置文件來指定一些選項。
vault.conf
backend "inmem" { }listener "tcp" {address = "0.0.0.0:8200"tls_disable = 1 }disable_mlock = true此配置適用于大多數平臺,可以嘗試使用Vault的第一步。 不要在生產中使用它。
通過啟動Vault
$ vault server -config vault.conf保管箱將作為前臺進程啟動。
恭喜,您已啟動保險柜。
現在是打開第二個控制臺以使用Vault執行管理任務的好時機。 Vault現在以純文本模式運行,因為已禁用TLS / SSL。 您需要設置VAULT_ADDR環境變量,以告知Vault客戶端使用純文本:
$ export VAULT_ADDR=http://127.0.0.1:8200保管箱已啟動。 在實際開始使用保管庫之前,它需要兩個額外的步驟。 保管箱需要初始化和啟封。 初始化是初始密鑰生成的過程。 啟封正在為Vault提供密鑰,因此Vault可以解密加密的數據并開始為客戶端提供服務。
保管箱在初始化時會創建兩件事:
保險柜允許使用Shamir Secret Sharing算法共享密鑰。 數據通常用一個密鑰加密。 有權訪問密鑰的人作為一個人就可以完全控制所有數據。 有時你不想要那個。 通常,您希望在多個人之間分配主密鑰,因此,沒有一個人可以控制所有加密數據。 保管箱允許指定總數的密鑰共享和初始化期間解封Vault所需的密鑰共享數。 保險柜初始化后,便無法更改該設置。 從控制臺初始化保管庫將顯示完整密鑰。 您可能希望通過DevOps工具采用API進行初始化,例如,向應該接收密鑰共享的操作員發送安全消息。
使用以下方法初始化保管箱:
$ vault init -key-shares=5 -key-threshold=2保管箱將顯示密鑰共享和根密鑰。 請注意,這些值是隨機的,并且在每次初始化時都會更改。 請小心該輸出,因為您只會看到一次。 之后沒有辦法檢索密鑰和令牌。 在將保管箱用于真實數據時,請仔細閱讀說明,否則會丟失數據。
Key 1: 99eb89735688ad7a29bb1ff27383bd1005a22a62c97f14357ea4f5f98c1d2c8c01 Key 2: 0c5605b16905794a302603bbeb8f6c8ad5ecf7e877f0e29084f838eba931b86902 Key 3: 7f3d88067c7e355acea4fe756a8b23fc6cd6bc671d7cb0f3d2cc8ae543dc3dc303 Key 4: 3d37062e1704ca2a02073b29c097d5a56e7056e710f515c16b40b9cfe3698bb804 Key 5: 4e5c8b99027f863afc85c6e741939ad3d74a1d687a7947a23d740bc109840e1205 Initial Root Token: 9a63de21-8af7-311a-9a5a-151b6a0d4795Vault initialized with 5 keys and a key threshold of 2. Please securely distribute the above keys. When the Vault is re-sealed, restarted, or stopped, you must provide at least 2 of these keys to unseal it again.Vault does not store the master key. Without at least 2 keys, your Vault will remain permanently sealed.然后,您需要打開Vault的密封。 保管箱不會將密鑰存儲在磁盤上。 它一直存儲在內存中。 初始化并在(重新)啟動Vault之后,您需要使用所需數量的密鑰共享來打開Vault的密封,以便Vault可以提供機密信息。 在這種情況下,這是兩個關鍵部分。 注意:還有一個Seal命令可使Vault停止提供機密信息。
$ vault unseal 99eb89735688ad7a29bb1ff27383bd1005a22a62c97f14357ea4f5f98c1d2c8c01 Sealed: true Key Shares: 5 Key Threshold: 2 Unseal Progress: 1$ vault unseal 7f3d88067c7e355acea4fe756a8b23fc6cd6bc671d7cb0f3d2cc8ae543dc3dc303 Sealed: false Key Shares: 5 Key Threshold: 2 Unseal Progress: 0保險柜開封后,您可以開始在保險柜內存儲秘密數據。
保險柜需要經過身份驗證的訪問權限才能從此處繼續。 保險柜將令牌用作其傳輸級別的常規身份驗證。
還記得初始化的輸出嗎? 密鑰共享之后的最后一項是根令牌。 目前最簡單的方法是使用根令牌。 在控制臺上使用令牌的最簡單方法是將其存儲在環境變量中:
$ export VAULT_TOKEN=9a63de21-8af7-311a-9a5a-151b6a0d4795 $ vault write secret/my-application password=H@rdT0Gu3ss通用秘密后端允許將任意值存儲為鍵值存儲。 單個上下文可以存儲一個或多個鍵值元組。 上下文可以按層次進行組織,并且使用的數據格式為JSON。
Vault提供除一般的秘密后臺其它后端,使證書產生MySQL,SQL服務器和PostgreSQL,領事和更多 。
認證方式
保管箱主要使用令牌。 每個令牌都分配給可能限制操作和路徑的策略。 策略使用基于路徑的匹配來應用規則。 令牌可以獲取元數據(鍵值)并顯示分配的名稱,這使管理對操作更加友好。
您可以手動創建令牌,并將其分配給應用程序和用戶。 除此之外,還有兩種身份驗證機制 (LDAP,用戶名/密碼,GitHub令牌……),允許用戶登錄并獲取令牌。 令牌和身份驗證機制可以撤銷,這使得鎖定特定用戶變得容易。
Spring Cloud Vault
我們在Pivotal考察了Vault,并認為它是一種很有前途的工具。 這就是我們構建Spring Cloud Vault的原因。 Spring Cloud Vault是類似于Spring Cloud Config的配置擴展。 Spring Cloud Config的目標是外部配置管理,該管理由存儲在各種存儲庫(例如GitHub,SVN甚至Vault)中的數據支持。
借助Spring Cloud Vault,您可以訪問Vault中的秘密。 在啟動應用程序時會獲取機密。 Spring Cloud Vault使用應用程序中的數據(應用程序名稱,活動上下文)來確定存儲機密的上下文路徑。
/secret/{application}/{profile} /secret/{application} /secret/{defaultContext}/{profile} /secret/{defaultContext}Spring Cloud Vault入門
首先,您需要一個Spring Boot項目。 start.spring.io是一個很好的起點。 任何空項目都足夠。
在您的項目中包含Spring Cloud Vault入門
將以下代碼添加到您的構建配置文件中。 這些行包括具有所有必需依賴項的Spring Cloud Vault入門程序。
Maven
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-vault-starter-config</artifactId><version>1.0.0.BUILD-SNAPSHOT</version> </dependency><repositories><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/libs-snapshot</url><snapshots><enabled>true</enabled></snapshots></repository> </repositories>Gradle
repositories {maven {url 'https://repo.spring.io/libs-snapshot'} }dependencies {compile("org.springframework.cloud:spring-cloud-vault-starter-config:1.0.0.BUILD-SNAPSHOT") }使用SNAPSHOT依賴項時,請確保包括Snapshots存儲庫。
設置配置
Spring Cloud Vault默認使用application作為默認上下文,并使用spring.application.name的值作為應用程序上下文。 所有配置都需要在引導程序配置中指定。 對于此示例,我們在src/main/resources使用bootstrap.yml :
spring:application.name: my-applicationcloud.vault:token: 9a63de21-8af7-311a-9a5a-151b6a0d4795scheme: httpspring.cloud.vault.scheme設置為http因為我們已經以純文本HTTP模式啟動了Vault。 不要為生產而這樣做。 純文本使整個秘密故事變得毫無用處,因為網絡上的所有聽眾都可以看到您的秘密。 spring.cloud.vault.scheme默認為https 。
請注意,此處的令牌取自根令牌。 您可以使用以下方法創建新令牌:
$ vault token-create Key Value --- ----- token 728d26ae-53a6-d8b6-d7a0-c5f62238ea55 token_accessor 2fd7dcba-39d0-04d3-8d6b-096c3529cf14 token_duration 0 token_renewable true token_policies [root]將數據寫入保險柜
將一些數據寫入保險柜:
$ vault write secret/my-application password=H@rdT0Gu3ss更新您的Spring Boot應用程序
現在轉到您的應用程序啟動器類,并增強它以注入秘密。 使用與將其寫入保險柜時相同的屬性名稱:
package example;import javax.annotation.PostConstruct;import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication public class SpringBootVaultHelloWorldApplication {public static void main(String[] args) {SpringApplication.run(SpringBootVaultHelloWorldApplication.class, args);}@Value("${password}")String password;@PostConstructprivate void postConstruct() {System.out.println("My password is: " + password);} }其他所有事情都由Spring Cloud Vault本身處理。 現在運行您的應用程序。
恭喜,您成功了!
外表
Spring Cloud Vault現在位于Cloud Incubator中。 它支持令牌和AppId身份驗證。 Spring Cloud Vault帶有用于各種數據庫集成和RabbitMQ / Consul支持的啟動程序和依賴項。 您可以在ttps://github.com/spring-cloud-incubator/spring-cloud-vault-config上簽出項目和文檔 。
我們準備了一些示例,以給您印象,如何將Spring Cloud Vault與應用程序集成。 您可以在https://github.com/mp911de/spring-cloud-vault-config-samples上找到示例。
翻譯自: https://www.javacodegeeks.com/2016/07/managing-secrets-vault.html
光盤 機密
總結
以上是生活随笔為你收集整理的光盘 机密_使用保险柜管理机密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 除了003福建舰,世界上还有哪些在建或即
- 下一篇: 写文章时如何做到主题明确写文章时如何做到