前言
由于有些服务器需要对公网提供服务、客户对于服务器安全比较重视,需要公司提供服务器安全报告。大多数服务器经过漏洞扫描之后、会出现很多软件低版本的漏洞,此时就需要升级软件的版本来解决这些漏洞问题。本篇文章记录升级软件过程。
漏洞编号 | 漏洞说明 |
---|---|
CVE-2023-38408 | OpenSSH漏洞 |
CVE-2008-3844 | OpenSSH漏洞 |
CVE-2021-41617 | OpenSSH漏洞 |
CVE-2021-3618 | Nginx漏洞 |
下面方案均在生产环境验证过、但是在升级时 仍然要给服务器做快照备份 以防出现生产事故!!!
一、升级OpenSSH ( OpenSSH_7.4p1 到 OpenSSH_9.9p2 )
1、安装一些必要的命令
先切换root用户 (如果本身就是root用户忽略 sudo -i 这步)
sudo -i
输入root用户密码
# 安装一些必要的命令(需要能访问外网)
yum install wget gcc openssl-devel pam-devel rpm-build zlib-devel -y
如果你的服务器不能访问外网 就需要离线安装一些软件比较麻烦 参考下面这篇文章
https://liucy.blog.csdn.net/article/details/136536352
上传提供的两个文件到 /home 目录 (上传文件的目录只要root用户能访问就行)
openssh-9.9p2.tar.gz
openssl-1.1.1t.tar.gz
文件获取地址:
通过网盘分享的文件:漏洞处理所需软件
链接: https://pan.baidu.com/s/1eiv04XBvNVjGZNZ3sl0WdQ?pwd=java 提取码: java
2、解压openssl-1.1.1t.tar.gz并放到/usr/local/目录
tar xf openssl-1.1.1t.tar.gz -C /usr/local
3、编译安装openssl
# 进入openssl目录
cd /usr/local/openssl-1.1.1t
# 编译安装openssl
./config shared --prefix=/usr/local/openssl
make -j 4
make install
4、为openssl做软连接 (需要特别注意按照步骤执行)
echo "/usr/local/openssl/lib/" >> /etc/ld.so.conf
# 加载配置文件
ldconfig
# 备份以前的openssl
mv /usr/bin/openssl /usr/bin/openssl.old
# 软连接,如果提示软连接已存在,记得备份软连接,然后在执行下面再次软连接,要不然会出问题,会导致root目录看不了,磁盘看不了,sftp连接不上;
ln -sv /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
如果提示软连接已存在 需要先备份再重新链接 (如果上面软连接执行没有提示 则忽略这步备份操作)
mv /usr/bin/openssl /usr/bin/openssl.bak
mv /usr/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1.bak
mv /usr/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1.bak
查看openssl版本
openssl version -a
结果: OpenSSL 1.1.1t 7 Feb 2023
5、查看、备份并卸载原有OpenSSH
注意:这一步需要确保终端一直连接 断开远程连接就不能用了(另开一个远程连接放在那一直保持连接,防止出现问题无法登录机器 , 可以新开一个root用户窗口 输入 vi test 放在那不动直到后续升级操作完成)
# 查看当前安装包
[root@localhost ~]# rpm -qa | grep openssh
# 结果如下
openssh-clients-7.4p1-21.el7.x86_64
openssh-7.4p1-21.el7.x86_64
openssh-server-7.4p1-21.el7.x86_64
# 查看当前OpenSSH版本(Centos7 默认使用OpenSSH_7.4p1)
[root@localhost ~]# ssh -V
# 结果如下
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
# 备份现有的SSH
[root@localhost ~]# mv /etc/ssh/ /etc/ssh.bak
[root@localhost ~]# mv /usr/bin/ssh /usr/bin/ssh.bak
[root@localhost ~]# mv /usr/sbin/sshd /usr/sbin/sshd.bak
# 如果您是第一次升级,备份/etc/init.d/sshd时会不存在,不影响后续操作
[root@localhost ~]# mv /etc/init.d/sshd /etc/init.d/sshd.bak
mv: 无法获取'/etc/init.d/sshd' 的文件状态(stat): No such file or directory
# 卸载现有OpenSSH
rpm -e --nodeps $(rpm -qa |grep openssh)
确保已经卸载成功(这步执行后没有返回数据则卸载成功)
rpm -qa | grep openssh
六、解压并编译安装OpenSSH
# 先进入openssh安装包所在目录 将下载的openssh安装包移动到/usr/local下
cd /home
[root@localhost home]# mv openssh-9.9p2.tar.gz /usr/local/
# 进入/usr/local/目录解压openssh-9.9p2.tar.gz
[root@localhost ~]# cd /usr/local/
[root@localhost local]# tar xf openssh-9.9p2.tar.gz
# 进入openssh目录
[root@localhost local]# cd openssh-9.9p2
# 编译安装 下面第一个命令是分行的 要复制完整
[root@localhost openssh-9.9p2]# CCFLAGS="-I/usr/local/include" \
LDFLAGS="-L/usr/local/lib64" \
./configure \
--sysconfdir=/etc/ssh \
--with-zlib \
--with-ssl-dir=/usr/local/openssl
[root@localhost openssh-9.9p2]# make -j 4
[root@localhost openssh-9.9p2]# make install
7、授权
[root@localhost openssh-9.9p2]# chmod 600 /etc/ssh/*
8、复制配置文件
[root@localhost openssh-9.9p2]# cp -rf /usr/local/sbin/sshd /usr/sbin/sshd
[root@localhost openssh-9.9p2]# cp -rf /usr/local/bin/ssh /usr/bin/ssh
[root@localhost openssh-9.9p2]# cp -rf /usr/local/bin/ssh-keygen /usr/bin/ssh-keygen
[root@localhost openssh-9.9p2]# cp -ar /usr/local/openssh-9.9p2/contrib/redhat/sshd.init /etc/init.d/sshd
[root@localhost openssh-9.9p2]# cp -ar /usr/local/openssh-9.9p2/contrib/redhat/sshd.pam /etc/pam.d/sshd.pam
9、修改配置允许root用户远程登录
# 修改配置允许root用户远程登录(允许使用密码登录,允许root远程登录,开启端口,赋予/etc/init.d/sshd权限) 从cat 复制到 最后一行的EOF 并执行
## 下面这些配置 是比较安全的配置 如果有特殊需求 按需修改
cat >>/etc/ssh/sshd_config<<EOF
LogLevel INFO
LoginGraceTime 1m
PermitRootLogin yes
PasswordAuthentication yes
KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group1-sha1,curve25519-sha256@libssh.org
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com
Protocol 2
Banner /etc/issue.net
PermitEmptyPasswords no
HostbasedAuthentication no
IgnoreRhosts yes
X11Forwarding no
MaxAuthTries 4
ClientAliveInterval 300
ClientAliveCountMax 0
EOF
[root@localhost openssh-9.9p2]# sed -i "s/^#Port/Port/g" /etc/ssh/sshd_config
[root@localhost openssh-9.9p2]# chmod 755 /etc/init.d/sshd
10、启用sshd,生成服务配置文件,并重启服务
# 启用sshd,生成服务配置文件
[root@localhost openssh-9.9p2]# systemctl enable sshd
# 下面两行是显示的结果
sshd.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig sshd on
# 重启服务
[root@localhost openssh-9.9p2]# systemctl restart sshd
# 查看服务状态
[root@localhost openssh-9.9p2]# systemctl status sshd
验证升级是否成功
[root@localhost ~]# ssh -V
# 显示结果
OpenSSH_9.9p2, OpenSSL 1.1.1t 7 Feb 2023
二、升级Nginx (Nginx1.20.2升级到Nginx1.26.3)
由于nginx一般都是24小时提供服务,所以下面是不中断服务热升级方案。
1、上传 nginx-1.26.3.tar.gz 到 /home 目录
当前如果不是root用户需要先切换root用户:
sudo -i
输入密码: root用户密码
2、解压
cd /home
tar -xzf nginx-1.26.3.tar.gz
3、进入 nginx-1.26.3 解压目录
cd /home/nginx-1.26.3
4、查看原nginx编译参数
# 如果下面命令不行 就需要进入老的nginx安装目录下的sbin目录中 ./nginx -V 查看
nginx -V
4、执行 ./configure 配置nginx (一定要和老版本的nginx配置保持一致)
(注意下面加的参数仅是示例参数,一定要替换成你的真实参数)
# 下面 ./configure 后面的参数需要和老版本查到的参数保持一致 (下面加到参数仅是示例参数)
./configure \
--prefix=/usr/share/nginx \
--sbin-path=/usr/sbin/nginx \
5、开始编译
make
6、备份老版本的nginx文件
whereis nginx
## 如果是如下目录/usr/sbin (注意这里是你nginx老版本的安装目录)
cp /usr/sbin/nginx /usr/sbin/ngin_bak_old
# 复制编译好的nginx1.26.3 到老的nginx目录
cp -f /home/nginx-1.26.3/objs/nginx /usr/sbin/
7、开始热启动 新版本进程 并主动退出旧版本进程
# 查询老版本nginx进程号
ps aux | grep nginx
## 启动新版本
kill -USR2 35081 ## 35081换成你查到的旧版本的nginx master进程号
ps aux | grep nginx ## 此时启动了两个nginx进程
8、此时有两套nginx进程 开始回收旧的worker进程 退出旧版本的master进程
kill -WINCH 35081 ## 旧版本的nginx master进程号 (注意这里还是 旧版本的nginx master进程号)
ps aux | grep nginx ## 发现旧版本的nginx worker进程退出了
## 再退出旧版本的nginx主进程
kill -QUIT 35081 ## 旧版本的nginx master进程号
验证升级是否成功
cd /usr/local/nginx/sbin
./nginx -V
# 显示结果
nginx version: nginx/1.26.3