Kubernetes 认证方式
Kubernetes 系统提供了三种认证方式:CA 认证、Token 认证 和 Base 认证。 CA 双向认证方式是最为严格和安全的集群安全配置方式,也是我们今天要介绍的主角。
我们先来了解下什么是 CA 认证:CA认证,即电子认证服务,证书颁发机构(CA, Certificate Authority)即颁发数字证书的机构。是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。CA中心为每个使用公开密钥的用户发放一个数字证书,数字证书的作用是证明证书中列出的用户合法拥有证书中列出的公开密钥。CA机构的数字签名使得攻击者不能伪造和篡改证书。在SET交易中,CA不仅对持卡人、商户发放证书,还要对获款的银行、网关发放证书。
主要配置流程如下:
- 生成根证书、API Server 服务端证书、服务端私钥、各个组件所用的客户端证书和客户端私钥。
- 修改 Kubernetes 各个服务进程的启动参数,启用双向认证模式。
openssh
opessl中RSA算法指令主要有三个:
指令 | 功能 |
---|---|
genrsa | 生成并输入一个RSA私钥 |
rsa | 处理RSA密钥的格式转换等问题 |
rsautl | 使用RSA密钥进行加密、解密、签名和验证等运算 |
genrsa [args] [numbits] //密钥位数,建议1024及以上 |
req 命令:使用已有私钥生成证书请求
openssl req [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-text] [-pubkey] [-noout] [-verify] [-modulus] [-new] [-rand file(s)] [-newkey rsa:bits][-newkey alg:file] [-nodes] [-key filename] [-keyform PEM|DER] [-keyout filename] [-keygen_engine id] [-[digest]] [-config filename] [-subj arg] [-multivalue-rdn] [-x509] [-days n] [-set_serial n][-asn1-kludge] [-no-asn1-kludge] [-newhdr] [-extensions section] [-reqexts section] [-utf8] [-nameopt] [-reqopt] [-subject] [-subj arg] [-batch] [-verbose] [-engine id] |
下文中相关名词简写
CSR - Certificate Signing Request,即证书签名请求,这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥(当然还附带了一些别的信息),在生成这个申请的时候,同时也会生成一个私钥,私钥要自己保管好
CRT - CRT应该是certificate的三个字母,其实还是证书的意思。
双向签名数字证书认证
创建CA证书和私钥相关文件
(1) 生成客户端的密钥,即客户端的公私钥对
//生成私钥文件 |
(2) 生成自签名证书:用自己的私钥为证书请求文件签名,生成证书文件
openssl req -x509 -new -nodes -key ca.key -subj "/CN=master" -days 7000 -out ca.crt |
(3) kube-apiservice的私钥:
openssl genrsa -out server.key 2048 |
(4) 通过配置文件生成签名请求证书:
创建一个master-ssl.cnf配置文件,用来生成书证签名请求文件和证书文件:
[req] |
查看kubernetes.default的cluster IP:
# kubectl get svc kubernetes -o yaml |
基于mstaer_ssl.cnf创建server.csr和server.crt文件.
创建证书签名请求文件:
openssl req -new -key server.key -subj "/CN=master" -config master_ssl.cnf -out server.csr |
创建证书文件:
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 7000 -extensions v3_req -extfile master_ssl.cnf -out server.crt |
下面生成server.crt 和ca.srl
(5) 设置kube-apiserver启动参数
KUBE_API_ARGS="--client-ca-file=/var/run/kubernetes/ca.crt --tls-private-key-file=/var/run/kubernetes/server.key --tls-cert-file=/var/run/kubernetes/server.crt --secure-port=6443" |
--client-ca-file
表示CA根证书文件、--tls-private-key-file
服务端证书文件、--tls-cert-file
服务端私钥文件;
重启kube-apiserver服务:
systemctl restart kube-apiserver |
设置 kube-controller-manager 的客户端
(1) 生成证书签名请求文件和证书文件
私钥文件:
openssl genrsa -out cs_client.key 2048 |
证书签名请求(Certificate Signing Request)文件:
openssl req -new -key cs_client.key -subj "/CN=master" -out cs_client.csr |
证书文件:
openssl x509 -req -in cs_client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 7000 -out cs_client.crt |
(2) 创建kubeconfig
apiVersion: v1 |
(3) 配置参数,重新启动kube-controller-manager
/etc/kubernetes/controller-manager
# Add your own! |
重启服务
systemctl restart kube-controller-manager |
kube-scheduler配置重启
# Add your own! |
重启服务:
systemctl restart kube-scheduler |
Node节点设置
从master复制ca.crt和ca.key到Node节点上,按照前面的方式生成证书签名请求和证书文件。
kubelet客户端
私钥:
openssl genrsa -out kubelet_client.key 2048 |
证书签名请求文件:
openssl req -new -key kubelet_client.key -subj "/CN=node2" -out kubelet_client.csr |
证书文件:
openssl x509 -req -in kubelet_client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 7000 -out kubelet_client.crt |
设置kubelet启动:
KUBELET_ARGS="--certificate-authority=/var/run/kubernetes/ssl_keys/ca.crt --client-certificate=/var/run/kubernetes/ssl_keys/cs_client.crt --client-key=/var/run/kubernetes/ssl_keys/cs_client.key" |
# Add your own! |
重启:
systemctl restart kubelet |
kube-proxy
KUBE_PROXY_ARGS="--bind-address=0.0.0.0 --master=https://192.168.1.122:6443 --kubeconfig=/etc/kubernetes/kubeconfig" |
重启:
systemctl restart kube-proxy |
在设置完成之后master注意开启6443端口:
#添加端口 |
测试是否成功:
# kubectl --server=https://192.168.1.122:6443 --certificate-authority=/var/run/kubernetes/ssl_keys/ca.crt --client-certificate=/var/run/kubernetes/ssl_keys/cs_client.crt --client-key=/var/run/kubernetes/ssl_keys/cs_client.key get nodes |