【问题标题】:How to parse a JSON secret to YAML in Vault?如何在 Vault 中将 JSON 密码解析为 YAML?
【发布时间】:2021-11-22 21:51:22
【问题描述】:

我在 Vault 中有一个秘密,它实际上是 JSON 的“复杂”结构,这意味着它不仅仅是一个键/值,而是在不同的子级别有几个键。

我需要以某种方式获取此机密并将其转换为该 JSON 的 YAML 表示形式。如果它是一个简单的结构(比如同一级别的几个 k/v),我可以使用像这样简单的东西

      {{- with secret "secret/foo" -}}
          {{ range $k, $v := .Data.data }}
            {{ $k }}: {{ $v }}
          {{- end }}
      {{- end }}

但是,由于情况并非如此,而且 JSON 的结构很复杂,因此想出一个模板是相当不可能的。

但是,我发现Vault使用Consul模板,而Consul有一个parseYAML功能,所以我的问题是,我如何模板这个,以便我得到.Data.data的所有内容并将其翻译成YAML?

我已经尝试了几种类似于下面这个的方法:

{{- with secret "secret/foo" -}}
{{ .Data.data| parseYAML }}
{{- end }}

但我总是遇到同样的错误wrong type for value; expected string; got map[string]interface {}"

更新

示例 yaml:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: app
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
      annotations:
        vault.hashicorp.com/agent-inject: 'true'
        vault.hashicorp.com/agent-inject-secret-foo: 'secret/foo'
        vault.hashicorp.com/agent-inject-template-secret-foo: |
          {{- with secret "secret/foo" -}}
          {{ .Data.data| parseYAML }}
          {{- end }}
        vault.hashicorp.com/role: 'app'
    spec:
      containers:
        - name: app
          image: 'app:1.0.0'
      serviceAccountName: app

其中secret/foo 是一个没有清晰结构的长 JSON。一个随机的例子(我认为实际的 JSON 大约有 300 行)。

{
  "a": {
    "a": "a",
    "b": "b",
    "c": {
      "a": "a",
      "b": {
        "c": "c"
      },
      "d": "a"
    },
    "e": {
      "a": {
        "b": {
          "c": {
            "a": "a",
            "b": "b"
          }
        }
      }
    }
  }
}

【问题讨论】:

  • 您的 .Data.data 是 HCL2 映射还是 JSON 字符串?
  • @MattSchuchard 我在 Vault 中存储了一个 JSON,但是一旦检索到秘密,输出肯定不是 JSON。它遵循如下格式:key:map[key:map[key:value] key2:value key3:map[key4:map[.......
  • 我不确定这是否是您所指的 HCL2 格式。基本上是一个 JSON,其中 { 替换为 map[, 替换为空格。
  • 这听起来像 HCL2 Map,它可以用parseYAML 正确转换为 YAML。我推测您的 Kubernetes 清单需要一个字符串类型的值,而您没有传递一个字符串。看到 1. 你的秘密的结构 2. Kubernetes manifest sn-p 都会减少猜测的数量。
  • @MattSchuchard 这个秘密真的很大,它本身并不是真正的“秘密”,但由于应用程序设计不佳,开发人员将秘密与标准设置混为一谈。因此,只需假设一个没有清晰结构的随机 JSON,例如 {"a":{"a":"a","b":"b","c":{"a":"a","b":{"c":"c"},"d":"a"},"e":{"a":{"b":{"c":{"a":"a","b":"b"}}}}}}。 Kubernetes 的 yaml 没有什么特别的,标准 Pod 定义带有 Vault 的 annocations 来读取秘密。

标签: kubernetes consul hashicorp-vault


【解决方案1】:

好吧,你想办法。

{{- with secret "secret/foo" -}}
{{ .Data.data| parseYAML }}
{{- end }}

这是正确的,但正确的函数不是parseYAML,而是toYAML

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 2018-06-23
    • 2013-04-25
    相关资源
    最近更新 更多