保险库——在不泄露秘密的情况下生成秘密?

保险库——在不泄露秘密的情况下生成秘密?

使用 Hashicorp 的 Vault,是否有可能生成一个秘密而不向生成该秘密的用户透露该秘密?

大致如下:

vault generate secret/my/awesome/secret 32

它会生成一个由 32 个随机字符组成的字符串,并将其存储在 Vault 中,并且不会向创建它的用户显示结果值,除非他们明确请求

vault kv get

手术?

快速阅读完 Vault 文档后,我确信这是可能的,但是现在我开始寻找有关如何执行此操作的详细信息,但发现的信息太少,所以我不确定这是否可行。

答案1

你可能会想问,你的具体用例是什么...但是,这是一种在 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 file”,因此随机字符由用户生成,而不是 Vault。即使用户看不到它,也可能是一个问题。恶意用户可能会写一个众所周知的字符串而不是随机字符串。迂腐的读者也可能认为 Vault 和 openssl 熵可能不同。

如果您希望 Vault 生成字符而无需用户参与,那么您将不得不忘记可打印字符。Vault 拥有一流的加密技术,无法将其随机性限制为一组可打印的 ASCII。有多种方法可以生成 base64 编码输出,但 base 64 中有一些模式会降低生成的字符串(已经很低的)熵。

但是,如果您可以接受纯粹的随机性,那么您可以滥用传输秘密后端的功能。首先启用它:

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)并在每条路径上设置不同的策略,这样并不是所有用户都可以更改随机值(又名旋转密钥)。

相关内容