kubernetes学习记录(13)——网上集群基于CA签名安全设置的两种方式对比

来源:互联网 发布:好玩的配音软件 编辑:程序博客网 时间:2024/05/29 02:34

在《kubernetes学习记录(9)——集群基于CA签名的安全设置》一文中,我是照着《Kubernetes权威指南》以及一些博客做了基于CA签名的安全设置。但是这一块基本没有理解,所以在此选择《创建TLS证书和秘钥》一文的创建方式做个对比,详细研究一下这一块的细节

《Kubernetes权威指南第2版》——2.1.6 Kubernetes核心服务配置详解
这章有各个启动进程关键配置参数的详解。


《创建TLS证书和秘钥》该文是http://jimmysong.io/kubernetes-handbook/里的一节,该书是基于Kubernetes1.6做的研究。

网上的各种教程中都有作者自己的思考与间接,彼此之间都有些差异,别人的东西不一定适合自己,我觉得对比着学习更能学到东西

证书数量和组件使用的对比

下面以表格的形式做一下对比。

项目 《kubernetes学习记录(9)——集群基于CA签名的安全设置》 《创建TLS证书和秘钥》 使用工具 openssl cfssl 生成的证书 ca.key
ca.crt
server.key
server.crt
kubelet_client.key
kubelet_client.crt
cs_client.key
cs_client.crt
ca-key.pem
ca.pem
kubernetes-key.pem
kubernetes.pem
kube-proxy-key.pem
kube-proxy.pem
admin-key.pem
admin.pem etcd使用的证书 无 ca.pem、kubernetes-key.pem、kubernetes.pem kube-apiserver使用的证书 ca.crt、server.key、server.crt ca.pem、kubernetes-key.pem、kubernetes.pem kube-controller-manager使用的证书 ca.crt、server.key、cs_client.crt、cs_client.key kube-controller、kube-scheduler 当前需要和 kube-apiserver 部署在同一台机器上且使用非安全端口通信,故不需要证书。(实际在后文中他做了配置) kube-scheduler使用的证书 ca.crt、cs_client.crt、cs_client.key kube-controller、kube-scheduler 当前需要和 kube-apiserver 部署在同一台机器上且使用非安全端口通信,故不需要证书。(实际在后文中他做了配置) kubelet使用的证书 kubelet_client.crt、kubelet_client.key、ca.crt ca.pem kube-proxy使用的证书 kubelet_client.crt、kubelet_client.key、ca.crt ca.pem、kube-proxy-key.pem、kube-proxy.pem kubectl 无 ca.pem、admin-key.pem、admin.pem


可以看出,整体思路还是相似的。接下来对比各个证书的生成过程,对比它们的异同。


通过对证书生成过程的分析。可以得出以下的对应关系:

ca.key<——>ca-key.pemca.crt<——>ca.pemserver.key<——>kubernetes-key.pemserver.crt<——>kubernetes.pemkubelet_client.key<——>kube-proxy-key.pemkubelet_client.crt<——>kube-proxy.pemcs_client.key<——>admin-key.pemcs_client.crt<——>admin.pem

从上述对比可以看出,两篇文章建立的8个证书文件其实是可以一一对应上的。
同时修改了上述表格中的“生成的证书”那一栏的顺序,使其一一对应。


证书内容的对比

以server.crt<——>kubernetes.pem这个为例,校验证书,对比里面的内容。

# openssl x509 -in server.crt -inform pem -noout -text

以下是我的server.crt校验证书显示的部分截取内容。

    Signature Algorithm: sha1WithRSAEncryption        Issuer: CN=192.168.121.143        Validity            Not Before: Aug 21 11:55:40 2017 GMT            Not After : Apr 30 11:55:40 2031 GMT        Subject: CN=master        X509v3 extensions:            X509v3 Basic Constraints:                 CA:FALSE            X509v3 Key Usage:                 Digital Signature, Non Repudiation, Key Encipherment            X509v3 Subject Alternative Name:                 DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, DNS:master, IP Address:10.254.0.1, IP Address:192.168.121.143

