mysql处理CVE-2023-21912漏洞

背景

Mysql出现拒绝服务漏洞(CVE-2023-21912),影响范围:5.0.0<=Oracle MySQL<=5.7.41和8.0<=Oracle MySQL<=8.0.30。线上系统使用的mysql都在此版本内,所以需要处理这个漏洞。

注:本文使用方法不敢完全保证正确,目前升级到发文时间,已过一个多月,没有任何问题。有错误的地方,欢迎指正

解决办法

升级mysql到最新版本(本文升级到的是8.0.33)

系统现状

目前系统部署了好几个生产环境,mysql方式有好几种部署方式(历史遗留问题)

  • 原生部署(压缩包)
  • yum部署
  • docker部署

思考

线上部署的方式不同,但是都是8.0.xx版本,考虑是小版本的升级,可以考虑覆盖应用。(这里没有完全验证猜想,慎用)。

  • docker升级 这个比较简单,直接改镜像版本
  • yum部署、原生部署就是本文的操作流程

升级过程(离线)

目前生产环境是离线环境,此处升级主要是离线升级的处理。

1. 查看 Centos 版本

cat /etc/centos-release

img

2.查看数据库版本

# 连接mysql数据,执行语句
SELECT VERSION()

img

3. 数据库离线下载地址

https://dev.mysql.com/downloads/mysql/
centos 对应 Red Hat Enterprise Linux / Oracle Linux
注:不知道linux对应Mysql版本,可以问ChatGPT
img

4. 解压安装包

在生产环境下加压安装包,在当前目录执行操作

5. 停止mysql服务

注意:如果mysql的配置修改的是/etc/my.cnf,升级之后,这个要覆盖

systemctl stop mysqld

5. 备份数据库文件

有镜像备份,可以忽略

# 注意:保存data文件,这里有两种路线,一种是通过生成sql,另外一种是数据文件保存(类似docker的挂载)
# 我选择第二种,因为感觉小版本是兼容的
# my.conf重新设定路径,那就修改到对应地址
cp -R /var/lib/mysql /var/lib/mysql_backup

6. 卸载当前数据库版本

这一步有点小坑,我通过Chatgpt得到的答案是:yum remove mysql mysql-server
但是实际上,安装的时候有多个包,所以我操作的过程采用的是列举包,依次删除,删除过程中包之间的依赖,我都强制删除。


# 列举以安装版本的mysql
rpm -qa | grep -i mysql
# 删除
yum remove mysql-community-xxx.x86_64

img

原生安装
如果是原生解压包安装的,目前的处理(这个是同事帮忙处理,我没有校验,仅作参考,慎用):

# 注释mysql路径
vim /etc/profile
# 配置生效
source /etc/profile

7. 本地安装

# 按顺序执行安装
# 下面是centos的mysql版本8.0.33版本安装顺序,包的名称自行根据系统版本修改
rpm -ivh mysql-community-common-8.0.33-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-plugins-8.0.33-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.33-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.33-1.el7.x86_64.rpm
rpm -ivh mysql-community-icu-data-files-8.0.33-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.33-1.el7.x86_64.rpm

8. 启动mysql

# 注:如果/etc/my.conf配置有设定,要先覆盖此文件,因为重新安装mysql之后,/etc/my.cnf会被覆盖
systemctl start mysqld
# 检查状态
systemctl status mysqld
# 查看日志
journalctl -u mysqld

img
img

辅助操作

查看含有mysql文件路径

find / -name mysql

img

查找mysql配置文件

mysql --help | grep /my.cnf | xargs ls
// 配置优先级 /etc/my.cnf > /etc/mysql/my.cnf > $basedir/my.cnf > ~/my.cnf
// 默认配置文件地址 /etc/my.cnf
// 默认日志路径  /var/log/mysqld.log

img

查看文件占用大小 当前目录

du -h --max-depth=1

查看应用日志

 journalctl -u 服务名称

小结

由于不是专业运维,对Linux不是很熟悉,对mysql的版本和运行原理也不精通;所以被要求短时间内升级mysql版本,采取的是尽可能疑问排除,采用最简单、快速的方法。

升级之前,自己没有太大把握,我尽量把自己的疑问整理了一下:

  • mysql版本升级会影响什么?大版本和小版本会不会有区别?
  • 如何备份mysql数据,出错如何快速恢复?
  • 不同版本的linux对应的mysql版本如何确认?
    我是询问ChatGPT,但是没有进一步求证
  • 离线安装会不会遇到系统缺失部分基础包的问题?
    这个在离线安装的docker遇到过,所以特别忌惮
  • 升级完成后,如何判断mysql是正常呢?

下面是自己升级的过程,自己存在很多疑问和不懂之处,虽然目前升级没有问题,但是过程正确比结果正确更重要。

1. 排查线上系统版本和安装的mysql版本

实践中,有多个服务器的mysql升级的,做好表格记录。包括:系统版本、mysql版本、安装方式等。
因为升级过程中,就遇到有一台服务器的Mysql是解压安装的;然而测试环境实践中,没有考虑这个情况,结果临时将全局路径剔除来解决。

2. 确认mysql版本影响

目前处理的是mysql 8.0.29、mysql 8.0.20到mysql 8.0.33的情况,这个没有查找太多资料,完全凭经验判断(错误示范)。

3. 下载安装包

官方地址:https://dev.mysql.com/downloads/mysql/

5. 借助ChatGPT

通过ChatGPT来获取解决方案。ChatGPT给出了一个貌似“正确”的答案。

4. 测试环境实践

将ChatGPT的答案在测试环境数据库进行升级,备份my.cnf配置,操作顺利。准备好脚本,正式环境升级备用。

5. 测试环境运行一段时间

项目开发人员开发一天,没有问题,就着手升级

6. 升级

首要考虑备份,这个集团有运维人员,负责网络虚拟机的运维,提前预定时间,到点备份镜像。在这之前上传好各个服务器的安装包,检查一遍脚本,备份mysql配置。时间点到了,开始按步骤升级。实际操作过程中,还是有出错,就是自己疏忽,没有三台mysql服务器,只校验了其中两台,其他有一台是解压包安装的,等到操作到这台,才发现找到不yum安装包,最后还是旁边同事帮忙一起处理。

最后,这次升级,有多少Linux知识盲区,自己可以去补充,后续等工作放缓一点,再回来重新校验和补充。

参考

posted @ 2023-04-26 12:57  WaterVon  阅读(5126)  评论(0)    收藏  举报