我有一个 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
用于连接集群、列出 Pod 等。
据我了解,kubeconfig 中的令牌保持秘密/私有很重要。但是
certificate-authority-data
呢?
由于它只是用于验证 API 服务器证书,我猜它具有与公钥相同的状态,并且至少可以对内部团队成员公开。
有文件证实这一点吗?
所有客户端(pod、使用 kubeconfigfile 的普通用户、服务帐户、组件客户端:kubelet 到 kube-apiserver 等)都在起诉 ca.crt 以识别自签名证书。
正如我们在 docs
中看到的通过将 --client-ca-file=SOMEFILE 选项传递给 API 服务器来启用客户端证书身份验证。引用的文件必须包含一个或多个证书颁发机构,用于验证向 API 服务器提供的客户端证书。如果提供并验证了客户端证书,则主题的公用名将用作请求的用户名。从 Kubernetes 1.4 开始,客户端证书还可以使用证书的组织字段来指示用户的组成员身份。要包含用户的多个组成员身份,请在证书中包含多个组织字段。
在默认使用 kubeadm 引导的 k8s 集群中,kube-apiserver 配置为
--client-ca-file=/etc/kubernetes/pki/ca.crt
。
正如您在 docs 证书颁发机构 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
默认情况下 ca.crt 位于
/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
为什么 ca.crt 包含在所有 kubeconfig 文件中 - 正如我们在 docs
中看到的客户端节点可能会拒绝承认自签名 CA 证书有效。对于非生产部署或在公司防火墙后面运行的部署,您可以将自签名 CA 证书分发给所有客户端并刷新有效证书的本地列表。
根据你最后的陈述。
由于它只是用于验证 API 服务器证书,我猜它具有与公钥相同的状态,并且至少可以对内部团队成员公开
certificate-authority-data
应包含在所有内部团队成员的所有 kubeconfig 文件中,而 client-key-data
或令牌应在不同客户端之间保密。
不,
certificate-authority-data
不必保密。这是一个PEM 编码的证书。您可以对其进行 base64 解码以查看该值,如下所示。
-----BEGIN CERTIFICATE-----
fwoeijfoweifoewifoweifowiefoweif
feohfqofpqqpjfpqjfqpjpjpjpjpjpj
and so on
-----END CERTIFICATE-----
它没有说“私有”,所以它只包含公钥。您还可以将其写入文件并通过
openssl x509 -in <filename>.pem -noout -text
读入以进行验证。您应该看到“主题公钥信息”,但没有提及私钥。
考虑到 kube_config 可能包含敏感令牌,为了安全起见,您应该考虑将其保密。
其他参考资料: