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证书和秘钥》

使用工具

openssl

cfssl

生成的证书

ca.keyca.crtserver.keyserver.crtkubelet_client.keykubelet_client.crtcs_client.keycs_client.crt

ca-key.pemca.pemkubernetes-key.pemkubernetes.pemkube-proxy-key.pemkube-proxy.pemadmin-key.pemadmin.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.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

总结

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java学习123

解决Cannot change version of project facet Dynamic web module to 2.5

2563
来自专栏向治洪

再谈Android动态链接库

前不久,我们准备将自己开发的视频播放sdk提供给公司其他部门,在打包的时候,同事问了我一个问题,为什么我们打sdk的时候需要分别提供armeabi和arm64-...

1997
来自专栏小狼的世界

20个Linux服务器安全强化建议(一)

Linux服务器安全对于保护用户数据、知识产权非常重要,同时还能减少你面对黑客的时间。在工作中,通常由系统管理员对Linux的安全负责,在这篇文章中,介绍了20...

872
来自专栏IT笔记

Linux下ActiveMQ无法启动

昨夜西风凋碧树 独上高楼望尽天涯路。 ? timg.jpg 邻近上线,居然才安装ActiveMQ,测试环境是在win环境下安装的,线上环境是Linux。 然而问...

2887
来自专栏阮一峰的网络日志

持续集成服务 Travis CI 教程

编写代码只是软件开发的一小部分,更多的时间往往花在构建(build)和测试(test)。 为了提高软件开发的效率,构建和测试的自动化工具层出不穷。Travis ...

3415
来自专栏cloudskyme

JRuby——Java和Ruby的强强联合

什么是JRuby JRuby是一个纯Java实现的Ruby解释器。通过JRuby,你可以在JVM上直接运行Ruby程序,调用Java的类库。很多Java编写的...

3184
来自专栏王肖的UT

Assimp Android 编译

1754
来自专栏云计算教程系列

如何创建自签名证书

TLS/SSL是用于将正常流量包装在受保护的加密包装中的Web协议。得益于此技术,服务器可以在服务器和客户端之间安全地发送流量,而不会被外部各方拦截。证书系统还...

1034
来自专栏Laoqi's Linux运维专列

CentOs7.3 搭建 RabbitMQ 3.6 单机多实例服务

2757
来自专栏鬼谷君

05-创建kubectl-kubeconfig文件

1182

扫码关注云+社区