1.背景
7月底部门的运维大哥离职了,奈何又没有新运维接替,至于为什么没有补位,懂得都懂,按老大的意思是先让开发一人顶一块,8月底争取补上。
打心底我有点排斥这事,但是人到中年又有什么办法呢,上有老下有小,唯有苟。
分派给我的部分是服务器漏洞的修复,小弟虽然懂几个linux命令但是在“漏洞修复”这个词面前还是有点苍白,只能祈祷这个月没有工单过来了,但是怕什么来什么,第二天就来了一个工单,大概看下是什么内容。
2.补充点知识
大概看了一下有两类漏洞需要处理,分别是:
1.openssh 版本过低;
2.MySql版本过低。
这几台机器的操作系统是Centos 7.9,网上搜了一下对于Centos系统的软件升级大概有以下几种:
方法一 手动编译安装法:此方法仅仅针对源码包进行安装,该方法需要借助的工具gcc以及gcc_c++工具,在安装的时候一定要先安装好这两个工具才可以进行下一步安装。步骤一:获得软件包以后,将软件包解压。解压步骤要看具体压缩的是什么格式,根据格式应用对应的解压工具进行解压。步骤二:cd到软件包内的bin目录下。步骤三:执行编译命令:make,该步骤的目的是将源文件编译成为二进制文件,以便下一步安装。步骤四:执行安装命令:make install。安装软件操作。如果想安装到 tool目录下,可以执行:make install /tool/编译法的优点就是利于找到文件夹以及源文件,方便与后期的卸载。缺点当该软件包需要依赖包的时候需要解决依赖包的问题才可以装上软件,相对比较麻烦。方法二 RPM安装方式:找到软件的RPM包的时候,执行rpm -ivh xxx.rpm,即可安装软件。rpm包只是将源码包打压成为了rpm文件格式,使用rpm工具进行安装。安装的时候同样会收到依赖包以及系统环境的影响。和手动编译安装法相比,rpm的优势在于升级和卸载。如果有更高级的kk.rpm包时,执行命令:rpm -uvh kk.rpm 即可升级软件,不像编译法先卸载再安装。卸载软件rpm -e kk.rpm,即可卸载。方法三 yum源安装方法:该方法需要借助到网络,访问到yum源才可以进行安装。如果是需要访问互联网上的yum源,则需要链接互联可以使用此方法进行访问。很多企业为了本地运行环境的安全性来考虑,一般禁止链接互联网。以通过yum源安装mysql为例:执行命令 yum install -y mysql 即可通过yum方式进行安装。通过yum 方式卸载 ,命令:yum remove mysql,即可卸载mysql。用该方法安装软件,yum源很重要,可以自己配置一个yum源,也可以使用互联网上面的yum源。推荐使用互联网上面的开源yum源,如果自己搭建yum源,其中的工具包比较难以收集全。更改或者设置yum源在文件yum.repo文件中进行更改。https://forum.huawei.com/enterprise/zh/thread/580933440356892672
个人感觉后两种最简单,相当于别人已经制作好了软件包只需要自己安装一下就好,但悲催的是找不到openssh最新版本的包,只能硬着头皮尝试自己通过源码编译,相比而言Mysql就舒服一点,官方有现成的包。
3.升级openssh
对于一个新手来说,开始之前总会先找一系列补救措施,以备不时之需,下面是我搜集的一些免死金牌。
3.1 开启telnet
有网友说先把telnet打开,以防openssh升级失败导致机器失联(当然也可以硬着头皮去找虚拟机管理员,控制台终归是能进去的)。
yum install -y telnet* xinetd vim /etc/pam.d/remote #注释掉auth required pam_securetty.so这一行 systemctl start xinetd.service systemctl start telnet.socket systemctl enable telnet.socke
3.2 虚拟机快照
虚拟机一般都提供了快照功能,简单理解为备份和还原功能,系统被搞坏了以后可以快速恢复。
3.3 提前模拟
毕竟是新手,对着客户环境直接开大太冒失,不妨找台内网的测试机器或者自己安装虚拟机模拟一下,做到心中有数。
3.4 开始编译
逐个下载源码包,openssh依赖zlib和openssl,编译openssh之前需要先把zlib和openssl编译。
#统一在/opt/ssh-upgrade/source/ 目录操作 #openssh 下载&解压 wget 'http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gz' tar zxvf openssh-9.8p1.tar.gz #openssl 下载&解压 wget https://www.openssl.org/source/old/1.1.1/openssl-1.1.1w.tar.gz tar zxvf openssl-1.1.1w.tar.gz #zlib下载&解压 wget https://zlib.net/fossils/zlib-1.3.1.tar.gz tar zxvf zlib-1.3.1.tar.gz
#编译zlib cd /opt/ssh-upgrade/source/zlib-1.3.1configure可能会出现的错误 Checking for gcc... Compiler error reporting is too harsh for ./configure (perhaps remove -Werror). ** ./configure aborting.这时需要安装软件 yum install -y gcc gcc-c++./configure --prefix=/opt/ssh-upgrade/zlib make && make install
#编译openssl #备份配置 cp -rf /etc/ssl/ /opt/ssh-upgrade/config_bak/sslcd /opt/ssh-upgrade/source/openssl-1.1.1w./config --prefix=/opt/ssh-upgrade/openssl/ --openssldir=/opt/ssh-upgrade/openssl/ shared make && make installln -sf /opt/ssh-upgrade/openssl/bin/openssl /usr/bin/openssl ln -sf /opt/ssh-upgrade/openssl/include/openssl /usr/include/openssl echo '/opt/ssh-upgrade/openssl/lib' >> /etc/ld.so.conf.d/ssh-upgrade.conf ldconfig
#编译openssh #备份配置 cp -rf /etc/ssh/ /opt/ssh-upgrade/config_bak/sshcd /opt/ssh-upgrade/source/openssh-9.8p1 ./configure --prefix=/opt/ssh-upgrade/openssh/ --sysconfdir=/opt/ssh-upgrade/openssh/ssh/ --with-openssl-includes=/opt/ssh-upgrade/openssl/include/ --with-ssl-dir=/opt/ssh-upgrade/openssl/ --with-zlib=/opt/ssh-upgrade/zlib/ --with-md5-passwords --without-openssl-header-check make && make install ln -sf /opt/ssh-upgrade/openssh/sbin/sshd /usr/sbin/sshd ln -sf /opt/ssh-upgrade/openssh/bin/ssh /usr/bin/ssh ln -sf /opt/ssh-upgrade/openssh/bin/ssh-add /usr/bin/ssh-add ln -sf /opt/ssh-upgrade/openssh/bin/ssh-agent /usr/bin/ssh-agent ln -sf /opt/ssh-upgrade/openssh/bin/ssh-keygen /usr/bin/ssh-keygen ln -sf /opt/ssh-upgrade/openssh/bin/ssh-keyscan /usr/bin/ssh-keyscan #还原配置 cp -rf /opt/ssh-upgrade/config_bak/ssh /etc/ssh/ # 加入开机启动之类的 chkconfig --add sshd chkconfig sshd on systemctl enable sshd.socket systemctl restart sshd systemctl status sshd
不出意外的话意外就发生了,网络闪断了一下,然后这台机器连不上了,因为是用内网的测试机器练手,所以即没开telnet也没找管理员做快照,只能硬着头皮找管理员用控制台进入机器看看啥情况,管理员猜测是ssh服务没有成功启动导致,但是通过systemctl status sshd发现服务没有问题,那大概率就是配置问题了,网上说的比较多的是/etc/ssh/sshd_config中的PermitRootLogin yes没有打开导致,但是查看配置也没有问题,内心深处有一个声音若隐若现“重启一把看看”,然并卵。
3.5 复盘
冷静下来之后,我逐条检查之前执行过的命令,其中有一个细节引起了我的怀疑,一起来看下。
./configure --prefix=/opt/ssh-upgrade/openssh/ --sysconfdir=/opt/ssh-upgrade/openssh/ssh/ --with-openssl-includes=/opt/ssh-upgrade/openssl/include/ --with-ssl-dir=/opt/ssh-upgrade/openssl/ --with-zlib=/opt/ssh-upgrade/zlib/ --with-md5-passwords --without-openssl-header-check
--sysconfdir=/opt/ssh-upgrade/openssh/ssh/,这个参数指定了配置文件的位置为/opt/ssh-upgrade/openssh/ssh/,所以我将最开始备份的配置文件恢复回/etc/ssh/自然是没用,那解决方案也就很简单了,将/opt/ssh-upgrade/openssh/ssh/sshd_config中的PermitRootLogin yes打开即可。
网上找的资料一定要弄懂,不要稀里糊涂的执行。
4.升级MySql
MySql的升级相对来说就简单一点了,有现成的软件包,下载了执行就好。
4.1 下载5.7.44的安装包
https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar
4.2 备份
配置文件和数据
cp /etc/my.cnf /data/back/my.cnf_0807mysqldump -uroot -p'xxx' --all-databases>/data/back/sqlfiles_0807.sql
4.3 停止数据库
systemctl stop mysqld
4.4 使用Uvh升级
rpm -Uvh mysql-community-common-5.7.44-1.el7.x86_64.rpm --nodeps rpm -Uvh mysql-community-libs-5.7.44-1.el7.x86_64.rpm --nodeps rpm -Uvh mysql-community-libs-compat-5.7.44-1.el7.x86_64.rpm --nodeps rpm -Uvh mysql-community-devel-5.7.44-1.el7.x86_64.rpm --nodeps rpm -Uvh mysql-community-client-5.7.44-1.el7.x86_64.rpm --nodeps rpm -Uvh mysql-community-server-5.7.44-1.el7.x86_64.rpm --nodeps
4.5 启动mysqld
service mysqld restart
4.6 检查更新
mysql_upgrade -uroot -p
参考https://dev.mysql.com/doc/refman/5.7/en/mysql-upgrade.html
4.7 重启mysql
systemctl restart mysqld
5.写在最后
本来挺多感慨和负面情绪想抒发一下的,但是真正把事情做完的时候好像又是一种“不以物喜,不以己悲”的心态,老了?怂了?和自己和解了?
人到中年,懂得都懂!