性能完全取决于您使用的存储后端。如果您对具有精细访问控制的机密进行回购之类的事情,那么您可能不需要 HA,因此文件存储后端就可以了,并且您可以使用 SSD 来获得良好的性能。
出于以下几个原因,我建议不要使用 Transit 后端来加密和存储文件:
1.) 如果您只使用 KV,则从一个存储后端迁移到另一个存储后端(例如文件存储到 HA 后端)相对容易/直接,但当您使用 vault 的高级功能时,它并不总是那么容易/可能的。 (顺便说一句,后端之间的迁移是我在 Vault 1.0++ 中注意到的一个相对较新的功能)
2.) 您可以列出存储在 KV 存储中的所有秘密,并且您有版本控制。如果您使用 Transit,则必须自己编写代码。
3.) Transit 不是为此而设计的,错误的工作工具,KV 就是你要找的。
如果您想在 Vault 中存储大文件:
不要单独使用 Consul(否则您将被限制为最大 0.5mb)
应该可以开始:
storage "file" { path = "C:/Vault" }
然后在需要 HA 时转换到 S3/Azure Blob + Consul
ha_backend "consul" {...}
storage "s3" {...}
(我建议你做一个 PoC 来确认你可以转换。)
注意:
在实践中,我发现我永远不会存储大于 0.375mb 的秘密,所以 Consul 本身就很好。这是一个更简单的设置,您可以进行时间点实时快照。另外,如果您发现将来需要空间,您可以迁移您的存储后端。
此外,由于以下不便/开销原因,您仍应避免使用大文件:
Vault 是一个使用以下语法的键值存储:
vault kv put secret/KEY key=value
vault kv put secret/dev config.json=base64'dstring
如果要存储二进制文件或多行字符串,则需要对其进行 base64 以将其转换为 1 行字符串,并将其存储为值。好吧,如果你最终得到一个 300mb 的文件,你就必须制作一个 400mb 的 base64 编码字符串。 (因为 base64 编码增加了一致的 33% 开销)
如果您真的想以可扩展的方式做到这一点:
我认为理想的方法是将对称加密/解密密钥 + 加密文件位置存储在 Vault 中。
使用 Consul 作为您的 Vault 后端。
使用 S3 作为您的文件存储。
如果我要这样做,我会在 Kubernetes 上托管 Consul + Minio/Rook/Ceph(自托管 S3)+ Kubernetes 上的 2-3 个保管库服务器,或者在启用英特尔 SGX 的盒子上实现最高安全性Vault SCONE Secure Enclaves(加密 ram)可防止 Spectre/Meltdown/0 天 root 访问内存转储漏洞利用。并将对称加密的文件存储在您的 DIY S3 上,并将解密密钥 + 文件位置引用存储在 Vault 中,然后使用一些中间件将其抽象出来。 (我只建议自托管 S3,这样您就可以成为多云 + 100% 基础架构即代码,但是可以根据您的要求混合和匹配部分设计。)