我试图避免任何用户都可以查看 kubernetes 机密。我尝试了密封的秘密,但这只是隐藏要存储在版本控制中的秘密。一旦我应用了该秘密,我就可以使用以下命令查看该秘密。
kubectl get secret mysecret -o yaml
上面的这个命令仍然显示 base64 编码形式的秘密。
如何避免有人使用上述简单命令看到秘密(即使是 base64 格式)。
我试图避免任何用户都可以查看 kubernetes 机密。我尝试了密封的秘密,但这只是隐藏要存储在版本控制中的秘密。一旦我应用了该秘密,我就可以使用以下命令查看该秘密。
kubectl get secret mysecret -o yaml
上面的这个命令仍然显示 base64 编码形式的秘密。
如何避免有人使用上述简单命令看到秘密(即使是 base64 格式)。
您可以使用 Hashicrop Vault 或 kubernetes-external-secrets ( https://github.com/godaddy/kubernetes-external-secrets )。
或者,如果您只想限制,那么您应该创建一个只读用户并使用角色和角色绑定来限制只读用户对密钥的访问。
然后,如果有人试图描述秘密,那么它将抛出拒绝访问错误。
示例代码:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: test-secrets
namespace: default
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- list
- watch
- create
- delete
- apiGroups:
- ""
resources:
- pods/exec
verbs:
- create
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: test-secrets
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: test-secrets
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: demo
上述角色无权访问机密。因此演示用户被拒绝访问。
使用 Kubernetes 内部工具无法做到这一点。您将始终不得不依赖第三方工具。
Hashicorps Vault 是一种非常常用的解决方案,它非常强大并且支持一些非常好的功能,例如动态机密或信封加密。但它在配置方面也可能变得非常复杂。所以你需要自己决定你需要什么样的解决方案。
我建议您使用Sealed-Secrets。它会加密您的秘密,您可以将加密的秘密安全地推送到您的存储库中。它没有这么大的功能列表,但它完全符合您的描述。
您可以通过 Init 容器将 Hashicrop Vault 机密注入 Kubernetes pod,并使用 sidecar 容器使它们保持最新。
更多细节在这里https://www.hashicorp.com/blog/injecting-vault-secrets-into-kubernetes-pods-via-a-sidecar/