以下是《创建TLS证书和秘钥》一文中kubernetes.pem校验证书显示的部分截取内容。

    Signature Algorithm: sha256WithRSAEncryption        Issuer: C=CN, ST=BeiJing, L=BeiJing, O=k8s, OU=System, CN=Kubernetes        Validity            Not Before: Apr  5 05:36:00 2017 GMT            Not After : Apr  5 05:36:00 2018 GMT        Subject: C=CN, ST=BeiJing, L=BeiJing, O=k8s, OU=System, CN=kubernetes        X509v3 extensions:            X509v3 Key Usage: critical                Digital Signature, Key Encipherment            X509v3 Extended Key Usage:                TLS Web Server Authentication, TLS Web Client Authentication            X509v3 Basic Constraints: critical                CA:FALSE            X509v3 Subject Key Identifier:                DD:52:04:43:10:13:A9:29:24:17:3A:0E:D7:14:DB:36:F8:6C:E0:E0            X509v3 Authority Key Identifier:                keyid:44:04:3B:60:BD:69:78:14:68:AF:A0:41:13:F6:17:07:13:63:58:CD            X509v3 Subject Alternative Name:                DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster, DNS:kubernetes.default.svc.cluster.local, IP Address:127.0.0.1, IP Address:172.20.0.112, IP Address:172.20.0.113, IP Address:172.20.0.114, IP Address:172.20.0.115, IP Address:10.254.0.1


对比 Issuer 字段的内容; Subject 字段的内容;X509v3 Subject Alternative Name 字段的内容; X509v3 Key Usage、Extended Key Usage 字段的内容。

对比发现,生成的证书结构和内容上都有相似之处,只是使用的生成软件不一样,过程不一样,导致格式上有些不一样的地方,这些差异是否会产生影响有待验证


组件配置证书的对比

这里只截取了证书配置部分的参数进行对比。

/etc/kubernetes/apiserver的安全认证设置(KUBE_API_ARGS)

《kubernetes学习记录(9)——集群基于CA签名的安全设置》 《创建TLS证书和秘钥》 --client-ca-file=/etc/kubernetes/ssl/ca.crt
--tls-private-key-file=/etc/kubernetes/ssl/server.key
--tls-cert-file=/etc/kubernetes/ssl/server.crt --tls-cert-file=/etc/kubernetes/ssl/kubernetes.pem
--tls-private-key-file=/etc/kubernetes/ssl/kubernetes-key.pem
--client-ca-file=/etc/kubernetes/ssl/ca.pem
--service-account-key-file=/etc/kubernetes/ssl/ca-key.pem
--etcd-cafile=/etc/kubernetes/ssl/ca.pem
--etcd-certfile=/etc/kubernetes/ssl/kubernetes.pem
--etcd-keyfile=/etc/kubernetes/ssl/kubernetes-key.pem


其中配置了的参数如下:

--client-ca-file #CA根证书文件,如果指定,该客户端证书会被用于认证过程--tls-cert-file #包含x509证书的文件路径,用于HTTPS认证--tls-private-key-file #包含x509与--tls-cert-file对应的私钥文件路径--service-account-key-file#包含PEM-encoded x509 RSA公钥和私钥的文件路径,用于验证Service Account的token,如果不指定,则使用--tls-private-key-file指定的文件--etcd-cafile#到etcd安全连接使用的SSL CA文件--etcd-certfile#到etcd安全连接使用的SSL 证书文件--etcd-keyfile#到etcd安全连接使用的SSL key文件

《创建TLS证书和秘钥》多配的是--service-account-key-file --etcd-cafile --etcd-certfile --etcd-keyfile(--kubelet-https=true指定kubelet是否使用https连接)
其中后三个是etcd的证书配置,在此我的etcd是和master暂在一台宿主机上,所以暂时不用配。与《创建TLS证书和秘钥》不配kube-controller、kube-scheduler 的原因类似(kube-controller、kube-scheduler 当前需要和 kube-apiserver 部署在同一台机器上且使用非安全端口通信,故不需要证书)。

