OccamsRazor 2018-03-28
kubernetes集群安全访问有两种方式:"基于CA签名的双向数字证书认证"与"基于BASE或TOKEN的简单认证",生产环境推荐使用"基于CA签名的双向数字证书认证"。
本文档采用 CloudFlare 的 PKI 工具集 cfssl 来生成 Certificate Authority (CA) 证书和秘钥文件,CA 是自签名的证书,用来签名后续创建的其它 TLS 证书。
以kubenode1为例,kubenode2&kubenode3做适当小调整。
[root@kubenode1 ~]# mkdir -p /usr/local/cfssl [root@kubenode1 ~]# cd /usr/local/cfssl/ # cfssl [root@kubenode1 cfssl]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 [root@kubenode1 cfssl]# mv cfssl_linux-amd64 cfssl [root@kubenode1 cfssl]# chmod +x cfssl # cfssl-certinfo [root@kubenode1 cfssl]# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 [root@kubenode1 cfssl]# mv cfssl-certinfo_linux-amd64 cfssl-certinfo [root@kubenode1 cfssl]# chmod +x cfssl-certinfo # cfssljson [root@kubenode1 cfssl]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 [root@kubenode1 cfssl]# mv cfssljson_linux-amd64 cfssljson [root@kubenode1 cfssl]# chmod +x cfssljson
# kubenode1节点完成即可 [root@kubenode1 ~]# cd /usr/local/cfssl/ # 生产CA配置文件模板 [root@kubenode1 cfssl]# cfssl print-defaults config > config.json # 生产CA证书签名请求文件模板 [root@kubenode1 cfssl]# cfssl print-defaults csr > csr.json
# kubenode1节点完成即可,以下的CA证书,签名等可通过scp分发到kubenode2&kubenode3; # ca-config.json:1个profiles,分别指定不同的过期时间,使用场景等参数,根据需要在不同场景使用不同的profile签名证书;这里以生成的模板为基础修改; # “signing”:表示该证书可用于签名其他证书,生成的ca.pem证书中CA=TRUE; # ”server auth“:client可用该CA对server提供的证书进行验证; # “client auth”:server可用该CA对client提供的证书进行验证; # 注意每个模块或每行有或没有“,”的区别 [root@kubenode1 cfssl]# cp config.json ca-config.json [root@kubenode1 cfssl]# vim ca-config.json { "signing": { "default": { "expiry": "8760h" }, "profiles": { "kubernetes": { "expiry": "8760h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } }
# “CN”:Common Name,kube-apiserver从证书中提取该字段作为请求的用户名(User Name);浏览器使用该字段验证网站是否合法; # “O”:Organization,kube-apiserver从证书中提取该字段作为请求用户所属的组(Group) [root@kubenode1 cfssl]# cp csr.json ca-csr.json [root@kubenode1 cfssl]# vim ca-csr.json { "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "ChengDu", "L": "ChengDu", "O": "k8s", "OU": "cloudteam" } ] }
[root@kubenode1 cfssl]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca [root@kubenode1 cfssl]# ls ca*
# 简单查看 [root@kubenode1 cfssl]# cfssl-certinfo -cert ca.pem
# 将生成的CA证书,秘钥,配置文件等分发到所有机器; # ca-key.pem与ca.pem重要 [root@kubenode1 ~]# mkdir -p /etc/kubernetes/ssl [root@kubenode1 ~]# cp /usr/local/cfssl/ca* /etc/kubernetes/ssl/ [root@kubenode1 ~]# scp /usr/local/cfssl/ca* [email protected]:/etc/kubernetes/ssl/ [root@kubenode1 ~]# scp /usr/local/cfssl/ca* [email protected]:/etc/kubernetes/ssl/