前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >kubernetes学习记录(13)——网上集群基于CA签名安全设置的两种方式对比

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

作者头像
胡了了
发布2017-12-28 17:46:33
8430
发布2017-12-28 17:46:33
举报
文章被收录于专栏:从零学习云计算

《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

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

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

代码语言:javascript
复制
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这个为例,校验证书,对比里面的内容。

代码语言:javascript
复制
# openssl x509 -in server.crt -inform pem -noout -text

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

代码语言:javascript
复制
    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校验证书显示的部分截取内容。

代码语言:javascript
复制
    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

其中配置了的参数如下:

代码语言:javascript
复制
--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。

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

代码语言:javascript
复制
--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做高可用部署了,这里的设置有待验证)

代码语言:javascript
复制
--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

代码语言:javascript
复制
--cert-dir# TLS证书所在目录,默认为/var/run/kubernetes

/etc/kubernetes/proxy

《kubernetes学习记录(9)——集群基于CA签名的安全设置》

《创建TLS证书和秘钥》

--kubeconfig=/etc/kubernetes/kubeconfig

--kubeconfig=/etc/kubernetes/kubelet.kubeconfig

总结

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-08-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 证书数量和组件使用的对比
  • 证书内容的对比
  • 组件配置证书的对比
    • /etc/kubernetes/apiserver的安全认证设置(KUBE_API_ARGS)
      • kube-controller-manager、kube-scheduler、etcd
        • /etc/kubernetes/controller-manager
        • /etc/kubernetes/scheduler
        • /etc/kubernetes/kubelet
        • /etc/kubernetes/proxy
    • 总结
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档