安全漏洞修复记录

1.  敏感信息泄露

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

GitHub地址:https://github.com/jetty/jetty.project/security/advisories/GHSA-wgmr-mf83-7x4j

解决方法如下:

下载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

其他参考:

https://blog.csdn.net/lhrm0213/article/details/117549337?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-4.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-4.no_search_link&utm_relevant_index=7

2.4.  SSL/TLS协议信息泄露漏洞

SSL/TLS协议信息泄露漏洞(CVE-2016-2183)【原理扫描】

包括kubelet、kube-apietcd。

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2023-12-18 17:26  丿小师傅灬  阅读(1139)  评论(0编辑  收藏  举报