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

 

posted @ 2025-01-02 16:13  潇潇暮鱼鱼  阅读(615)  评论(0)    收藏  举报