安全漏洞修复记录
1.1. 6443/10251/10252敏感信息泄露
上图中提示6443、10251、10252三个端口分别对应了K8S的kubelet API、kube-scheduler、kube-controller三个服务的通讯端口。访问URL显示这三个端口的指标、版本页面会显示敏感信息。所以我们需要做的是禁止三个端口外部IP访问,仅要允许K8S集群内设备访问。
在操作过程中浙江项目的服务器是有安装iptables,因此docker引擎在创建内部网络时会通过iptables设置网络策略。这种情况下再开启firewalld,通过firewalld设置的策略不会生效。选择通过iptables做网络策略。
关闭firewalld之后做了一下操作:
sudo iptables -A INPUT -p tcp -s 127.0.0.1 --dport 10252 -j ACCEPT
sudo iptables -A INPUT -p tcp -s *.34 --dport 10252 -j ACCEPT
sudo iptables -A INPUT -p tcp -s *.35 --dport 10252 -j ACCEPT
sudo iptables -A INPUT -p tcp -s *.73 --dport 10252 -j ACCEPT
sudo iptables -A INPUT -p tcp -s *.74 --dport 10252 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 10252 -j REJECT
sudo iptables -A INPUT -p tcp -s 127.0.0.1 --dport 10251 -j ACCEPT
sudo iptables -A INPUT -p tcp -s *.34 --dport 10251 -j ACCEPT
sudo iptables -A INPUT -p tcp -s *.35 --dport 10251 -j ACCEPT
sudo iptables -A INPUT -p tcp -s *.73 --dport 10251 -j ACCEPT
sudo iptables -A INPUT -p tcp -s *.74 --dport 10251 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 10251 -j REJECT
sudo iptables -A INPUT -p tcp -s 127.0.0.1 --dport 6443 -j ACCEPT
sudo iptables -A INPUT -p tcp -s *.34 --dport 6443 -j ACCEPT
sudo iptables -A INPUT -p tcp -s *.35 --dport 6443 -j ACCEPT
sudo iptables -A INPUT -p tcp -s *.73 --dport 6443 -j ACCEPT
sudo iptables -A INPUT -p tcp -s *.74 --dport 6443 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 6443 -j REJECT
34、35、73、74为K8S集群中的所有节点IP,上面的操作对顺序有严格要求,先设置白名单再设置所有IP精致访问。设置后可以对端口的开通情况做验证。
通过:
telnet IP PORT
或页面访问
2. CVE漏洞
2.1. Eclipse Jetty 信息泄露漏洞
Eclipse Jetty 信息泄露漏洞(CVE-2021-28169)
Eclipse Jetty 资源管理错误漏洞(CVE-2021-28165)
Eclipse Jetty 资源管理错误漏洞(CVE-2020-27223)
Eclipse Jetty是一个java应用容器,相当于tomcat。项目中我们没有直接使用,被扫描出的原因是zookeeper 的admin管理页面使用了Eclipse Jetty,并且使用版本比较低。解决有两个方案,一是关闭zookeeper的管理页面;二是通过iptables/firewalld禁止8080端口;三是iptables配置只允许本机访问(自己服务使用的,明确端口);四是更会安全的版本。
方法一:
在启动脚本中增加-Dzookeeper.admin.enableServer=false
修改后按顺序重启zookeeper、kafka,操作过程中请确保队列中的消息不丢失。
方法二:
sudo iptables -A INPUT -p tcp --dport 8080 -j REJECT
重新开启
sudo iptables -L INPUT --line-numbers -n
sudo iptables -D INPUT $对应的编号
或
sudo firewall-cmd --remove-port=8080/tcp --permanent
sudo firewall-cmd --reload
重新开启
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
方法三:
sudo iptables -A INPUT -p tcp --dport XXXX -s 127.0.0.1 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport XXXX -j DROP
方法四:
Eclipse Jetty存在安全漏洞,该漏洞源于无效的HTTPI/2请求可能占用连接导致拒绝服务,以下产品和版本受到影响:Eclipse Jetty 9.4.46及之前版本、10.0.9及之前版本、11.0.9及之前版本。解决办法: Jetty升级到这几个修复版本9.4.47.10.0.10,11.0.10
解决方法如下:
下载jetty 9.4.47替换zookeeper3.6.1中的lib中的jetty-*的jar包
下载完成后,替换原有对应jar包
重启zookeeper。
其他组件处理方式相同,替换后重启。
2.2. Harbor SQL注入安全漏洞
Harbor 用户枚举安全漏洞(CVE-2019-3990)
Harbor 代码问题漏洞(CVE-2020-13788)
Harbor SQL注入安全漏洞(CVE-2019-19026)
Harbor SQL注入安全漏洞(CVE-2019-19029)
安全扫描工具扫描出来都会带有描述、解决方案这类信息,需要认真查看获取众多漏洞描述说明寻找公因数,比如Harbor 代码问题漏洞(CVE-2020-13788)中要求harbor版本升级至2.0.1版本以上,CVE-2019-19029、CVE-2019-19026、CVE-2019-3990 的安全版本是 >= 1.9.3 。因此至少要将harbor升级至2.0.1版本以上。介于现行版本是1.7.5。
harbor1.7.5升级到1.8.0
harbor1.8.0升级到1.9.0
harbor1.9.0升级到2.0.0
harbor2.0.0 再升级到需要的版本
升级需要经历四次升级,中间还需要升级docker自身的版本。步骤太过复杂,仓库项目中的镜像总数只有30+,多因素考虑直接搭建一个较高版本的harbor仓库。选择安装2.7.3版本的harbor。
https://github.com/goharbor/harbor/releases/tag/v2.7.3
安装步骤网上有很多可以直接参考。
注意事项:
1、 备份项目中最新使用的镜像名称及tag
2、 编辑harbor.yaml修改hostname 、port、仓库存储所在分区,尽量与旧版保持一直
3、 编辑harbor.yaml注释掉https的部分
4、 执行./install.sh
5、 页面登录后修改默认密码
6、 创建harbor项目并设为公开
7、 还原最新的镜像到harbor项目中(镜像在工作节点运行过都会存储在docker本地仓库中)
2.3. OpenSSH 安全漏洞
OpenSSH 安全漏洞(CVE-2023-38408)
OpenSSH 命令注入漏洞(CVE-2020-15778)
升级openssh 可以查看文档后面的组件升级说明。
禁用scp,改用rsync等缓解风险:
禁用scp命令(此方法不影响ssh使用)
mv /usr/bin/scp /usr/bin/scp.bak
恢复scp命令
mv /usr/bin/scp.bak /usr/bin/scp
其他参考:
2.4. SSL/TLS协议信息泄露漏洞
SSL/TLS协议信息泄露漏洞(CVE-2016-2183)【原理扫描】
包括kubelet、kube-api和etcd。
2.4.1. kubelet
问题测试:
root@master1:/var/lib/kubelet#nmap --script ssl-enum-ciphers -p 6443 127.0.0.1
Starting Nmap 7.60 (https://nmap.org) at 2022-08-15 11:08 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000067s latency).
PORT STATE SERVICE
6443/tcp open sun-sr-https
| ssl-enum-ciphers:
| TLSv1.2:
| ciphers:
| TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (rsa 2048) - A
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (rsa 2048) - A
| TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (rsa 2048) - A
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_128_GCM_SHA256 (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 2048) - A
| compressors:
| NULL
| cipher preference: client
| warnings:
| 64-bit block cipher 3DES vulnerable to SWEET32 attack
|_ least strength: C
上面会有64-bit block cipher 3DES vulnerable to SWEET32 attac,解决方案是去除3DES的加密,以kube1.19为例,其他部署方式可能对应的配置文件及路径有差异。去除3DES,其他保留和之前一致,kubelet 在config.yaml增加tlsCipherSuites属性。
vi /var/lib/kubelet/config.yaml
tlsCipherSuites: ['TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256','TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384','TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305','TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256','TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384','TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305','TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256','TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA','TLS_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_CBC_SHA','TLS_RSA_WITH_AES_256_GCM_SHA384']
systemctl daemon-reload
systemctl restart kubelet.service
2.4.2. kube-apiserver
kube-api 在kube-apiserver.yaml的command参数部分增加tls-cipher-suites
vi /etc/kubernetes/manifests/kube-apiserver.yaml
- --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_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_CBC_SHA,TLS_RSA_WITH_AES_256_GCM_SHA384
2.4.3. etcd
etcd 在etcd.yaml的command参数部分增加cipher-suites,注意没有tls前缀
# etcd有提示unexpected TLS cipher suite "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",去除对应加密模式
vi /etc/kubernetes/manifests/etcd.yaml
- --cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_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_CBC_SHA,TLS_RSA_WITH_AES_256_GCM_SHA384
结果验证:
nmap --script ssl-enum-ciphers -p 10250 127.0.0.1
nmap --script ssl-enum-ciphers -p 6443 127.0.0.1
nmap --script ssl-enum-ciphers -p 2379 127.0.0.1
如上执行应该没有warnings
上面逻辑10250在所有节点执行(kubelet机器),6443和2379在所有master节点执行,对应着全部执行一次。
其他参考:
https://www.cnblogs.com/pengpengboshi/p/16248565.html
https://docs.guance.com/scheck/4213-k8s-kubelet-tls-cipher-suites/
2.5. Linux polkit本地权限提升漏洞
Linux polkit本地权限提升漏洞(CVE-2021-4034)
Linux Polkit工具集是Linux系统在安装过程中自带的系统工具集,其中包括大量运维常用工具,主用于在类 Unix操作系统中控制系统范围权限,通过定义和审核权限规则,实现不同优先级进程间的通讯。polkit存在本地权限提升漏洞,该工具集中的pkexec在特定情况下无法正确处理调用参数计数,因此会尝试将环境变量作为命令执行。攻击者可以通过控制环境变量, 利用该漏洞通过精心设计环境变量诱导pkexec执行任意代码,具有低权限的攻击者可以利用此漏洞绕过pkexec自带的安全保护措施,获取目标机器的ROOT权限,对主机安全造成严重威胁。
目前主流Linux版本均受影响。以下polkit版本为对应操作系统的修复版本:
CentOS 6:polkit-0.96-11.el6_10.2
CentOS 7:polkit-0.112-26.el7_9.1
可采用以下命令升级Polkit至安全版本。
yum clean all && yum makecache && yum update polkit -y
成功升级后,您可以运行以下命令查看Polkit的版本信息,检查是否为安全版本。
rpm -qa polkit
2.6. Linux内核漏洞
Linux内核漏洞(CVE-2020-14386)
该漏洞源自Linux内核net/packet/af_packet.c,攻击者可以通过该漏洞实现越界写,可能造成提权和容器逃逸等风险。
CVE-2020-14386是内核模块中存在的内存溢出漏洞。在高版本Linux系统(内核版本高于4.6)上,非特权用户以及K8s或Docker容器中的用户存在触发该漏洞的可能。该漏洞能够允许攻击者实现越界写,可能实现提权或容器逃逸。
1. 使用以下任一方式升级内核版本。
运行以下命令升级内核至修复版本。
yum -y install kernel-4.19.91-21.2.al7
运行以下命令升级至最新内核版本。
yum -y update kernel
2. 运行以下命令重启系统。
reboot
2.7. CentOS Ruby 安全漏洞
CentOS RubyGems 安全漏洞(CVE-2019-8325)
CentOS RubyGems 安全漏洞(CVE-2019-8323)
CentOS Ruby 安全漏洞(CVE-2018-8777)
CentOS Ruby 安全漏洞(CVE-2018-8778)
CentOS Ruby 安全漏洞(CVE-2018-8779)
CentOS RubyGems 安全漏洞(CVE-2018-1000075)
CentOS RubyGems 路径遍历漏洞(CVE-2018-1000073)
CentOS RubyGems gem owner 安全漏洞(CVE-2019-8322)
redis是通过ruby语言开发的,在旧版本的redis创建集群时需要安装ruby,创建集群后ruby环境就没有再被使用,因此选择直接卸载ruby应用。
yum卸载ruby引用
sudo yum remove ruby
删除命令文件
which ruby
sudo rm -rf /usr/bin/ruby
更新环境变量
source ~/.bashrc
2.8. nginx 安全漏洞
nginx 安全漏洞(CVE-2018-16843)
nginx 安全漏洞(CVE-2018-16844)
nginx 安全漏洞(CVE-2019-9513)
nginx 安全漏洞(CVE-2019-9511)
CVE-2018-16843 nginx 1.15.6和1.14.1之前的版本的HTTP/2实现过程中存在安全漏洞。攻击者可利用该漏洞消耗大量的内存空间。
CVE-2018-16844 Nginx 1.15.5之前的版本和1.14.1版本中的HTTP/2实现过程中存在安全漏洞。远程攻击者可通过发送恶意的请求利用该漏洞造成拒绝服务。
CVE-2019-9511,CVE-2019-9513,CVE-2019-9516 Nginx 1.9.51 至 16.0版本及1.17.2.版本中的HTTP/2实现中存在拒绝服务漏洞,攻击者以多个数据流请求特定资源上的大量数据,通过操纵窗口大小和流优先级,强迫服务器将数据排列在1字节的块中,导致CPU及内存资源耗尽,造成拒绝服务。
获取nginx的版本号
/usr/local/nginx/sbin/nginx -v
可以升级至1.20.2 以上的版本,通常在项目上通过镜像运行的nginx,提前docker pull nginx:1.21.6,在dockerfile 中修改from基础镜像修改为nginx:1.21.6即可。
3. 组件升级
3.1. 升级openssh
方式一
ssh -V
cd gcc
rpm -Uvh *.rpm --nodeps --force
cd
cd openssl-devel
rpm -Uvh *.rpm --nodeps --force
cd
tar -zxf openssh-9.0p1.tar.gz
cd openssh-9.0p1
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords --with-privsep-path=/var/lib/sshd
cp -r /etc/ssh /etc/ssh.old
rpm -qa |grep openssh
rpm -e --nodeps openssh-clients-7.4p1-16.el7.x86_64
rpm -e --nodeps openssh-server-7.4p1-16.el7.x86_64
rpm -e --nodeps openssh-7.4p1-16.el7.x86_64
rpm -qa |grep openssh
make
chmod 600 /etc/ssh/ssh_host_rsa_key
chmod 600 /etc/ssh/ssh_host_dsa_key
chmod 600 /etc/ssh/ssh_host_ecdsa_key
chmod 600 /etc/ssh/ssh_host_ed25519_key
make install
install -v -m755 contrib/ssh-copy-id /usr/bin
install -v -m644 contrib/ssh-copy-id.1 /usr/share/man/man1
install -v -m755 -d /usr/share/doc/openssh-9.0p1
install -v -m644 INSTALL LICENCE OVERVIEW README*
install -v -m644 INSTALL LICENCE OVERVIEW README* /usr/share/doc/openssh-9.0p1
cp -p contrib/redhat/sshd.init /etc/init.d/sshd
chmod +x /etc/init.d/sshd
chkconfig --add sshd
chkconfig sshd on
chkconfig --list sshd
systemctl start sshd
sshd -v
然后需要改一次密码 修改一次配置文件
systemctl daemon-reload
systemctl restart sshd
方式二
安装及依赖包传输到服务器中
cd gcc
rpm -Uvh *.rpm --nodeps --force
cd ../openssl-devel/
rpm -Uvh *.rpm --nodeps --force
cd
tar zxf openssh-9.0p1.tar.gz
cd openssh-9.0p1
vi version.h
修改成任意信息
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords --with-privsep-path=/var/lib/sshd
cp -r /etc/ssh /etc/ssh.old
rpm -qa |grep openssh
rpm -e --nodeps openssh-clients-7.4p1-16.el7.x86_64
rpm -e --nodeps openssh-server-7.4p1-16.el7.x86_64
rpm -e --nodeps openssh-7.4p1-16.el7.x86_64
make
chmod 600 /etc/ssh/ssh_host_rsa_key
chmod 600 /etc/ssh/ssh_host_ecdsa_key
chmod 600 /etc/ssh/ssh_host_ed25519_key
make install
ssh -V
install -v -m755 contrib/ssh-copy-id /usr/bin
install -v -m644 contrib/ssh-copy-id.1 /usr/share/man/man1
install -v -m755 -d /usr/share/doc/openssh-9.0p1
install -v -m644 INSTALL LICENCE OVERVIEW README*
install -v -m644 INSTALL LICENCE OVERVIEW README* /usr/share/doc/openssh-9.0p1
cp -p contrib/redhat/sshd.init /etc/init.d/sshd
chmod +x /etc/init.d/sshd
chkconfig --add sshd
chkconfig sshd on
chkconfig --list sshd
setenforce 0
vi /etc/ssh/sshd_config
#修改一次密码
passwd
systemctl daemon-reload
systemctl restart sshd
尝试重新连接
3.2. 升级openssl
一个文件Openssl-3.0.5.tar.gz 两个目录Perl Perl-Extutils
openssl version
cd perl/
rpm -Uvh *.rpm --nodeps –force
cd ../perl-ExtUtils/
rpm -Uvh *.rpm --nodeps –force
cd
tar zxf openssl-3.0.5.tar.gz
cd openssl-3.0.5
./config --prefix=/usr/local --openssldir=/usr/local/openssl
make && make install
cd /usr/bin/
mv /usr/bin/openssl /usr/bin/openssl.bak
mv /usr/include/openssl /usr/include/openssl.bak
ln -s /usr/local/bin/openssl /usr/bin/openssl
ln -s /usr/local/include/openssl /usr/include/openssl
cd /usr/local/lib64
cp libssl.so.3 /usr/lib/libssl.so.3
cp libcrypto.so.3 /usr/lib/libcrypto.so.3
pwd
echo /usr/local/lib64 >/etc/ld.so.conf.d/openssl.conf
ldconfig -v
openssl version