在 Google Secret Manager 中存储二进制数据

Posted

技术标签:

【中文标题】在 Google Secret Manager 中存储二进制数据【英文标题】:Storing binary data in Google Secret Manager 【发布时间】:2020-07-19 21:51:20 【问题描述】:

我第一次使用Google Secret Manager 来存储一些二进制数据。当我访问秘密时,它似乎有不同的编码或格式。

实际数据是一个证书包,但我已经能够使用较小的二进制数据重现该问题。重现步骤:

    用二进制数据创建一个文件:

    echo -e -n '\xed\xfe' > secret.txt
    

    创建密钥和版本:

    gcloud secrets create "my-secret" \
      --data-file ./secret.txt \
      --replication-policy "automatic"
    

    访问密钥并将结果保存到文件中:

    gcloud secrets versions access latest --secret "my-secret" > result.txt
    

    比较两个文件:

    od -t x1 secret.txt  # ed fe
    od -t x1 result.txt  # 3f 3f 0a
    

为什么结果不同?我是否需要做一些额外的事情才能让 Google Secret Manager 处理二进制数据?

【问题讨论】:

【参考方案1】:

Secret Manager 完全按照给定的方式存储数据。不幸的是,gcloud CLI 工具中存在一个错误,该错误会在响应末尾添加一个额外的换行符。

这个错误是fixed in gcloud v288.0.0。请确保您使用的是 v288.0.0 或更高版本。

如果您担心本地编码问题,则应改为获取原始 JSON 响应。此响应将包含 base64 编码的秘密负载,这对于传输来说更加安全:

gcloud secrets versions access latest --secret "my-secret" --format "json"

您可以使用jq 之类的工具在命令行上解析 JSON。请注意,秘密负载数据是 base64 编码的,因此您需要在使用前解码该值。

gcloud secrets versions access latest --secret "my-secret" --format "json" | \
  jq -r .payload.data | \
  base64 --decode > results_binary.txt

验证:

od -t x1 results_binary.txt  # ed fe

【讨论】:

如果你的环境中没有安装jq,你可以使用gcloud的--format参数来解析出你想要的json中的字段。有关更多信息,请参阅 Google 的此文档link。

以上是关于在 Google Secret Manager 中存储二进制数据的主要内容,如果未能解决你的问题,请参考以下文章

从 Google Cloud Build 访问存储在 Google Secret Manager 中的环境变量

使用 Node.js 更新 Google Cloud Secret Manager 中的数据

为啥在由 Apache 运行时,来自 Google Secret Manager API 的 gRPC 调用会挂起?

Google Secret Manager:不要通过 Spring Boot 从中获得价值

Google Secret Manager - 可以用于存储 API 用户的用户名和密码吗?

将 env 变量从 Google 的 Secret Manager 加载到在 Google Cloud Run 上运行但未通过 Cloud Build 部署的 Docker 容器中?