如何让 kubernetes pods 在没有密钥的情况下无法解密 kubernetes secrets?
How to make the kubernetes pods unable to decrypt the kubernetes secrets without a key?
我试图实现的最终目标是创建一个 kubernetes 秘密(可能有一个密钥)和一个使用它的 pod。但要注意的是,创建的 pod 不应该 decode/decrypt 没有特定密钥的秘密值。
我已经尝试过静态数据加密的秘密,但这还不足以满足我的要求。
编辑:我正在尝试将其作为逐步解决方案。 (正如@Dawid 在评论中所问)
- 使用您的密钥加密您的数据(您的加密逻辑,可能在脚本中)。
./encrypt.sh --key your-key --data your-data
- 创建此加密数据的秘密
kubectl create secret generic your-secret-name --from-literal=secretdata=your-encrypted-data
- 您可以在您的 pod 中添加这样的解密逻辑(作为 sidecar 或 initContainer)
# decrypt.sh will decode base64 then your decryption logic using your-key
./decrypt.sh --key your-key --data /var/my-secrets
- 您还需要将此机密作为卷装载到您的容器中。
spec:
containers:
- image: "image"
name: app
...
volumeMounts:
- mountPath: "/var/my-secrets"
name: my-secret
volumes:
- name: my-secret
secret:
secretName: your-secret-name
正如@Kiran 的回答,这是我获得解决方案所遵循的步骤。
使用openssl
加密
echo -n "preetham" | openssl enc -e -aes-256-cbc -a -salt -pass pass:<PASSWORD>
从 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
创建密钥
kubectl apply -f preetham-secrets-test.yaml -n <NAMESPACE>
将密钥挂载到卷并执行到 pod 中。 Kubernetes reference
在 pod 内假设秘密安装到 /opt/mnt/secrets/
。
bash-4.2# cat /opt/mnt/secrets/username
U2FsdGVkX18VsbQaVpeqrCCJCDEd3LCbefT6nupChvw=bash-4.2#
使用 openssl
解密相同内容。(您可能必须使用
基于图像安装 openssl
bash-4.2# echo "U2FsdGVkX18VsbQaVpeqrCCJCDEd3LCbefT6nupChvw=" | openssl enc -d -aes-256-cbc -a -salt -pass pass:<PASSWORD>
preethambash-4.2#
我试图实现的最终目标是创建一个 kubernetes 秘密(可能有一个密钥)和一个使用它的 pod。但要注意的是,创建的 pod 不应该 decode/decrypt 没有特定密钥的秘密值。 我已经尝试过静态数据加密的秘密,但这还不足以满足我的要求。
编辑:我正在尝试将其作为逐步解决方案。 (正如@Dawid 在评论中所问)
- 使用您的密钥加密您的数据(您的加密逻辑,可能在脚本中)。
./encrypt.sh --key your-key --data your-data
- 创建此加密数据的秘密
kubectl create secret generic your-secret-name --from-literal=secretdata=your-encrypted-data
- 您可以在您的 pod 中添加这样的解密逻辑(作为 sidecar 或 initContainer)
# decrypt.sh will decode base64 then your decryption logic using your-key
./decrypt.sh --key your-key --data /var/my-secrets
- 您还需要将此机密作为卷装载到您的容器中。
spec:
containers:
- image: "image"
name: app
...
volumeMounts:
- mountPath: "/var/my-secrets"
name: my-secret
volumes:
- name: my-secret
secret:
secretName: your-secret-name
正如@Kiran 的回答,这是我获得解决方案所遵循的步骤。
使用
加密openssl
echo -n "preetham" | openssl enc -e -aes-256-cbc -a -salt -pass pass:<PASSWORD>
从 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
创建密钥
kubectl apply -f preetham-secrets-test.yaml -n <NAMESPACE>
将密钥挂载到卷并执行到 pod 中。 Kubernetes reference
在 pod 内假设秘密安装到
/opt/mnt/secrets/
。bash-4.2# cat /opt/mnt/secrets/username U2FsdGVkX18VsbQaVpeqrCCJCDEd3LCbefT6nupChvw=bash-4.2#
使用
基于图像安装openssl
解密相同内容。(您可能必须使用openssl
bash-4.2# echo "U2FsdGVkX18VsbQaVpeqrCCJCDEd3LCbefT6nupChvw=" | openssl enc -d -aes-256-cbc -a -salt -pass pass:<PASSWORD> preethambash-4.2#