kubernetes:gpg 解密后,来自秘密 yaml 的值在节点 js 容器中被破坏

Posted

技术标签:

【中文标题】kubernetes:gpg 解密后,来自秘密 yaml 的值在节点 js 容器中被破坏【英文标题】:kubernetes: Values from secret yaml are broken in node js container after gpg decryption 【发布时间】:2021-09-22 02:22:46 【问题描述】:

我是 Kubernetes 新手。我有一个 Kubernetes 秘密 yaml 文件:

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  API_KEY: 123409uhttt
  SECRET_KEY: yu676jfjehfuehfu02

我使用 gpg 加密进行了编码:

 gpg -a --symmetric --cipher-algo AES256 -o "secrets.yaml.gpg" "secrets.yaml"

并在 github 操作的工作流程中解密它,如下所示:

gpg -q --batch --yes --decrypt --passphrase=$GPG_SECRET my/location/to/secrets.yaml.gpg | kubectl apply -n $NAMESPACE -f -

当我跑步时:

kubectl get secret my-secret -n my-namespace -o yaml

我得到的 yaml 显示为 API_KEY 和 SECRET_KEY 设置的正确值,如下所示:

apiVersion: v1
data:
  API_KEY: 123409uhttt
  SECRET_KEY: yu676jfjehfuehfu02
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      "apiVersion":"v1","data":"API_KEY":"123409uhttt","SECRET_KEY":"yu676jfjehfuehfu02","kind":"Secret","metadata":"annotations":,"name":"my-secret","namespace":"my-namespace","type":"Opaque"
  creationTimestamp: "2021-07-12T23:28:56Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: 
        f:API_KEY: 
        f:SECRET_KEY: 
      f:metadata:
        f:annotations:
          .: 
          f:kubectl.kubernetes.io/last-applied-configuration: 
      f:type: 
    manager: kubectl-client-side-apply
    operation: Update
    time: "2021-07-10T23:28:56Z"
  name: my-secret
  namespace: my-namespace
  resourceVersion: "29813715"
  uid: 89a34b6d-914eded509
type: Opaque

但是当应用程序使用 SECRET_KEY 和 API_KEY 请求时,它会以损坏的编码显示这些值。当我记录它们时,我会打印这些值:

Api_Key -  ᶹ��4yַӭ�ӯu�ï¿8
Secret_Key - �V�s��Û[ï¶×¿zoï½9sï¿½ï¿½ï¿½ï¿ 

当我不使用 secrets.yaml 中的 Api_Key 和 Secret_Key(作为应用程序中的硬编码值)时,它会按预期工作。

我需要帮助才能在运行节点 js 应用程序的容器中访问具有正确值的秘密数据(Api_Key 和 Secret_Key)。

【问题讨论】:

【参考方案1】:

您的秘密值似乎不是 base64 编码的。 要么将数据类型更改为不需要 base64 编码的“stringData”,要么先对你的秘密值进行编码。

例如echo "§SECRET_KEY" | base64 并在您的秘密中使用此值。 您描述的问题发生在秘密值被注入 base64 解码到您的 pod 中。

但是,当您尝试解码您提供的值时

echo "123409uhttt" | base64 -d 你会得到以下输出:�m��ۡ��base64: invalid input

【讨论】:

以上是关于kubernetes:gpg 解密后,来自秘密 yaml 的值在节点 js 容器中被破坏的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Boot 将来自 Google Secret Manager 的秘密作为环境变量注入 Kubernetes Pod?

加密解密:文件加密

Kubernetes Secrets 自动删除

使用 GPG 对数据进行加密解密签名

小工具之gpg加密解密

sh 使用GPG解密文件