K8s组件的SSL/TLS 漏洞(CVE-2016-2183)修复
ssl漏洞,需要避免使用3DES算法,K8S涉及这个漏洞的有etcd,kubelet,kube-apiserver,kube-controller-manager和kube-scheduler五个组件。
rancher启动的k8s的集群都是容器化的,启动了一个个独立的docker。他的etcd,kubelet,kube-apiserver的ssl都没有问题,kube-controller-manager和kube-scheduler需要修复。
kube-operator启动的k8s集群etcd和kubelet是systemctl启动的,kube-apiserver,kube-controller-manager,kube-scheduler是容器启动的。他的kube-controller-manager和kube-scheduler的ssl没有问题,etcd,kubelet,kube-apiserver需要修复。
nmap是一个强大的网络扫描工具,主要用于网络安全测试和渗透测试。它能够扫描目标主机的开放端口、操作系统类型、版本信息等。
#官网下载:https://nmap.org/dist/nmap-7.93-1.x86_64.rpm,上传后安装: rpm -ivh nmap-7.93-1.x86_64.rpm #执行检测 nmap --script ssl-enum-ciphers -p 10257 10.12.3.141
扫描结果重点关注warnings,64-bit block cipher 3DES vulnerable to SWEET32 attack,漏洞修复成功则没有该项提示。
1.etcd(2380端口)修复:(已验证)
etcd默认使用TLSv1.2,只需要设置SSL协议,k8s是通过kube-operator安装的是systemctl启动,/etc/kubernetes/manifests/etcd.yaml中没有配置文件,配置文件在/etc/systemd/system/etcd.service中进行配置。修改配置文件,增加如下配置:
--cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA
若是systemctl启动,修改配置后重启服务
systemtctl daemon-reload && systemctl restart etcd.service
再次检测
nmap --script ssl-enum-ciphers -p 2380 10.12.20.90
2.kube-controller-manager(10257)、kube-scheduler(10259)修复:
--tls-cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
若是system启动,修改配置后重启服务
systemtctl daemon-reload systemctl restart kube-controller-manager.service systemctl restart kube-scheduler.service
再次检测
#kube-controlle nmap --script ssl-enum-ciphers -p 10257 10.12.20.90 #kube-scheduler nmap --script ssl-enum-ciphers -p 10259 10.12.20.90
使用rancher部署的k8s集群,需要在rancher中进行配置(已验证)
在kube-controlle和scheduler下添加
extra_args: tls-cipher-suites: >- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

3. kubelet(10250)修复(已验证)
修改配置文件/var/lib/kubelet/config.yaml
vim /var/lib/kubelet/config.yaml
tlsCipherSuites: [TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA]
若是system启动,修改配置后重启服务
systemtctl daemon-reload
systemctl restart kubelet.service
再次检测
#kubelet nmap --script ssl-enum-ciphers -p 10250 10.12.20.90
4. kube-apiserver (6443)修复(验证失败)
修改配置文件
kube-apiserver: /etc/kubernetes/manifests/kube-apiserver.yaml 修改后有问题,apiserver容器exit集群会down。
--tls-cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
若是system启动,修改配置后重启服务
systemtctl daemon-reload
systemctl restart kube-apiserver.service
再次检测
#kube-apiserver nmap --script ssl-enum-ciphers -p 6443 10.12.20.90
最后使用的方法(已验证)
像iptables添加规则,使得只允许本集群内的服务器访问
iptables -A INPUT -p tcp -s 10.12.7.152/29 --dport 6443 -j ACCEPT iptables -A INPUT -p tcp -s 10.12.20.8/29 --dport 6443 -j ACCEPT iptables -A INPUT -p tcp --dport 6443 -j DROP service iptables save
如果是使用firewalld则
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="10.12.7.152/29" port protocol="tcp" port="6443" accept' firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="10.12.20.8/29" port protocol="tcp" port="6443" accept' firewall-cmd --runtime-reload
后续如果需要添加可以访问6443的主机,由于iptables的规则是从上到下进行匹配的,所以不能加在drop的后面,需要先找到drop这一条,再其前面添加ACCEPT规则
列出 INPUT 链的详细规则,并显示每条规则的行号和详细信息
iptables -L INPUT -v -n --line-numbers
查找drop 6443的行号为8
8 38 2264 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:6443
在8之前添加accept规则
iptables -I INPUT 8 -s 10.38.0.44 -p tcp --dport 6443 -j ACCEPT
浙公网安备 33010602011771号