Linux\CentOS解决OpenSSH和Nginx安全漏洞

发布于:2025-03-29 ⋅ 阅读:(27) ⋅ 点赞:(0)

前言

由于有些服务器需要对公网提供服务、客户对于服务器安全比较重视,需要公司提供服务器安全报告。大多数服务器经过漏洞扫描之后、会出现很多软件低版本的漏洞,此时就需要升级软件的版本来解决这些漏洞问题。本篇文章记录升级软件过程。

漏洞编号 漏洞说明
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

网站公告

今日签到

点亮在社区的每一天
去签到