Vault

Vault - 生成秘密而不洩露它?

  • January 30, 2020

使用 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

此方法還允許您創建多個密鑰(例如命名productiontest)並在每個路徑上設置不同的策略,因此並非所有使用者都可以更改隨機值(也就是輪換密鑰)。

引用自:https://serverfault.com/questions/931384