【问题标题】:store and retrieve files from hashicorp vault从 hashcorp Vault 存储和检索文件
【发布时间】:2018-12-10 16:51:03
【问题描述】:

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

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

【问题讨论】:

    标签: hashicorp-vault


    【解决方案1】:

    您似乎可以指定一个包含数据的文件作为 HashiCorp 保险库中键的值存储。

    你可以使用

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

    因此,如果您想存储 crt 的内容,您可以这样做:

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

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

    【讨论】:

      【解决方案2】:

      所以 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 个保留关键字以及以下命名约定/逻辑:

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

        Wrapper 脚本会将“bigfile”识别为保留关键字,并执行解析 json 的逻辑,从文件存储(Torrent/TFP 服务器/CephFS 路径/Azure Blob/AWS S3/GCP 云存储)下载加密文件,并解密文件 a就我目前的情况而言。
      2. 对于秘密二进制文件 秘密/文件名 base64dfile:1 行字符串,表示二进制文件的 base64 编码版本
        Wrapper 脚本会将“base64dfile”识别为保留关键字,并执行逻辑将其取消base64 并在获取时转换为文件。
      3. 对于文本文件(带有秘密的 .json、带有秘密的 .yamls、.pem 证书等)秘密/文件名文件名:允许文件内容作为多行字符串

      【讨论】:

        【解决方案3】:

        在 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
        

        【讨论】:

          猜你喜欢
          • 2020-01-24
          • 2020-01-23
          • 2021-01-24
          • 1970-01-01
          • 2013-06-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-02
          相关资源
          最近更新 更多