【发布时间】:2018-12-10 16:51:03
【问题描述】:
我不知道如何在 hashcorp 保险库中存储文件。我们的 PoC 用例是将 SSL 证书存储在特定路径,然后通过 HTTP API 下载。
我尝试使用似乎最合适的 kv 秘密引擎。
【问题讨论】:
标签: hashicorp-vault
我不知道如何在 hashcorp 保险库中存储文件。我们的 PoC 用例是将 SSL 证书存储在特定路径,然后通过 HTTP API 下载。
我尝试使用似乎最合适的 kv 秘密引擎。
【问题讨论】:
标签: hashicorp-vault
您似乎可以指定一个包含数据的文件作为 HashiCorp 保险库中键的值存储。
你可以使用
vault write <path> -value=@file 将file 的内容写入路径中指定的键。
因此,如果您想存储 crt 的内容,您可以这样做:
vault write secret/ssl-certs/prod-1 -value=@ssl-cert.crt
要记住的一点是,您保存的不是文件,而是文件的内容。
【讨论】:
所以 Vault 的默认产品没有此功能,但有一个桌面 GUI 程序以用户友好的方式添加此功能。
https://github.com/adobe/cryptr
我在使用它时确实遇到了一些困惑:
如果您有 KVv2,HC Web UI 和 Cryptr 桌面 GUI 将使用不同的约定。
编写保险柜策略时,您将使用 /KVv2/data/path/
使用 Cryptr 时,您将使用 /KVv2/data/path/
使用 HC WebUI 时,您将使用 /kvv2/path/
事实:您可以利用 base64 编码将原始二进制文件存储在任何 KV 存储中。
因此您也可以使用该技术存储在 Hashicorp Vault 中。
所以 base64 编码是一个可逆函数,它允许您获取任何二进制文件,将其转换为 1 行字符串,然后获取生成的 1 行字符串并将其转换回任何二进制文件。由于您可以在任何 KV 存储中存储 1 行字符串,因此您可以在任何 KV 存储中存储任意二进制文件! :) (*)
这里有一些代码可以满足您的要求:
CMD:\> vault server -dev
WindowsSubsystemForLinuxBash:/mnt/c# curl -L https://releases.hashicorp.com/vault/1.0.2/vault_1.0.2_linux_amd64.zip > vault.zip
Bash# apt-get update
Bash# apt-get install unzip
Bash# unzip vault.zip -d /bin
Bash# chmod +x /bin/vault
Bash# export VAULT_ADDR=http://127.0.0.1:8200
Bash# vault login s.aO8ustaAV4Ot1OxzBe94vi3J
Bash# cat excelfile.xlsx | md5sum
fb6b4eaa2be1c8c410645a5f0819539e -
Bash# cat excelfile.xlsx | base64 | base64 --decode > x.xlsx
Bash# cat x.xlsx | md5sum
fb6b4eaa2be1c8c410645a5f0819539e -
Bash:/mnt/c# cat excelfile.xlsx | base64 | vault kv put secret/excelfile.xlsx base64dfile=-
(=- means assign value from standard in, which in this case is the piped output of the cat file command)
Chrome: localhost:8200
(login with dev root token, and you'll see the value is characters in a 1 line string)
Bash# rm excelfile.xlsx
Bash# vault kv get -field=base64dfile secret/excelfile.xlsx | tr -d '\n' | base64 --decode > excelfile.xlsx
(or)
Bash# vault kv get -field=base64dfile secret/excelfile.xlsx | sed 's/\r//' | base64 --decode > excelfile.xlsx
Bash# cat excelfile.xlsx | md5sum
fb6b4eaa2be1c8c410645a5f0819539e -
(*注意 Vault 和其他 KV 存储通常有文件大小限制,带有 Consul 后端的 Vault 的秘密文件大小限制约为 375kb,因为 base64 编码会使文件大小膨胀 4/3,从而导致大小到 500kb,Consul 的键值对限制为 0.5mb ish。)
(请注意,这是足够的空间,因为证书文件可以是 ~8KB/如果它大于 375kb,它可能不是秘密。)
让我们说你需要存储更大的秘密:
(如 Kubernetes etcd 快照)
自 Vault 进入 1.0 以来,内置了迁移存储后端的功能,因此您可以从“Consul 存储后端”切换到“使用 Consul 的 AWS S3 存储的混合存储后端”(仍然需要 Consuls 以实现多方的 HA 一致性锁定服务器设置)”有一个更大的限制。选择不同的存储后端会给你一个更大的 KV 大小限制。注意 Vault 可能会施加一个合理的限制,比如 10mb。因为即使你有一个支持 1TB 键值大小的 Vault 后端,您肯定要三思而后行将大文件存储在保管库中,因为 base64 进程会增加计算开销并使文件膨胀 4/3,因此一旦 base64 处理,300mb 的文件将占用 400mb 的空间。(话虽这么说因为为了一致性,一致性有利于自动化和可维护性以及计算/存储资源。)
如果我需要支持大型机密,我会如何使用 Vault:
我会编写一个包装器 python 脚本来从保险库中获取和获取机密,并且我将有 3 个场景、2 个保留关键字以及以下命名约定/逻辑:
【讨论】:
在 vault 中加载 kv 对时,您还可以使用 json 文件加载其中一个密钥作为证书。 以下是在https://www.digicert.com/order/sample-csr.php 生成的示例证书
-----BEGIN CERTIFICATE REQUEST-----
MIICvDCCAaQCAQAwdzELMAkGA1UEBhMCVVMxDTALBgNVBAgMBFV0YWgxDzANBgNV
BAcMBkxpbmRvbjEWMBQGA1UECgwNRGlnaUNlcnQgSW5jLjERMA8GA1UECwwIRGln
aUNlcnQxHTAbBgNVBAMMFGV4YW1wbGUuZGlnaWNlcnQuY29tMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8+To7d+2kPWeBv/orU3LVbJwDrSQbeKamCmo
wp5bqDxIwV20zqRb7APUOKYoVEFFOEQs6T6gImnIolhbiH6m4zgZ/CPvWBOkZc+c
1Po2EmvBz+AD5sBdT5kzGQA6NbWyZGldxRthNLOs1efOhdnWFuhI162qmcflgpiI
WDuwq4C9f+YkeJhNn9dF5+owm8cOQmDrV8NNdiTqin8q3qYAHHJRW28glJUCZkTZ
wIaSR6crBQ8TbYNE0dc+Caa3DOIkz1EOsHWzTx+n0zKfqcbgXi4DJx+C1bjptYPR
BPZL8DAeWuA8ebudVT44yEp82G96/Ggcf7F33xMxe0yc+Xa6owIDAQABoAAwDQYJ
KoZIhvcNAQEFBQADggEBAB0kcrFccSmFDmxox0Ne01UIqSsDqHgL+XmHTXJwre6D
hJSZwbvEtOK0G3+dr4Fs11WuUNt5qcLsx5a8uk4G6AKHMzuhLsJ7XZjgmQXGECpY
Q4mC3yT3ZoCGpIXbw+iP3lmEEXgaQL0Tx5LFl/okKbKYwIqNiyKWOMj7ZR/wxWg/
ZDGRs55xuoeLDJ/ZRFf9bI+IaCUd1YrfYcHIl3G87Av+r49YVwqRDT0VDV7uLgqn
29XI1PpVUNCPQGn9p/eX6Qo7vpDaPybRtA2R7XLKjQaF9oXWeCUqy1hvJac9QFO2
97Ob1alpHPoZ7mWiEuJwjBPii6a9M9G30nUo39lBi1w=
-----END CERTIFICATE REQUEST-----
为了存储上述证书并将其作为键值对保存在 json 文件中,必须将换行符替换为 \n 以将其保存为单个连续字符串 以下是 json 文件的内容(与 value 保存的证书相同) vault_certfile_kv_stackoverflow.json
{
"sample.ssl.public.cert":"-----BEGIN CERTIFICATE REQUEST-----\nMIICvDCCAaQCAQAwdzELMAkGA1UEBhMCVVMxDTALBgNVBAgMBFV0YWgxDzANBgNV\nBAcMBkxpbmRvbjEWMBQGA1UECgwNRGlnaUNlcnQgSW5jLjERMA8GA1UECwwIRGln\naUNlcnQxHTAbBgNVBAMMFGV4YW1wbGUuZGlnaWNlcnQuY29tMIIBIjANBgkqhkiG\n9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8+To7d+2kPWeBv/orU3LVbJwDrSQbeKamCmo\nwp5bqDxIwV20zqRb7APUOKYoVEFFOEQs6T6gImnIolhbiH6m4zgZ/CPvWBOkZc+c\n1Po2EmvBz+AD5sBdT5kzGQA6NbWyZGldxRthNLOs1efOhdnWFuhI162qmcflgpiI\nWDuwq4C9f+YkeJhNn9dF5+owm8cOQmDrV8NNdiTqin8q3qYAHHJRW28glJUCZkTZ\nwIaSR6crBQ8TbYNE0dc+Caa3DOIkz1EOsHWzTx+n0zKfqcbgXi4DJx+C1bjptYPR\nBPZL8DAeWuA8ebudVT44yEp82G96/Ggcf7F33xMxe0yc+Xa6owIDAQABoAAwDQYJ\nKoZIhvcNAQEFBQADggEBAB0kcrFccSmFDmxox0Ne01UIqSsDqHgL+XmHTXJwre6D\nhJSZwbvEtOK0G3+dr4Fs11WuUNt5qcLsx5a8uk4G6AKHMzuhLsJ7XZjgmQXGECpY\nQ4mC3yT3ZoCGpIXbw+iP3lmEEXgaQL0Tx5LFl/okKbKYwIqNiyKWOMj7ZR/wxWg/\nZDGRs55xuoeLDJ/ZRFf9bI+IaCUd1YrfYcHIl3G87Av+r49YVwqRDT0VDV7uLgqn\n29XI1PpVUNCPQGn9p/eX6Qo7vpDaPybRtA2R7XLKjQaF9oXWeCUqy1hvJac9QFO2\n97Ob1alpHPoZ7mWiEuJwjBPii6a9M9G30nUo39lBi1w=\n-----END CERTIFICATE REQUEST-----"
}
最后这里是如何上传这个json文件
vault write --address=https://<vaultdomain> secret/<path> @vault_certfile_kv_stackoverflow.json
【讨论】: