即使在删除用于加密的 KMS 密钥后也能取回 GKE 机密
Getting GKE secrets back even after deleting the KMS keys used for encryption
我按照 this 文档创建了一个带有 --database-encryption-key
标志的 GKE 集群 (1.13.6-gke.6),为启用 应用层机密加密提供了 KMS 密钥.
我使用以下命令创建了一个秘密:
kubectl create secret generic dev-db-secret --from-literal=username=someuser --from-literal=password=somepass
因此,如果我的假设是正确的,这些秘密将使用我在创建集群时提供的 KMS 密钥加密存储。然而,即使在我销毁了所用密钥的所有版本之后,我也能够使用 kubectl get secret dev-db-secret -o yaml
看到存储在 GKE etcd
中的秘密,并且我能够在创建的 pod 中看到它们使用以下清单:
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: dev-db-secret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: test-secret
key: password
restartPolicy: Never
如果我执行上述 pod 并执行 echo SECRET_USERNAME
和 echo SECRET_PASSWORD
,我会在我的控制台上以纯文本形式打印用户名和密码。
这是加密的工作方式吗?如果是,加密究竟发生在哪里?
我究竟做错了什么?秘密真的加密了吗?
我不是 100% 确定,但我认为这些密钥已缓存,因此可能需要一段时间才能解密失败。 Azure 是这样,我猜 GKE 也差不多。
顺便说一句,您可能想阅读如何保护清单文件以便将它们存储在 Git 上。我写了一个 blog post 描述了一些你可以使用的选项。
我按照 this 文档创建了一个带有 --database-encryption-key
标志的 GKE 集群 (1.13.6-gke.6),为启用 应用层机密加密提供了 KMS 密钥.
我使用以下命令创建了一个秘密:
kubectl create secret generic dev-db-secret --from-literal=username=someuser --from-literal=password=somepass
因此,如果我的假设是正确的,这些秘密将使用我在创建集群时提供的 KMS 密钥加密存储。然而,即使在我销毁了所用密钥的所有版本之后,我也能够使用 kubectl get secret dev-db-secret -o yaml
看到存储在 GKE etcd
中的秘密,并且我能够在创建的 pod 中看到它们使用以下清单:
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: dev-db-secret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: test-secret
key: password
restartPolicy: Never
如果我执行上述 pod 并执行 echo SECRET_USERNAME
和 echo SECRET_PASSWORD
,我会在我的控制台上以纯文本形式打印用户名和密码。
这是加密的工作方式吗?如果是,加密究竟发生在哪里? 我究竟做错了什么?秘密真的加密了吗?
我不是 100% 确定,但我认为这些密钥已缓存,因此可能需要一段时间才能解密失败。 Azure 是这样,我猜 GKE 也差不多。
顺便说一句,您可能想阅读如何保护清单文件以便将它们存储在 Git 上。我写了一个 blog post 描述了一些你可以使用的选项。