--service-account-key-file
我没指定,使用–tls-private-key-file指定的文件,为server.key(kubernetes-key.pem)。
《创建TLS证书和秘钥》指定使用的是ca-key.pem。

kube-controller-manager、kube-scheduler、etcd

《创建TLS证书和秘钥》认为kube-controller、kube-scheduler 当前需要和 kube-apiserver 部署在同一台机器上且使用非安全端口通信,故不需要证书(实际在后文中他做了配置)。他是配了一个etcd的集群,所以etcd做了安全认证。

这里,我认为,之后的生成环境为了保证高可用性,etcd和kube-apiserver都应该配成集群的形式,所以kube-controller-manager、kube-scheduler、etcd都应该配置。

/etc/kubernetes/controller-manager

《kubernetes学习记录(9)——集群基于CA签名的安全设置》 《创建TLS证书和秘钥》 --service-account-private-key-file=/etc/kubernetes/ssl/server.key
--root-ca-file=/etc/kubernetes/ssl/ca.crt
--kubeconfig=/etc/kubernetes/kubeconfig --cluster-signing-cert-file=/etc/kubernetes/ssl/ca.pem
--cluster-signing-key-file=/etc/kubernetes/ssl/ca-key.pem
--service-account-private-key-file=/etc/kubernetes/ssl/ca-key.pem
--root-ca-file=/etc/kubernetes/ssl/ca.pem
--leader-elect=true


在我的--kubeconfig=/etc/kubernetes/kubeconfig配置了 client-certificate: /etc/kubernetes/ssl/cs_client.crt、client-key: /etc/kubernetes/ssl/cs_client.key、certificate-authority: /etc/kubernetes/ssl/ca.crt。

所以综上配置了的参数如下:

--leader-elect=true #设置为true表示进行leader选举,用于多个master组件的高可用部署--service-account-private-key-file#用于给Service Account token签名的PEM-encoded RSA私钥文件路径--root-ca-file#根CA证书文件路径,将被用于Service Account的token secret中。--cluster-signing-cert-file与--cluster-signing-key-file的参数意义暂时不明。--kubeconfig #kubeconfig配置文件路径,在配置文件中包括Master的地址信息及必要认证信息

/etc/kubernetes/scheduler

《kubernetes学习记录(9)——集群基于CA签名的安全设置》 《创建TLS证书和秘钥》 --address=127.0.0.1
--kubeconfig=/etc/kubernetes/kubeconfig --leader-elect=true --address=127.0.0.1


--address 值必须为 127.0.0.1,因为当前 kube-apiserver 期望 scheduler 和 controller-manager 在同一台机器(当kube-apiserver做高可用部署了,这里的设置有待验证)

--leader-elect=true #设置为true表示进行leader选举,用于多个master组件的高可用部署--kubeconfig #kubeconfig配置文件路径,在配置文件中包括Master的地址信息及必要认证信息

/etc/kubernetes/kubelet

《kubernetes学习记录(9)——集群基于CA签名的安全设置》 《创建TLS证书和秘钥》 --kubeconfig=/etc/kubernetes/kubeconfig --kubeconfig=/etc/kubernetes/kubelet.kubeconfig
--cert-dir=/etc/kubernetes/ssl


--cert-dir# TLS证书所在目录,默认为/var/run/kubernetes

/etc/kubernetes/proxy

《kubernetes学习记录(9)——集群基于CA签名的安全设置》 《创建TLS证书和秘钥》 --kubeconfig=/etc/kubernetes/kubeconfig --kubeconfig=/etc/kubernetes/kubelet.kubeconfig

总结

通过对比发现,两种方式做安全认证的思路差不多,有些细节方面需要结合一下。这些内容后续会进一步的研究。

阅读全文
0 0
原创粉丝点击