从hashicorp保管库存储和检索文件

时间:2018-12-10 16:51:04

标签: hashicorp-vault

我不知道如何在hashicorp保管库中存储文件。 PoC的用例是将SSL证书存储在特定路径,然后通过HTTP API下载。

我尝试使用似乎最合适的kv secrets引擎。

3 个答案:

答案 0 :(得分:2)

在库中加载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

答案 1 :(得分:1)

似乎您可以指定一个包含数据的文件,以将其存储为HashiCorp库中密钥的值。

您可以使用

vault write <path> -value=@filefile的内容写入路径中指定的键。

因此,如果要存储crt的内容,可以执行以下操作:

vault write secret/ssl-certs/prod-1 -value=@ssl-cert.crt

要记住的一件事是,您保存的不是文件,而是文件的内容。

答案 2 :(得分:0)

因此Vault的默认产品未包含此功能,但是有一个Desktop GUI程序以用户友好的方式添加了此功能。
https://github.com/adobe/cryptr
使用它时,我确实有些困惑:
如果您有KVv2,则HC Web UI和Cryptr Desktop 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  -


(*请注意,保管箱和其他KV商店经常有文件大小限制,具有Consul后端的保管库的秘密文件大小限制约为375kb,因为base64编码会使文件大小膨胀4 / 3rds,大小上限为500kb,Consul的键值对限制为0.5mb ish。)
(请注意,证书文件有足够的空间,大约为8KB /如果大于375kb,则可能不是秘密。)

让我们一路走来,您需要存储更大的秘密:
(例如Kubernetes etcd快照)
自Vault版本1.0以来,内置的功能可以迁移您的存储后端,因此您可以从“ Consul存储后端”切换到“带有Consul的AWS S3存储的混合存储后端”(仍需要Consuls来锁定HA一致性多服务器设置)”来设置一个更大的限制。选择一个不同的存储后端将给您一个更大的KV大小限制。请注意,保管箱可能会施加一个合理的限制,例如10mb。因为即使您的保管库后端支持1TB键值大小,您肯定要对在Vault中存储大文件进行三思,因为base64进程会增加计算开销,并且会使文件膨胀4 / 3rds,因此,一次300mb的文件将在base64之后占用400mb的空间。表示可以这样做,因为出于一致性的考虑,一致性有利于自动化和可维护性以及计算/存储资源。)

如果我需要支持大型机密,请按以下方式使用保险柜:
我将编写一个包装器python脚本以从Vault中获取和获取秘密,并且我将具有3个方案,2个保留关键字和以下命名约定/逻辑:

  1. 大于375kb的机密
    机密/文件名bigfile:json,其中包含对称的加密密钥以及存储在用于存储大文件的位置中的加密文件位置。

    包装器脚本会将“ bigfile”识别为保留关键字,并执行逻辑以解析json,从文件存储(Torrent / TFP服务器/ CephFS路径/ Azure Blob / AWS S3 / GCP Cloud Storage)下载加密的文件,然后解密文件a对我来说,要符合我目前的情况。
  2. 对于<375kb的秘密二进制文件
    secret / filename base64dfile:1行字符串,代表二进制文件的base64编码版本

    包装程序脚本会将“ base64dfile”识别为保留关键字,并执行逻辑以对其进行unbase64并在获取文件时将其转换为文件。
  3. 用于文本文件(带机密的.json,带机密的.yamls,.pem证书等)<375
    机密/文件名filename:允许文件内容为多行字符串
  4. >