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

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

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


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

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

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

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

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


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


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

ca.key<——>ca-key.pem
ca.crt<——>ca.pem
server.key<——>kubernetes-key.pem
server.crt<——>kubernetes.pem
kubelet_client.key<——>kube-proxy-key.pem
kubelet_client.crt<——>kube-proxy.pem
cs_client.key<——>admin-key.pem
cs_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

总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值