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 条评论
登录 后参与评论

相关文章

来自专栏吾爱乐享

php学习之走进web开发

993
来自专栏技术视野

在Ubuntu 16.04或Debian 8上安装SquirrelMail

SquirrelMail是一个用PHP编写的webmail包,它支持SMTP和IMAP协议,并具有跨平台兼容性。SquirrelMail需要一台带有PHP的We...

1021
来自专栏breeze技术随笔

win10使用WSL编译Linux C++项目

我们是做后台开发的,虽然我们的svr都泡在tlinux上,但是大部分同学写代码/看代码还都是在windows下。

4118
来自专栏黑客秘密

黑客是如何实施暴力破解的?

“没有网络安全,就没有国家安全”,网络安全已经成为了国家战略级目标,如果做过开发的工程师也可能遇到过网站或者服务器被暴力破解的情况。下面我们就来看看,黑客是如何...

1987
来自专栏大魏分享(微信公众号:david-share)

用Ansible自动供应vmware虚拟机--构建数据中心一体化运维平台第二篇

1.1 简述 一直以来,打开邮箱被ticket糊一脸的事情时有发生。我一直在想,能不能以一种简单的方案(不花老板的钱)来供应(provisioning)虚拟机呢...

5522
来自专栏数据之美

Ubuntu on Windows10 跨平台开发环境搭建权威指南

程序猿经常争论的一个话题是:日常开发到底 Windows 好还是 Linux 好?进而演化出另一个问题:到底选 MacBook 好还是 SurfaceBook ...

50414
来自专栏GopherCoder

Python:一周笔记

1464
来自专栏源码之家

用mysqldump备份数据库时,要注意路径的问题。

1073
来自专栏张戈的专栏

解决Nginx Helper插件一键清理缓存功能导致网站打不开问题

5 月份,张戈博客分享了一篇《Nginx 开启 fastcgi_cache 缓存加速,支持 html 伪静态页面》的文章。文中也提到了 WordPress 有一...

3599
来自专栏雪胖纸的玩蛇日常

1.Ubuntu系统与vmware虚拟机的安装与使用

1485

扫码关注云+社区