Vault - 生成秘密而不洩露它?
使用 Hashicorp 的 Vault,是否可以在不向生成它的使用者透露該秘密的情況下生成一個秘密?
沿著:
vault generate secret/my/awesome/secret 32
它將生成一個由 32 個隨機字元組成的字元串,將其儲存在 Vault 中,並且不會向創建它的使用者顯示結果值,除非他們明確地使用
vault kv get
手術?
在快速閱讀 Vault 文件後,我確信這是可能的,但現在我已經開始尋找有關如何執行此操作的詳細資訊,但我發現的資訊太少了,我不確定這是否可能
$$ yet $$.
很想問您的確切案例是什麼……但這是在 Vault 中儲存 32 個隨機字母數字(我認為)字元的簡單方法。
vault write secret/my/awesome/secret - << EOF { "key":"$(< /dev/urandom tr -dc A-Za-z0-9 | head -c${1:-32};echo;)" } EOF
回讀字元是標準的 K/V 操作:
$ vault read --field=key secret/my/awesome/secret FA9hxKMejhKyRHVAclPQbNWaLFDPUMky
這種方法的問題在於它使用了 Linux 的“here 文件”,因此隨機字元是由 user 生成的,而不是 Vault。即使使用者看不到它,這也可能是個問題。惡意使用者可以編寫一個眾所周知的字元串而不是隨機字元串。迂腐的讀者也可能會爭辯說 Vault 和 openssl 熵可能不同。
如果您希望 Vault 在沒有使用者參與的情況下生成字元,您將不得不忘記可列印字元。Vault 擁有一流的加密技術,無法將其隨機性限制為一組可列印的 ASCII。有多種方法可以生成 base64 編碼輸出,但 base64 中有一些模式可以降低生成字元串的(已經很低)熵。
但是,如果您可以接受純隨機性,那麼您可能會濫用傳輸秘密後端的功能。首先啟用它:
vault secrets enable transit
要求 Vault 生成密鑰並永久保存。我命名了那個鍵
serverfault
:vault write --force transit/keys/serverfault
現在您有了一個密鑰,使用恰好產生 32 個字節的算法產生一個 Seinfeld 散列(一個什麼都沒有的散列)。第二行 (
cut|openssl|xxd
) 僅用於漂亮的列印,請根據您的喜好調整:vault write --field=hmac transit/hmac/serverfault algorithm=sha2-256 input=AAAA \ | cut -d: -f3 | openssl base64 -d -A | xxd 00000000: d2e5 8e43 bed4 13be 4488 1823 457b 4575 ...C....D..#E{Eu 00000010: 3030 8059 198e 669a bdaa cbb6 d4e7 8130 00.Y..f........0
多試幾次,總能得到相同的輸出。要獲得一個新的、完全隨機的值,只需更改 HMAC密鑰:
vault write --force transit/keys/serverfault/rotate
獲取隨機字節的命令現在產生一個新值:
vault write --field=hmac transit/hmac/serverfault algorithm=sha2-256 input=AAAA \ | cut -d: -f3 | openssl base64 -d -A | xxd 00000000: d2e5 8e43 bed4 13be 4488 1823 457b 4575 ...C....D..#E{Eu 00000010: 3030 8059 198e 669a bdaa cbb6 d4e7 8130 00.Y..f........0
此方法還允許您創建多個密鑰(例如命名
production
和test
)並在每個路徑上設置不同的策略,因此並非所有使用者都可以更改隨機值(也就是輪換密鑰)。