k8s集群证书颁发机构应该保密吗?

u12*_*123 10 ca kubernetes

我有一个 azure aks 集群和一个本地 kubeconfig:

apiVersion: v1
kind: Config
clusters:
- name: my-cluster
  cluster:
    certificate-authority-data: LS0...0tCg==
    server: https://api-server:443
contexts:
- name: my-context
  context:
    cluster: my-cluster
    namespace: samples
    user: my-context-user
current-context: my-context
users:
- name: my-context-user
  user:
    token: ey...jI
Run Code Online (Sandbox Code Playgroud)

用于连接到集群、列出 Pod 等。

据我了解,kubeconfig 中的令牌保持秘密/私有很重要。但那又怎样呢certificate-authority-data

由于它只是用于验证 API 服务器证书,我猜它具有与公钥相同的状态,并且至少可以对内部团队成员公开。

是否有文件证实这一点?

我在这里这里没有找到任何相关信息。

小智 3

所有客户端(pod、使用 kubeconfigfile 的普通用户、服务帐户、组件客户端:kubelet 到 kube-apiserver 等)都在起诉ca.crt以识别自签名证书。

正如我们在文档中看到的

通过将 --client-ca-file=SOMEFILE 选项传递给 API 服务器来启用客户端证书身份验证。引用的文件必须包含一个或多个证书颁发机构,用于验证向 API 服务器提供的客户端证书。如果提供并验证了客户端证书,则主题的公用名将用作请求的用户名。从 Kubernetes 1.4 开始,客户端证书还可以使用证书的组织字段来指示用户的组成员身份。要包含用户的多个组成员身份,请在证书中包含多个组织字段。

在使用 kubeadm 进行引导的 k8s 集群中,默认情况下 kube-apiserver 配置为--client-ca-file=/etc/kubernetes/pki/ca.crt.

正如您在文档中看到的,证书颁发机构ca.crt应该在用于安全连接 k8s 集群的所有客户端的任何配置文件中引用。

有时您可能想使用此处嵌入的 Base64 编码数据而不是单独的证书文件;在这种情况下,您需要将后缀 -data 添加到密钥,例如,certificate-authority-data、client-certificate-data、client-key-data

默认情况下,该值是 Base64 编码的并嵌入到 KubeconfigFile 中。

当您的工作负载从Pod内访问 k8s API 时, 您还可以找到以下信息:

# Reference the internal certificate authority (CA)
CACERT=${SERVICEACCOUNT}/ca.crt
Run Code Online (Sandbox Code Playgroud)

默认情况下ca.crt位于/var/run/secrets/kubernetes.io/serviceaccount/ca.crt

为什么ca.crt包含在所有 kubeconfigFiles 中 - 正如我们在文档中看到的

客户端节点可能会拒绝承认自签名 CA 证书有效。对于非生产部署或在公司防火墙后面运行的部署,您可以将自签名 CA 证书分发给所有客户端并刷新有效证书的本地列表。

根据你上次的说法。

由于它只是用于验证 API 服务器证书,我猜它与公钥具有相同的状态,并且至少可以对内部团队成员公开

certificate-authority-data应包含在所有内部团队成员的所有 kubeconfig 文件中,而client-key-data或 令牌应在不同客户端之间保密。

  • 好吧,基本上我问的问题的简短答案是 CA 本身并不敏感,不需要保密 - 尽管惯例是将其存储在 based64 中? (7认同)
  • TL;博士是的,您没有(甚至不应该)保守“证书颁发机构数据”的秘密。Base64 不是用来加密数据的,而是用来对其进行编码的,这是另一回事。[此处](/sf/ask/326019151/ Between-encoding-and-encryption)有一个很好的答案,解释了其中的差异。 (4认同)