私密信息管理工具 Vault 快速入門
什么是 Vault
Vault 是一個基于身份的秘密和加密管理系統(tǒng)。秘密是您想要嚴格控制訪問的任何內(nèi)容,例如 API 加密密鑰、密碼和證書。 Vault 提供由身份驗證和授權方法控制的加密服務。使用 Vault 的 UI、CLI 或 HTTP API,可以安全地存儲和管理、嚴格控制(限制)和審核對機密和其他敏感數(shù)據(jù)的訪問。
為什么需要 Vault
執(zhí)行密碼輪換策略很痛苦
掌握機密的員工離職后可能泄密或是惡意報復
開發(fā)者不小心把機密信息隨著代碼上傳到公網(wǎng)的源碼倉庫造成泄密
管理多個系統(tǒng)的機密非常麻煩
需要將機密信息安全地加密后存儲,但又不想將密鑰暴露給應用程序,以防止應用程序被入侵后連帶密鑰一起泄漏
Vault 架構圖
Vault 只暴漏了存儲后端(Storage Backend) 和 API,其他部分都被保護起來了。Vault 并不信任后端存儲,存放的都是密文。

安裝
此處以 Mac 為例,其他平臺參考官方文檔Vault 安裝向?qū)?/p>
啟動 Vault(Dev 模式)
查看服務狀態(tài)
寫入第一個密碼
如果報這個錯誤:
vault write kv/infini value=infinilabs
Error writing data to kv/cheng: Error making API request.URL: PUT?http://127.0.0.1:8200/v1/kv/cheng
Code: 404. Errors:
no handler for route 'kv/cheng'
是因為 kv 存儲沒有啟動(不同版本默認初始設置不同),執(zhí)行:
讀取一條數(shù)據(jù)
使用 Consul 作為數(shù)據(jù)存儲的 Backend
Vault 自身不存儲數(shù)據(jù),需要提供存儲后臺。 支持多種后臺。
啟動 Consul
啟動 Vault(生產(chǎn)模式)
創(chuàng)建配置文件,使用剛剛啟動的 Consul 作為存儲后臺。
注意: 這種方式啟動,為生產(chǎn)模式,需要手動配置和管理秘鑰。
執(zhí)行命令,啟動
注意: 此時雖然服務啟動了,但是 Vault 處于封印狀態(tài)(sealed), 不可用。
此時我們執(zhí)行操作,會看到如下提示:
上面 Dev 模式啟動的 Vault 實際上幫助我們自動地把創(chuàng)建主密鑰、解封的步驟都完成了。生產(chǎn)模式,則需要手動配置后續(xù)步驟。
補充點小知識

Vault 保存在 Backend 中的數(shù)據(jù)都是加密的
Vault 密鑰稱為 Master Key 主密鑰,Vault 默認使用 Shamir 算法,把主密鑰切分成 M 份,管理員必須至少提供其中的 N 份才能還原出主密鑰(這里的 M 和 N 都是可配置的,M>=N)理想狀態(tài)下,我們必須把這 M 份密鑰分配給公司內(nèi) M 個不同的人,只有在獲取其中 N 個人的授權后,Vault 才可以成功解密主密鑰。
Vault 初始化(生產(chǎn)模式)
注意看,接下來的步驟,會生成 5 個秘鑰,一個 Root 用戶的 Token。真實場景下,這 5 個秘鑰會分配給 5 個不同的人員管理。 至少正確輸入 3 個秘鑰,才能解封 Vault。
熱知識: Vault 每次啟動/重啟,都會進入封印狀態(tài),未解封時,幾乎無法執(zhí)行任何操作。
Vault 默認訪問 https 的地址,所以如果執(zhí)行初始化報如下錯誤:
設置一下 Vault 地址即可,執(zhí)行:
export VAULT_ADDR='http://127.0.0.1:8200'
查看 Vault 狀態(tài)
此時 Vault 處于封印狀態(tài)(Sealed 為 true)
解封 Vault
使用需要 vault operator unseal 命令來執(zhí)行解封。至少需要 3 個秘鑰來解封。
注意: 每次輸入一個秘鑰,會看到如上提示"Unseal Progress 1/3"。 但是,這里僅僅表示已經(jīng)輸入多少個秘鑰,并不代表輸入的秘鑰都是正確的!!
如何使用 Vault 保存秘密
進入下一步之前,先來看看 Vault 提供了哪些措施,用來保護我們的秘密?
秘鑰的保護機制: 秘鑰被拆分成 5 份,至少正確輸入 3 個才能解封。
策略控制(權限控制): 可以針對每個 Path 設置策略。
有效期: Vault 生成的每個令牌(Token)都有有效期。
開始前,我們先寫入 2 條測試數(shù)據(jù):
熱知識:
"kv/infini" 是一個 Path(路徑), 可以簡單理解為數(shù)據(jù)庫中的一個表。并不是 kv 數(shù)據(jù)庫 當中的 key。你可以試試這樣存數(shù)據(jù)并讀取:
制定策略
新建策略文件
輸入以下內(nèi)容
解釋: 以上策略,是指在 infini 這個路徑(path)下,具有只讀權限。
創(chuàng)建策略
先登錄已經(jīng)解封的 Vault(使用初始化生成的 root token 登錄)
"infini-readonly" 是策略的名稱,這個可以自定義
生成 Token 并指定策略
生成對"kv/infini"具有只讀權限的 Token, 執(zhí)行:
此處生成了新的 Token: s.bHzsfREs9MGirYO8yZ2TbAzq, 有效期 768 小時(別拿計算器了,我算過了,32 天)
使用新生成的 Token 登錄(別找退出操作了,直接再執(zhí)行 login 即可):
驗證新生成的 Token
嘗試讀 kv/infini 的秘密:
Wow!成功讀取!
試試寫入操作
有個疑問,你說當前這個 Token,可以讀取 kv/ck 的秘密嗎?
啊歐! 不行~
OK, 到這里了,簡單的對 Vault 做了個入門。 Vault 的功能點還有很多,去看看下面的文檔吧~~