apiserver参数--kubelet-certificate-authority
作用
官方说明:
参数作用:
文档链接:
https://kubernetes.io/zh-cn/docs/concepts/architecture/control-plane-node-communication/
通过kubectl logs/exec等操作时,kubelet的https端口会作为建连的目标端。默认情况下apiserver时不会对kubelet服务端证书进行认证的,因此会存在中间人攻击风险
修复方案:
根据官方所说,kubeadm交付的集群,kubelet使用的是自签kubelet证书而非使用集群ca所签证书,因此需要在kubelet参数中指定如下两个参数,开启kubelet server证书认证,且证书由集群ca签署
[root@node kubelet-server-cert]# tail -2 /var/lib/kubelet/config.yaml
tlsCertFile: /var/lib/kubelet/pki/kubelet-server.crt
tlsPrivateKeyFile: /var/lib/kubelet/pki/kubelet-server.key
-
kubelet基于集群ca签署server证书
-
创建目录
[root@node ~]# mkdir kubelet-server-cert [root@node ~]# cd kubelet-server-cert/
-
创建kubelet-server.key用于后续生成csr文件
[root@node kubelet-server-cert]# openssl genrsa -out kubelet-server.key 2048 Generating RSA private key, 2048 bit long modulus .............+++ .............+++ e is 65537 (0x10001)
-
生成scr文件(Certificate Signing Request的英文缩写,即证书签名请求文件)
[root@node kubelet-server-cert]# openssl req -new -sha256 -key kubelet-server.key -subj "/CN=kubernetes" -reqexts SAN -config <(cat /etc/pki/tls/openssl.cnf <(printf "\\n[SAN]\\nsubjectAltName=IP:192.168.10.110")) -out kubelet-server.csr # 这里openssl.cnf文件路径可以通过如下命令获取 [root@node kubelet-server-cert]# openssl version -a OpenSSL 1.0.2k-fips 26 Jan 2017 built on: reproducible build, date unspecified platform: linux-x86_64 options: bn(64,64) md2(int) rc4(16x,int) des(idx,cisc,16,int) idea(int) blowfish(idx) compiler: gcc -I. -I.. -I../include -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -m64 -DL_ENDIAN -Wall -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -Wa,--noexecstack -DPURIFY -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DRC4_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM OPENSSLDIR: "/etc/pki/tls" # openssl配置文件路径 engines: rdrand dynamic
-
创建extfile.txt文件证书配置,用于创建证书文件
[root@node kubelet-server-cert]# cat extfile.txt subjectAltName = IP:192.168.10.110 extendedKeyUsage = serverAuth [root@node kubelet-server-cert]# hostname -i 192.168.10.110
-
使用集群CA生成节点kubelet服务端证书文件
[root@node kubelet-server-cert]# openssl x509 -req -in kubelet-server.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out kubelet-server.crt -days 3650 -sha256 -extfile extfile.txt Signature ok subject=/CN=kubernetes Getting CA Private Key
-
将生成的kubelet-server.crt和kubelet-server.key文件添加至kubelet cert dir目录中
# cert dir默认路径 [root@node kubelet-server-cert]# kubelet --help |grep cert-dir --cert-dir string The directory where the TLS certs are located. If --tls-cert-file and --tls-private-key-file are provided, this flag will be ignored. (default "/var/lib/kubelet/pki") [root@node kubelet-server-cert]# ls extfile.txt kubelet-server.crt kubelet-server.csr kubelet-server.key [root@node kubelet-server-cert]# cp kubelet-server.crt kubelet-server.key /var/lib/kubelet/pki/
-
-
kubelet配置文件中添加tls证书配置
[root@node kubelet-server-cert]# tail -2 /var/lib/kubelet/config.yaml tlsCertFile: /var/lib/kubelet/pki/kubelet-server.crt tlsPrivateKeyFile: /var/lib/kubelet/pki/kubelet-server.key
-
apiserver开启
--kubelet-**certificate-autho**rity
参数,增加对kubelet服务端证书的认证[root@master kubelet-server-cert]# grep kubelet-certificat /etc/kubernetes/manifests/kube-apiserver.yaml - --kubelet-certificate-authority=/etc/kubernetes/pki/ca.crt
-
操作过程中发现,如果仅完成上述步骤,由于calico组件依然使用老token会无法获取集群信息,新pod会无法启动,因此需要重启所有calico组件