如何让 kubernetes pod 无法在没有密钥的情况下解密 kubernetes 的秘密?

问题描述

我试图实现的最终目标是创建一个 kubernetes secret(可能带有密钥)和一个使用它的 pod。但问题是,创建的 pod 应该无法在没有特定密钥的情况下解码/解密秘密值。 我已经尝试了静态数据加密的秘密,但这还不足以满足我的要求。

解决方法

编辑:我正在尝试将其作为逐步解决方案。 (如@Dawid 在评论中所问)

  1. 使用您的密钥(您的加密逻辑,可能在脚本中)加密您的数据。
./encrypt.sh --key your-key --data your-data
  1. 创建这个加密数据的秘密
kubectl create secret generic your-secret-name --from-literal=secretdata=your-encrypted-data 
  1. 您可以在 pod 中添加这样的解密逻辑(作为 sidecar 或 initContainer)
# decrypt.sh will decode base64 then your decryption logic using your-key
./decrypt.sh --key your-key --data /var/my-secrets 
  1. 此外,您还需要将此机密作为卷安装到您的容器中。
    spec:
      containers:
      - image: "image"
        name: app
        ...
        volumeMounts:
          - mountPath: "/var/my-secrets"
            name: my-secret
      volumes:
        - name: my-secret
          secret:
            secretName: your-secret-name
,

正如@Kiran 所回答的,这里是我获得解决方案所遵循的步骤。

  1. 使用 openssl 加密

    echo -n "preetham" | openssl enc -e -aes-256-cbc -a -salt -pass pass:<PASSWORD>

  2. 从 YAML 文件创建机密。 preetham-secrets-test.yaml

    apiVersion: v1
    kind: Secret
    metadata:
      name: preetham-secrets
    type: Opaque
    stringData: # Using stringData instead data
      username: U2FsdGVkX18VsbQaVpeqrCCJCDEd3LCbefT6nupChvw=  # output from the step 1 
    
  3. 创建秘密

    kubectl apply -f preetham-secrets-test.yaml -n <NAMESPACE>

  4. 将 secret 安装到 volume 并执行到 pod 中。 Kubernetes reference

  5. 在 pod 内部,假设机密已安装到 /opt/mnt/secrets/

    bash-4.2# cat /opt/mnt/secrets/username
    
    U2FsdGVkX18VsbQaVpeqrCCJCDEd3LCbefT6nupChvw=bash-4.2#
    
  6. 使用 openssl 进行解密。(您可能需要使用

    根据图像安装 openssl
    bash-4.2# echo "U2FsdGVkX18VsbQaVpeqrCCJCDEd3LCbefT6nupChvw=" | openssl enc -d -aes-256-cbc -a -salt -pass pass:<PASSWORD>
    
    preethambash-4.2#